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