Skip to content

Commit 04ea779

Browse files
chore: 테스트코드 환경설정 (#21)
1 parent 93f8d30 commit 04ea779

File tree

9 files changed

+617
-107
lines changed

9 files changed

+617
-107
lines changed

package.json

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
"build:all": "node build.mjs",
88
"lint": "eslint .",
99
"storybook": "storybook dev -p 6006",
10-
"build-storybook": "storybook build"
10+
"build-storybook": "storybook build",
11+
"test": "vitest"
1112
},
1213
"dependencies": {
1314
"@layer/lib": "file:layer-lib-0.0.1.tgz",
@@ -30,6 +31,11 @@
3031
"@storybook/react-webpack5": "^8.4.2",
3132
"@storybook/test": "^8.4.2",
3233
"@storybook/theming": "^8.4.2",
34+
"@testing-library/dom": "^10.4.0",
35+
"@testing-library/jest-dom": "^6.6.3",
36+
"@testing-library/react": "^16.0.1",
37+
"@testing-library/user-event": "^14.5.2",
38+
"@types/jest": "^29.5.14",
3339
"@types/node": "^22.9.0",
3440
"@types/react": "^18.3.12",
3541
"@types/react-dom": "^18.3.1",
@@ -44,6 +50,7 @@
4450
"eslint-plugin-storybook": "^0.11.0",
4551
"glob": "^11.0.0",
4652
"globals": "^15.11.0",
53+
"happy-dom": "^15.11.6",
4754
"path": "^0.12.7",
4855
"prettier": "^3.3.3",
4956
"storybook": "^8.4.2",
@@ -52,7 +59,7 @@
5259
"typescript-eslint": "^8.11.0",
5360
"vite": "^5.4.10",
5461
"vite-plugin-dts": "^4.3.0",
55-
"vite-plugin-lib-inject-css": "^2.1.1"
62+
"vitest": "^2.1.5"
5663
},
5764
"packageManager": "pnpm@9.12.1+sha512.e5a7e52a4183a02d5931057f7a0dbff9d5e9ce3161e33fa68ae392125b79282a8a8a470a51dfc8a0ed86221442eb2fb57019b0990ed24fab519bf0e1bc5ccfc4"
5865
}

packages/lib/use-escape-key-down/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "@layer-ui/react-use-escape-key-down",
2+
"name": "@layer-lib/react-use-escape-key-down",
33
"version": "0.0.1",
44
"license": "MIT",
55
"exports": {

packages/ui/modal/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"version": "pnpm version"
2929
},
3030
"dependencies": {
31-
"@layer-ui/react-use-escape-key-down": "workspace:*",
31+
"@layer-lib/react-use-escape-key-down": "workspace:*",
3232
"@layer-lib/react-context": "workspace:*",
3333
"@layer-lib/react-use-composed-ref": "workspace:*",
3434
"@layer-ui/portal": "workspace:*",
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import React from "react";
2+
import { render, fireEvent, screen } from "@testing-library/react";
3+
import { vi } from "vitest";
4+
import { userEvent } from "@testing-library/user-event";
5+
import { Modal, ModalTrigger, ModalContent } from "./Modal";
6+
7+
const OPEN_TEXT = "열기";
8+
const CLOSE_TEXT = "닫기";
9+
const TITLE_TEXT = "제목";
10+
const CONTENT_TEXT = "내용";
11+
12+
const ModalTest = (props: React.ComponentProps<typeof Modal>) => (
13+
<Modal {...props}>
14+
<ModalTrigger>{OPEN_TEXT}</ModalTrigger>
15+
<ModalContent>
16+
<h2 id="modal-title">{TITLE_TEXT}</h2>
17+
<p id="modal-description">{CONTENT_TEXT}</p>
18+
<ModalTrigger>{CLOSE_TEXT}</ModalTrigger>
19+
</ModalContent>
20+
</Modal>
21+
);
22+
23+
describe("Modal 컴포넌트", () => {
24+
const user = userEvent.setup();
25+
describe("트리거 클릭 후", () => {
26+
it("모달이 열려야 함", async () => {
27+
render(<ModalTest />);
28+
const trigger = await screen.findByText(OPEN_TEXT);
29+
30+
await user.click(trigger);
31+
32+
expect(trigger).toBeInTheDocument();
33+
});
34+
35+
it("모달이 닫혀야 함", () => {
36+
const rendered = render(<ModalTest />);
37+
fireEvent.keyDown(document.activeElement!, { key: "Escape" });
38+
expect(rendered.queryByText(CONTENT_TEXT)).not.toBeInTheDocument();
39+
});
40+
});
41+
42+
describe("제어 모드", () => {
43+
it("onOpenChange가 호출되어야 함", () => {
44+
const handleOpenChange = vi.fn();
45+
46+
const rendered = render(<ModalTest open={true} onOpenChange={handleOpenChange} />);
47+
48+
fireEvent.click(rendered.getByText(OPEN_TEXT));
49+
expect(handleOpenChange).toHaveBeenCalledWith(false);
50+
});
51+
});
52+
53+
describe("모달 비활성화", async () => {
54+
it("모달이 열려야 함", async () => {
55+
const onChangeMock = vi.fn();
56+
57+
const rendered = render(<ModalTest modal={false} onOpenChange={onChangeMock} />);
58+
const trigger = rendered.getByText(OPEN_TEXT);
59+
expect(rendered.queryByText(CONTENT_TEXT)).not.toBeInTheDocument();
60+
61+
await user.click(trigger);
62+
63+
const content = rendered.getByText(CONTENT_TEXT);
64+
const close = rendered.getByText(CLOSE_TEXT);
65+
66+
expect(content).toBeInTheDocument();
67+
expect(close).toBeInTheDocument();
68+
69+
expect(onChangeMock).toHaveBeenCalledWith(true);
70+
expect(onChangeMock).toHaveBeenCalledTimes(1);
71+
});
72+
});
73+
});

0 commit comments

Comments
 (0)