1차 싱크 완료
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
import { describe, it, expect, afterEach } from "vitest";
|
||||
import { render, cleanup } from "@testing-library/react";
|
||||
import { PublicPageRenderer } from "@/features/editor/components/PublicPageRenderer";
|
||||
import type { Block } from "@/features/editor/state/editorStore";
|
||||
|
||||
// divider 스타일 TDD
|
||||
// - colorHex 에 따른 라인 색상
|
||||
// - marginY/marginYPx 에 따른 상하 여백 em 스케일
|
||||
// - widthMode/widthPx 에 따른 길이 모드
|
||||
|
||||
afterEach(() => {
|
||||
cleanup();
|
||||
});
|
||||
|
||||
describe("PublicPageRenderer - divider 스타일", () => {
|
||||
it("colorHex 가 지정되면 구분선 라인에 해당 색상이 적용되어야 한다", () => {
|
||||
const blocksWithColor: Block[] = [
|
||||
{
|
||||
id: "div_color",
|
||||
type: "divider",
|
||||
props: {
|
||||
align: "center",
|
||||
thickness: "thin",
|
||||
colorHex: "#123456",
|
||||
},
|
||||
} as any,
|
||||
];
|
||||
|
||||
const { getByTestId, rerender } = render(<PublicPageRenderer blocks={blocksWithColor} />);
|
||||
|
||||
const lineWithColor = getByTestId("preview-divider-line") as HTMLElement;
|
||||
// JSDOM 은 #123456 을 rgb(18, 52, 86) 으로 노출한다.
|
||||
expect(lineWithColor.style.backgroundColor).toBe("rgb(18, 52, 86)");
|
||||
|
||||
const blocksWithoutColor: Block[] = [
|
||||
{
|
||||
id: "div_default",
|
||||
type: "divider",
|
||||
props: {
|
||||
align: "center",
|
||||
thickness: "thin",
|
||||
},
|
||||
} as any,
|
||||
];
|
||||
|
||||
rerender(<PublicPageRenderer blocks={blocksWithoutColor} />);
|
||||
|
||||
const lineDefault = getByTestId("preview-divider-line") as HTMLElement;
|
||||
// 기본 색상은 #475569 이며, JSDOM 에서는 rgb(71, 85, 105) 로 표시된다.
|
||||
expect(lineDefault.style.backgroundColor).toBe("rgb(71, 85, 105)");
|
||||
});
|
||||
|
||||
it("marginYPx 이 있으면 divider 컨테이너 상하 여백이 em 스케일로 적용되어야 한다", () => {
|
||||
const blocks: Block[] = [
|
||||
{
|
||||
id: "div_margin_px",
|
||||
type: "divider",
|
||||
props: {
|
||||
align: "center",
|
||||
thickness: "thin",
|
||||
marginYPx: 32,
|
||||
},
|
||||
} as any,
|
||||
];
|
||||
|
||||
const { getByTestId } = render(<PublicPageRenderer blocks={blocks} />);
|
||||
|
||||
const wrapper = getByTestId("preview-divider") as HTMLDivElement;
|
||||
// 32px / 16 = 2em
|
||||
expect(wrapper.style.marginTop).toBe("2em");
|
||||
expect(wrapper.style.marginBottom).toBe("2em");
|
||||
});
|
||||
|
||||
it("marginY 토큰만 있을 때도 적절한 px 값을 em 으로 변환해 상하 여백에 적용해야 한다", () => {
|
||||
const blocks: Block[] = [
|
||||
{
|
||||
id: "div_margin_token",
|
||||
type: "divider",
|
||||
props: {
|
||||
align: "center",
|
||||
thickness: "thin",
|
||||
marginY: "lg", // 24px 로 매핑
|
||||
},
|
||||
} as any,
|
||||
];
|
||||
|
||||
const { getByTestId } = render(<PublicPageRenderer blocks={blocks} />);
|
||||
|
||||
const wrapper = getByTestId("preview-divider") as HTMLDivElement;
|
||||
// 24px / 16 = 1.5em
|
||||
expect(wrapper.style.marginTop).toBe("1.5em");
|
||||
expect(wrapper.style.marginBottom).toBe("1.5em");
|
||||
});
|
||||
|
||||
it("widthMode 가 fixed 이고 widthPx 가 있으면 divider 라인의 width 가 pxToEm 으로 변환되어야 한다", () => {
|
||||
const blocks: Block[] = [
|
||||
{
|
||||
id: "div_fixed_width",
|
||||
type: "divider",
|
||||
props: {
|
||||
align: "center",
|
||||
thickness: "thin",
|
||||
widthMode: "fixed",
|
||||
widthPx: 480,
|
||||
},
|
||||
} as any,
|
||||
];
|
||||
|
||||
const { getByTestId } = render(<PublicPageRenderer blocks={blocks} />);
|
||||
|
||||
const line = getByTestId("preview-divider-line") as HTMLDivElement;
|
||||
// 480px / 16 = 30em
|
||||
expect(line.style.width).toBe("30em");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user