github.com/orteth01/up@v0.2.0/http/relay/relay_test.go (about)

     1  package relay
     2  
     3  import (
     4  	"net/http/httptest"
     5  	"os"
     6  	"strings"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/tj/assert"
    11  
    12  	"github.com/apex/up"
    13  )
    14  
    15  // TODO: fix hanging
    16  
    17  func TestRelay(t *testing.T) {
    18  	os.Chdir("testdata/basic")
    19  	defer os.Chdir("../..")
    20  
    21  	c := &up.Config{}
    22  	assert.NoError(t, c.Default(), "default")
    23  
    24  	h, err := New(c)
    25  	assert.NoError(t, err, "init")
    26  
    27  	t.Run("GET simple", func(t *testing.T) {
    28  		res := httptest.NewRecorder()
    29  		req := httptest.NewRequest("GET", "/hello", nil)
    30  
    31  		start := time.Now()
    32  		h.ServeHTTP(res, req)
    33  		t.Logf("latency = %s", time.Since(start))
    34  
    35  		assert.Equal(t, 200, res.Code)
    36  		assert.Equal(t, "text/plain", res.Header().Get("Content-Type"))
    37  		assert.Equal(t, "Hello World", res.Body.String())
    38  	})
    39  
    40  	t.Run("GET encoded path", func(t *testing.T) {
    41  		t.Run("200", func(t *testing.T) {
    42  			res := httptest.NewRecorder()
    43  			req := httptest.NewRequest("GET", "/echo/01BM82CJ9K1WK6EFJX8C1R4YH7/foo%20%25%20bar%20&%20baz%20=%20raz", nil)
    44  			req.Header.Set("Host", "example.com")
    45  			req.Header.Set("User-Agent", "tobi")
    46  
    47  			h.ServeHTTP(res, req)
    48  
    49  			body := `{
    50    "header": {
    51      "host": "example.com",
    52      "user-agent": "tobi",
    53      "x-forwarded-for": "192.0.2.1",
    54      "accept-encoding": "gzip"
    55    },
    56    "url": "/echo/01BM82CJ9K1WK6EFJX8C1R4YH7/foo%20%25%20bar%20&%20baz%20=%20raz",
    57    "body": ""
    58  }`
    59  
    60  			assert.Equal(t, 200, res.Code)
    61  			assert.Equal(t, "application/json", res.Header().Get("Content-Type"))
    62  			assertString(t, body, res.Body.String())
    63  		})
    64  	})
    65  
    66  	t.Run("POST basic", func(t *testing.T) {
    67  		t.Run("200", func(t *testing.T) {
    68  			res := httptest.NewRecorder()
    69  			req := httptest.NewRequest("POST", "/echo/something", strings.NewReader("Some body here"))
    70  
    71  			h.ServeHTTP(res, req)
    72  
    73  			body := `{
    74    "header": {
    75      "host": "example.com",
    76      "content-length": "14",
    77      "x-forwarded-for": "192.0.2.1",
    78      "accept-encoding": "gzip"
    79    },
    80    "url": "/echo/something",
    81    "body": "Some body here"
    82  }`
    83  
    84  			assert.Equal(t, 200, res.Code)
    85  			assert.Equal(t, "application/json", res.Header().Get("Content-Type"))
    86  			assertString(t, body, res.Body.String())
    87  		})
    88  	})
    89  
    90  	t.Run("restart server", func(t *testing.T) {
    91  		t.Run("200", func(t *testing.T) {
    92  			res := httptest.NewRecorder()
    93  			req := httptest.NewRequest("GET", "/throw/env", nil)
    94  
    95  			h.ServeHTTP(res, req)
    96  
    97  			assert.Equal(t, 200, res.Code)
    98  			assertString(t, "Hello", res.Body.String())
    99  		})
   100  	})
   101  
   102  }
   103  
   104  // TODO: move test to handler pkg or just test the config
   105  func TestRelay_node(t *testing.T) {
   106  	os.Chdir("testdata/node")
   107  	defer os.Chdir("../..")
   108  
   109  	c, err := up.ReadConfig("up.json")
   110  	assert.NoError(t, err, "config")
   111  
   112  	h, err := New(c)
   113  	assert.NoError(t, err)
   114  
   115  	t.Run("npm start", func(t *testing.T) {
   116  		res := httptest.NewRecorder()
   117  		req := httptest.NewRequest("GET", "/", nil)
   118  
   119  		h.ServeHTTP(res, req)
   120  
   121  		assert.Equal(t, 200, res.Code)
   122  		assertString(t, "Node", res.Body.String())
   123  	})
   124  }
   125  
   126  func assertString(t testing.TB, want, got string) {
   127  	if want != got {
   128  		t.Fatalf("\nwant:\n\n%s\n\ngot:\n\n%s\n", want, got)
   129  	}
   130  }
   131  
   132  func BenchmarkRelay(b *testing.B) {
   133  	os.Chdir("testdata/basic")
   134  	defer os.Chdir("../..")
   135  
   136  	b.ReportAllocs()
   137  
   138  	c := &up.Config{}
   139  	assert.NoError(b, c.Default(), "default")
   140  
   141  	h, err := New(c)
   142  	assert.NoError(b, err)
   143  
   144  	b.ResetTimer()
   145  	b.SetParallelism(30)
   146  
   147  	b.RunParallel(func(pb *testing.PB) {
   148  		for pb.Next() {
   149  			res := httptest.NewRecorder()
   150  			req := httptest.NewRequest("GET", "/", nil)
   151  			h.ServeHTTP(res, req)
   152  		}
   153  	})
   154  }