package test import ( "git.sxidc.com/go-framework/baize/framework/core/tag/sql/sql_result" "git.sxidc.com/go-tools/utils/encoding" "git.sxidc.com/go-tools/utils/strutils" "github.com/pkg/errors" "math/rand" "reflect" "strings" "testing" "time" ) type SqlResultTagStruct struct { Ignore string `sqlresult:"-"` Column string `sqlresult:"column:test_column"` TimeLayout time.Time `sqlresult:"timeLayout:2006-01-02"` Aes string `sqlresult:"aes:@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L"` SplitWith []string `sqlresult:"splitWith:##"` Trim string `sqlresult:"trim:||"` TrimPrefix string `sqlresult:"trimPrefix:{{"` TrimSuffix string `sqlresult:"trimSuffix:}}"` WrongTimeLayout int `sqlresult:"timeLayout:2006-01-02"` WrongAes int `sqlresult:"aes:@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L"` WrongSplitWith int `sqlresult:"splitWith:##"` WrongTrim int `sqlresult:"trim:||"` WrongTrimPrefix int `sqlresult:"trimPrefix:{{"` WrongTrimSuffix int `sqlresult:"trimSuffix:}}"` } func (s SqlResultTagStruct) checkFields(t *testing.T, result map[string]any) { if len(result) != reflect.TypeOf(s).NumField()-1 { t.Fatalf("%+v\n", errors.Errorf("有字段没有被解析")) } for columnName, value := range result { if columnName == "ignore" { t.Fatalf("%+v\n", errors.Errorf("忽略字段没有被忽略")) } switch columnName { case "test_column": if s.Column != value { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.Column, value)) } case "time_layout": resultValue := value.(string) if s.TimeLayout.Format(time.DateOnly)+"T00:00:00" != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.TimeLayout.Format(time.DateOnly), resultValue)) } case "aes": resultValue := value.(string) decrypted, err := encoding.AESDecrypt(resultValue, "@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L") if err != nil { t.Fatalf("%+v\n", errors.Errorf(err.Error())) } if s.Aes != decrypted { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.Aes, decrypted)) } case "split_with": resultValue := value.(string) if strings.Join(s.SplitWith, "##") != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, strings.Join(s.SplitWith, "##"), resultValue)) } case "trim": resultValue := value.(string) if s.Trim != strings.Trim(resultValue, "||") { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.Trim, strings.Trim(resultValue, "||"))) } case "trim_prefix": resultValue := value.(string) if s.TrimPrefix != strings.TrimPrefix(resultValue, "{{") { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.TrimPrefix, strings.TrimPrefix(resultValue, "{{"))) } case "trim_suffix": resultValue := value.(string) if s.TrimSuffix != strings.TrimSuffix(resultValue, "}}") { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.TrimSuffix, strings.TrimSuffix(resultValue, "}}"))) } case "wrong_time_layout": resultValue := value.(int) if s.WrongTimeLayout != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.WrongTimeLayout, resultValue)) } case "wrong_aes": resultValue := value.(int) if s.WrongAes != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.WrongAes, resultValue)) } case "wrong_split_with": resultValue := value.(int) if s.WrongSplitWith != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.WrongSplitWith, resultValue)) } case "wrong_trim": resultValue := value.(int) if s.WrongTrim != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.WrongTrim, resultValue)) } case "wrong_trim_prefix": resultValue := value.(int) if s.WrongTrimPrefix != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.WrongTrimPrefix, resultValue)) } case "wrong_trim_suffix": resultValue := value.(int) if s.WrongTrimSuffix != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.WrongTrimSuffix, resultValue)) } default: t.Fatalf("%+v\n", errors.Errorf("未知的列: tag columnName: %v", columnName)) } } } type SqlResultTagPointFieldsStruct struct { Ignore *string `sqlresult:"-"` Column *string `sqlresult:"column:test_column"` TimeLayout *time.Time `sqlresult:"timeLayout:2006-01-02"` Aes *string `sqlresult:"aes:@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L"` SplitWith *[]string `sqlresult:"splitWith:##"` Trim *string `sqlresult:"trim:||"` TrimPrefix *string `sqlresult:"trimPrefix:{{"` TrimSuffix *string `sqlresult:"trimSuffix:}}"` WrongTimeLayout *int `sqlresult:"timeLayout:2006-01-02"` WrongAes *int `sqlresult:"aes:@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L"` WrongSplitWith *int `sqlresult:"splitWith:##"` WrongTrim *int `sqlresult:"trim:||"` WrongTrimPrefix *int `sqlresult:"trimPrefix:{{"` WrongTrimSuffix *int `sqlresult:"trimSuffix:}}"` } func (s SqlResultTagPointFieldsStruct) checkFields(t *testing.T, result map[string]any) { if len(result) != reflect.TypeOf(s).NumField()-1 { t.Fatalf("%+v\n", errors.Errorf("有字段没有被解析")) } for columnName, value := range result { if columnName == "ignore" { t.Fatalf("%+v\n", errors.Errorf("忽略字段没有被忽略")) } switch columnName { case "test_column": if *s.Column != value { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, *s.Column, value)) } case "time_layout": resultValue := value.(string) if (*s.TimeLayout).Format(time.DateOnly)+"T00:00:00" != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, (*s.TimeLayout).Format(time.DateOnly), resultValue)) } case "aes": resultValue := value.(string) decrypted, err := encoding.AESDecrypt(resultValue, "@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L") if err != nil { t.Fatalf("%+v\n", errors.Errorf(err.Error())) } if *s.Aes != decrypted { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, *s.Aes, decrypted)) } case "split_with": resultValue := value.(string) if strings.Join(*s.SplitWith, "##") != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, strings.Join(*s.SplitWith, "##"), resultValue)) } case "trim": resultValue := value.(string) if *s.Trim != strings.Trim(resultValue, "||") { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.Trim, strings.Trim(resultValue, "||"))) } case "trim_prefix": resultValue := value.(string) if *s.TrimPrefix != strings.TrimPrefix(resultValue, "{{") { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.TrimPrefix, strings.TrimPrefix(resultValue, "{{"))) } case "trim_suffix": resultValue := value.(string) if *s.TrimSuffix != strings.TrimSuffix(resultValue, "}}") { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.TrimSuffix, strings.TrimSuffix(resultValue, "}}"))) } case "wrong_time_layout": resultValue := value.(int) if *s.WrongTimeLayout != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.WrongTimeLayout, resultValue)) } case "wrong_aes": resultValue := value.(int) if *s.WrongAes != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.WrongAes, resultValue)) } case "wrong_split_with": resultValue := value.(int) if *s.WrongSplitWith != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.WrongSplitWith, resultValue)) } case "wrong_trim": resultValue := value.(int) if *s.WrongTrim != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.WrongTrim, resultValue)) } case "wrong_trim_prefix": resultValue := value.(int) if *s.WrongTrimPrefix != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.WrongTrimPrefix, resultValue)) } case "wrong_trim_suffix": resultValue := value.(int) if *s.WrongTrimSuffix != resultValue { t.Fatalf("%+v\n", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v", columnName, s.WrongTrimSuffix, resultValue)) } default: t.Fatalf("%+v\n", errors.Errorf("未知的列: tag columnName: %v", columnName)) } } } func TestSqlResultTagDefaultUsage(t *testing.T) { aesEncrypted, err := encoding.AESEncrypt(strutils.SimpleUUID(), "@MKU^*HF%p%G43Fd)UAHCVD#$XZSWQ@L") if err != nil { t.Fatalf("%+v\n", errors.Errorf(err.Error())) } result := map[string]any{ "test_column": strutils.SimpleUUID(), "time_layout": "2024-07-03T00:00:00", "aes": aesEncrypted, "split_with": strings.Join([]string{strutils.SimpleUUID(), strutils.SimpleUUID()}, "##"), "trim": "||" + strutils.SimpleUUID() + "||", "trim_prefix": "{{" + strutils.SimpleUUID(), "trim_suffix": strutils.SimpleUUID() + "}}", "wrong_time_layout": rand.Int(), "wrong_aes": rand.Int(), "wrong_split_with": rand.Int(), "wrong_trim": rand.Int(), "wrong_trim_prefix": rand.Int(), "wrong_trim_suffix": rand.Int(), } s := SqlResultTagStruct{} sPointerField := SqlResultTagPointFieldsStruct{} err = sql_result.DefaultUsage(result, s, "") if err == nil || err.Error() != "参数不是结构指针" { t.Fatalf("%+v\n", errors.Errorf("没有检测出参数必须是指针类型")) } err = sql_result.DefaultUsage(result, sPointerField, "") if err == nil || err.Error() != "参数不是结构指针" { t.Fatalf("%+v\n", errors.Errorf("没有检测出参数必须是指针类型")) } err = sql_result.DefaultUsage(result, &s, "") if err != nil { t.Fatalf("%+v\n", err) } s.checkFields(t, result) err = sql_result.DefaultUsage(result, &sPointerField, "") if err != nil { t.Fatalf("%+v\n", err) } sPointerField.checkFields(t, result) }