github.com/gogf/gf@v1.16.9/util/gvalid/gvalid_z_unit_custom_rule_test.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/gogf/gf. 6 7 package gvalid_test 8 9 import ( 10 "context" 11 "errors" 12 "testing" 13 14 "github.com/gogf/gf/frame/g" 15 "github.com/gogf/gf/util/gconv" 16 17 "github.com/gogf/gf/test/gtest" 18 "github.com/gogf/gf/util/gvalid" 19 ) 20 21 func Test_CustomRule1(t *testing.T) { 22 rule := "custom" 23 err := gvalid.RegisterRule( 24 rule, 25 func(ctx context.Context, rule string, value interface{}, message string, data interface{}) error { 26 pass := gconv.String(value) 27 if len(pass) != 6 { 28 return errors.New(message) 29 } 30 m := gconv.Map(data) 31 if m["data"] != pass { 32 return errors.New(message) 33 } 34 return nil 35 }, 36 ) 37 gtest.Assert(err, nil) 38 gtest.C(t, func(t *gtest.T) { 39 err := gvalid.CheckValue(context.TODO(), "123456", rule, "custom message") 40 t.Assert(err.String(), "custom message") 41 err = gvalid.CheckValue(context.TODO(), "123456", rule, "custom message", g.Map{"data": "123456"}) 42 t.Assert(err, nil) 43 }) 44 // Error with struct validation. 45 gtest.C(t, func(t *gtest.T) { 46 type T struct { 47 Value string `v:"uid@custom#自定义错误"` 48 Data string `p:"data"` 49 } 50 st := &T{ 51 Value: "123", 52 Data: "123456", 53 } 54 err := gvalid.CheckStruct(context.TODO(), st, nil) 55 t.Assert(err.String(), "自定义错误") 56 }) 57 // No error with struct validation. 58 gtest.C(t, func(t *gtest.T) { 59 type T struct { 60 Value string `v:"uid@custom#自定义错误"` 61 Data string `p:"data"` 62 } 63 st := &T{ 64 Value: "123456", 65 Data: "123456", 66 } 67 err := gvalid.CheckStruct(context.TODO(), st, nil) 68 t.Assert(err, nil) 69 }) 70 } 71 72 func Test_CustomRule2(t *testing.T) { 73 rule := "required-map" 74 err := gvalid.RegisterRule(rule, func(ctx context.Context, rule string, value interface{}, message string, data interface{}) error { 75 m := gconv.Map(value) 76 if len(m) == 0 { 77 return errors.New(message) 78 } 79 return nil 80 }) 81 gtest.Assert(err, nil) 82 // Check. 83 gtest.C(t, func(t *gtest.T) { 84 errStr := "data map should not be empty" 85 t.Assert(gvalid.CheckValue(context.TODO(), g.Map{}, rule, errStr).String(), errStr) 86 t.Assert(gvalid.CheckValue(context.TODO(), g.Map{"k": "v"}, rule, errStr), nil) 87 }) 88 // Error with struct validation. 89 gtest.C(t, func(t *gtest.T) { 90 type T struct { 91 Value map[string]string `v:"uid@required-map#自定义错误"` 92 Data string `p:"data"` 93 } 94 st := &T{ 95 Value: map[string]string{}, 96 Data: "123456", 97 } 98 err := gvalid.CheckStruct(context.TODO(), st, nil) 99 t.Assert(err.String(), "自定义错误") 100 }) 101 // No error with struct validation. 102 gtest.C(t, func(t *gtest.T) { 103 type T struct { 104 Value map[string]string `v:"uid@required-map#自定义错误"` 105 Data string `p:"data"` 106 } 107 st := &T{ 108 Value: map[string]string{"k": "v"}, 109 Data: "123456", 110 } 111 err := gvalid.CheckStruct(context.TODO(), st, nil) 112 t.Assert(err, nil) 113 }) 114 } 115 116 func Test_CustomRule_AllowEmpty(t *testing.T) { 117 rule := "allow-empty-str" 118 err := gvalid.RegisterRule(rule, func(ctx context.Context, rule string, value interface{}, message string, data interface{}) error { 119 s := gconv.String(value) 120 if len(s) == 0 || s == "gf" { 121 return nil 122 } 123 return errors.New(message) 124 }) 125 gtest.Assert(err, nil) 126 // Check. 127 gtest.C(t, func(t *gtest.T) { 128 errStr := "error" 129 t.Assert(gvalid.CheckValue(context.TODO(), "", rule, errStr), nil) 130 t.Assert(gvalid.CheckValue(context.TODO(), "gf", rule, errStr), nil) 131 t.Assert(gvalid.CheckValue(context.TODO(), "gf2", rule, errStr).String(), errStr) 132 }) 133 // Error with struct validation. 134 gtest.C(t, func(t *gtest.T) { 135 type T struct { 136 Value string `v:"uid@allow-empty-str#自定义错误"` 137 Data string `p:"data"` 138 } 139 st := &T{ 140 Value: "", 141 Data: "123456", 142 } 143 err := gvalid.CheckStruct(context.TODO(), st, nil) 144 t.Assert(err, nil) 145 }) 146 // No error with struct validation. 147 gtest.C(t, func(t *gtest.T) { 148 type T struct { 149 Value string `v:"uid@allow-empty-str#自定义错误"` 150 Data string `p:"data"` 151 } 152 st := &T{ 153 Value: "john", 154 Data: "123456", 155 } 156 err := gvalid.CheckStruct(context.TODO(), st, nil) 157 t.Assert(err.String(), "自定义错误") 158 }) 159 } 160 161 func TestValidator_RuleFunc(t *testing.T) { 162 ruleName := "custom_1" 163 ruleFunc := func(ctx context.Context, rule string, value interface{}, message string, data interface{}) error { 164 pass := gconv.String(value) 165 if len(pass) != 6 { 166 return errors.New(message) 167 } 168 if m := gconv.Map(data); m["data"] != pass { 169 return errors.New(message) 170 } 171 return nil 172 } 173 gtest.C(t, func(t *gtest.T) { 174 err := g.Validator().Rules(ruleName).Messages("custom message").RuleFunc(ruleName, ruleFunc).CheckValue("123456") 175 t.Assert(err.String(), "custom message") 176 err = g.Validator(). 177 Rules(ruleName). 178 Messages("custom message"). 179 Data(g.Map{"data": "123456"}). 180 RuleFunc(ruleName, ruleFunc). 181 CheckValue("123456") 182 t.AssertNil(err) 183 }) 184 // Error with struct validation. 185 gtest.C(t, func(t *gtest.T) { 186 type T struct { 187 Value string `v:"uid@custom_1#自定义错误"` 188 Data string `p:"data"` 189 } 190 st := &T{ 191 Value: "123", 192 Data: "123456", 193 } 194 err := g.Validator().RuleFunc(ruleName, ruleFunc).CheckStruct(st) 195 t.Assert(err.String(), "自定义错误") 196 }) 197 // No error with struct validation. 198 gtest.C(t, func(t *gtest.T) { 199 type T struct { 200 Value string `v:"uid@custom_1#自定义错误"` 201 Data string `p:"data"` 202 } 203 st := &T{ 204 Value: "123456", 205 Data: "123456", 206 } 207 err := g.Validator().RuleFunc(ruleName, ruleFunc).CheckStruct(st) 208 t.AssertNil(err) 209 }) 210 } 211 212 func TestValidator_RuleFuncMap(t *testing.T) { 213 ruleName := "custom_1" 214 ruleFunc := func(ctx context.Context, rule string, value interface{}, message string, data interface{}) error { 215 pass := gconv.String(value) 216 if len(pass) != 6 { 217 return errors.New(message) 218 } 219 if m := gconv.Map(data); m["data"] != pass { 220 return errors.New(message) 221 } 222 return nil 223 } 224 gtest.C(t, func(t *gtest.T) { 225 err := g.Validator(). 226 Rules(ruleName). 227 Messages("custom message"). 228 RuleFuncMap(map[string]gvalid.RuleFunc{ 229 ruleName: ruleFunc, 230 }).CheckValue("123456") 231 t.Assert(err.String(), "custom message") 232 err = g.Validator(). 233 Rules(ruleName). 234 Messages("custom message"). 235 Data(g.Map{"data": "123456"}). 236 RuleFuncMap(map[string]gvalid.RuleFunc{ 237 ruleName: ruleFunc, 238 }). 239 CheckValue("123456") 240 t.AssertNil(err) 241 }) 242 // Error with struct validation. 243 gtest.C(t, func(t *gtest.T) { 244 type T struct { 245 Value string `v:"uid@custom_1#自定义错误"` 246 Data string `p:"data"` 247 } 248 st := &T{ 249 Value: "123", 250 Data: "123456", 251 } 252 err := g.Validator(). 253 RuleFuncMap(map[string]gvalid.RuleFunc{ 254 ruleName: ruleFunc, 255 }).CheckStruct(st) 256 t.Assert(err.String(), "自定义错误") 257 }) 258 // No error with struct validation. 259 gtest.C(t, func(t *gtest.T) { 260 type T struct { 261 Value string `v:"uid@custom_1#自定义错误"` 262 Data string `p:"data"` 263 } 264 st := &T{ 265 Value: "123456", 266 Data: "123456", 267 } 268 err := g.Validator(). 269 RuleFuncMap(map[string]gvalid.RuleFunc{ 270 ruleName: ruleFunc, 271 }).CheckStruct(st) 272 t.AssertNil(err) 273 }) 274 }