|
|
@@ -100,7 +100,11 @@ func TestBillRepoLoadRechargeRequestNosBetweenInclusive(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// TestBillRepoLoadLogsAndPageOrdering 全量取数与分页一致性(分页只切明细,不改全量)。
|
|
|
+// TestBillRepoLoadLogsAndPageOrdering 全量取数 vs 窗口内分页(两者作用域不同,必须都对)。
|
|
|
+//
|
|
|
+// v1.4 起:`LoadLogs` 仍是**全量**(dump 的 `temp_user_expense_log` 等价物,供汇总用),
|
|
|
+// 而 `PageLogs` / `CountLogs` **按窗口过滤**(`from <= create_time < to`,右开)。
|
|
|
+// 本用例同时钉住这两条,防止"为了明细过滤顺手把全量也裁了"(那会把期初算错)。
|
|
|
func TestBillRepoLoadLogsAndPageOrdering(t *testing.T) {
|
|
|
db := newBillRepoDB(t)
|
|
|
ctx := context.Background()
|
|
|
@@ -126,32 +130,37 @@ func TestBillRepoLoadLogsAndPageOrdering(t *testing.T) {
|
|
|
if len(all) != 3 {
|
|
|
t.Fatalf("全量流水 = %d 条,期望 3(**不带时间/类型过滤**,同 dump 临时表)", len(all))
|
|
|
}
|
|
|
- total, err := repo.CountLogs(ctx, userID)
|
|
|
+
|
|
|
+ from := time.Date(2026, 3, 1, 0, 0, 0, 0, time.UTC)
|
|
|
+ to := time.Date(2026, 3, 6, 9, 0, 0, 0, time.UTC) // 右开:03-06 09:00 那笔**恰好落在 to**,应被排除
|
|
|
+ total, err := repo.CountLogs(ctx, userID, from, to)
|
|
|
if err != nil {
|
|
|
t.Fatalf("CountLogs 失败: %v", err)
|
|
|
}
|
|
|
- if total != 3 {
|
|
|
- t.Fatalf("CountLogs = %d,期望 3", total)
|
|
|
+ if total != 2 {
|
|
|
+ t.Fatalf("CountLogs = %d,期望 2(窗口内 2 笔;右端点那笔被 `create_time < to` 排除)", total)
|
|
|
}
|
|
|
|
|
|
- page1, err := repo.PageLogs(ctx, userID, PageQuery{Page: 1, PageSize: 2})
|
|
|
+ page1, err := repo.PageLogs(ctx, userID, from, to, PageQuery{Page: 1, PageSize: 2})
|
|
|
if err != nil {
|
|
|
t.Fatalf("PageLogs(1) 失败: %v", err)
|
|
|
}
|
|
|
- page2, err := repo.PageLogs(ctx, userID, PageQuery{Page: 2, PageSize: 2})
|
|
|
+ page2, err := repo.PageLogs(ctx, userID, from, to, PageQuery{Page: 2, PageSize: 2})
|
|
|
if err != nil {
|
|
|
t.Fatalf("PageLogs(2) 失败: %v", err)
|
|
|
}
|
|
|
- if len(page1) != 2 || len(page2) != 1 {
|
|
|
- t.Fatalf("分页条数 = %d/%d,期望 2/1", len(page1), len(page2))
|
|
|
+ if len(page1) != 2 || len(page2) != 0 {
|
|
|
+ t.Fatalf("分页条数 = %d/%d,期望 2/0(窗口内只有 2 笔;右端点那笔已被排除)", len(page1), len(page2))
|
|
|
}
|
|
|
- // 倒序:第 1 页首行是最新的 03-06 那笔
|
|
|
- if !sameRepoAmount(t, page1[0].Money, "-5.00") {
|
|
|
- t.Fatalf("第 1 页首行 money = %s,期望 -5.00(时间倒序)", page1[0].Money)
|
|
|
+ // 同一秒两行按 id DESC:第 1 页首行应是 id 更大的 107,次行是 100
|
|
|
+ if page1[0].Type != model.ExpenseLogTypeRecommend || page1[1].Type != model.ExpenseLogTypeRecharge {
|
|
|
+ t.Fatalf("同一秒内排序不稳定:page1=%+v", page1)
|
|
|
}
|
|
|
- // 同一秒两行按 id DESC:第 1 页次行应是 id 更大的 107
|
|
|
- if page1[1].Type != model.ExpenseLogTypeRecommend || page2[0].Type != model.ExpenseLogTypeRecharge {
|
|
|
- t.Fatalf("同一秒内排序不稳定:page1=%+v page2=%+v", page1[1], page2[0])
|
|
|
+ // 窗口外(恰好等于 to)那笔不得出现在明细
|
|
|
+ for _, row := range page1 {
|
|
|
+ if !row.CreateTime.Before(to) {
|
|
|
+ t.Fatalf("明细含右端点流水:%+v", row)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -201,12 +210,20 @@ func TestBillRepoParamGuards(t *testing.T) {
|
|
|
ctx := context.Background()
|
|
|
repo := NewBillRepo(db)
|
|
|
|
|
|
+ from := time.Date(2026, 3, 1, 0, 0, 0, 0, time.UTC)
|
|
|
+ to := time.Date(2026, 4, 1, 0, 0, 0, 0, time.UTC)
|
|
|
+
|
|
|
_, err := repo.LoadLogs(ctx, "")
|
|
|
wantRepoErr(t, err, infraerrors.CodeBadParam, "LoadLogs 空 user")
|
|
|
- _, err = repo.PageLogs(ctx, "", PageQuery{})
|
|
|
+ _, err = repo.PageLogs(ctx, "", from, to, PageQuery{})
|
|
|
wantRepoErr(t, err, infraerrors.CodeBadParam, "PageLogs 空 user")
|
|
|
- _, err = repo.CountLogs(ctx, "")
|
|
|
+ _, err = repo.CountLogs(ctx, "", from, to)
|
|
|
wantRepoErr(t, err, infraerrors.CodeBadParam, "CountLogs 空 user")
|
|
|
+ // from>to:分页与计数都必须拒绝(否则会静默返回空集,掩盖调用方的时间窗写反)
|
|
|
+ _, err = repo.PageLogs(ctx, "01HUSER000000000000000930", to, from, PageQuery{})
|
|
|
+ wantRepoErr(t, err, infraerrors.CodeBadParam, "PageLogs from 晚于 to")
|
|
|
+ _, err = repo.CountLogs(ctx, "01HUSER000000000000000930", to, from)
|
|
|
+ wantRepoErr(t, err, infraerrors.CodeBadParam, "CountLogs from 晚于 to")
|
|
|
_, err = repo.LoadActivitySigned(ctx, "")
|
|
|
wantRepoErr(t, err, infraerrors.CodeBadParam, "LoadActivitySigned 空 user")
|
|
|
_, err = repo.LoadActivityUsedLogs(ctx, "")
|