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  }