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 }