|
@@ -0,0 +1,319 @@
|
|
|
+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", errors.Errorf("有字段没有被解析"))
|
|
|
+ }
|
|
|
+
|
|
|
+ for columnName, value := range result {
|
|
|
+ if columnName == "ignore" {
|
|
|
+ t.Fatalf("%+v", errors.Errorf("忽略字段没有被忽略"))
|
|
|
+ }
|
|
|
+
|
|
|
+ switch columnName {
|
|
|
+ case "test_column":
|
|
|
+ if s.Column != value {
|
|
|
+ t.Fatalf("%+v", 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", 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", errors.Errorf(err.Error()))
|
|
|
+ }
|
|
|
+
|
|
|
+ if s.Aes != decrypted {
|
|
|
+ t.Fatalf("%+v", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v",
|
|
|
+ columnName, s.WrongTrimSuffix, resultValue))
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ t.Fatalf("%+v", 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", errors.Errorf("有字段没有被解析"))
|
|
|
+ }
|
|
|
+
|
|
|
+ for columnName, value := range result {
|
|
|
+ if columnName == "ignore" {
|
|
|
+ t.Fatalf("%+v", errors.Errorf("忽略字段没有被忽略"))
|
|
|
+ }
|
|
|
+
|
|
|
+ switch columnName {
|
|
|
+ case "test_column":
|
|
|
+ if *s.Column != value {
|
|
|
+ t.Fatalf("%+v", 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", 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", errors.Errorf(err.Error()))
|
|
|
+ }
|
|
|
+
|
|
|
+ if *s.Aes != decrypted {
|
|
|
+ t.Fatalf("%+v", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", errors.Errorf("值不正确: columnName: %v, fieldValue %v, resultValue %v",
|
|
|
+ columnName, s.WrongTrimSuffix, resultValue))
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ t.Fatalf("%+v", 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", 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", errors.Errorf("没有检测出参数必须是指针类型"))
|
|
|
+ }
|
|
|
+
|
|
|
+ err = sql_result.DefaultUsage(result, sPointerField, "")
|
|
|
+ if err == nil || err.Error() != "参数不是结构指针" {
|
|
|
+ t.Fatalf("%+v", errors.Errorf("没有检测出参数必须是指针类型"))
|
|
|
+ }
|
|
|
+
|
|
|
+ err = sql_result.DefaultUsage(result, &s, "")
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("%+v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ s.checkFields(t, result)
|
|
|
+
|
|
|
+ err = sql_result.DefaultUsage(result, &sPointerField, "")
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("%+v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ sPointerField.checkFields(t, result)
|
|
|
+}
|