| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- import { describe, expect, it, vi } from "vitest";
- import { fromZonedTime } from "date-fns-tz";
- const mocks = vi.hoisted(() => ({
- getSession: vi.fn(),
- getSystemSettings: vi.fn(),
- findUsageLogsForKeySlim: vi.fn(),
- findUsageLogsForKeyBatch: vi.fn(),
- resolveSystemTimezone: vi.fn(),
- }));
- vi.mock("@/lib/auth", () => ({
- getSession: mocks.getSession,
- }));
- vi.mock("@/repository/system-config", () => ({
- getSystemSettings: mocks.getSystemSettings,
- }));
- vi.mock("@/repository/usage-logs", async (importOriginal) => {
- const actual = await importOriginal<typeof import("@/repository/usage-logs")>();
- return {
- ...actual,
- findUsageLogsForKeySlim: mocks.findUsageLogsForKeySlim,
- findUsageLogsForKeyBatch: mocks.findUsageLogsForKeyBatch,
- };
- });
- vi.mock("@/lib/utils/timezone", () => ({
- resolveSystemTimezone: mocks.resolveSystemTimezone,
- }));
- describe("my-usage date range parsing", () => {
- it("computes exclusive endTime as next local midnight across DST start for batch logs", async () => {
- const tz = "America/Los_Angeles";
- mocks.resolveSystemTimezone.mockResolvedValue(tz);
- mocks.getSession.mockResolvedValue({
- key: { id: 1, key: "k" },
- user: { id: 1 },
- });
- mocks.getSystemSettings.mockResolvedValue({
- currencyDisplay: "USD",
- billingModelSource: "original",
- });
- mocks.findUsageLogsForKeyBatch.mockResolvedValue({
- logs: [],
- nextCursor: null,
- hasMore: false,
- });
- const { getMyUsageLogsBatch } = await import("@/actions/my-usage");
- const res = await getMyUsageLogsBatch({ startDate: "2024-03-10", endDate: "2024-03-10" });
- expect(res.ok).toBe(true);
- expect(mocks.findUsageLogsForKeyBatch).toHaveBeenCalledTimes(1);
- const args = mocks.findUsageLogsForKeyBatch.mock.calls[0]?.[0];
- expect(args.startTime).toBe(fromZonedTime("2024-03-10T00:00:00", tz).getTime());
- expect(args.endTime).toBe(fromZonedTime("2024-03-11T00:00:00", tz).getTime());
- expect(args.limit).toBe(20);
- expect(args.endTime - args.startTime).toBe(23 * 60 * 60 * 1000);
- });
- it("computes exclusive endTime as next local midnight across DST end for batch logs", async () => {
- const tz = "America/Los_Angeles";
- mocks.resolveSystemTimezone.mockResolvedValue(tz);
- mocks.getSession.mockResolvedValue({
- key: { id: 1, key: "k" },
- user: { id: 1 },
- });
- mocks.getSystemSettings.mockResolvedValue({
- currencyDisplay: "USD",
- billingModelSource: "original",
- });
- mocks.findUsageLogsForKeyBatch.mockResolvedValue({
- logs: [],
- nextCursor: null,
- hasMore: false,
- });
- const { getMyUsageLogsBatch } = await import("@/actions/my-usage");
- const res = await getMyUsageLogsBatch({ startDate: "2024-11-03", endDate: "2024-11-03" });
- expect(res.ok).toBe(true);
- expect(mocks.findUsageLogsForKeyBatch).toHaveBeenCalledTimes(1);
- const args = mocks.findUsageLogsForKeyBatch.mock.calls[0]?.[0];
- expect(args.startTime).toBe(fromZonedTime("2024-11-03T00:00:00", tz).getTime());
- expect(args.endTime).toBe(fromZonedTime("2024-11-04T00:00:00", tz).getTime());
- expect(args.limit).toBe(20);
- expect(args.endTime - args.startTime).toBe(25 * 60 * 60 * 1000);
- });
- it("computes DST-safe range for legacy page-based logs API", async () => {
- const tz = "America/Los_Angeles";
- mocks.resolveSystemTimezone.mockResolvedValue(tz);
- mocks.getSession.mockResolvedValue({
- key: { id: 1, key: "k" },
- user: { id: 1 },
- });
- mocks.getSystemSettings.mockResolvedValue({
- currencyDisplay: "USD",
- billingModelSource: "original",
- });
- mocks.findUsageLogsForKeySlim.mockResolvedValue({
- logs: [],
- total: 0,
- });
- const { getMyUsageLogs } = await import("@/actions/my-usage");
- const res = await getMyUsageLogs({ startDate: "2024-03-10", endDate: "2024-03-10" });
- expect(res.ok).toBe(true);
- expect(mocks.findUsageLogsForKeySlim).toHaveBeenCalledTimes(1);
- const args = mocks.findUsageLogsForKeySlim.mock.calls[0]?.[0];
- expect(args.startTime).toBe(fromZonedTime("2024-03-10T00:00:00", tz).getTime());
- expect(args.endTime).toBe(fromZonedTime("2024-03-11T00:00:00", tz).getTime());
- expect(args.page).toBe(1);
- expect(args.pageSize).toBe(20);
- });
- });
|