github.com/hhsnopek/up@v0.1.1/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  }