143 lines
3.9 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|