github.com/System-Glitch/goyave/v3@v3.6.1-0.20210226143142-ac2fe42ee80e/request_test.go (about)

     1  package goyave
     2  
     3  import (
     4  	"net"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"net/url"
     8  	"strings"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/System-Glitch/goyave/v3/cors"
    13  
    14  	"github.com/System-Glitch/goyave/v3/helper/filesystem"
    15  	"github.com/System-Glitch/goyave/v3/validation"
    16  	"github.com/google/uuid"
    17  	"github.com/stretchr/testify/assert"
    18  )
    19  
    20  func createTestRequest(rawRequest *http.Request) *Request {
    21  	return &Request{
    22  		httpRequest: rawRequest,
    23  		Rules:       &validation.Rules{},
    24  		Params:      map[string]string{},
    25  	}
    26  }
    27  func TestRequestContentLength(t *testing.T) {
    28  	rawRequest := httptest.NewRequest("GET", "/test-route", strings.NewReader("body"))
    29  	request := createTestRequest(rawRequest)
    30  	assert.Equal(t, int64(4), request.ContentLength())
    31  }
    32  
    33  func TestRequestMethod(t *testing.T) {
    34  	rawRequest := httptest.NewRequest("GET", "/test-route", strings.NewReader("body"))
    35  	request := createTestRequest(rawRequest)
    36  	assert.Equal(t, "GET", request.Method())
    37  
    38  	rawRequest = httptest.NewRequest("POST", "/test-route", strings.NewReader("body"))
    39  	request = createTestRequest(rawRequest)
    40  	assert.Equal(t, "POST", request.Method())
    41  }
    42  
    43  func TestRequestRemoteAddress(t *testing.T) {
    44  	rawRequest := httptest.NewRequest("GET", "/test-route", strings.NewReader("body"))
    45  	request := createTestRequest(rawRequest)
    46  	assert.Equal(t, "192.0.2.1:1234", request.RemoteAddress())
    47  }
    48  
    49  func TestRequestProtocol(t *testing.T) {
    50  	rawRequest := httptest.NewRequest("GET", "/test-route", strings.NewReader("body"))
    51  	request := createTestRequest(rawRequest)
    52  	assert.Equal(t, "HTTP/1.1", request.Protocol())
    53  }
    54  
    55  func TestRequestURL(t *testing.T) {
    56  	rawRequest := httptest.NewRequest("GET", "/test-route", strings.NewReader("body"))
    57  	request := createTestRequest(rawRequest)
    58  	assert.Equal(t, "/test-route", request.URI().Path)
    59  }
    60  
    61  func TestRequestReferrer(t *testing.T) {
    62  	rawRequest := httptest.NewRequest("GET", "/test-route", strings.NewReader("body"))
    63  	rawRequest.Header.Set("Referer", "https://www.google.com")
    64  	request := createTestRequest(rawRequest)
    65  	assert.Equal(t, "https://www.google.com", request.Referrer())
    66  }
    67  
    68  func TestRequestUserAgent(t *testing.T) {
    69  	rawRequest := httptest.NewRequest("GET", "/test-route", strings.NewReader("body"))
    70  	rawRequest.Header.Set("User-Agent", "goyave/version")
    71  	request := createTestRequest(rawRequest)
    72  	assert.Equal(t, "goyave/version", request.UserAgent())
    73  }
    74  
    75  func TestRequestCookies(t *testing.T) {
    76  	rawRequest := httptest.NewRequest("GET", "/test-route", strings.NewReader("body"))
    77  	rawRequest.AddCookie(&http.Cookie{
    78  		Name:  "cookie-name",
    79  		Value: "test",
    80  	})
    81  	request := createTestRequest(rawRequest)
    82  	cookies := request.Cookies("cookie-name")
    83  	assert.Equal(t, 1, len(cookies))
    84  	assert.Equal(t, "test", cookies[0].Value)
    85  }
    86  
    87  func TestRequestValidate(t *testing.T) {
    88  	rawRequest := httptest.NewRequest("POST", "/test-route", strings.NewReader("string=hello%20world&number=42"))
    89  	rawRequest.Header.Set("Content-Type", "application/json")
    90  	request := createTestRequest(rawRequest)
    91  	request.Data = map[string]interface{}{
    92  		"string": "hello world",
    93  		"number": 42,
    94  	}
    95  	request.Rules = validation.RuleSet{
    96  		"string": {"required", "string"},
    97  		"number": {"required", "numeric", "min:10"},
    98  	}.AsRules()
    99  	errors := request.validate()
   100  	assert.Nil(t, errors)
   101  
   102  	rawRequest = httptest.NewRequest("POST", "/test-route", strings.NewReader("string=hello%20world"))
   103  	rawRequest.Header.Set("Content-Type", "application/json")
   104  	request = createTestRequest(rawRequest)
   105  	request.Data = map[string]interface{}{
   106  		"string": "hello world",
   107  	}
   108  
   109  	request.Rules = &validation.Rules{
   110  		Fields: validation.FieldMap{
   111  			"string": {
   112  				Rules: []*validation.Rule{
   113  					{Name: "required"},
   114  					{Name: "string"},
   115  				},
   116  			},
   117  			"number": {
   118  				Rules: []*validation.Rule{
   119  					{Name: "required"},
   120  					{Name: "numeric"},
   121  					{Name: "min", Params: []string{"50"}},
   122  				},
   123  			},
   124  		},
   125  	}
   126  	errors = request.validate()
   127  	assert.NotNil(t, errors)
   128  	assert.Equal(t, 2, len(errors["number"]))
   129  
   130  	rawRequest = httptest.NewRequest("POST", "/test-route", strings.NewReader("string=hello%20world&number=42"))
   131  	rawRequest.Header.Set("Content-Type", "application/json")
   132  	request = createTestRequest(rawRequest)
   133  	request.Rules = nil
   134  	errors = request.validate()
   135  	assert.Nil(t, errors)
   136  }
   137  
   138  func TestRequestAccessors(t *testing.T) {
   139  	loc, err := time.LoadLocation("America/New_York")
   140  	if err != nil {
   141  		panic(err)
   142  	}
   143  
   144  	uid, err := uuid.Parse("3bbcee75-cecc-5b56-8031-b6641c1ed1f1")
   145  	if err != nil {
   146  		panic(err)
   147  	}
   148  
   149  	date, err := time.Parse("2006-01-02", "2019-11-21")
   150  	if err != nil {
   151  		panic(err)
   152  	}
   153  
   154  	url, err := url.ParseRequestURI("https://google.com")
   155  	if err != nil {
   156  		panic(err)
   157  	}
   158  
   159  	rawRequest := httptest.NewRequest("POST", "/test-route", nil)
   160  	request := createTestRequest(rawRequest)
   161  	request.Data = map[string]interface{}{
   162  		"string":   "hello world",
   163  		"integer":  42,
   164  		"numeric":  42.3,
   165  		"bool":     true,
   166  		"file":     []filesystem.File{{MIMEType: "image/png"}},
   167  		"timezone": loc,
   168  		"ip":       net.ParseIP("127.0.0.1"),
   169  		"uuid":     uid,
   170  		"date":     date,
   171  		"url":      url,
   172  		"object": map[string]interface{}{
   173  			"hello": "world",
   174  		},
   175  	}
   176  
   177  	assert.Equal(t, "hello world", request.String("string"))
   178  	assert.Equal(t, 42, request.Integer("integer"))
   179  	assert.Equal(t, 42.3, request.Numeric("numeric"))
   180  	assert.Equal(t, rawRequest, request.Request())
   181  	assert.True(t, request.Bool("bool"))
   182  
   183  	files := request.File("file")
   184  	assert.Len(t, files, 1)
   185  	assert.Equal(t, "image/png", files[0].MIMEType)
   186  
   187  	assert.Equal(t, "America/New_York", request.Timezone("timezone").String())
   188  	assert.Equal(t, "127.0.0.1", request.IP("ip").String())
   189  	assert.Equal(t, "3bbcee75-cecc-5b56-8031-b6641c1ed1f1", request.UUID("uuid").String())
   190  	assert.Equal(t, "2019-11-21 00:00:00 +0000 UTC", request.Date("date").String())
   191  	assert.Equal(t, "https://google.com", request.URL("url").String())
   192  	assert.Equal(t, request.Data["object"], request.Object("object"))
   193  
   194  	assert.Panics(t, func() { request.String("integer") })
   195  	assert.Panics(t, func() { request.Integer("string") })
   196  	assert.Panics(t, func() { request.Numeric("string") })
   197  	assert.Panics(t, func() { request.Bool("string") })
   198  	assert.Panics(t, func() { request.File("string") })
   199  	assert.Panics(t, func() { request.Timezone("string") })
   200  	assert.Panics(t, func() { request.IP("string") })
   201  	assert.Panics(t, func() { request.UUID("string") })
   202  	assert.Panics(t, func() { request.Date("string") })
   203  	assert.Panics(t, func() { request.URL("string") })
   204  	assert.Panics(t, func() { request.String("doesn't exist") })
   205  	assert.Panics(t, func() { request.Object("doesn't exist") })
   206  }
   207  
   208  func TestRequestHas(t *testing.T) {
   209  	request := createTestRequest(httptest.NewRequest("POST", "/test-route", nil))
   210  	request.Data = map[string]interface{}{
   211  		"string": "hello world",
   212  	}
   213  
   214  	assert.True(t, request.Has("string"))
   215  	assert.False(t, request.Has("not_in_request"))
   216  }
   217  
   218  func TestRequestCors(t *testing.T) {
   219  	request := createTestRequest(httptest.NewRequest("POST", "/test-route", nil))
   220  
   221  	assert.Nil(t, request.CORSOptions())
   222  
   223  	request.corsOptions = cors.Default()
   224  	options := request.CORSOptions()
   225  	assert.NotNil(t, options)
   226  
   227  	// Check cannot alter config
   228  	options.MaxAge = time.Second
   229  	assert.NotEqual(t, request.corsOptions.MaxAge, options.MaxAge)
   230  }
   231  
   232  func TestGetBearerToken(t *testing.T) {
   233  	request := createTestRequest(httptest.NewRequest("POST", "/test-route", nil))
   234  	request.Header().Set("Authorization", "NotBearer 123456789")
   235  	token, ok := request.BearerToken()
   236  	assert.Empty(t, token)
   237  	assert.False(t, ok)
   238  
   239  	request.Header().Set("Authorization", "Bearer123456789")
   240  	token, ok = request.BearerToken()
   241  	assert.Empty(t, token)
   242  	assert.False(t, ok)
   243  
   244  	request.Header().Set("Authorization", "Bearer 123456789")
   245  	token, ok = request.BearerToken()
   246  	assert.Equal(t, "123456789", token)
   247  	assert.True(t, ok)
   248  }
   249  
   250  func TestToStruct(t *testing.T) {
   251  	type UserInsertRequest struct {
   252  		Username string
   253  		Email    string
   254  	}
   255  
   256  	request := createTestRequest(httptest.NewRequest("POST", "/test-route", nil))
   257  	request.Data = map[string]interface{}{
   258  		"username": "johndoe",
   259  		"email":    "johndoe@example.org",
   260  	}
   261  
   262  	userInsertRequest := UserInsertRequest{}
   263  
   264  	if err := request.ToStruct(&userInsertRequest); err != nil {
   265  		assert.FailNow(t, err.Error())
   266  	}
   267  
   268  	assert.Equal(t, "johndoe", userInsertRequest.Username)
   269  	assert.Equal(t, "johndoe@example.org", userInsertRequest.Email)
   270  }