package adminfinance import ( "net/http" "net/http/httptest" "testing" "hfb_sys/backend/internal/timeutil" "github.com/gin-gonic/gin" ) func TestParseFlexibleDateTime(t *testing.T) { loc := timeutil.ShanghaiLocation() // 1. Test YYYY-MM-DD start, err := parseFlexibleDateTime("2026-09-01", loc, false) if err != nil { t.Fatalf("unexpected error for date start: %v", err) } if start.Year() != 2026 || start.Month() != 9 || start.Day() != 1 || start.Hour() != 0 || start.Minute() != 0 || start.Second() != 0 { t.Fatalf("unexpected start date: %v", start) } end, err := parseFlexibleDateTime("2026-09-01", loc, true) if err != nil { t.Fatalf("unexpected error for date end: %v", err) } if end.Year() != 2026 || end.Month() != 9 || end.Day() != 1 || end.Hour() != 23 || end.Minute() != 59 || end.Second() != 59 { t.Fatalf("unexpected end date: %v", end) } // 2. Test YYYY-MM-DD HH:mm startMinute, err := parseFlexibleDateTime("2026-09-01 14:30", loc, false) if err != nil { t.Fatalf("unexpected error for minute start: %v", err) } if startMinute.Hour() != 14 || startMinute.Minute() != 30 || startMinute.Second() != 0 { t.Fatalf("unexpected start minute: %v", startMinute) } endMinute, err := parseFlexibleDateTime("2026-09-01 14:30", loc, true) if err != nil { t.Fatalf("unexpected error for minute end: %v", err) } if endMinute.Hour() != 14 || endMinute.Minute() != 30 || endMinute.Second() != 59 { t.Fatalf("unexpected end minute: %v", endMinute) } // 3. Test YYYY-MM-DD HH:mm:ss startSec, err := parseFlexibleDateTime("2026-09-01 14:30:15", loc, false) if err != nil { t.Fatalf("unexpected error for second start: %v", err) } if startSec.Hour() != 14 || startSec.Minute() != 30 || startSec.Second() != 15 { t.Fatalf("unexpected start sec: %v", startSec) } endSec, err := parseFlexibleDateTime("2026-09-01 14:30:15", loc, true) if err != nil { t.Fatalf("unexpected error for second end: %v", err) } if endSec.Hour() != 14 || endSec.Minute() != 30 || endSec.Second() != 15 { t.Fatalf("unexpected end sec: %v", endSec) } // 4. Test invalid if _, err := parseFlexibleDateTime("invalid-date", loc, false); err == nil { t.Fatalf("expected error for invalid date") } } func TestParseDateRangeGin(t *testing.T) { gin.SetMode(gin.TestMode) tests := []struct { name string query string wantStatus int wantOk bool }{ { name: "default range", query: "", wantStatus: http.StatusOK, wantOk: true, }, { name: "date range", query: "?start_date=2026-09-01&end_date=2026-09-07", wantStatus: http.StatusOK, wantOk: true, }, { name: "datetime range with minute", query: "?start_date=2026-09-01%2009:30&end_date=2026-09-07%2018:45", wantStatus: http.StatusOK, wantOk: true, }, { name: "datetime range with second", query: "?start_date=2026-09-01%2009:30:00&end_date=2026-09-07%2018:45:59", wantStatus: http.StatusOK, wantOk: true, }, { name: "start_time and end_time params", query: "?start_time=2026-09-01%2009:30:00&end_time=2026-09-07%2018:45:59", wantStatus: http.StatusOK, wantOk: true, }, { name: "start after end", query: "?start_date=2026-09-07&end_date=2026-09-01", wantStatus: http.StatusBadRequest, wantOk: false, }, { name: "invalid date", query: "?start_date=invalid", wantStatus: http.StatusBadRequest, wantOk: false, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) req, _ := http.NewRequest(http.MethodGet, "/test"+tc.query, nil) c.Request = req _, _, ok := parseDateRange(c, 29) if ok != tc.wantOk { t.Fatalf("parseDateRange() ok = %v, wantOk = %v", ok, tc.wantOk) } if !ok && w.Code != tc.wantStatus { t.Fatalf("HTTP status = %d, wantStatus = %d", w.Code, tc.wantStatus) } }) } }