github.com/franciscocpg/up@v0.1.10/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 TestHandler_conditionalGet(t *testing.T) { 64 os.Chdir("testdata/static") 65 defer os.Chdir("../..") 66 67 h, err := New() 68 assert.NoError(t, err) 69 70 res := httptest.NewRecorder() 71 req := httptest.NewRequest("GET", "/style.css", nil) 72 req.Header.Set("If-Modified-Since", "Thu, 27 Jul 2030 03:30:31 GMT") 73 h.ServeHTTP(res, req) 74 assert.Equal(t, 304, res.Code) 75 assert.Equal(t, "", res.Header().Get("Content-Length")) 76 assert.Equal(t, "", res.Body.String()) 77 } 78 79 func TestHandler_rewrite(t *testing.T) { 80 os.Chdir("testdata/static-rewrites") 81 defer os.Chdir("../..") 82 83 h, err := New() 84 assert.NoError(t, err) 85 86 res := httptest.NewRecorder() 87 req := httptest.NewRequest("GET", "/docs/ping/guides/alerts", nil) 88 h.ServeHTTP(res, req) 89 assert.Equal(t, 200, res.Code) 90 assert.Equal(t, "14", res.Header().Get("Content-Length")) 91 assert.Equal(t, "Alerting docs\n", res.Body.String()) 92 } 93 94 func TestHandler_redirect(t *testing.T) { 95 os.Chdir("testdata/static-redirects") 96 defer os.Chdir("../..") 97 98 h, err := New() 99 assert.NoError(t, err) 100 101 res := httptest.NewRecorder() 102 req := httptest.NewRequest("GET", "/docs/ping/guides/alerts/", nil) 103 h.ServeHTTP(res, req) 104 assert.Equal(t, "/help/ping/alerts", res.Header().Get("Location")) 105 assert.Equal(t, 302, res.Code) 106 assert.Equal(t, "Found\n", res.Body.String()) 107 } 108 109 func TestHandler_spa(t *testing.T) { 110 os.Chdir("testdata/spa") 111 defer os.Chdir("../..") 112 113 h, err := New() 114 assert.NoError(t, err) 115 116 t.Run("index", func(t *testing.T) { 117 res := httptest.NewRecorder() 118 req := httptest.NewRequest("GET", "/", nil) 119 h.ServeHTTP(res, req) 120 assert.Equal(t, 200, res.Code) 121 assert.Equal(t, "Index\n", res.Body.String()) 122 }) 123 124 t.Run("redirect", func(t *testing.T) { 125 res := httptest.NewRecorder() 126 req := httptest.NewRequest("GET", "/index.html", nil) 127 h.ServeHTTP(res, req) 128 assert.Equal(t, 301, res.Code) 129 }) 130 131 t.Run("file does not exist", func(t *testing.T) { 132 res := httptest.NewRecorder() 133 req := httptest.NewRequest("GET", "/something/here", nil) 134 h.ServeHTTP(res, req) 135 assert.Equal(t, 200, res.Code) 136 assert.Equal(t, "Index\n", res.Body.String()) 137 }) 138 139 t.Run("file exists", func(t *testing.T) { 140 res := httptest.NewRecorder() 141 req := httptest.NewRequest("GET", "/app.js", nil) 142 h.ServeHTTP(res, req) 143 assert.Equal(t, 200, res.Code) 144 assert.Equal(t, "app js\n", res.Body.String()) 145 }) 146 147 t.Run("file exists nested", func(t *testing.T) { 148 res := httptest.NewRecorder() 149 req := httptest.NewRequest("GET", "/css/bar.css", nil) 150 h.ServeHTTP(res, req) 151 assert.Equal(t, 200, res.Code) 152 assert.Equal(t, "bar css\n", res.Body.String()) 153 }) 154 } 155 156 func BenchmarkHandler(b *testing.B) { 157 b.ReportAllocs() 158 159 b.Run("static server", func(b *testing.B) { 160 os.Chdir("testdata/basic") 161 162 h, err := New() 163 assert.NoError(b, err) 164 165 b.ResetTimer() 166 b.SetParallelism(80) 167 168 b.RunParallel(func(pb *testing.PB) { 169 for pb.Next() { 170 res := httptest.NewRecorder() 171 req := httptest.NewRequest("GET", "/", nil) 172 h.ServeHTTP(res, req) 173 } 174 }) 175 }) 176 177 b.Run("node server relay", func(b *testing.B) { 178 os.Chdir("testdata/basic") 179 180 h, err := New() 181 assert.NoError(b, err) 182 183 b.ResetTimer() 184 b.SetParallelism(80) 185 186 b.RunParallel(func(pb *testing.PB) { 187 for pb.Next() { 188 res := httptest.NewRecorder() 189 req := httptest.NewRequest("GET", "/", nil) 190 h.ServeHTTP(res, req) 191 } 192 }) 193 }) 194 }