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