fix: resolve frontend audit findings
Frontend security / security (push) Successful in 10s
Frontend verify / verify (push) Successful in 4m57s
Conventional commits / commits (pull_request) Successful in 28s
Frontend security / security (pull_request) Successful in 10s
Frontend verify / verify (pull_request) Successful in 5m10s
Frontend security / security (push) Successful in 10s
Frontend verify / verify (push) Successful in 4m57s
Conventional commits / commits (pull_request) Successful in 28s
Frontend security / security (pull_request) Successful in 10s
Frontend verify / verify (pull_request) Successful in 5m10s
Repair investment recovery, draft preservation, date validation, currency presentation, accessibility, and route error recovery. Correct Docker and dependency checks and consume explicit income roles.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { MantineProvider } from "@mantine/core";
|
||||
import { type QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
||||
import { render, screen, waitFor } from "@testing-library/react";
|
||||
import { fireEvent, render, screen, waitFor } from "@testing-library/react";
|
||||
import { HttpResponse, http } from "msw";
|
||||
import { MemoryRouter } from "react-router";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
@@ -43,6 +43,21 @@ function renderPage(queryClient: QueryClient) {
|
||||
}
|
||||
|
||||
describe("AccountsPage", () => {
|
||||
it("loads accounts after retrying an initial HTTP failure", async () => {
|
||||
const modes: (string | null)[] = [];
|
||||
server.use(
|
||||
http.get("*/api/v1/brokerage-accounts", ({ request }) => {
|
||||
modes.push(new URL(request.url).searchParams.get("sync"));
|
||||
return modes.length === 1
|
||||
? HttpResponse.json({ code: "TBANK_UNAVAILABLE" }, { status: 503 })
|
||||
: HttpResponse.json(resource([account]));
|
||||
}),
|
||||
);
|
||||
renderPage(createTestQueryClient());
|
||||
fireEvent.click(await screen.findByRole("button", { name: "Повторить" }));
|
||||
expect(await screen.findByText(account.name)).toBeVisible();
|
||||
expect(modes).toEqual([null, "observe"]);
|
||||
});
|
||||
it.each([
|
||||
["loading", AccountsPageLoading, "status"],
|
||||
["empty", AccountsPageEmpty, undefined],
|
||||
@@ -143,8 +158,10 @@ describe("AccountsPage", () => {
|
||||
expect(screen.getByText(account.name)).toBeInTheDocument();
|
||||
|
||||
screen.getByRole("button", { name: "Повторить" }).click();
|
||||
await waitFor(() => expect(requests).toEqual([{ screen: "accounts" }]));
|
||||
expect(requestCount).toBe(2);
|
||||
await waitFor(() => expect(requestCount).toBe(3));
|
||||
await waitFor(() => expect(warning).not.toBeInTheDocument());
|
||||
expect(screen.getByText(account.name)).toBeVisible();
|
||||
expect(requests).toEqual([]);
|
||||
});
|
||||
|
||||
it("keeps a cached empty account list visible after a refresh error", async () => {
|
||||
|
||||
@@ -18,7 +18,7 @@ function useAccountsPageViewModel() {
|
||||
return {
|
||||
state: "error" as const,
|
||||
code: apiErrorCode(accounts.error),
|
||||
retry: sync.refresh,
|
||||
retry: sync.retry,
|
||||
};
|
||||
}
|
||||
if (!accounts.data?.length)
|
||||
@@ -28,7 +28,7 @@ function useAccountsPageViewModel() {
|
||||
refreshing: accounts.isFetching || sync.refreshing,
|
||||
sourceError: sync.sourceError,
|
||||
refreshError: accounts.isError || sync.transportError || sync.sourceError,
|
||||
retry: sync.refresh,
|
||||
retry: sync.retry,
|
||||
};
|
||||
return {
|
||||
state: "loaded" as const,
|
||||
@@ -37,7 +37,7 @@ function useAccountsPageViewModel() {
|
||||
refreshing: accounts.isFetching || sync.refreshing,
|
||||
sourceError: sync.sourceError,
|
||||
refreshError: accounts.isError || sync.transportError || sync.sourceError,
|
||||
retry: sync.refresh,
|
||||
retry: sync.retry,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user