github.com/jalateras/up@v0.1.5/http/inject/inject_test.go (about) 1 package inject 2 3 import ( 4 "io" 5 "net/http" 6 "net/http/httptest" 7 "os" 8 "testing" 9 10 "github.com/tj/assert" 11 "github.com/apex/up" 12 13 "github.com/apex/up/http/errorpages" 14 "github.com/apex/up/http/static" 15 "github.com/apex/up/internal/inject" 16 ) 17 18 func TestInject(t *testing.T) { 19 os.Chdir("testdata") 20 defer os.Chdir("..") 21 22 c := &up.Config{ 23 Inject: inject.Rules{ 24 "head": []*inject.Rule{ 25 { 26 Type: "script", 27 Value: "/whatever.js", 28 }, 29 }, 30 }, 31 } 32 33 assert.NoError(t, c.Default(), "default") 34 assert.NoError(t, c.Validate(), "validate") 35 36 h, err := New(c, static.New(c)) 37 assert.NoError(t, err, "init") 38 39 h, err = errorpages.New(c, h) 40 assert.NoError(t, err, "init") 41 42 t.Run("2xx", func(t *testing.T) { 43 res := httptest.NewRecorder() 44 req := httptest.NewRequest("GET", "/", nil) 45 46 h.ServeHTTP(res, req) 47 48 html := `<!DOCTYPE html> 49 <html> 50 <head> 51 <meta charset="utf-8"> 52 <script src="/whatever.js"></script> 53 </head> 54 <body> 55 56 </body> 57 </html> 58 ` 59 60 assert.Equal(t, 200, res.Code) 61 assert.Equal(t, "text/html; charset=utf-8", res.Header().Get("Content-Type")) 62 assert.Equal(t, html, res.Body.String()) 63 }) 64 65 t.Run("4xx", func(t *testing.T) { 66 res := httptest.NewRecorder() 67 req := httptest.NewRequest("GET", "/missing", nil) 68 69 h.ServeHTTP(res, req) 70 71 assert.Equal(t, 404, res.Code) 72 assert.Equal(t, "text/html; charset=utf-8", res.Header().Get("Content-Type")) 73 assert.Equal(t, "<p>Not Found</p>\n", res.Body.String()) 74 }) 75 76 t.Run("non-html", func(t *testing.T) { 77 res := httptest.NewRecorder() 78 req := httptest.NewRequest("GET", "/style.css", nil) 79 80 h.ServeHTTP(res, req) 81 82 assert.Equal(t, 200, res.Code) 83 assert.Equal(t, "text/css; charset=utf-8", res.Header().Get("Content-Type")) 84 assert.Equal(t, "body{}\n", res.Body.String()) 85 }) 86 87 t.Run("write before header", func(t *testing.T) { 88 s := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 89 w.Header().Set("Content-Type", "text/html") 90 io.WriteString(w, "<html>") 91 io.WriteString(w, "<head>") 92 io.WriteString(w, "</head>") 93 io.WriteString(w, "<body>") 94 io.WriteString(w, "</body>") 95 io.WriteString(w, "</html>") 96 }) 97 98 h, err := New(c, s) 99 assert.NoError(t, err, "initialize") 100 101 res := httptest.NewRecorder() 102 req := httptest.NewRequest("GET", "/", nil) 103 104 h.ServeHTTP(res, req) 105 106 assert.Equal(t, 200, res.Code) 107 assert.Equal(t, "<html><head> <script src=\"/whatever.js\"></script>\n </head><body></body></html>", res.Body.String()) 108 }) 109 }