github.com/orteth01/up@v0.2.0/handler/handler_test.go (about) 1 package handler 2 3 import ( 4 "net/http" 5 "net/http/httptest" 6 "os" 7 "testing" 8 9 "github.com/tj/assert" 10 ) 11 12 func TestNode(t *testing.T) { 13 os.Chdir("testdata/node") 14 defer os.Chdir("../..") 15 16 h, err := New() 17 assert.NoError(t, err) 18 19 res := httptest.NewRecorder() 20 req := httptest.NewRequest("GET", "/", nil) 21 22 h.ServeHTTP(res, req) 23 24 actual := res.Header() 25 assert.NotEmpty(t, actual.Get("Date"), "date") 26 actual.Del("Date") 27 28 header := make(http.Header) 29 header.Add("X-Powered-By", "up") 30 header.Add("X-Foo", "bar") 31 header.Add("Content-Length", "11") 32 header.Add("Content-Type", "text/plain; charset=utf-8") 33 header.Add("Vary", "Accept-Encoding") 34 assert.Equal(t, header, actual) 35 } 36 37 func TestStatic(t *testing.T) { 38 os.Chdir("testdata/static") 39 defer os.Chdir("../..") 40 41 h, err := New() 42 assert.NoError(t, err) 43 44 res := httptest.NewRecorder() 45 req := httptest.NewRequest("GET", "/", nil) 46 47 h.ServeHTTP(res, req) 48 49 actual := res.Header() 50 assert.NotEmpty(t, actual.Get("Last-Modified"), "last-modified") 51 actual.Del("Last-Modified") 52 53 header := make(http.Header) 54 header.Add("X-Powered-By", "up") 55 header.Add("Content-Length", "12") 56 header.Add("Content-Type", "text/html; charset=utf-8") 57 header.Add("Accept-Ranges", "bytes") 58 header.Add("Vary", "Accept-Encoding") 59 60 assert.Equal(t, header, actual) 61 } 62 63 func TestNodeWithPackage(t *testing.T) { 64 os.Chdir("testdata/node-pkg") 65 defer os.Chdir("../..") 66 67 h, err := New() 68 assert.NoError(t, err) 69 70 res := httptest.NewRecorder() 71 req := httptest.NewRequest("GET", "/", nil) 72 73 h.ServeHTTP(res, req) 74 75 assert.Equal(t, "Hello World", res.Body.String()) 76 } 77 78 func TestNodeWithPackageStart(t *testing.T) { 79 os.Chdir("testdata/node-pkg-start") 80 defer os.Chdir("../..") 81 82 h, err := New() 83 assert.NoError(t, err) 84 85 res := httptest.NewRecorder() 86 req := httptest.NewRequest("GET", "/", nil) 87 88 h.ServeHTTP(res, req) 89 90 assert.Equal(t, "Hello World", res.Body.String()) 91 } 92 93 func TestHandler_conditionalGet(t *testing.T) { 94 os.Chdir("testdata/static") 95 defer os.Chdir("../..") 96 97 h, err := New() 98 assert.NoError(t, err) 99 100 res := httptest.NewRecorder() 101 req := httptest.NewRequest("GET", "/style.css", nil) 102 req.Header.Set("If-Modified-Since", "Thu, 27 Jul 2030 03:30:31 GMT") 103 h.ServeHTTP(res, req) 104 assert.Equal(t, 304, res.Code) 105 assert.Equal(t, "", res.Header().Get("Content-Length")) 106 assert.Equal(t, "", res.Body.String()) 107 } 108 109 func TestHandler_rewrite(t *testing.T) { 110 os.Chdir("testdata/static-rewrites") 111 defer os.Chdir("../..") 112 113 h, err := New() 114 assert.NoError(t, err) 115 116 res := httptest.NewRecorder() 117 req := httptest.NewRequest("GET", "/docs/ping/guides/alerts", nil) 118 h.ServeHTTP(res, req) 119 assert.Equal(t, 200, res.Code) 120 assert.Equal(t, "14", res.Header().Get("Content-Length")) 121 assert.Equal(t, "Alerting docs\n", res.Body.String()) 122 } 123 124 func TestHandler_redirect(t *testing.T) { 125 os.Chdir("testdata/static-redirects") 126 defer os.Chdir("../..") 127 128 h, err := New() 129 assert.NoError(t, err) 130 131 res := httptest.NewRecorder() 132 req := httptest.NewRequest("GET", "/docs/ping/guides/alerts/", nil) 133 h.ServeHTTP(res, req) 134 assert.Equal(t, "/help/ping/alerts", res.Header().Get("Location")) 135 assert.Equal(t, 302, res.Code) 136 assert.Equal(t, "Found\n", res.Body.String()) 137 } 138 139 func TestHandler_spa(t *testing.T) { 140 os.Chdir("testdata/spa") 141 defer os.Chdir("../..") 142 143 h, err := New() 144 assert.NoError(t, err) 145 146 t.Run("index", func(t *testing.T) { 147 res := httptest.NewRecorder() 148 req := httptest.NewRequest("GET", "/", nil) 149 h.ServeHTTP(res, req) 150 assert.Equal(t, 200, res.Code) 151 assert.Equal(t, "Index\n", res.Body.String()) 152 }) 153 154 t.Run("redirect", func(t *testing.T) { 155 res := httptest.NewRecorder() 156 req := httptest.NewRequest("GET", "/index.html", nil) 157 h.ServeHTTP(res, req) 158 assert.Equal(t, 301, res.Code) 159 }) 160 161 t.Run("file does not exist", func(t *testing.T) { 162 res := httptest.NewRecorder() 163 req := httptest.NewRequest("GET", "/something/here", nil) 164 h.ServeHTTP(res, req) 165 assert.Equal(t, 200, res.Code) 166 assert.Equal(t, "Index\n", res.Body.String()) 167 }) 168 169 t.Run("file exists", func(t *testing.T) { 170 res := httptest.NewRecorder() 171 req := httptest.NewRequest("GET", "/app.js", nil) 172 h.ServeHTTP(res, req) 173 assert.Equal(t, 200, res.Code) 174 assert.Equal(t, "app js\n", res.Body.String()) 175 }) 176 177 t.Run("file exists nested", func(t *testing.T) { 178 res := httptest.NewRecorder() 179 req := httptest.NewRequest("GET", "/css/bar.css", nil) 180 h.ServeHTTP(res, req) 181 assert.Equal(t, 200, res.Code) 182 assert.Equal(t, "bar css\n", res.Body.String()) 183 }) 184 } 185 186 func BenchmarkHandler(b *testing.B) { 187 b.ReportAllocs() 188 189 b.Run("static server", func(b *testing.B) { 190 os.Chdir("testdata/basic") 191 192 h, err := New() 193 assert.NoError(b, err) 194 195 b.ResetTimer() 196 b.SetParallelism(80) 197 198 b.RunParallel(func(pb *testing.PB) { 199 for pb.Next() { 200 res := httptest.NewRecorder() 201 req := httptest.NewRequest("GET", "/", nil) 202 h.ServeHTTP(res, req) 203 } 204 }) 205 }) 206 207 b.Run("node server relay", func(b *testing.B) { 208 os.Chdir("testdata/basic") 209 210 h, err := New() 211 assert.NoError(b, err) 212 213 b.ResetTimer() 214 b.SetParallelism(80) 215 216 b.RunParallel(func(pb *testing.PB) { 217 for pb.Next() { 218 res := httptest.NewRecorder() 219 req := httptest.NewRequest("GET", "/", nil) 220 h.ServeHTTP(res, req) 221 } 222 }) 223 }) 224 }