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