feat: execute route and release recovery contracts
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
import { render, screen } from "@testing-library/react";
|
||||
import userEvent from "@testing-library/user-event";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
|
||||
import {
|
||||
createAnonymousSessionAdapter,
|
||||
@@ -14,10 +14,13 @@ import { createTestApplication } from "../helpers/create-test-application.js";
|
||||
|
||||
/**
|
||||
* @param {import("../../src/application/ports/auth-session-port.js").AuthSessionPort} session
|
||||
* @param {Parameters<typeof createTestApplication>[0]} [overrides]
|
||||
*/
|
||||
function renderRouter(session) {
|
||||
function renderRouter(session, overrides = {}) {
|
||||
return render(
|
||||
<ApplicationProvider application={createTestApplication({ session })}>
|
||||
<ApplicationProvider
|
||||
application={createTestApplication({ ...overrides, session })}
|
||||
>
|
||||
<AppRouter />
|
||||
</ApplicationProvider>,
|
||||
);
|
||||
@@ -50,6 +53,10 @@ describe("application router", () => {
|
||||
await screen.findByRole("heading", { name: "UI 구성요소", level: 1 }),
|
||||
).toBeVisible();
|
||||
expect(window.location.pathname).toBe("/examples/ui");
|
||||
expect(document.title).toBe("UI 구성요소 · Frontend Skeleton");
|
||||
expect(
|
||||
screen.getByRole("heading", { name: "UI 구성요소", level: 1 }),
|
||||
).toHaveFocus();
|
||||
});
|
||||
|
||||
it("reacts to demo sign-in and opens the protected integration route", async () => {
|
||||
@@ -82,4 +89,31 @@ describe("application router", () => {
|
||||
screen.getByRole("heading", { name: "세션이 필요합니다." }),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
it("rejects invalid route search before any application query runs", async () => {
|
||||
const getCurrent = vi.fn(async () => ({
|
||||
buildId: "test-build",
|
||||
releaseId: "test-release",
|
||||
configSchemaVersion: "1",
|
||||
apiContractVersion: "1",
|
||||
assetManifestHash: "test-hash",
|
||||
routeChunks: { "route-sample-resources": "assets/sample.js" },
|
||||
}));
|
||||
window.history.pushState({}, "", "/sample/resources?limit=invalid");
|
||||
renderRouter(createDemoSessionAdapter("authenticated"), {
|
||||
releaseInfo: { getCurrent, refresh: getCurrent },
|
||||
});
|
||||
|
||||
expect(
|
||||
await screen.findByRole("heading", {
|
||||
name: "올바르지 않은 주소입니다.",
|
||||
}),
|
||||
).toBeVisible();
|
||||
expect(screen.getAllByRole("heading", { level: 1 })).toHaveLength(1);
|
||||
expect(screen.getByText("안전한 탐색 링크를 사용해 주세요.")).toHaveAttribute(
|
||||
"data-route-error",
|
||||
"ROUTE_SEARCH_INVALID",
|
||||
);
|
||||
expect(getCurrent).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user