refactor(pwa): штрафы живут только на главном экране
Отдельный список штрафов удалён: два списка одного и того же в разных местах сбивали с толку. Фильтр «Штрафы» внизу главного экрана теперь показывает сами постановления, а не проводки по ним, и ведёт в карточку с фотографией. Разница между постановлением и проводкой здесь принципиальная: штраф, который водитель оплатил сам, парк не выставлял — проводки нет, и в выписке он бы не появился вовсе (Морозов, штраф от 16.08). Строка «Долг по штрафам» вверху теперь включает этот фильтр, а не уводит на другой экран. Период действует и на штрафы: календарь над списком не должен стоять, ничего не меняя. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,14 @@ vi.mock("@/api/driver", () => ({
|
||||
synced_at: null,
|
||||
pending_topup: 1500,
|
||||
})),
|
||||
getFines: vi.fn(async () => ({
|
||||
items: [{
|
||||
id: 12, number: "18810525260813035846", date: "2026-08-13",
|
||||
article: "12.09.2 - Превышение скорости", address: "", car_number: "А947УТ125",
|
||||
amount: 618.75, settled: "owed" as const, cancelled: false, has_photo: true,
|
||||
}],
|
||||
open_count: 1, debt: -5156,
|
||||
})),
|
||||
getStatement: vi.fn(async () => ({
|
||||
items: [
|
||||
{ date: "2026-08-17", title: "Аренда автомобиля", description: "ТС А947УТ125",
|
||||
@@ -38,7 +46,6 @@ function wrap() {
|
||||
<Routes>
|
||||
<Route path="/" element={<BalancePage />} />
|
||||
<Route path="/topup" element={<p>экран пополнения</p>} />
|
||||
<Route path="/fines" element={<p>экран штрафов</p>} />
|
||||
</Routes>
|
||||
</MemoryRouter>
|
||||
</QueryClientProvider>
|
||||
@@ -64,9 +71,18 @@ describe("главный экран", () => {
|
||||
|
||||
it("фильтр перезапрашивает операции выбранного вида", async () => {
|
||||
wrap();
|
||||
await userEvent.click(await screen.findByRole("button", { name: "Штрафы" }));
|
||||
await userEvent.click(await screen.findByRole("button", { name: "Начисления" }));
|
||||
const calls = vi.mocked(driver.getStatement).mock.calls;
|
||||
expect(calls[calls.length - 1][2]).toBe("fines");
|
||||
expect(calls[calls.length - 1][2]).toBe("charges");
|
||||
});
|
||||
|
||||
it("фильтр «Штрафы» показывает постановления, а не проводки", async () => {
|
||||
// Штраф, оплаченный водителем самостоятельно, парк не выставлял — проводки по
|
||||
// нему нет, и в выписке он бы не появился вовсе (Морозов, 18.08.2026).
|
||||
wrap();
|
||||
await userEvent.click(await screen.findByRole("button", { name: "Штрафы" }));
|
||||
expect(await screen.findByText(/Превышение скорости/)).toBeInTheDocument();
|
||||
expect(driver.getFines).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("аренда и штрафы видны сразу, остальные статьи — нет", async () => {
|
||||
@@ -86,10 +102,11 @@ describe("главный экран", () => {
|
||||
expect(await screen.findByText("экран пополнения")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("строка штрафов открывает список, а не оплату: «за что» важнее кнопки", async () => {
|
||||
it("строка штрафов включает фильтр внизу, а не уводит на другой экран", async () => {
|
||||
wrap();
|
||||
await userEvent.click(await screen.findByRole("button", { name: /Долг по штрафам/ }));
|
||||
expect(await screen.findByText("экран штрафов")).toBeInTheDocument();
|
||||
expect(await screen.findByText(/Превышение скорости/)).toBeInTheDocument();
|
||||
expect(driver.getFines).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("категории для выбора живут в шторке «Пополнить»", async () => {
|
||||
|
||||
Reference in New Issue
Block a user