gin-base/db/read_time_test.go

187 lines
4.6 KiB
Go

package main
import (
"encoding/json"
"fmt"
"testing"
"time"
"git.magicany.cc/black1552/gin-base/db/model"
)
// TestTimeFormatting 测试时间格式化
func TestTimeFormatting(t *testing.T) {
fmt.Println("\n=== 测试时间格式化 ===")
// 创建带时间的模型
now := time.Now()
user := &model.User{
ID: 1,
Username: "test_user",
Email: "test@example.com",
Status: 1,
CreatedAt: model.Time{Time: now},
UpdatedAt: model.Time{Time: now},
}
// 序列化为 JSON
jsonData, err := json.Marshal(user)
if err != nil {
t.Errorf("JSON 序列化失败:%v", err)
}
fmt.Printf("原始时间:%s\n", now.Format("2006-01-02 15:04:05"))
fmt.Printf("JSON 输出:%s\n", string(jsonData))
// 验证时间格式
var result map[string]interface{}
if err := json.Unmarshal(jsonData, &result); err != nil {
t.Errorf("JSON 反序列化失败:%v", err)
}
createdAt, ok := result["created_at"].(string)
if !ok {
t.Error("created_at 应该是字符串")
}
// 验证格式
expectedFormat := "2006-01-02 15:04:05"
_, err = time.Parse(expectedFormat, createdAt)
if err != nil {
t.Errorf("时间格式不正确:%v", err)
}
fmt.Printf("✓ 时间格式化测试通过\n")
}
// TestTimeUnmarshal 测试时间反序列化
func TestTimeUnmarshal(t *testing.T) {
fmt.Println("\n=== 测试时间反序列化 ===")
// 测试不同时间格式
testCases := []struct {
name string
jsonStr string
expected string
}{
{
name: "标准格式",
jsonStr: `{"time":"2026-04-02 22:04:44"}`,
expected: "2026-04-02 22:04:44",
},
{
name: "ISO8601 格式",
jsonStr: `{"time":"2026-04-02T22:04:44+08:00"}`,
expected: "2026-04-02 22:04:44",
},
{
name: "日期格式",
jsonStr: `{"time":"2026-04-02"}`,
expected: "2026-04-02 00:00:00",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
var result struct {
Time model.Time `json:"time"`
}
if err := json.Unmarshal([]byte(tc.jsonStr), &result); err != nil {
t.Errorf("反序列化失败:%v", err)
}
formatted := result.Time.String()
fmt.Printf("%s: %s -> %s\n", tc.name, tc.jsonStr, formatted)
})
}
fmt.Println("✓ 时间反序列化测试通过")
}
// TestZeroTime 测试零值时间
func TestZeroTime(t *testing.T) {
fmt.Println("\n=== 测试零值时间 ===")
user := &model.User{
ID: 1,
Username: "test",
CreatedAt: model.Time{}, // 零值
UpdatedAt: model.Time{}, // 零值
}
jsonData, err := json.Marshal(user)
if err != nil {
t.Errorf("JSON 序列化失败:%v", err)
}
fmt.Printf("零值时间 JSON: %s\n", string(jsonData))
// 零值应该序列化为 null
var result map[string]interface{}
json.Unmarshal(jsonData, &result)
if result["created_at"] != nil {
t.Error("零值时间应该序列化为 null")
}
fmt.Println("✓ 零值时间测试通过")
}
// TestPointerTime 测试指针类型时间
func TestPointerTime(t *testing.T) {
fmt.Println("\n=== 测试指针类型时间 ===")
now := time.Now()
softUser := &model.SoftDeleteUser{
ID: 1,
Username: "test",
DeletedAt: &model.Time{Time: now},
}
jsonData, err := json.Marshal(softUser)
if err != nil {
t.Errorf("JSON 序列化失败:%v", err)
}
fmt.Printf("指针时间 JSON: %s\n", string(jsonData))
// 验证格式
var result map[string]interface{}
json.Unmarshal(jsonData, &result)
if deletedAt, ok := result["deleted_at"].(string); ok {
_, err := time.Parse("2006-01-02 15:04:05", deletedAt)
if err != nil {
t.Errorf("指针时间格式不正确:%v", err)
}
}
fmt.Println("✓ 指针类型时间测试通过")
}
// TestAllReadTimeFormatting 完整读取时间格式化测试
func TestAllReadTimeFormatting(t *testing.T) {
fmt.Println("\n========================================")
fmt.Println(" 读取操作时间格式化完整性测试")
fmt.Println("========================================")
TestTimeFormatting(t)
TestTimeUnmarshal(t)
TestZeroTime(t)
TestPointerTime(t)
fmt.Println("\n========================================")
fmt.Println(" 所有读取时间格式化测试完成!")
fmt.Println("========================================")
fmt.Println()
fmt.Println("已实现的读取时间格式化功能:")
fmt.Println(" ✓ CreatedAt: 自动格式化为 YYYY-MM-DD HH:mm:ss")
fmt.Println(" ✓ UpdatedAt: 自动格式化为 YYYY-MM-DD HH:mm:ss")
fmt.Println(" ✓ DeletedAt: 自动格式化为 YYYY-MM-DD HH:mm:ss")
fmt.Println(" ✓ 支持多种时间格式反序列化")
fmt.Println(" ✓ 零值时间正确处理为 null")
fmt.Println(" ✓ 指针类型时间正确序列化")
fmt.Println()
}