1 package httpfile 2 3 import ( 4 "io" 5 "net/http" 6 "net/http/httptest" 7 "strings" 8 "testing" 9 "time" 10 ) 11 12 func TestFile(t *testing.T) { 13 earliest := time.Now().Add(-time.Second) 14 file := New("data.json") 15 latest := time.Now().Add(time.Second) 16 17 server := httptest.NewServer(file) 18 defer server.Close() 19 20 client := server.Client() 21 22 r, err := client.Head(server.URL) 23 if err != nil { 24 t.Fatalf("unexpected error: %s", err) 25 } 26 27 if r.ContentLength != 0 { 28 t.Errorf("expecting to have no size, got %d", r.ContentLength) 29 } 30 31 if mime := r.Header.Get("Content-Type"); mime != "application/json" { 32 t.Errorf("expecting to have json mime type, got %q", mime) 33 } 34 35 if modtime, err := time.Parse(time.RFC1123, r.Header.Get("Last-Modified")); err != nil { 36 t.Errorf("error parsing modtime: %s", err) 37 } else if earliest.After(modtime) || modtime.After(latest) { 38 t.Errorf("expecting modtime to be between %s and %s, got %s", earliest, latest, modtime) 39 } 40 41 earliest = time.Now().Add(-time.Second) 42 f := file.Create() 43 44 f.Write([]byte("some data")) 45 io.WriteString(f, ", and some more data") 46 f.Close() 47 48 latest = time.Now().Add(time.Second) 49 50 req, _ := http.NewRequest(http.MethodGet, server.URL, nil) 51 req.Header.Set("Accept-Encoding", "") 52 53 r, err = client.Do(req) 54 if err != nil { 55 t.Fatalf("unexpected error: %s", err) 56 } 57 58 if r.Uncompressed != false { 59 t.Errorf("expecting to receive uncompressed data, didn't!") 60 } 61 62 if r.ContentLength != 29 { 63 t.Errorf("expecting to have size of 29 bytes, got %d", r.ContentLength) 64 } 65 66 var sb strings.Builder 67 68 io.Copy(&sb, r.Body) 69 70 if sb.String() != "some data, and some more data" { 71 t.Errorf("expecting to read content %q, got %q", "some data, and some more data", sb.String()) 72 } 73 74 if modtime, err := time.Parse(time.RFC1123, r.Header.Get("Last-Modified")); err != nil { 75 t.Errorf("error parsing modtime: %s", err) 76 } else if earliest.After(modtime) || modtime.After(latest) { 77 t.Errorf("expecting modtime to be between %s and %s, got %s", earliest, latest, modtime) 78 } 79 80 earliest = time.Now().Add(-time.Second) 81 f = file.Create() 82 83 f.WriteString("checking compressed data") 84 f.Close() 85 86 latest = time.Now().Add(time.Second) 87 88 r, err = client.Get(server.URL) 89 if err != nil { 90 t.Fatalf("unexpected error: %s", err) 91 } 92 93 if r.Uncompressed != true { 94 t.Errorf("expecting to receive compressed data, didn't!") 95 } 96 97 if modtime, err := time.Parse(time.RFC1123, r.Header.Get("Last-Modified")); err != nil { 98 t.Errorf("error parsing modtime: %s", err) 99 } else if earliest.After(modtime) || modtime.After(latest) { 100 t.Errorf("expecting modtime to be between %s and %s, got %s", earliest, latest, modtime) 101 } 102 103 sb.Reset() 104 105 io.Copy(&sb, r.Body) 106 107 if sb.String() != "checking compressed data" { 108 t.Errorf("expecting to read content %q, got %q", "checking compressed data", sb.String()) 109 } 110 } 111 112 func TestReadFrom(t *testing.T) { 113 const data = "<html><head><body><h1>Hello, World</h1></body></html>" 114 115 file := New("data.html") 116 117 server := httptest.NewServer(file) 118 defer server.Close() 119 120 n, _ := file.ReadFrom(strings.NewReader(data)) 121 if n != 53 { 122 t.Errorf("expecting to write 53 bytes, wrote %d", n) 123 } 124 125 r, err := server.Client().Get(server.URL) 126 if err != nil { 127 t.Fatalf("unexpected error: %s", err) 128 } 129 130 var sb strings.Builder 131 132 io.Copy(&sb, r.Body) 133 134 if sb.String() != data { 135 t.Errorf("expecting to read content %q, got %q", data, sb.String()) 136 } 137 } 138 139 func TestChtime(t *testing.T) { 140 expected := time.Unix(12345, 0) 141 file := New("data.txt") 142 143 file.Chtime(expected) 144 145 server := httptest.NewServer(file) 146 defer server.Close() 147 148 r, err := server.Client().Head(server.URL) 149 if err != nil { 150 t.Fatalf("unexpected error: %s", err) 151 } 152 153 if modtime, err := time.Parse(time.RFC1123, r.Header.Get("Last-Modified")); err != nil { 154 t.Errorf("error parsing modtime: %s", err) 155 } else if !modtime.Equal(expected) { 156 t.Errorf("expecting modtime to be %s, got %s", expected, modtime) 157 } 158 } 159