package validator import ( "testing" "time" "github.com/go-playground/validator/v10" ) func TestValidateAuthDate(t *testing.T) { validate := validator.New() validate.RegisterValidation("auth_date", validateAuthDate) today := time.Now().Format("20060102") yesterday := time.Now().AddDate(0, 0, -1).Format("20060102") tomorrow := time.Now().AddDate(0, 0, 1).Format("20060102") lastWeek := time.Now().AddDate(0, 0, -7).Format("20060102") nextWeek := time.Now().AddDate(0, 0, 7).Format("20060102") tests := []struct { name string authDate string wantErr bool }{ { name: "今天到今天 - 有效", authDate: today + "-" + today, wantErr: false, }, { name: "昨天到今天 - 有效", authDate: yesterday + "-" + today, wantErr: false, }, { name: "今天到明天 - 有效", authDate: today + "-" + tomorrow, wantErr: false, }, { name: "上周到今天 - 有效", authDate: lastWeek + "-" + today, wantErr: false, }, { name: "今天到下周 - 有效", authDate: today + "-" + nextWeek, wantErr: false, }, { name: "昨天到明天 - 有效", authDate: yesterday + "-" + tomorrow, wantErr: false, }, { name: "明天到后天 - 无效(不包括今天)", authDate: tomorrow + "-" + time.Now().AddDate(0, 0, 2).Format("20060102"), wantErr: true, }, { name: "上周到昨天 - 无效(不包括今天)", authDate: lastWeek + "-" + yesterday, wantErr: true, }, { name: "格式错误 - 缺少连字符", authDate: "2024010120240131", wantErr: true, }, { name: "格式错误 - 多个连字符", authDate: "20240101-20240131-20240201", wantErr: true, }, { name: "格式错误 - 日期长度不对", authDate: "202401-20240131", wantErr: true, }, { name: "格式错误 - 非数字", authDate: "20240101-2024013A", wantErr: true, }, { name: "无效日期 - 2月30日", authDate: "20240230-20240301", wantErr: true, }, { name: "无效日期 - 13月", authDate: "20241301-20241331", wantErr: true, }, { name: "开始日期晚于结束日期", authDate: "20240131-20240101", wantErr: true, }, { name: "空字符串 - 由required处理", authDate: "", wantErr: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := validate.Var(tt.authDate, "auth_date") if (err != nil) != tt.wantErr { t.Errorf("validateAuthDate() error = %v, wantErr %v", err, tt.wantErr) } }) } } func TestParseYYYYMMDD(t *testing.T) { tests := []struct { name string dateStr string want time.Time wantErr bool }{ { name: "有效日期", dateStr: "20240101", want: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC), wantErr: false, }, { name: "闰年2月29日", dateStr: "20240229", want: time.Date(2024, 2, 29, 0, 0, 0, 0, time.UTC), wantErr: false, }, { name: "非闰年2月29日", dateStr: "20230229", want: time.Time{}, wantErr: true, }, { name: "长度错误", dateStr: "202401", want: time.Time{}, wantErr: true, }, { name: "非数字", dateStr: "2024010A", want: time.Time{}, wantErr: true, }, { name: "无效月份", dateStr: "20241301", want: time.Time{}, wantErr: true, }, { name: "无效日期", dateStr: "20240230", want: time.Time{}, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := parseYYYYMMDD(tt.dateStr) if (err != nil) != tt.wantErr { t.Errorf("parseYYYYMMDD() error = %v, wantErr %v", err, tt.wantErr) return } if !tt.wantErr && !got.Equal(tt.want) { t.Errorf("parseYYYYMMDD() = %v, want %v", got, tt.want) } }) } }