75 lines
2.2 KiB
TypeScript
75 lines
2.2 KiB
TypeScript
// @vitest-environment jsdom
|
|
|
|
import { render, screen } from "@testing-library/react";
|
|
import { describe, expect, it, vi } from "vitest";
|
|
|
|
import { createRuntimeComposition } from "../../src/bootstrap/create-runtime-composition.ts";
|
|
import { RuntimeApplication } from "../../src/bootstrap/runtime-application.tsx";
|
|
|
|
const runtimeConfig = {
|
|
APP_ENV: "local",
|
|
API_BASE_URL: "http://localhost:8080",
|
|
REQUEST_TIMEOUT_MS: 10_000,
|
|
MAX_RETRY_ATTEMPTS: 2,
|
|
TELEMETRY_ENABLED: false,
|
|
AUTH_MODE: "demo",
|
|
CONFIG_SCHEMA_VERSION: "1",
|
|
API_CONTRACT_VERSION: "1",
|
|
RELEASE_MANIFEST_URL: "/release-manifest.json",
|
|
BUILD_ID: "local-build",
|
|
RELEASE_ID: "local-release",
|
|
};
|
|
|
|
const releaseManifest = {
|
|
schemaVersion: 1,
|
|
appVersion: "0.1.0",
|
|
buildId: "local-build",
|
|
commitSha: "local",
|
|
configSchemaVersion: "1",
|
|
apiContractVersion: "1",
|
|
assetManifestHash: "test-hash",
|
|
releaseId: "local-release",
|
|
builtAt: "2026-07-26T00:00:00.000Z",
|
|
routeChunks: {
|
|
"route-home": "assets/home.js",
|
|
"route-examples-ui": "assets/ui.js",
|
|
"route-examples-states": "assets/states.js",
|
|
"route-examples-auth": "assets/auth.js",
|
|
"route-not-found": "assets/not-found.js",
|
|
},
|
|
};
|
|
|
|
describe("production runtime application tree", () => {
|
|
it("connects validated config and release through composition and ApplicationProvider", async () => {
|
|
const fetcher = vi.fn(async (input) => {
|
|
const url =
|
|
typeof input === "string"
|
|
? input
|
|
: input instanceof URL
|
|
? input.href
|
|
: input.url;
|
|
return Response.json(
|
|
url.includes("release-manifest") ? releaseManifest : runtimeConfig,
|
|
);
|
|
});
|
|
const composition = await createRuntimeComposition({
|
|
fetcher,
|
|
host: {},
|
|
});
|
|
|
|
window.history.pushState({}, "", "/");
|
|
render(<RuntimeApplication composition={composition} />);
|
|
|
|
expect(
|
|
await screen.findByRole("heading", {
|
|
name: "Clean Architecture Frontend",
|
|
}),
|
|
).toBeVisible();
|
|
expect(
|
|
await screen.findByText("빌드 local-build · 릴리스 local-release"),
|
|
).toBeVisible();
|
|
expect(fetcher).toHaveBeenCalledTimes(2);
|
|
expect(composition).not.toHaveProperty("ports");
|
|
});
|
|
});
|