156 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2014 beego Author. All Rights Reserved.
 | |
| //
 | |
| // Licensed under the Apache License, Version 2.0 (the "License");
 | |
| // you may not use this file except in compliance with the License.
 | |
| // You may obtain a copy of the License at
 | |
| //
 | |
| //      http://www.apache.org/licenses/LICENSE-2.0
 | |
| //
 | |
| // Unless required by applicable law or agreed to in writing, software
 | |
| // distributed under the License is distributed on an "AS IS" BASIS,
 | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| // See the License for the specific language governing permissions and
 | |
| // limitations under the License.
 | |
| 
 | |
| package validation
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"log"
 | |
| 	"reflect"
 | |
| 	"testing"
 | |
| )
 | |
| 
 | |
| type user struct {
 | |
| 	ID    int
 | |
| 	Tag   string `valid:"Maxx(aa)"`
 | |
| 	Name  string `valid:"Required;"`
 | |
| 	Age   int    `valid:"Required; Range(1, 140)"`
 | |
| 	match string `valid:"Required; Match(/^(test)?\\w*@(/test/);com$/);Max(2)"`
 | |
| }
 | |
| 
 | |
| func TestGetValidFuncs(t *testing.T) {
 | |
| 	u := user{Name: "test", Age: 1}
 | |
| 	tf := reflect.TypeOf(u)
 | |
| 	var vfs []ValidFunc
 | |
| 	var err error
 | |
| 
 | |
| 	f, _ := tf.FieldByName("ID")
 | |
| 	if vfs, err = getValidFuncs(f); err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if len(vfs) != 0 {
 | |
| 		t.Fatal("should get none ValidFunc")
 | |
| 	}
 | |
| 
 | |
| 	f, _ = tf.FieldByName("Tag")
 | |
| 	if _, err = getValidFuncs(f); err.Error() != "doesn't exists Maxx valid function" {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	f, _ = tf.FieldByName("Name")
 | |
| 	if vfs, err = getValidFuncs(f); err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if len(vfs) != 1 {
 | |
| 		t.Fatal("should get 1 ValidFunc")
 | |
| 	}
 | |
| 	if vfs[0].Name != "Required" && len(vfs[0].Params) != 0 {
 | |
| 		t.Error("Required funcs should be got")
 | |
| 	}
 | |
| 
 | |
| 	f, _ = tf.FieldByName("Age")
 | |
| 	if vfs, err = getValidFuncs(f); err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if len(vfs) != 2 {
 | |
| 		t.Fatal("should get 2 ValidFunc")
 | |
| 	}
 | |
| 	if vfs[0].Name != "Required" && len(vfs[0].Params) != 0 {
 | |
| 		t.Error("Required funcs should be got")
 | |
| 	}
 | |
| 	if vfs[1].Name != "Range" && len(vfs[1].Params) != 2 {
 | |
| 		t.Error("Range funcs should be got")
 | |
| 	}
 | |
| 
 | |
| 	f, _ = tf.FieldByName("match")
 | |
| 	if vfs, err = getValidFuncs(f); err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if len(vfs) != 3 {
 | |
| 		t.Fatal("should get 3 ValidFunc but now is", len(vfs))
 | |
| 	}
 | |
| }
 | |
| 
 | |
| type User struct {
 | |
| 	Name string `valid:"Required;MaxSize(5)" `
 | |
| 	Sex  string `valid:"Required;" label:"sex_label"`
 | |
| 	Age  int    `valid:"Required;Range(1, 140);" label:"age_label"`
 | |
| }
 | |
| 
 | |
| func TestValidation(t *testing.T) {
 | |
| 	u := User{"man1238888456", "", 1140}
 | |
| 	valid := Validation{}
 | |
| 	b, err := valid.Valid(&u)
 | |
| 	if err != nil {
 | |
| 		// handle error
 | |
| 	}
 | |
| 	if !b {
 | |
| 		// validation does not pass
 | |
| 		// blabla...
 | |
| 		for _, err := range valid.Errors {
 | |
| 			log.Println(err.Key, err.Message)
 | |
| 		}
 | |
| 		if len(valid.Errors) != 3 {
 | |
| 			t.Error("must be has 3 error")
 | |
| 		}
 | |
| 	} else {
 | |
| 		t.Error("must be has 3 error")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestCall(t *testing.T) {
 | |
| 	u := user{Name: "test", Age: 180}
 | |
| 	tf := reflect.TypeOf(u)
 | |
| 	var vfs []ValidFunc
 | |
| 	var err error
 | |
| 	f, _ := tf.FieldByName("Age")
 | |
| 	if vfs, err = getValidFuncs(f); err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	valid := &Validation{}
 | |
| 	vfs[1].Params = append([]interface{}{valid, u.Age}, vfs[1].Params...)
 | |
| 	if _, err = funcs.Call(vfs[1].Name, vfs[1].Params...); err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if len(valid.Errors) != 1 {
 | |
| 		t.Error("age out of range should be has an error")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func ExampleAddCustomFunc() {
 | |
| 	err := AddCustomFunc("MyFunc", func(v *Validation, obj interface{}, key string) {
 | |
| 		// do validation, and if you find something wrong,
 | |
| 		// call AddError
 | |
| 		v.AddError(key, "this is my error")
 | |
| 	})
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	type MyUser struct {
 | |
| 		Name string `valid:"MyFunc"`
 | |
| 	}
 | |
| 	v := Validation{}
 | |
| 	ok, err := v.Valid(&MyUser{})
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	if !ok {
 | |
| 		// get the validation error here
 | |
| 		errs := v.Errors
 | |
| 		fmt.Println(errs[0].Error())
 | |
| 	}
 | |
| 	// Output:
 | |
| 	// Name this is my error
 | |
| }
 |