import { describe, it, expect, afterEach, vi, beforeEach } from "vitest";
import { render, screen, cleanup } from "@testing-library/react";
import PreviewPage from "@/app/preview/page";
import type { ProjectConfig, Block } from "@/features/editor/state/editorStore";
// PreviewPage 캔버스 프리셋/폭/배경색 TDD
// - canvasPreset / canvasWidthPx / canvasBgColorHex / bodyBgColorHex 가
// preview-canvas-inner 및 main 배경에 올바르게 반영되는지 검증한다.
let mockState: any;
beforeEach(() => {
const baseProjectConfig: ProjectConfig = {
title: "프리뷰 캔버스 테스트",
slug: "preview-canvas-test",
canvasPreset: "full",
canvasBgColorHex: "#0f172a",
bodyBgColorHex: "#020617",
};
mockState = {
blocks: [] as Block[],
projectConfig: baseProjectConfig,
};
});
vi.mock("@/features/editor/state/editorStore", () => {
const useEditorStore = (selector: (state: any) => any) => selector(mockState);
return {
__esModule: true,
useEditorStore,
};
});
vi.mock("next/link", () => {
return {
__esModule: true,
default: ({ href, children }: any) => {children},
};
});
afterEach(() => {
cleanup();
});
describe("PreviewPage - canvasPreset / canvasWidthPx", () => {
it("mobile 프리셋 + canvasWidthPx=390 은 preview-canvas-inner maxWidth 를 390px 로 설정해야 한다", () => {
mockState.projectConfig = {
...(mockState.projectConfig as ProjectConfig),
canvasPreset: "mobile",
canvasWidthPx: 390,
} as ProjectConfig;
render();
const inner = screen.getByTestId("preview-canvas-inner") as HTMLElement;
expect(inner.style.maxWidth).toBe("390px");
});
it("tablet 프리셋 + canvasWidthPx=768 은 maxWidth 를 768px 로 설정해야 한다", () => {
mockState.projectConfig = {
...(mockState.projectConfig as ProjectConfig),
canvasPreset: "tablet",
canvasWidthPx: 768,
} as ProjectConfig;
render();
const inner = screen.getByTestId("preview-canvas-inner") as HTMLElement;
expect(inner.style.maxWidth).toBe("768px");
});
it("desktop 프리셋 + canvasWidthPx=1200 은 maxWidth 를 1200px 로 설정해야 한다", () => {
mockState.projectConfig = {
...(mockState.projectConfig as ProjectConfig),
canvasPreset: "desktop",
canvasWidthPx: 1200,
} as ProjectConfig;
render();
const inner = screen.getByTestId("preview-canvas-inner") as HTMLElement;
expect(inner.style.maxWidth).toBe("1200px");
});
it("full 프리셋에서 canvasWidthPx 가 없으면 maxWidth 는 비워져 있어야 한다", () => {
mockState.projectConfig = {
...(mockState.projectConfig as ProjectConfig),
canvasPreset: "full",
canvasWidthPx: undefined,
} as ProjectConfig;
render();
const inner = screen.getByTestId("preview-canvas-inner") as HTMLElement;
expect(inner.style.maxWidth).toBe("");
});
it("custom 프리셋 + canvasWidthPx=1024 는 maxWidth 를 1024px 로 설정해야 한다", () => {
mockState.projectConfig = {
...(mockState.projectConfig as ProjectConfig),
canvasPreset: "custom",
canvasWidthPx: 1024,
} as ProjectConfig;
render();
const inner = screen.getByTestId("preview-canvas-inner") as HTMLElement;
expect(inner.style.maxWidth).toBe("1024px");
});
it("canvasBgColorHex 와 bodyBgColorHex 가 각각 preview-canvas-inner 및 main 배경에 적용되어야 한다", () => {
mockState.projectConfig = {
...(mockState.projectConfig as ProjectConfig),
canvasPreset: "full",
canvasBgColorHex: "#111111",
bodyBgColorHex: "#222222",
} as ProjectConfig;
const { container } = render();
const inner = screen.getByTestId("preview-canvas-inner") as HTMLElement;
const main = container.querySelector("main") as HTMLElement;
expect(inner.style.backgroundColor).toBe("rgb(17, 17, 17)");
expect(main.style.backgroundColor).toBe("rgb(34, 34, 34)");
});
});