feat(cards): filter operations by date range

This commit is contained in:
2026-09-12 21:52:13 +03:00
parent 8e58c016d2
commit 9bb385b9f0
7 changed files with 188 additions and 47 deletions
+28 -11
View File
@@ -57,6 +57,7 @@ function setup(
clear: () => {},
});
const requests: string[] = [];
const summaryRequests: string[] = [];
server.use(
http.get("*/api/v1/bank-cards/a", () =>
options.missing
@@ -82,8 +83,9 @@ function setup(
hasNext: Number(new URL(request.url).searchParams.get("page")) < 3,
});
}),
http.get("*/api/v1/bank-cards/summary", () =>
options.summaryError
http.get("*/api/v1/bank-cards/summary", ({ request }) => {
summaryRequests.push(new URL(request.url).search);
return options.summaryError
? HttpResponse.error()
: HttpResponse.json({
month: "2026-08",
@@ -92,8 +94,8 @@ function setup(
refunds: money("50"),
net: money("-50"),
categories: [],
}),
),
});
}),
);
const client = createTestQueryClient();
render(
@@ -107,18 +109,18 @@ function setup(
</MantineProvider>
</QueryClientProvider>,
);
return { requests, client };
return { requests, summaryRequests, client };
}
describe("CardPage", () => {
it("shares month with history, pages the journal and keeps current balance", async () => {
const { requests } = setup();
it("shares date range with history, pages the journal and keeps current balance", async () => {
const { requests, summaryRequests } = setup();
await screen.findByRole("heading", { name: "Повседневная" });
expect(
await screen.findByText("Перевод на «Запасная»"),
).toBeInTheDocument();
expect(screen.getByText("03.08.2026")).toBeInTheDocument();
expect(screen.getByText("−50,01 ₽")).toBeInTheDocument();
expect(screen.getByText("-50 ₽")).toBeInTheDocument();
expect(await screen.findByText("-50,00 ₽")).toBeInTheDocument();
expect(screen.getByRole("button", { name: "Назад" })).toBeDisabled();
expect(requests.every((value) => value.includes("limit=10"))).toBe(true);
fireEvent.click(screen.getByRole("button", { name: "Далее" }));
@@ -135,15 +137,30 @@ describe("CardPage", () => {
expect(
screen.getByRole("button", { name: "Страница 3" }),
).toHaveTextContent("3");
fireEvent.click(screen.getByLabelText("Месяц"));
fireEvent.click(await screen.findByRole("button", { name: "Jul" }));
fireEvent.click(screen.getByLabelText("Период"));
fireEvent.click(
await screen.findByRole("button", { name: "10 August 2026" }),
);
fireEvent.click(
await screen.findByRole("button", { name: "20 August 2026" }),
);
await waitFor(() =>
expect(
requests.some(
(v) => v.includes("month=2026-07") && v.includes("page=1"),
(v) =>
v.includes("from=2026-08-10") &&
v.includes("to=2026-08-20") &&
v.includes("page=1"),
),
).toBe(true),
);
await waitFor(() =>
expect(summaryRequests.at(-1)).toContain("from=2026-08-10&to=2026-08-20"),
);
expect(screen.getByRole("link", { name: "Карта" })).toHaveAttribute(
"href",
"/cards/b?from=2026-08-10&to=2026-08-20",
);
expect(screen.getByText(/10\s000 ₽/)).toBeInTheDocument();
});
it("keeps the journal in place while the next page loads", async () => {