github.com/goravel/framework@v1.13.9/validation/validator_test.go (about) 1 package validation 2 3 import ( 4 "bytes" 5 "io" 6 "mime/multipart" 7 "net/http" 8 "os" 9 "path/filepath" 10 "testing" 11 12 "github.com/gookit/validate" 13 "github.com/stretchr/testify/assert" 14 ) 15 16 func TestBind(t *testing.T) { 17 type Data struct { 18 A string 19 B int 20 C string 21 File *multipart.FileHeader 22 } 23 24 request := buildRequest(t) 25 26 tests := []struct { 27 name string 28 data validate.DataFace 29 rules map[string]string 30 expectData Data 31 expectErr error 32 }{ 33 { 34 name: "success when data is map and key is lowercase", 35 data: validate.FromMap(map[string]any{"a": "aa"}), 36 rules: map[string]string{"a": "required"}, 37 expectData: Data{ 38 A: "aa", 39 }, 40 }, 41 { 42 name: "success when data is map, key is lowercase and has errors", 43 data: validate.FromMap(map[string]any{"a": "aa", "c": "cc"}), 44 rules: map[string]string{"a": "required", "b": "required"}, 45 expectData: Data{ 46 A: "aa", 47 C: "cc", 48 }, 49 }, 50 { 51 name: "success when data is map and key is uppercase", 52 data: validate.FromMap(map[string]any{"A": "aa"}), 53 rules: map[string]string{"A": "required"}, 54 expectData: Data{ 55 A: "aa", 56 }, 57 }, 58 { 59 name: "success when data is struct and key is uppercase", 60 data: func() validate.DataFace { 61 data, err := validate.FromStruct(struct { 62 A string 63 }{ 64 A: "aa", 65 }) 66 assert.Nil(t, err) 67 68 return data 69 }(), 70 rules: map[string]string{"A": "required"}, 71 expectData: Data{ 72 A: "aa", 73 }, 74 }, 75 { 76 name: "empty when data is struct and key is lowercase", 77 data: func() validate.DataFace { 78 data, err := validate.FromStruct(struct { 79 a string 80 }{ 81 a: "aa", 82 }) 83 assert.Nil(t, err) 84 85 return data 86 }(), 87 rules: map[string]string{"a": "required"}, 88 expectData: Data{}, 89 }, 90 { 91 name: "success when data is get request", 92 data: func() validate.DataFace { 93 request, err := http.NewRequest(http.MethodGet, "/?a=aa", nil) 94 assert.Nil(t, err) 95 data, err := validate.FromRequest(request) 96 assert.Nil(t, err) 97 98 return data 99 }(), 100 rules: map[string]string{"A": "required"}, 101 expectData: Data{ 102 A: "aa", 103 }, 104 }, 105 { 106 name: "success when data is post request", 107 data: func() validate.DataFace { 108 request, err := http.NewRequest(http.MethodGet, "/?a=aa", nil) 109 assert.Nil(t, err) 110 data, err := validate.FromRequest(request) 111 assert.Nil(t, err) 112 113 return data 114 }(), 115 rules: map[string]string{"A": "required"}, 116 expectData: Data{ 117 A: "aa", 118 }, 119 }, 120 { 121 name: "success when data is post request with body", 122 data: func() validate.DataFace { 123 data, err := validate.FromRequest(request, 1) 124 assert.Nil(t, err) 125 126 return data 127 }(), 128 rules: map[string]string{"A": "required", "File": "required"}, 129 expectData: func() Data { 130 _, fileHeader, _ := request.FormFile("file") 131 data := Data{ 132 A: "aa", 133 File: fileHeader, 134 } 135 136 return data 137 }(), 138 }, 139 } 140 141 for _, test := range tests { 142 t.Run(test.name, func(t *testing.T) { 143 validator := &Validator{data: test.data} 144 145 var data Data 146 err := validator.Bind(&data) 147 assert.Nil(t, test.expectErr, err) 148 assert.Equal(t, test.expectData.A, data.A) 149 assert.Equal(t, test.expectData.B, data.B) 150 assert.Equal(t, test.expectData.C, data.C) 151 assert.Equal(t, test.expectData.File == nil, data.File == nil) 152 }) 153 } 154 } 155 156 func TestFails(t *testing.T) { 157 var maker *Validation 158 tests := []struct { 159 describe string 160 data any 161 rules map[string]string 162 expectRes bool 163 }{ 164 { 165 describe: "false", 166 data: map[string]any{"a": "aa"}, 167 rules: map[string]string{"a": "required"}, 168 }, 169 { 170 describe: "true", 171 data: map[string]any{"b": "bb"}, 172 rules: map[string]string{"a": "required"}, 173 expectRes: true, 174 }, 175 } 176 177 for _, test := range tests { 178 maker = NewValidation() 179 validator, err := maker.Make( 180 test.data, 181 test.rules, 182 ) 183 assert.Nil(t, err) 184 assert.Equal(t, test.expectRes, validator.Fails(), test.describe) 185 } 186 } 187 188 func buildRequest(t *testing.T) *http.Request { 189 payload := &bytes.Buffer{} 190 writer := multipart.NewWriter(payload) 191 192 err := writer.WriteField("a", "aa") 193 assert.Nil(t, err) 194 195 logo, err := os.Open("../logo.png") 196 assert.Nil(t, err) 197 198 defer logo.Close() 199 part1, err := writer.CreateFormFile("file", filepath.Base("../logo.png")) 200 assert.Nil(t, err) 201 202 _, err = io.Copy(part1, logo) 203 assert.Nil(t, err) 204 assert.Nil(t, writer.Close()) 205 206 request, err := http.NewRequest(http.MethodPost, "/", payload) 207 assert.Nil(t, err) 208 request.Header.Set("Content-Type", writer.FormDataContentType()) 209 210 return request 211 }