github.com/franciscocpg/up@v0.1.10/http/errorpages/errorpages_test.go (about) 1 package errorpages 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/http/httptest" 7 "os" 8 "testing" 9 10 "github.com/tj/assert" 11 "github.com/apex/up" 12 "github.com/apex/up/config" 13 ) 14 15 var server = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 16 if r.URL.Path == "/404" { 17 w.Header().Set("X-Foo", "bar") 18 http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound) 19 return 20 } 21 22 if r.URL.Path == "/400" { 23 http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest) 24 return 25 } 26 27 if r.URL.Path == "/500" { 28 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) 29 return 30 } 31 32 w.Header().Set("X-Foo", "bar") 33 w.Header().Set("Content-Type", "text/plain") 34 fmt.Fprintf(w, "Hello") 35 fmt.Fprintf(w, " ") 36 fmt.Fprintf(w, "World") 37 }) 38 39 func TestErrors_defaults(t *testing.T) { 40 os.Chdir("testdata") 41 defer os.Chdir("..") 42 43 c := &up.Config{} 44 assert.NoError(t, c.Default(), "default") 45 assert.NoError(t, c.Validate(), "validate") 46 47 test(t, c) 48 } 49 50 func TestErrors_dir(t *testing.T) { 51 c := &up.Config{ 52 ErrorPages: config.ErrorPages{ 53 Dir: "testdata", 54 }, 55 } 56 57 assert.NoError(t, c.Default(), "default") 58 assert.NoError(t, c.Validate(), "validate") 59 60 test(t, c) 61 } 62 63 func test(t *testing.T, c *up.Config) { 64 h, err := New(c, server) 65 assert.NoError(t, err, "init") 66 67 t.Run("200", func(t *testing.T) { 68 res := httptest.NewRecorder() 69 req := httptest.NewRequest("GET", "/", nil) 70 71 h.ServeHTTP(res, req) 72 73 assert.Equal(t, 200, res.Code) 74 assert.Equal(t, "bar", res.Header().Get("X-Foo")) 75 assert.Equal(t, "text/plain", res.Header().Get("Content-Type")) 76 assert.Equal(t, "Hello World", res.Body.String()) 77 }) 78 79 t.Run("exact", func(t *testing.T) { 80 res := httptest.NewRecorder() 81 req := httptest.NewRequest("GET", "/404", nil) 82 83 h.ServeHTTP(res, req) 84 85 assert.Equal(t, 404, res.Code) 86 assert.Equal(t, "", res.Header().Get("X-Foo")) 87 assert.Equal(t, "text/html; charset=utf-8", res.Header().Get("Content-Type")) 88 assert.Equal(t, "Sorry! Can't find that.\n", res.Body.String()) 89 }) 90 91 t.Run("range", func(t *testing.T) { 92 res := httptest.NewRecorder() 93 req := httptest.NewRequest("GET", "/500", nil) 94 95 h.ServeHTTP(res, req) 96 97 assert.Equal(t, 500, res.Code) 98 assert.Equal(t, "Accept", res.Header().Get("Vary")) 99 assert.Equal(t, "", res.Header().Get("X-Foo")) 100 assert.Equal(t, "text/html; charset=utf-8", res.Header().Get("Content-Type")) 101 assert.Equal(t, "500 – Internal Server Error\n", res.Body.String()) 102 }) 103 104 t.Run("default text/html", func(t *testing.T) { 105 res := httptest.NewRecorder() 106 req := httptest.NewRequest("GET", "/400", nil) 107 req.Header.Set("Accept", "text/html") 108 109 h.ServeHTTP(res, req) 110 111 assert.Equal(t, 400, res.Code) 112 assert.Equal(t, "Accept", res.Header().Get("Vary")) 113 assert.Equal(t, "", res.Header().Get("X-Foo")) 114 assert.Equal(t, "text/html; charset=utf-8", res.Header().Get("Content-Type")) 115 assert.Contains(t, res.Body.String(), "<title>Bad Request – 400</title>", "title") 116 assert.Contains(t, res.Body.String(), `<span class="status">Bad Request</span>`, "status text") 117 assert.Contains(t, res.Body.String(), `<span class="code">400</span>`, "status code") 118 }) 119 120 t.Run("default text/*", func(t *testing.T) { 121 res := httptest.NewRecorder() 122 req := httptest.NewRequest("GET", "/400", nil) 123 req.Header.Set("Accept", "text/*") 124 125 h.ServeHTTP(res, req) 126 127 assert.Equal(t, 400, res.Code) 128 assert.Equal(t, "Accept", res.Header().Get("Vary")) 129 assert.Equal(t, "", res.Header().Get("X-Foo")) 130 assert.Equal(t, "text/html; charset=utf-8", res.Header().Get("Content-Type")) 131 assert.Contains(t, res.Body.String(), "<title>Bad Request – 400</title>", "title") 132 assert.Contains(t, res.Body.String(), `<span class="status">Bad Request</span>`, "status text") 133 assert.Contains(t, res.Body.String(), `<span class="code">400</span>`, "status code") 134 }) 135 }