Files
page-builder/tests/unit/LocaleProvider.spec.tsx
T
jaybe f71207aeb5
CI / test (push) Failing after 11m12s
CI / e2e (push) Has been cancelled
CI / pr_and_merge (push) Has been cancelled
i18n 적용
2025-12-10 15:56:51 +09:00

57 lines
1.7 KiB
TypeScript

import { describe, it, expect, afterEach } from "vitest";
import { render, screen, fireEvent, cleanup } from "@testing-library/react";
import { LocaleProvider, useAppLocale, useLocaleActions } from "@/features/i18n/LocaleProvider";
// LocaleProvider / useAppLocale / useLocaleActions TDD
// - initialLocale 로 전달된 로케일이 하위 컴포넌트에서 그대로 노출되는지 검증한다.
// - useLocaleActions 로 setLocale 을 호출하면 하위 컴포넌트의 로케일이 변경되어야 한다.
describe("LocaleProvider", () => {
afterEach(() => {
cleanup();
});
function LocaleConsumer() {
const locale = useAppLocale();
return <div data-testid="current-locale">{locale}</div>;
}
function LocaleSetterButton({ next }: { next: "en" | "ko" }) {
const { setLocale } = useLocaleActions();
return (
<button type="button" onClick={() => setLocale(next)}>
set-{next}
</button>
);
}
it("initialLocale 로 en 을 전달하면 하위 컴포넌트에서 en 로케일을 읽을 수 있어야 한다", () => {
render(
<LocaleProvider initialLocale="en">
<LocaleConsumer />
</LocaleProvider>,
);
const current = screen.getByTestId("current-locale");
expect(current.textContent).toBe("en");
});
it("setLocale 을 호출하면 하위 컴포넌트의 useAppLocale 결과가 업데이트되어야 한다", () => {
render(
<LocaleProvider initialLocale="en">
<LocaleConsumer />
<LocaleSetterButton next="ko" />
</LocaleProvider>,
);
const current = screen.getByTestId("current-locale");
expect(current.textContent).toBe("en");
fireEvent.click(screen.getByText("set-ko"));
expect(current.textContent).toBe("ko");
});
});