goyave.dev/goyave/v5@v5.0.0-rc9.0.20240517145003-d3f977d0b9f3/request_test.go (about)

     1  package goyave
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestRequest(t *testing.T) {
    14  
    15  	t.Run("NewRequest", func(t *testing.T) {
    16  		httpReq := httptest.NewRequest(http.MethodGet, "/test", nil)
    17  		r := NewRequest(httpReq)
    18  
    19  		assert.Equal(t, httpReq, r.httpRequest)
    20  		assert.False(t, r.Now.IsZero())
    21  		assert.NotNil(t, r.Extra)
    22  	})
    23  
    24  	t.Run("Accessors", func(t *testing.T) {
    25  		httpReq := httptest.NewRequest(http.MethodPost, "/test", bytes.NewBufferString("hello"))
    26  		httpReq.Header.Set("X-Test", "value")
    27  		httpReq.Header.Set("Referer", "referrer")
    28  		httpReq.Header.Set("User-Agent", "useragent")
    29  		httpReq.SetBasicAuth("username", "password")
    30  		httpReq.AddCookie(&http.Cookie{Name: "test-cookie", Value: "value"})
    31  		r := NewRequest(httpReq)
    32  
    33  		assert.Equal(t, httpReq, r.Request())
    34  		assert.Equal(t, http.MethodPost, r.Method())
    35  		assert.Equal(t, "HTTP/1.1", r.Protocol())
    36  		assert.Equal(t, "/test", r.URL().String())
    37  
    38  		assert.Equal(t, httpReq.Header, r.Header())
    39  		assert.Equal(t, "/test", r.URL().String())
    40  		assert.Equal(t, int64(5), r.ContentLength())
    41  		assert.Equal(t, "192.0.2.1:1234", r.RemoteAddress())
    42  
    43  		cookies := r.Cookies()
    44  		assert.Equal(t, cookies, r.cookies)
    45  		assert.Equal(t, []*http.Cookie{{Name: "test-cookie", Value: "value"}}, cookies)
    46  
    47  		assert.Equal(t, "referrer", r.Referrer())
    48  		assert.Equal(t, "useragent", r.UserAgent())
    49  
    50  		username, password, ok := r.BasicAuth()
    51  		assert.Equal(t, "username", username)
    52  		assert.Equal(t, "password", password)
    53  		assert.True(t, ok)
    54  
    55  		assert.NotNil(t, r.Body())
    56  		httpReq = httptest.NewRequest(http.MethodGet, "/test", nil)
    57  		assert.NotNil(t, NewRequest(httpReq).Body())
    58  	})
    59  
    60  	t.Run("BearerToken", func(t *testing.T) {
    61  		httpReq := httptest.NewRequest(http.MethodGet, "/test", nil)
    62  		httpReq.Header.Set("Authorization", "Bearer  token  ")
    63  		r := NewRequest(httpReq)
    64  
    65  		token, ok := r.BearerToken()
    66  		assert.Equal(t, "token", token)
    67  		assert.True(t, ok)
    68  
    69  		httpReq = httptest.NewRequest(http.MethodGet, "/test", nil)
    70  		r = NewRequest(httpReq)
    71  
    72  		token, ok = r.BearerToken()
    73  		assert.Empty(t, token)
    74  		assert.False(t, ok)
    75  	})
    76  
    77  	t.Run("Context", func(t *testing.T) {
    78  		httpReq := httptest.NewRequest(http.MethodGet, "/test", nil)
    79  		r := NewRequest(httpReq)
    80  
    81  		ctx := r.Context()
    82  		if !assert.NotNil(t, ctx) {
    83  			return
    84  		}
    85  		assert.Equal(t, httpReq.Context(), ctx)
    86  
    87  		key := struct{}{}
    88  		r2 := r.WithContext(context.WithValue(ctx, key, "value"))
    89  		assert.Equal(t, r, r2)
    90  
    91  		ctx2 := r.Context()
    92  		assert.Equal(t, "value", ctx2.Value(key))
    93  	})
    94  }