Files
hfb_sys/backend/internal/modules/adminfinance/handler_test.go
T

143 lines
3.9 KiB
Go

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)
}
})
}
}