修复相关BUG + 增加单元测试, 覆盖率100% #3
							
								
								
									
										50
									
								
								data_type.go
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								data_type.go
									
									
									
									
									
								
							| @ -14,12 +14,12 @@ package consts | ||||
| // Date : 14:10 2024/11/25 | ||||
| type DataType string | ||||
|  | ||||
| func (df *DataType) String() string { | ||||
| 	return string(*df) | ||||
| func (df DataType) String() string { | ||||
| 	return string(df) | ||||
| } | ||||
|  | ||||
| func (df *DataType) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(df.String()), nil | ||||
| func (df DataType) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(`"` + df.String() + `"`), nil | ||||
| } | ||||
|  | ||||
| // IsValid 判断枚举值是否有效 | ||||
| @ -27,9 +27,9 @@ func (df *DataType) MarshalJSON() ([]byte, error) { | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 14:45 2024/11/25 | ||||
| func (df *DataType) IsValid() bool { | ||||
| func (df DataType) IsValid() bool { | ||||
| 	for _, item := range DataTypeList { | ||||
| 		if item.Value == *df { | ||||
| 		if item.Value == df || item.Value.String() == df.String() { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| @ -369,49 +369,49 @@ func GetDataTypeDefaultValue(dataType DataType) any { | ||||
| 	case DataTypeBoolPtr: | ||||
| 		return new(bool) | ||||
| 	case DataTypeMapStrAny: | ||||
| 		return new(map[string]any) | ||||
| 		return map[string]any{} | ||||
| 	case DataTypeMapAnyAny: | ||||
| 		return new(map[any]any) | ||||
| 		return map[any]any{} | ||||
| 	case DataTypeMapStrBool: | ||||
| 		return new(map[string]bool) | ||||
| 		return map[string]bool{} | ||||
| 	case DataTypeMapStrInt: | ||||
| 		return new(map[string]int) | ||||
| 		return map[string]int{} | ||||
| 	case DataTypeMapStrFloat: | ||||
| 		return new(map[string]float64) | ||||
| 		return map[string]float64{} | ||||
| 	case DataTypeMapStrUint: | ||||
| 		return new(map[string]uint) | ||||
| 		return map[string]uint{} | ||||
| 	case DataTypeMapStrSlice: | ||||
| 		return new(map[string][]any) | ||||
| 		return map[string][]any{} | ||||
| 	case DataTypeMapStrStr: | ||||
| 		return new(map[string]string) | ||||
| 		return map[string]string{} | ||||
| 	case DataTypeSliceAny: | ||||
| 		return new([]any) | ||||
| 		return []any{} | ||||
| 	case DataTypeSliceString: | ||||
| 		return new([]string) | ||||
| 		return []string{} | ||||
| 	case DataTypeSliceBool: | ||||
| 		return new([]bool) | ||||
| 		return []bool{} | ||||
| 	case DataTypeSliceInt: | ||||
| 		return new([]int) | ||||
| 		return []int{} | ||||
| 	case DataTypeSliceUint: | ||||
| 		return new([]uint) | ||||
| 		return []uint{} | ||||
| 	case DataTypeSliceFloat: | ||||
| 		return new([]float64) | ||||
| 		return []float64{} | ||||
| 	case DataTypeSliceMapAnyAny: | ||||
| 		// map[any]any 序列化会有问题,当做 map[string]any 处理 | ||||
| 		return new([]map[string]any) | ||||
| 		return []map[string]any{} | ||||
| 	case DataTypeSliceMapStringAny: | ||||
| 		return new([]map[string]any) | ||||
| 		return []map[string]any{} | ||||
| 	default: | ||||
| 		// 序列化之后的map | ||||
| 		for _, dataTypeItem := range DataTypeMapMarshal { | ||||
| 			if dataTypeItem == dataType { | ||||
| 				return "" | ||||
| 				return "{}" | ||||
| 			} | ||||
| 		} | ||||
| 		// 序列化之后的slice | ||||
| 		for _, dataTypeItem := range DataTypeSliceMarshal { | ||||
| 			if dataTypeItem == dataType { | ||||
| 				return "" | ||||
| 				return "[]" | ||||
| 			} | ||||
| 		} | ||||
| 		// 指定分隔符分割的slice | ||||
| @ -423,7 +423,7 @@ func GetDataTypeDefaultValue(dataType DataType) any { | ||||
| 		// 未枚举的slice类型用any接收 | ||||
| 		for _, dataTypeItem := range DataTypeSlice { | ||||
| 			if dataTypeItem == dataType { | ||||
| 				return new([]any) | ||||
| 				return []any{} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										188
									
								
								data_type_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								data_type_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,188 @@ | ||||
| // Package consts ... | ||||
| // | ||||
| // Description : consts ... | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 2025-04-20 15:06 | ||||
| package consts | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	. "github.com/smartystreets/goconvey/convey" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestDataType_String(t *testing.T) { | ||||
| 	Convey("data type 字符串值", t, func() { | ||||
| 		byteData, err := json.Marshal(DataTypeString) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(DataTypeString.String(), ShouldEqual, "string") | ||||
| 		So(string(byteData), ShouldEqual, `"string"`) | ||||
| 	}) | ||||
| 	Convey("data type MarshalJSON", t, func() { | ||||
| 		str, err := DataTypeString.MarshalJSON() | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(str), ShouldEqual, `"string"`) | ||||
| 		dataList := []DataType{DataTypeString} | ||||
| 		jsonData, err := json.Marshal(dataList) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(jsonData), ShouldEqual, `["string"]`) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestDataType_IsValid(t *testing.T) { | ||||
| 	Convey("data type 非法验证", t, func() { | ||||
| 		So(DataType("Invalid").IsValid(), ShouldBeFalse) | ||||
| 	}) | ||||
| 	Convey("data type 合法验证", t, func() { | ||||
| 		So(DataType("string").IsValid(), ShouldBeTrue) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestGetDataTypeDefaultValue(t *testing.T) { | ||||
| 	Convey("int 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeInt), ShouldEqual, 0) | ||||
| 	}) | ||||
| 	Convey("int8 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeInt8), ShouldEqual, int8(0)) | ||||
| 	}) | ||||
| 	Convey("int16 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeInt16), ShouldEqual, int16(0)) | ||||
| 	}) | ||||
| 	Convey("int32 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeInt32), ShouldEqual, int32(0)) | ||||
| 	}) | ||||
| 	Convey("int64 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeInt64), ShouldEqual, int64(0)) | ||||
| 	}) | ||||
| 	Convey("uint 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeUint), ShouldEqual, uint(0)) | ||||
| 	}) | ||||
| 	Convey("uint8 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeUint8), ShouldEqual, uint8(0)) | ||||
| 	}) | ||||
| 	Convey("uint16 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeUint16), ShouldEqual, uint16(0)) | ||||
| 	}) | ||||
| 	Convey("uint32 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeUint32), ShouldEqual, uint32(0)) | ||||
| 	}) | ||||
| 	Convey("uint64 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeUint64), ShouldEqual, uint64(0)) | ||||
| 	}) | ||||
| 	Convey("float32 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeFloat32), ShouldEqual, float32(0)) | ||||
| 	}) | ||||
| 	Convey("uint64 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeFloat64), ShouldEqual, float64(0)) | ||||
| 	}) | ||||
| 	Convey("bool 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeBool), ShouldBeFalse) | ||||
| 	}) | ||||
| 	Convey("string 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeString), ShouldBeEmpty) | ||||
| 	}) | ||||
| 	Convey("IntPtr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeIntPtr), ShouldEqual, new(int)) | ||||
| 	}) | ||||
| 	Convey("Int8Ptr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeInt8Ptr), ShouldEqual, new(int8)) | ||||
| 	}) | ||||
| 	Convey("Int16Ptr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeInt16Ptr), ShouldEqual, new(int16)) | ||||
| 	}) | ||||
| 	Convey("Int32Ptr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeInt32Ptr), ShouldEqual, new(int32)) | ||||
| 	}) | ||||
| 	Convey("Int64Ptr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeInt64Ptr), ShouldEqual, new(int64)) | ||||
| 	}) | ||||
| 	Convey("UintPtr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeUintPtr), ShouldEqual, new(uint)) | ||||
| 	}) | ||||
| 	Convey("Uint8Ptr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeUint8Ptr), ShouldEqual, new(uint8)) | ||||
| 	}) | ||||
| 	Convey("Uint16Ptr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeUint16Ptr), ShouldEqual, new(uint16)) | ||||
| 	}) | ||||
| 	Convey("Uint32Ptr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeUint32Ptr), ShouldEqual, new(uint32)) | ||||
| 	}) | ||||
| 	Convey("Uint64Ptr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeUint64Ptr), ShouldEqual, new(uint64)) | ||||
| 	}) | ||||
| 	Convey("Float32Ptr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeFloat32Ptr), ShouldEqual, new(float32)) | ||||
| 	}) | ||||
| 	Convey("Float64Ptr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeFloat64Ptr), ShouldEqual, new(float64)) | ||||
| 	}) | ||||
| 	Convey("BoolPtr 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeBoolPtr), ShouldEqual, new(bool)) | ||||
| 	}) | ||||
| 	Convey("map[string]any 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeMapStrAny), ShouldEqual, map[string]any{}) | ||||
| 	}) | ||||
| 	Convey("map[any]any 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeMapAnyAny), ShouldEqual, map[any]any{}) | ||||
| 	}) | ||||
| 	Convey("map[string]bool 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeMapStrBool), ShouldEqual, map[string]bool{}) | ||||
| 	}) | ||||
| 	Convey("map[string]int 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeMapStrInt), ShouldEqual, map[string]int{}) | ||||
| 	}) | ||||
| 	Convey("map[string]float 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeMapStrFloat), ShouldEqual, map[string]float64{}) | ||||
| 	}) | ||||
| 	Convey("map[string]uint 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeMapStrUint), ShouldEqual, map[string]uint{}) | ||||
| 	}) | ||||
| 	Convey("map[string]slice 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeMapStrSlice), ShouldEqual, map[string][]any{}) | ||||
| 	}) | ||||
| 	Convey("map[string]string 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeMapStrStr), ShouldEqual, map[string]string{}) | ||||
| 	}) | ||||
| 	Convey("[]any 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeSliceAny), ShouldEqual, []any{}) | ||||
| 	}) | ||||
| 	Convey("[]string 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeSliceString), ShouldEqual, []string{}) | ||||
| 	}) | ||||
| 	Convey("[]bool 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeSliceBool), ShouldEqual, []bool{}) | ||||
| 	}) | ||||
| 	Convey("[]int 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeSliceInt), ShouldEqual, []int{}) | ||||
| 	}) | ||||
| 	Convey("[]uint 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeSliceUint), ShouldEqual, []uint{}) | ||||
| 	}) | ||||
| 	Convey("[]float 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeSliceFloat), ShouldEqual, []float64{}) | ||||
| 	}) | ||||
| 	Convey("[]map[string]any 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeSliceMapStringAny), ShouldEqual, []map[string]any{}) | ||||
| 	}) | ||||
| 	Convey("[]map[any]any 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeSliceMapAnyAny), ShouldEqual, []map[string]any{}) | ||||
| 	}) | ||||
| 	Convey("map marshal 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeMapStrAnyWithMarshal), ShouldEqual, "{}") | ||||
| 	}) | ||||
| 	Convey("slice marshal 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeSliceBoolWithMarshal), ShouldEqual, "[]") | ||||
| 	}) | ||||
| 	Convey("slice split 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeSliceIntWithChar), ShouldEqual, "") | ||||
| 	}) | ||||
| 	Convey("未枚举的alice 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataTypeSliceSlice), ShouldEqual, []any{}) | ||||
| 	}) | ||||
| 	Convey("unknown 默认值", t, func() { | ||||
| 		So(GetDataTypeDefaultValue(DataType("unknown")), ShouldEqual, nil) | ||||
| 	}) | ||||
| } | ||||
| @ -1,8 +0,0 @@ | ||||
| // Package enums ... | ||||
| // | ||||
| // Description : enums ... | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 2024-11-25 14:39 | ||||
| package enums | ||||
| @ -1,8 +0,0 @@ | ||||
| // Package enums ... | ||||
| // | ||||
| // Description : enums ... | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 2024-11-25 14:08 | ||||
| package enums | ||||
							
								
								
									
										61
									
								
								file_type.go
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								file_type.go
									
									
									
									
									
								
							| @ -9,26 +9,17 @@ package consts | ||||
|  | ||||
| type FileType string | ||||
|  | ||||
| func (ft *FileType) String() string { | ||||
| 	return string(*ft) | ||||
| func (ft FileType) String() string { | ||||
| 	return string(ft) | ||||
| } | ||||
|  | ||||
| func (ft *FileType) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(ft.String()), nil | ||||
| func (ft FileType) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(`"` + ft.String() + `"`), nil | ||||
| } | ||||
|  | ||||
| func (ft *FileType) IsValid() bool { | ||||
| 	supportFileTypeList := []FileType{ | ||||
| 		FileTypeJson, | ||||
| 		FileTypeIni, | ||||
| 		FileTypeYml, | ||||
| 		FileTypeYaml, | ||||
| 		FileTypeToml, | ||||
| 		FileTypeXml, | ||||
| 		FileTypeTxt, | ||||
| 	} | ||||
| 	for _, fileType := range supportFileTypeList { | ||||
| 		if fileType == *ft { | ||||
| func (ft FileType) IsValid() bool { | ||||
| 	for _, fileType := range SupportFileTypeList { | ||||
| 		if fileType.Value == ft || fileType.Value.String() == ft.String() { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| @ -45,3 +36,41 @@ const ( | ||||
| 	FileTypeTxt     FileType = "txt"     // txt格式文件 | ||||
| 	FileTypeUnknown FileType = "unknown" // 未知格式 | ||||
| ) | ||||
|  | ||||
| type FileTypeDesc struct { | ||||
| 	Value FileType | ||||
| 	Desc  string | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	SupportFileTypeList = []FileTypeDesc{ | ||||
| 		{ | ||||
| 			Value: FileTypeJson, | ||||
| 			Desc:  "json格式文件", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Value: FileTypeIni, | ||||
| 			Desc:  "init格式文件", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Value: FileTypeYml, | ||||
| 			Desc:  "yml格式文件", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Value: FileTypeYaml, | ||||
| 			Desc:  "yaml格式文件", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Value: FileTypeToml, | ||||
| 			Desc:  "toml格式文件", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Value: FileTypeTxt, | ||||
| 			Desc:  "txt格式文件", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Value: FileTypeXml, | ||||
| 			Desc:  "xml格式文件", | ||||
| 		}, | ||||
| 	} | ||||
| ) | ||||
|  | ||||
							
								
								
									
										41
									
								
								file_type_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								file_type_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | ||||
| // Package consts ... | ||||
| // | ||||
| // Description : consts ... | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 2025-04-20 15:17 | ||||
| package consts | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	. "github.com/smartystreets/goconvey/convey" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestFileType_String(t *testing.T) { | ||||
| 	Convey("file type 字符串值", t, func() { | ||||
| 		byteData, err := json.Marshal(FileTypeJson) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(FileTypeJson.String(), ShouldEqual, "json") | ||||
| 		So(string(byteData), ShouldEqual, `"json"`) | ||||
| 	}) | ||||
| 	Convey("file type MarshalJSON", t, func() { | ||||
| 		str, err := FileTypeJson.MarshalJSON() | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(str), ShouldEqual, `"json"`) | ||||
| 		dataList := []FileType{FileTypeJson} | ||||
| 		jsonData, err := json.Marshal(dataList) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(jsonData), ShouldEqual, `["json"]`) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestFileType_IsValid(t *testing.T) { | ||||
| 	Convey("file type 非法验证", t, func() { | ||||
| 		So(FileType("Invalid").IsValid(), ShouldBeFalse) | ||||
| 	}) | ||||
| 	Convey("file type 合法验证", t, func() { | ||||
| 		So(FileType("json").IsValid(), ShouldBeTrue) | ||||
| 	}) | ||||
| } | ||||
							
								
								
									
										12
									
								
								header.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								header.go
									
									
									
									
									
								
							| @ -9,15 +9,15 @@ package consts | ||||
|  | ||||
| type HttpHeader string | ||||
|  | ||||
| func (hh *HttpHeader) String() string { | ||||
| 	return string(*hh) | ||||
| func (hh HttpHeader) String() string { | ||||
| 	return string(hh) | ||||
| } | ||||
|  | ||||
| func (hh *HttpHeader) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(hh.String()), nil | ||||
| func (hh HttpHeader) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(`"` + hh.String() + `"`), nil | ||||
| } | ||||
|  | ||||
| var ( | ||||
| const ( | ||||
| 	HeaderKeyAccessControlAllowOrigin   HttpHeader = "Access-Control-Allow-Origin"   // 标识允许哪个域的请求 | ||||
| 	HeaderKeyAccessControlAllowHeaders  HttpHeader = "Access-Control-Allow-Headers"  // 标识允许的请求header | ||||
| 	HeaderKeyAccessControlAllowMethods  HttpHeader = "Access-Control-Allow-Methods"  // 标识允许的请求方法 | ||||
| @ -25,7 +25,7 @@ var ( | ||||
| 	HeaderKeyAccessControlMaxAge        HttpHeader = "Access-Control-Max-Age"        // 控制发送预检请求options的频率,单位 : 秒 | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| const ( | ||||
| 	HeaderKeyContentType    HttpHeader = "Content-Type"    // 请求头中Content-Type的key | ||||
| 	HeaderKeyReferer        HttpHeader = "Referer"         // 请求头中Referer的key | ||||
| 	HeaderKeyUserAgent      HttpHeader = "User-Agent"      // 请求头中User-Agent的key | ||||
|  | ||||
							
								
								
									
										32
									
								
								header_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								header_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | ||||
| // Package consts ... | ||||
| // | ||||
| // Description : consts ... | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 2025-04-20 14:22 | ||||
| package consts | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	. "github.com/smartystreets/goconvey/convey" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestHttpHeader_String(t *testing.T) { | ||||
| 	Convey("http header字符串值", t, func() { | ||||
| 		byteData, err := json.Marshal(HeaderKeyContentType) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(HeaderKeyContentType.String(), ShouldEqual, "Content-Type") | ||||
| 		So(string(byteData), ShouldEqual, `"Content-Type"`) | ||||
| 	}) | ||||
| 	Convey("http header MarshalJSON", t, func() { | ||||
| 		str, err := HeaderKeyContentType.MarshalJSON() | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(str), ShouldEqual, `"Content-Type"`) | ||||
| 		dataList := []HttpHeader{HeaderKeyContentType} | ||||
| 		jsonData, err := json.Marshal(dataList) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(jsonData), ShouldEqual, `["Content-Type"]`) | ||||
| 	}) | ||||
| } | ||||
							
								
								
									
										27
									
								
								http_code_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								http_code_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| // Package consts ... | ||||
| // | ||||
| // Description : consts ... | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 2025-04-20 15:29 | ||||
| package consts | ||||
|  | ||||
| import ( | ||||
| 	. "github.com/smartystreets/goconvey/convey" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func Test_newHttpCodeData(t *testing.T) { | ||||
| 	Convey("newHttpCode 验证", t, func() { | ||||
| 		hCode := newHttpCodeData(499) | ||||
| 		So(hCode.Code, ShouldEqual, 499) | ||||
| 		So(hCode.Desc, ShouldEqual, "client request timeout") | ||||
| 		So(hCode.Value, ShouldEqual, 499) | ||||
| 		hCode = newHttpCodeData(4990) | ||||
| 		So(hCode.Code, ShouldEqual, 4990) | ||||
| 		So(strings.Contains(hCode.Desc, "unknown error"), ShouldBeTrue) | ||||
| 		So(hCode.Value, ShouldEqual, 4990) | ||||
| 	}) | ||||
| } | ||||
							
								
								
									
										52
									
								
								logger.go
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								logger.go
									
									
									
									
									
								
							| @ -9,15 +9,15 @@ package consts | ||||
|  | ||||
| type LogLevel string | ||||
|  | ||||
| func (ll *LogLevel) String() string { | ||||
| 	return string(*ll) | ||||
| func (ll LogLevel) String() string { | ||||
| 	return string(ll) | ||||
| } | ||||
|  | ||||
| func (ll *LogLevel) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(ll.String()), nil | ||||
| func (ll LogLevel) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(`"` + ll.String() + `"`), nil | ||||
| } | ||||
|  | ||||
| func (ll *LogLevel) IsValid() bool { | ||||
| func (ll LogLevel) IsValid() bool { | ||||
| 	levelList := []LogLevel{ | ||||
| 		LogLevelDebug, | ||||
| 		LogLevelInfo, | ||||
| @ -26,14 +26,14 @@ func (ll *LogLevel) IsValid() bool { | ||||
| 		LogLevelPanic, | ||||
| 	} | ||||
| 	for _, level := range levelList { | ||||
| 		if level == *ll { | ||||
| 		if level == ll { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| var ( | ||||
| const ( | ||||
| 	LogLevelDebug LogLevel = "DEBUG" | ||||
| 	LogLevelInfo  LogLevel = "INFO" | ||||
| 	LogLevelWarn  LogLevel = "WARN" | ||||
| @ -47,18 +47,12 @@ func (ls LogSplit) String() string { | ||||
| 	return string(ls) | ||||
| } | ||||
| func (ls LogSplit) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(ls.String()), nil | ||||
| 	return []byte(`"` + ls.String() + `"`), nil | ||||
| } | ||||
|  | ||||
| func (ls LogSplit) IsValid() bool { | ||||
| 	supportSplitList := []LogSplit{ | ||||
| 		LogSplitHour, | ||||
| 		LogSplitDay, | ||||
| 		LogSplitMonth, | ||||
| 		LogSplitYear, | ||||
| 	} | ||||
| 	for _, supportSplit := range supportSplitList { | ||||
| 		if supportSplit == ls { | ||||
| 	for _, supportSplit := range SupportLogSplitList { | ||||
| 		if supportSplit.Value == ls || supportSplit.Value.String() == ls.String() { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| @ -72,6 +66,32 @@ const ( | ||||
| 	LogSplitYear  LogSplit = "YEAR" | ||||
| ) | ||||
|  | ||||
| type LogSplitDesc struct { | ||||
| 	Value LogSplit `json:"value"` | ||||
| 	Desc  string   `json:"desc"` | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	SupportLogSplitList = []LogSplitDesc{ | ||||
| 		{ | ||||
| 			Value: LogSplitHour, | ||||
| 			Desc:  "按小时切割", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Value: LogSplitDay, | ||||
| 			Desc:  "按天切割", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Value: LogSplitMonth, | ||||
| 			Desc:  "按月切割", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Value: LogSplitYear, | ||||
| 			Desc:  "按年切割", | ||||
| 		}, | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	LogPathDefault = "logs" | ||||
| ) | ||||
|  | ||||
| @ -9,11 +9,60 @@ package consts | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	. "github.com/smartystreets/goconvey/convey" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestLogLevel_String(t *testing.T) { | ||||
| 	byteData, err := json.Marshal(LogLevelDebug) | ||||
| 	fmt.Println(string(byteData), err) | ||||
| 	Convey("logger type字符串值", t, func() { | ||||
| 		byteData, err := json.Marshal(LogLevelDebug) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(LogLevelDebug.String(), ShouldEqual, "DEBUG") | ||||
| 		So(string(byteData), ShouldEqual, `"DEBUG"`) | ||||
| 	}) | ||||
| 	Convey("logger type MarshalJSON", t, func() { | ||||
| 		str, err := LogLevelDebug.MarshalJSON() | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(str), ShouldEqual, `"DEBUG"`) | ||||
| 		dataList := []LogLevel{LogLevelDebug} | ||||
| 		jsonData, err := json.Marshal(dataList) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(jsonData), ShouldEqual, `["DEBUG"]`) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestLogLevel_IsValid(t *testing.T) { | ||||
| 	Convey("logger type 非法验证", t, func() { | ||||
| 		So(LogLevel("Invalid").IsValid(), ShouldBeFalse) | ||||
| 	}) | ||||
| 	Convey("logger type 合法验证", t, func() { | ||||
| 		So(LogLevelDebug.IsValid(), ShouldBeTrue) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestLogSplit_String(t *testing.T) { | ||||
| 	Convey("logger split 字符串值", t, func() { | ||||
| 		byteData, err := json.Marshal(LogSplitHour) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(LogSplitHour.String(), ShouldEqual, "HOUR") | ||||
| 		So(string(byteData), ShouldEqual, `"HOUR"`) | ||||
| 	}) | ||||
| 	Convey("logger split MarshalJSON", t, func() { | ||||
| 		str, err := LogSplitHour.MarshalJSON() | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(str), ShouldEqual, `"HOUR"`) | ||||
| 		dataList := []LogSplit{LogSplitHour} | ||||
| 		jsonData, err := json.Marshal(dataList) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(jsonData), ShouldEqual, `["HOUR"]`) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestLogSplit_IsValid(t *testing.T) { | ||||
| 	Convey("logger split 非法验证", t, func() { | ||||
| 		So(LogSplit("Invalid").IsValid(), ShouldBeFalse) | ||||
| 	}) | ||||
| 	Convey("logger split 合法验证", t, func() { | ||||
| 		So(LogSplit("HOUR").IsValid(), ShouldBeTrue) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
							
								
								
									
										10
									
								
								redis.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								redis.go
									
									
									
									
									
								
							| @ -9,15 +9,15 @@ package consts | ||||
|  | ||||
| type RedisCmd string | ||||
|  | ||||
| func (rc *RedisCmd) String() string { | ||||
| 	return string(*rc) | ||||
| func (rc RedisCmd) String() string { | ||||
| 	return string(rc) | ||||
| } | ||||
|  | ||||
| func (rc *RedisCmd) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(rc.String()), nil | ||||
| func (rc RedisCmd) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(`"` + rc.String() + `"`), nil | ||||
| } | ||||
|  | ||||
| var ( | ||||
| const ( | ||||
| 	RedisCommandExists       RedisCmd = "EXISTS" | ||||
| 	RedisCommandTTL          RedisCmd = "TTL" | ||||
| 	RedisCommandSet          RedisCmd = "SET" | ||||
|  | ||||
| @ -24,6 +24,10 @@ func TestRedisCmd_String(t *testing.T) { | ||||
| 	Convey("redis cmd MarshalJSON", t, func() { | ||||
| 		str, err := RedisCommandSet.MarshalJSON() | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(str), ShouldEqual, `SET`) | ||||
| 		So(string(str), ShouldEqual, `"SET"`) | ||||
| 		dataList := []RedisCmd{RedisCommandSet} | ||||
| 		jsonData, err := json.Marshal(dataList) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(jsonData), ShouldEqual, `["SET"]`) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
							
								
								
									
										56
									
								
								request.go
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								request.go
									
									
									
									
									
								
							| @ -19,43 +19,19 @@ func (rdl RequestDataLocation) String() string { | ||||
| } | ||||
|  | ||||
| func (rdl RequestDataLocation) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(rdl.String()), nil | ||||
| 	return []byte(`"` + rdl.String() + `"`), nil | ||||
| } | ||||
|  | ||||
| func (rdl RequestDataLocation) IsValid() bool { | ||||
| 	for _, item := range RequestDataLocationList { | ||||
| 		if item.Value == rdl { | ||||
| 		if item.Value == rdl || item.Value.String() == rdl.String() { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // ResponseDataLocation 响应数据所在位置 | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 14:41 2024/11/25 | ||||
| type ResponseDataLocation string | ||||
|  | ||||
| func (rdl *ResponseDataLocation) String() string { | ||||
| 	return string(*rdl) | ||||
| } | ||||
|  | ||||
| func (rdl *ResponseDataLocation) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(rdl.String()), nil | ||||
| } | ||||
|  | ||||
| func (rdl *ResponseDataLocation) IsValid() bool { | ||||
| 	for _, item := range ResponseDataLocationList { | ||||
| 		if item.Value == *rdl { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| var ( | ||||
| const ( | ||||
| 	RequestDataLocationHeader       RequestDataLocation = "HEADER"        // header | ||||
| 	RequestDataLocationCookie       RequestDataLocation = "COOKIE"        // cookie | ||||
| 	RequestDataLocationBody         RequestDataLocation = "BODY"          // body | ||||
| @ -66,7 +42,31 @@ var ( | ||||
| 	RequestDataLocationCustomConfig RequestDataLocation = "CUSTOM_CONFIG" // 针对接口的一些自定义配置规则 | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| // ResponseDataLocation 响应数据所在位置 | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 14:41 2024/11/25 | ||||
| type ResponseDataLocation string | ||||
|  | ||||
| func (rdl ResponseDataLocation) String() string { | ||||
| 	return string(rdl) | ||||
| } | ||||
|  | ||||
| func (rdl ResponseDataLocation) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(`"` + rdl.String() + `"`), nil | ||||
| } | ||||
|  | ||||
| func (rdl ResponseDataLocation) IsValid() bool { | ||||
| 	for _, item := range ResponseDataLocationList { | ||||
| 		if item.Value == rdl || item.Value.String() == rdl.String() { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	ResponseDataLocationHeader    ResponseDataLocation = "HEADER"    // header | ||||
| 	ResponseDataLocationCookie    ResponseDataLocation = "COOKIE"    // cookie | ||||
| 	ResponseDataLocationBody      ResponseDataLocation = "BODY"      // body | ||||
|  | ||||
							
								
								
									
										68
									
								
								request_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								request_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,68 @@ | ||||
| // Package consts ... | ||||
| // | ||||
| // Description : consts ... | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 2025-04-20 14:37 | ||||
| package consts | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	. "github.com/smartystreets/goconvey/convey" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestRequestDataLocation_String(t *testing.T) { | ||||
| 	Convey("request data location字符串值", t, func() { | ||||
| 		byteData, err := json.Marshal(RequestDataLocationBody) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(RequestDataLocationBody.String(), ShouldEqual, "BODY") | ||||
| 		So(string(byteData), ShouldEqual, `"BODY"`) | ||||
| 	}) | ||||
| 	Convey("request data location MarshalJSON", t, func() { | ||||
| 		str, err := RequestDataLocationBody.MarshalJSON() | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(str), ShouldEqual, `"BODY"`) | ||||
| 		dataList := []RequestDataLocation{RequestDataLocationBody} | ||||
| 		jsonData, err := json.Marshal(dataList) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(jsonData), ShouldEqual, `["BODY"]`) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestRequestDataLocation_IsValid(t *testing.T) { | ||||
| 	Convey("request data location 非法验证", t, func() { | ||||
| 		So(RequestDataLocation("Invalid").IsValid(), ShouldBeFalse) | ||||
| 	}) | ||||
| 	Convey("request data location 合法验证", t, func() { | ||||
| 		So(RequestDataLocation("BODY").IsValid(), ShouldBeTrue) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestResponseDataLocation_String(t *testing.T) { | ||||
| 	Convey("response data location字符串值", t, func() { | ||||
| 		byteData, err := json.Marshal(ResponseDataLocationBody) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(RequestDataLocationBody.String(), ShouldEqual, "BODY") | ||||
| 		So(string(byteData), ShouldEqual, `"BODY"`) | ||||
| 	}) | ||||
| 	Convey("response data location MarshalJSON", t, func() { | ||||
| 		str, err := ResponseDataLocationBody.MarshalJSON() | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(str), ShouldEqual, `"BODY"`) | ||||
| 		dataList := []ResponseDataLocation{ResponseDataLocationBody} | ||||
| 		jsonData, err := json.Marshal(dataList) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(jsonData), ShouldEqual, `["BODY"]`) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestResponseDataLocation_IsValid(t *testing.T) { | ||||
| 	Convey("response data location 非法验证", t, func() { | ||||
| 		So(ResponseDataLocation("Invalid").IsValid(), ShouldBeFalse) | ||||
| 	}) | ||||
| 	Convey("response data location 合法验证", t, func() { | ||||
| 		So(ResponseDataLocation("BODY").IsValid(), ShouldBeTrue) | ||||
| 	}) | ||||
| } | ||||
| @ -9,12 +9,12 @@ package consts | ||||
|  | ||||
| type HttpScheme string | ||||
|  | ||||
| func (hs *HttpScheme) String() string { | ||||
| 	return string(*hs) | ||||
| func (hs HttpScheme) String() string { | ||||
| 	return string(hs) | ||||
| } | ||||
|  | ||||
| func (hs *HttpScheme) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(hs.String()), nil | ||||
| func (hs HttpScheme) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(`"` + hs.String() + `"`), nil | ||||
| } | ||||
|  | ||||
| var ( | ||||
|  | ||||
							
								
								
									
										32
									
								
								scheme_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								scheme_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | ||||
| // Package consts ... | ||||
| // | ||||
| // Description : consts ... | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 2025-04-20 15:47 | ||||
| package consts | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	. "github.com/smartystreets/goconvey/convey" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestHttpScheme_String(t *testing.T) { | ||||
| 	Convey("scheme 字符串值", t, func() { | ||||
| 		byteData, err := json.Marshal(SchemeHTTPS) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(SchemeHTTPS.String(), ShouldEqual, "https") | ||||
| 		So(string(byteData), ShouldEqual, `"https"`) | ||||
| 	}) | ||||
| 	Convey("scheme MarshalJSON", t, func() { | ||||
| 		str, err := SchemeHTTPS.MarshalJSON() | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(str), ShouldEqual, `"https"`) | ||||
| 		dataList := []HttpScheme{SchemeHTTPS} | ||||
| 		jsonData, err := json.Marshal(dataList) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(jsonData), ShouldEqual, `["https"]`) | ||||
| 	}) | ||||
| } | ||||
							
								
								
									
										25
									
								
								validator.go
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								validator.go
									
									
									
									
									
								
							| @ -11,25 +11,22 @@ package consts | ||||
|  | ||||
| type ValidatorRule string // 验证规则 | ||||
|  | ||||
| func (vr *ValidatorRule) String() string { | ||||
| 	if nil == vr { | ||||
| 		return "" | ||||
| 	} | ||||
| 	return string(*vr) | ||||
| func (vr ValidatorRule) String() string { | ||||
| 	return string(vr) | ||||
| } | ||||
|  | ||||
| func (vr *ValidatorRule) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(vr.String()), nil | ||||
| func (vr ValidatorRule) MarshalJSON() ([]byte, error) { | ||||
| 	return []byte(`"` + vr.String() + `"`), nil | ||||
| } | ||||
|  | ||||
| // IsValid 验证规则是否有效 | ||||
| func (vr *ValidatorRule) IsValid() bool { | ||||
| 	_, exist := ValidatorRuleSupportDataTypeTable[*vr] | ||||
| func (vr ValidatorRule) IsValid() bool { | ||||
| 	_, exist := ValidatorRuleSupportDataTypeTable[vr] | ||||
| 	if !exist { | ||||
| 		return false | ||||
| 	} | ||||
| 	rule := ValidatorRuleSupportDataTypeTable[*vr].ValidatorRule | ||||
| 	if vr.String() != (&rule).String() { | ||||
| 	rule := ValidatorRuleSupportDataTypeTable[vr].ValidatorRule | ||||
| 	if vr.String() != rule.String() { | ||||
| 		return false | ||||
| 	} | ||||
| 	return exist | ||||
| @ -40,8 +37,8 @@ func (vr *ValidatorRule) IsValid() bool { | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 16:10 2025/1/22 | ||||
| func (vr *ValidatorRule) Config() ValidatorRuleConfig { | ||||
| 	return ValidatorRuleSupportDataTypeTable[*vr] | ||||
| func (vr ValidatorRule) Config() ValidatorRuleConfig { | ||||
| 	return ValidatorRuleSupportDataTypeTable[vr] | ||||
| } | ||||
|  | ||||
| // IsSupportDataType 是否支持指定的数据类型 | ||||
| @ -49,7 +46,7 @@ func (vr *ValidatorRule) Config() ValidatorRuleConfig { | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 16:11 2025/1/22 | ||||
| func (vr *ValidatorRule) IsSupportDataType(dataType DataType) bool { | ||||
| func (vr ValidatorRule) IsSupportDataType(dataType DataType) bool { | ||||
| 	dataTypeList := vr.Config().SupportDataTypeList | ||||
| 	if len(dataTypeList) == 0 { | ||||
| 		// 未配置则认为支持 | ||||
|  | ||||
							
								
								
									
										64
									
								
								validator_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								validator_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| // Package consts ... | ||||
| // | ||||
| // Description : consts ... | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 2025-04-20 17:37 | ||||
| package consts | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	. "github.com/smartystreets/goconvey/convey" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestValidatorRule_String(t *testing.T) { | ||||
| 	Convey("validate rule 字符串值", t, func() { | ||||
| 		byteData, err := json.Marshal(ValidateRuleGt) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(ValidateRuleGt.String(), ShouldEqual, "gt") | ||||
| 		So(string(byteData), ShouldEqual, `"gt"`) | ||||
| 	}) | ||||
| 	Convey("validate rule MarshalJSON", t, func() { | ||||
| 		str, err := ValidateRuleGt.MarshalJSON() | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(str), ShouldEqual, `"gt"`) | ||||
| 		dataList := []ValidatorRule{ValidateRuleGt} | ||||
| 		jsonData, err := json.Marshal(dataList) | ||||
| 		So(err, ShouldBeNil) | ||||
| 		So(string(jsonData), ShouldEqual, `["gt"]`) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestValidatorRule_IsValid(t *testing.T) { | ||||
| 	Convey("validator rule 不存在", t, func() { | ||||
| 		So(ValidatorRule("Invalid").IsValid(), ShouldBeFalse) | ||||
| 	}) | ||||
| 	Convey("validator rule 配置值错误", t, func() { | ||||
| 		ValidatorRuleSupportDataTypeTable[ValidatorRule("Invalid")] = ValidatorRuleConfig{} | ||||
| 		So(ValidatorRule("Invalid").IsValid(), ShouldBeFalse) | ||||
| 		So(ValidatorRule("gt").IsValid(), ShouldBeTrue) | ||||
| 	}) | ||||
| 	Convey("validator rule 配置值", t, func() { | ||||
| 		So(ValidatorRuleGtcsfield.Config().MinParamCnt, ShouldEqual, 1) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestValidatorRule_IsSupportDataType(t *testing.T) { | ||||
| 	Convey("validator rule 是否支持指定数据类型", t, func() { | ||||
| 		So(ValidatorRuleGtcsfield.IsSupportDataType(DataTypeUint), ShouldBeTrue) | ||||
| 		So(ValidatorRuleGtcsfield.IsSupportDataType(DataTypeString), ShouldBeFalse) | ||||
| 	}) | ||||
| 	Convey("validator rule 未指定类型默认支持", t, func() { | ||||
| 		So(ValidatorRuleCommonOmitempty.IsSupportDataType(DataTypeString), ShouldBeTrue) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestRegisterCustomValidatorRule(t *testing.T) { | ||||
| 	Convey("注册自定义验证规则", t, func() { | ||||
| 		RegisterCustomValidatorRule(ValidatorRule("Invalid"), ValidatorRuleConfig{}) | ||||
| 		_, exist := ValidatorRuleSupportDataTypeTable[ValidatorRule("Invalid")] | ||||
| 		So(exist, ShouldBeTrue) | ||||
| 	}) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user