Skip to content

Commit cb546d9

Browse files
authored
Merge pull request #16 from cobocho/e2e
test(e2e): ์˜ค๋ฒ„๋ ˆ์ด API E2E ํ…Œ์ŠคํŠธ ํ™•์žฅ
2 parents def4236 + 75b8cc4 commit cb546d9

48 files changed

Lines changed: 15712 additions & 141 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

โ€Ž.gitignoreโ€Ž

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ dist/
44
*.log
55
pnpm-debug.log*
66
packages/docs/.env
7+
packages/react-naver-maps-kit/e2e/app/.env.e2e
8+
packages/react-naver-maps-kit/playwright-report/
9+
packages/react-naver-maps-kit/test-results/
710
.pnpm-store/
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
# Playwright ๊ธฐ๋ฐ˜ E2E ํ…Œ์ŠคํŠธ ๋ชฉ๋ก
2+
3+
react-naver-maps-kit์—์„œ **Playwright**๋กœ ๊ฒ€์ฆํ•˜๋ฉด ์ข‹์€ ํ…Œ์ŠคํŠธ๋งŒ ์ •๋ฆฌํ•œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.
4+
`โœ…` = ๊ตฌํ˜„๋จ, `โฌœ` = ์ถ”๊ฐ€ ๊ถŒ์žฅ.
5+
6+
**์‹ค์ œ ๋„ค์ด๋ฒ„ ์ง€๋„ API ์‚ฌ์šฉ** (mock ์—†์Œ). API ํ‚ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:
7+
- `VITE_NAVER_MAP_NCP_KEY_ID` ๋˜๋Š” `NAVER_MAP_NCP_KEY_ID` ํ™˜๊ฒฝ ๋ณ€์ˆ˜
8+
- ๋˜๋Š” `e2e/app/.env.e2e`์— `VITE_NAVER_MAP_NCP_KEY_ID=your_key` ์„ค์ • ํ›„ `--mode e2e`๋กœ ์‹คํ–‰
9+
10+
---
11+
12+
## 1. ์ง€๋„ ์ด๋ฒคํŠธ (center / zoom)
13+
14+
| # | ํ…Œ์ŠคํŠธ | ์ƒํƒœ | ๋น„๊ณ  |
15+
|---|--------|------|------|
16+
| 1 | ref.setCenter ํ˜ธ์ถœ ์‹œ onCenterChanged๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค | โœ… | ๋ฒ„ํŠผ ํด๋ฆญ โ†’ ํ‘œ์‹œ ์ขŒํ‘œ/ํ˜ธ์ถœ ํšŸ์ˆ˜ ๊ฒ€์ฆ |
17+
| 2 | ref.setZoom ํ˜ธ์ถœ ์‹œ onZoomChanged๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค | โœ… | ๋ฒ„ํŠผ ํด๋ฆญ โ†’ ํ‘œ์‹œ ์คŒ/ํ˜ธ์ถœ ํšŸ์ˆ˜ ๊ฒ€์ฆ |
18+
| 3 | ์—ฌ๋Ÿฌ ๋ฒˆ setCenter ํ˜ธ์ถœ ์‹œ onCenterChanged๊ฐ€ ๋งค๋ฒˆ ํ˜ธ์ถœ๋œ๋‹ค | โœ… | ํ˜ธ์ถœ ํšŸ์ˆ˜ 2ํšŒ ๊ฒ€์ฆ |
19+
| 4 | ์—ฌ๋Ÿฌ ๋ฒˆ setZoom ํ˜ธ์ถœ ์‹œ onZoomChanged๊ฐ€ ๋งค๋ฒˆ ํ˜ธ์ถœ๋œ๋‹ค | โœ… | ํ˜ธ์ถœ ํšŸ์ˆ˜ 2ํšŒ ๊ฒ€์ฆ |
20+
21+
---
22+
23+
## 2. Controlled / Uncontrolled
24+
25+
| # | ํ…Œ์ŠคํŠธ | ์ƒํƒœ | ๋น„๊ณ  |
26+
|---|--------|------|------|
27+
| 5 | **Controlled**: ์Šฌ๋ผ์ด๋”/์…€๋ ‰ํŠธ๋กœ center ๋ณ€๊ฒฝ ์‹œ ์ง€๋„๊ฐ€ ํ•ด๋‹น ์œ„์น˜๋กœ ์ด๋™ํ•œ๋‹ค | โฌœ | ๋ถ€๋ชจ state โ†’ center prop โ†’ ์ง€๋„ ์ด๋™ ์—ฌ๋ถ€ |
28+
| 6 | **Controlled**: zoom prop ๋ณ€๊ฒฝ ์‹œ ์ง€๋„ ์คŒ ๋ ˆ๋ฒจ์ด ํ•ด๋‹น ๊ฐ’์œผ๋กœ ๋ฐ”๋€๋‹ค | โฌœ | ๋ถ€๋ชจ state โ†’ zoom prop โ†’ ํ‘œ์‹œ/ref.getZoom() |
29+
| 7 | **Uncontrolled**: ref.setCenter ํ˜ธ์ถœ ํ›„ ref.getCenter()๋กœ ํ˜„์žฌ ์ค‘์‹ฌ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค | โฌœ | ๋ฒ„ํŠผ์œผ๋กœ setCenter โ†’ getCenter ํ‘œ์‹œ ์˜์—ญ ๊ฒ€์ฆ |
30+
| 8 | **Uncontrolled**: ref.setZoom ํ˜ธ์ถœ ํ›„ ref.getZoom()์œผ๋กœ ํ˜„์žฌ ์คŒ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค | โฌœ | ๋ฒ„ํŠผ์œผ๋กœ setZoom โ†’ getZoom ํ‘œ์‹œ ๊ฒ€์ฆ |
31+
32+
---
33+
34+
## 3. ์ง€๋„ ํฌ์ธํ„ฐ ์ด๋ฒคํŠธ
35+
36+
| # | ํ…Œ์ŠคํŠธ | ์ƒํƒœ | ๋น„๊ณ  |
37+
|---|--------|------|------|
38+
| 9 | ์ง€๋„ ํด๋ฆญ ์‹œ onClick์ด ํ˜ธ์ถœ๋˜๊ณ  ํด๋ฆญ ์ขŒํ‘œ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค | โฌœ | mock์—์„œ click ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•„์š” |
39+
| 10 | ์ง€๋„ ์šฐํด๋ฆญ ์‹œ onRightClick์ด ํ˜ธ์ถœ๋œ๋‹ค | โฌœ | rightclick ์ด๋ฒคํŠธ |
40+
| 11 | onBoundsChanged๊ฐ€ pan/zoom ํ›„ ํ˜ธ์ถœ๋œ๋‹ค | โฌœ | ref.panTo / setZoom ํ›„ bounds ํ‘œ์‹œ ๊ฒ€์ฆ (mock) |
41+
| 12 | ์ด๋™/์คŒ ์ข…๋ฃŒ ํ›„ onIdle์ด ํ˜ธ์ถœ๋œ๋‹ค | โฌœ | ํƒ€์ด๋ฐ ์ด์Šˆ ๊ฐ€๋Šฅ, ํ•„์š” ์‹œ mock์—์„œ idle ๋ฐœ์ƒ |
42+
43+
---
44+
45+
## 4. ref API (ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ์ด๋™/์คŒ)
46+
47+
| # | ํ…Œ์ŠคํŠธ | ์ƒํƒœ | ๋น„๊ณ  |
48+
|---|--------|------|------|
49+
| 13 | ref.panTo ํ˜ธ์ถœ ์‹œ ์ง€๋„๊ฐ€ ํ•ด๋‹น ์ขŒํ‘œ๋กœ ์ด๋™ํ•œ๋‹ค | โœ… | panTo ํ›„ ํ‘œ์‹œ center ๋˜๋Š” onCenterChanged ๊ฒ€์ฆ |
50+
| 14 | ref.fitBounds ํ˜ธ์ถœ ์‹œ ๋ทฐ๊ฐ€ ํ•ด๋‹น bounds๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค | โœ… | fitBounds ํ›„ center ๋ณ€๊ฒฝ ๊ฒ€์ฆ |
51+
| 15 | ref.zoomBy(delta) ํ˜ธ์ถœ ์‹œ ์คŒ ๋ ˆ๋ฒจ์ด ๋ณ€๊ฒฝ๋œ๋‹ค | โœ… | zoomBy ํ›„ onZoomChanged ๋˜๋Š” ํ‘œ์‹œ ์คŒ ๊ฒ€์ฆ |
52+
53+
---
54+
55+
## 5. ์˜ค๋ฒ„๋ ˆ์ด: Marker
56+
57+
| # | ํ…Œ์ŠคํŠธ | ์ƒํƒœ | ๋น„๊ณ  |
58+
|---|--------|------|------|
59+
| 16 | ๋งˆ์ปค ํด๋ฆญ ์‹œ Marker onClick์ด ํ˜ธ์ถœ๋œ๋‹ค | โœ… | ๋งˆ์ปค DOM ํด๋ฆญ โ†’ ์ฝœ๋ฐฑ ํ˜ธ์ถœ ํšŸ์ˆ˜/ํ‘œ์‹œ ๊ฒ€์ฆ |
60+
| 17 | ๋งˆ์ปค ํด๋ฆญ ์‹œ ์—ฐ๊ฒฐ๋œ InfoWindow๊ฐ€ ์—ด๋ฆฐ๋‹ค | โœ… | ๋งˆ์ปค ํด๋ฆญ โ†’ InfoWindow ๋‚ด์šฉ/ํ‘œ์‹œ ์—ฌ๋ถ€ ๊ฒ€์ฆ |
61+
| 18 | ref.setPosition ํ˜ธ์ถœ ์‹œ ๋งˆ์ปค ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ๊ณ  onPositionChanged๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค | โœ… | ๋ฒ„ํŠผ์œผ๋กœ setPosition โ†’ ํ‘œ์‹œ ์ขŒํ‘œ ๊ฒ€์ฆ |
62+
63+
---
64+
65+
## 6. ์˜ค๋ฒ„๋ ˆ์ด: MarkerClusterer
66+
67+
| # | ํ…Œ์ŠคํŠธ | ์ƒํƒœ | ๋น„๊ณ  |
68+
|---|--------|------|------|
69+
| 19 | ํด๋Ÿฌ์Šคํ„ฐ ํด๋ฆญ ์‹œ ํ™•์žฅ ๋˜๋Š” ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋œ๋‹ค | โฌœ | ํด๋Ÿฌ์Šคํ„ฐ ์˜์—ญ ํด๋ฆญ โ†’ ํด๋Ÿฌ์Šคํ„ฐ ํ•ด์ œ/์ฝœ๋ฐฑ ๊ฒ€์ฆ |
70+
| 20 | helpers.zoomToCluster ํ˜ธ์ถœ ์‹œ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ด๋™/์คŒ๋œ๋‹ค | โฌœ | ๋ฒ„ํŠผ์œผ๋กœ zoomToCluster โ†’ center/zoom ํ‘œ์‹œ ๊ฒ€์ฆ |
71+
72+
---
73+
74+
## 7. ์˜ค๋ฒ„๋ ˆ์ด: InfoWindow
75+
76+
| # | ํ…Œ์ŠคํŠธ | ์ƒํƒœ | ๋น„๊ณ  |
77+
|---|--------|------|------|
78+
| 21 | open ํ˜ธ์ถœ ์‹œ InfoWindow๊ฐ€ DOM์— ํ‘œ์‹œ๋œ๋‹ค | โฌœ | open ๋ฒ„ํŠผ โ†’ ๋‚ด์šฉ/๊ฐ€์‹œ์„ฑ ๊ฒ€์ฆ |
79+
| 22 | close ํ˜ธ์ถœ ์‹œ InfoWindow๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค | โฌœ | open ํ›„ close โ†’ ๋น„ํ‘œ์‹œ ๊ฒ€์ฆ |
80+
81+
---
82+
83+
## 8. ๋กœ๋”ฉ / ์—๋Ÿฌ (์„ ํƒ)
84+
85+
| # | ํ…Œ์ŠคํŠธ | ์ƒํƒœ | ๋น„๊ณ  |
86+
|---|--------|------|------|
87+
| 23 | SDK ๋กœ๋”ฉ ์ „์—๋Š” ์ง€๋„ ์˜์—ญ์ด ๋กœ๋”ฉ ์ƒํƒœ(๋˜๋Š” fallback)๋กœ ๋ณด์ธ๋‹ค | โฌœ | mock ์ง€์—ฐ ์‹œ loading UI ๊ฒ€์ฆ |
88+
| 24 | ncpKeyId ์—†์ด Provider ์‚ฌ์šฉ ์‹œ ์—๋Ÿฌ fallback์ด ๋ณด์ธ๋‹ค | โฌœ | ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋˜๋Š” fallback ๋…ธ์ถœ ๊ฒ€์ฆ |
89+
90+
---
91+
92+
## ๊ตฌํ˜„ ํ˜„ํ™ฉ ์š”์•ฝ
93+
94+
| ๊ตฌ๋ถ„ | ๊ฐœ์ˆ˜ |
95+
|------|------|
96+
| ๊ตฌํ˜„๋จ (โœ…) | 4 |
97+
| ์ถ”๊ฐ€ ๊ถŒ์žฅ (โฌœ) | 20 |
98+
99+
---
100+
101+
## ์‹คํ–‰ ๋ฐฉ๋ฒ•
102+
103+
1. **API ํ‚ค ์„ค์ •** (ํ•„์ˆ˜): ๋„ค์ด๋ฒ„ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์—์„œ ์ง€๋„ API ํ‚ค ๋ฐœ๊ธ‰ ํ›„ ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋กœ ์„ค์ •.
104+
- ์…ธ: `export NAVER_MAP_NCP_KEY_ID=your_key` ๋˜๋Š” `export VITE_NAVER_MAP_NCP_KEY_ID=your_key`
105+
- ๋˜๋Š” `e2e/app/.env.e2e` ์ƒ์„ฑ ํ›„ `VITE_NAVER_MAP_NCP_KEY_ID=your_key` ์ž…๋ ฅ (ํ”„๋กœ์ ํŠธ์—์„œ `.env.e2e` gitignore ๊ถŒ์žฅ)
106+
107+
2. **์‹คํ–‰**
108+
```bash
109+
cd packages/react-naver-maps-kit
110+
pnpm run e2e:install # ์ตœ์ดˆ 1ํšŒ: Chromium ์„ค์น˜
111+
pnpm run e2e # ํ…Œ์ŠคํŠธ ์‹คํ–‰
112+
pnpm run e2e:ui # UI ๋ชจ๋“œ
113+
```
114+
115+
E2E๋Š” **์‹ค์ œ ๋„ค์ด๋ฒ„ ์ง€๋„ API**๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. API ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ํ…Œ์ŠคํŠธ ์•ฑ์— ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๊ณ , ํ•ด๋‹น ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์Šคํ‚ต๋ฉ๋‹ˆ๋‹ค.
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
# react-naver-maps-kit ํ…Œ์ŠคํŠธ ๋ชฉ๋ก
2+
3+
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์˜๋ฏธ ์žˆ๊ฒŒ ์ปค๋ฒ„ํ•˜๋ฉด ์ข‹์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ฆฌํ•œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.
4+
`โœ…` = ์ด๋ฏธ ์žˆ์Œ, `โฌœ` = ์ถ”๊ฐ€ ๊ถŒ์žฅ.
5+
6+
---
7+
8+
## 1. NaverMap (ํ•ต์‹ฌ)
9+
10+
### 1.1 Provider / ์ปจํ…์ŠคํŠธ
11+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
12+
|--------|------|------|
13+
| โœ… NaverMap์€ NaverMapProvider ๋ฐ–์—์„œ ์‚ฌ์šฉ ์‹œ ์—๋Ÿฌ | Vitest | ํ˜„์žฌ ๊ตฌํ˜„๋จ |
14+
| โœ… Provider + Map + useNaverMap์œผ๋กœ map ์ธ์Šคํ„ด์Šค ์ œ๊ณต | Vitest | |
15+
| โฌœ NaverMap๋งŒ ๋‹จ๋… ์‚ฌ์šฉ ์‹œ "must be used inside NaverMapProvider" ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ฒ€์ฆ | Vitest | ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ผ์น˜ |
16+
17+
### 1.2 ์ธ์Šคํ„ด์Šค / ๋ผ์ดํ”„์‚ฌ์ดํด
18+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
19+
|--------|------|------|
20+
| โœ… ์˜ต์…˜ ๋ณ€๊ฒฝ ์‹œ map ์ธ์Šคํ„ด์Šค ์žฌ์ƒ์„ฑ ์—†์ด setZoom/setOptions๋งŒ ํ˜ธ์ถœ | Vitest | |
21+
| โœ… ์–ธ๋งˆ์šดํŠธ ์‹œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•ด์ œ, clearInstanceListeners ํ˜ธ์ถœ | Vitest | |
22+
| โฌœ onMapReady ์ฝœ๋ฐฑ์ด ์ง€๋„ ์ƒ์„ฑ ํ›„ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š”์ง€ | Vitest | |
23+
| โฌœ onMapDestroy๊ฐ€ ์–ธ๋งˆ์šดํŠธ ์‹œ ํ˜ธ์ถœ๋˜๋Š”์ง€ | Vitest | |
24+
| โฌœ ref.getCenter() / getZoom()์ด ํ˜„์žฌ ๊ฐ’ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ | Vitest | mock์—์„œ setCenter ํ›„ getCenter ๊ฒ€์ฆ |
25+
26+
### 1.3 Controlled / Uncontrolled
27+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
28+
|--------|------|------|
29+
| โœ… center/zoom prop ๋ณ€๊ฒฝ ์‹œ setCenter/setZoom ํ˜ธ์ถœ (์ธ์Šคํ„ด์Šค ์œ ์ง€) | Vitest | |
30+
| โฌœ **Controlled**: center prop๋งŒ ๋„˜๊ธด ๊ฒฝ์šฐ, center ๋ณ€๊ฒฝ ์‹œ setCenter ํ˜ธ์ถœ, zoom์€ ๋‚ด๋ถ€ ์œ ์ง€ | Vitest | |
31+
| โฌœ **Controlled**: zoom prop๋งŒ ๋„˜๊ธด ๊ฒฝ์šฐ, zoom ๋ณ€๊ฒฝ ์‹œ setZoom ํ˜ธ์ถœ, center๋Š” ๋‚ด๋ถ€ ์œ ์ง€ | Vitest | |
32+
| โฌœ **Uncontrolled**: defaultCenter/defaultZoom๋งŒ ๋„˜๊ธด ๊ฒฝ์šฐ, ๋‹ค๋ฅธ ์˜ต์…˜ ๋ณ€๊ฒฝ ์‹œ ๊ธฐ์กด center/zoom ๋ณต์› | Vitest | (NaverMap.tsx ์˜ต์…˜ ๋™๊ธฐํ™” effect) |
33+
| โฌœ **E2E**: controlled ๋ชจ๋“œ์—์„œ ๋ถ€๋ชจ state ๋ณ€๊ฒฝ ์‹œ ์ง€๋„ center/zoom์ด prop๊ณผ ๋™๊ธฐํ™”๋˜๋Š”์ง€ | Playwright | ๋ฒ„ํŠผ์œผ๋กœ state ๋ณ€๊ฒฝ โ†’ DOM/ํ‘œ์‹œ๊ฐ’ ๊ฒ€์ฆ |
34+
35+
### 1.4 ์ด๋ฒคํŠธ
36+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
37+
|--------|------|------|
38+
| โœ… ref.setCenter ํ˜ธ์ถœ ์‹œ onCenterChanged ํ˜ธ์ถœ | Playwright | |
39+
| โœ… ref.setZoom ํ˜ธ์ถœ ์‹œ onZoomChanged ํ˜ธ์ถœ | Playwright | |
40+
| โœ… ์—ฌ๋Ÿฌ ๋ฒˆ setCenter/setZoom ์‹œ ์ฝœ๋ฐฑ ๋งค๋ฒˆ ํ˜ธ์ถœ | Playwright | |
41+
| โฌœ onBoundsChanged๊ฐ€ bounds ๋ณ€๊ฒฝ ์‹œ ํ˜ธ์ถœ๋˜๋Š”์ง€ | Vitest ๋˜๋Š” Playwright | mock์—์„œ panTo ๋“ฑ ํ›„ ๊ฒ€์ฆ |
42+
| โฌœ onIdle์ด ์ด๋™/์คŒ ์ข…๋ฃŒ ํ›„ ํ˜ธ์ถœ๋˜๋Š”์ง€ | Playwright | ํƒ€์ด๋ฐ ์ด์Šˆ ์žˆ์„ ์ˆ˜ ์žˆ์Œ |
43+
| โฌœ onClick / onRightClick ๋“ฑ ํฌ์ธํ„ฐ ์ด๋ฒคํŠธ๊ฐ€ DOM ํด๋ฆญ๊ณผ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ | Playwright | mock map์—์„œ click ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ |
44+
45+
### 1.5 ref API
46+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
47+
|--------|------|------|
48+
| โฌœ ref.panTo ํ˜ธ์ถœ ์‹œ ์ง€๋„ ์ด๋™ | Vitest (mock) | |
49+
| โฌœ ref.fitBounds ํ˜ธ์ถœ ์‹œ ํ•ด๋‹น bounds๋กœ ๋ทฐ ๋ณ€๊ฒฝ | Vitest (mock) | |
50+
| โฌœ ref.zoomBy(delta) ํ˜ธ์ถœ ์‹œ ์คŒ ๋ ˆ๋ฒจ ๋ณ€๊ฒฝ | Vitest (mock) | |
51+
52+
---
53+
54+
## 2. NaverMapProvider / ์Šคํฌ๋ฆฝํŠธ ๋กœ๋”
55+
56+
### 2.1 loadNaverMapsScript (๋‹จ์œ„)
57+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
58+
|--------|------|------|
59+
| โฌœ window.naver.maps๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฉด ์Šคํฌ๋ฆฝํŠธ ์š”์ฒญ ์—†์ด ์ฆ‰์‹œ resolve | Vitest | isNaverMapsReady true ์‹œ Promise.resolve |
60+
| โฌœ ncpKeyId ์—†์ด ํ˜ธ์ถœ ์‹œ ์—๋Ÿฌ (getClientKey throw) | Vitest | |
61+
| โฌœ submodules ์ง€์ • ์‹œ ํ•ด๋‹น ํ‚ค๊ฐ€ maps์— ์žˆ์„ ๋•Œ๋งŒ ready | Vitest | isNaverMapsReady + submodules |
62+
| โฌœ createScriptUrl์ด ncpKeyId ๊ธฐ์ค€์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ์ฟผ๋ฆฌ ์ƒ์„ฑ | Vitest | |
63+
| โฌœ timeout ์ดˆ๊ณผ ์‹œ reject | Vitest | waitForNaverMapsReady mock |
64+
65+
### 2.2 Provider ํ†ตํ•ฉ
66+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
67+
|--------|------|------|
68+
| โฌœ autoLoad=false๋ฉด ์ดˆ๊ธฐ์—๋Š” loading, ์Šคํฌ๋ฆฝํŠธ ๋กœ๋“œ ์•ˆ ํ•จ | Vitest | |
69+
| โฌœ reloadSdk ํ˜ธ์ถœ ์‹œ loading โ†’ ready/error ์ „ํ™˜ | Vitest | |
70+
| โฌœ ์ธ์ฆ ์‹คํŒจ ์‹œ sdkStatus 'error', onError ํ˜ธ์ถœ | Vitest | navermap_authFailure ์‹œ๋ฎฌ๋ ˆ์ด์…˜ |
71+
72+
---
73+
74+
## 3. useNaverMap / useNaverMapInstance
75+
76+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
77+
|--------|------|------|
78+
| โœ… Provider ๋ฐ–์—์„œ useNaverMap ํ˜ธ์ถœ ์‹œ ์—๋Ÿฌ | Vitest | |
79+
| โฌœ requireReady: true ์ด๊ณ  sdkStatus !== 'ready'์ผ ๋•Œ ์—๋Ÿฌ | Vitest | |
80+
| โฌœ requireMapInstance: true ์ด๊ณ  map์ด null์ผ ๋•Œ ์—๋Ÿฌ | Vitest | |
81+
| โฌœ useNaverMapInstance()๊ฐ€ context.map ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ | Vitest | |
82+
83+
---
84+
85+
## 4. MapInstanceContext
86+
87+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
88+
|--------|------|------|
89+
| โฌœ NaverMap ์ž์‹์—์„œ useMapInstance()๊ฐ€ map ์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜ | Vitest | |
90+
| โฌœ useMapInstanceRequired()๊ฐ€ map ์—†์„ ๋•Œ ์—๋Ÿฌ | Vitest | |
91+
| โฌœ ์ง€๋„ ๋ฐ–(Provider๋งŒ ์žˆ๋Š” ๊ณณ)์—์„œ useMapInstance()๋Š” null | Vitest | |
92+
93+
---
94+
95+
## 5. ์˜ค๋ฒ„๋ ˆ์ด: Marker
96+
97+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
98+
|--------|------|------|
99+
| โฌœ position prop์œผ๋กœ ๋งˆ์ปค ์ƒ์„ฑ, map์— ์ถ”๊ฐ€ | Vitest | mock Map + Marker ์ธ์Šคํ„ด์Šค |
100+
| โฌœ position ๋ณ€๊ฒฝ ์‹œ ๋งˆ์ปค ์œ„์น˜๋งŒ ์—…๋ฐ์ดํŠธ (์ธ์Šคํ„ด์Šค ์œ ์ง€) | Vitest | |
101+
| โฌœ onClick ํ•ธ๋“ค๋Ÿฌ๊ฐ€ naver.maps ์ด๋ฒคํŠธ์™€ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ | Vitest | Event.addListener ํ˜ธ์ถœ ๊ฒ€์ฆ |
102+
| โฌœ ref.getPosition() / setPosition() ๋™์ž‘ | Vitest | |
103+
| โฌœ MarkerClusterer ์ž์‹์œผ๋กœ ๋„ฃ์—ˆ์„ ๋•Œ clustererItemId๋กœ ๋“ฑ๋ก๋˜๋Š”์ง€ | Vitest | ClustererContext ์—ฐ๋™ |
104+
105+
---
106+
107+
## 6. ์˜ค๋ฒ„๋ ˆ์ด: MarkerClusterer
108+
109+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
110+
|--------|------|------|
111+
| โฌœ ์ž์‹ Marker๋“ค์ด ํด๋Ÿฌ์Šคํ„ฐ๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋“ฑ๋ก๋จ | Vitest | |
112+
| โฌœ ์ง€๋„ bounds/zoom ๋ณ€๊ฒฝ ์‹œ ํด๋Ÿฌ์Šคํ„ฐ ์žฌ๊ณ„์‚ฐ (recomputeOn) | Vitest | |
113+
| โฌœ helpers.zoomToCluster ํ˜ธ์ถœ ์‹œ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ด๋™/์คŒ | Vitest ๋˜๋Š” Playwright | |
114+
| โฌœ ํด๋Ÿฌ์Šคํ„ฐ ํด๋ฆญ ์‹œ ํด๋Ÿฌ์Šคํ„ฐ ํ™•์žฅ ๋˜๋Š” ์ฝœ๋ฐฑ ํ˜ธ์ถœ | Playwright | E2E์—์„œ ํด๋ฆญ ๊ฒ€์ฆ |
115+
116+
---
117+
118+
## 7. ์˜ค๋ฒ„๋ ˆ์ด: InfoWindow
119+
120+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
121+
|--------|------|------|
122+
| โฌœ anchor(๋งˆ์ปค ๋“ฑ)์— ๋ถ™์–ด ์—ด๋ฆผ | Vitest | |
123+
| โฌœ open/close ์ œ์–ด ์‹œ DOM ํ‘œ์‹œ ์—ฌ๋ถ€ | Vitest ๋˜๋Š” Playwright | |
124+
125+
---
126+
127+
## 8. ์˜ค๋ฒ„๋ ˆ์ด: Circle / Polygon / Polyline / Rectangle
128+
129+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
130+
|--------|------|------|
131+
| โฌœ center + radius (Circle) ๋˜๋Š” path (Polygon ๋“ฑ)๋กœ ์˜ค๋ฒ„๋ ˆ์ด ์ƒ์„ฑ | Vitest | |
132+
| โฌœ prop ๋ณ€๊ฒฝ ์‹œ setOptions ๋˜๋Š” ํ•ด๋‹น setter๋งŒ ํ˜ธ์ถœ (์žฌ์ƒ์„ฑ ์—†์Œ) | Vitest | |
133+
134+
---
135+
136+
## 9. ์„œ๋ธŒ๋ชจ๋“ˆ (Panorama, Visualization, Drawing)
137+
138+
| ํ…Œ์ŠคํŠธ | ์œ ํ˜• | ๋น„๊ณ  |
139+
|--------|------|------|
140+
| โฌœ submodules์— panorama ์—†์„ ๋•Œ Panorama ์‚ฌ์šฉ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ | Vitest | |
141+
| โฌœ submodules์— visualization ์—†์„ ๋•Œ HeatMap/DotMap ์‚ฌ์šฉ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ | Vitest | |
142+
| โฌœ DrawingManager๊ฐ€ submodules 'drawing' ์—†์„ ๋•Œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ | Vitest | |
143+
144+
---
145+
146+
## 10. E2E (Playwright) โ€“ ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค
147+
148+
| ํ…Œ์ŠคํŠธ | ๋น„๊ณ  |
149+
|--------|------|
150+
| โœ… ์ง€๋„ ์ด๋™(๋ฒ„ํŠผ) โ†’ onCenterChanged ํ˜ธ์ถœ, ํ‘œ์‹œ ์ขŒํ‘œ ๊ฐฑ์‹  | ๊ตฌํ˜„๋จ |
151+
| โœ… ์คŒ ๋ณ€๊ฒฝ(๋ฒ„ํŠผ) โ†’ onZoomChanged ํ˜ธ์ถœ, ํ‘œ์‹œ ์คŒ ๊ฐฑ์‹  | ๊ตฌํ˜„๋จ |
152+
| โฌœ ์ง€๋„ ํด๋ฆญ โ†’ onClick ํ˜ธ์ถœ, ํด๋ฆญ ์ขŒํ‘œ ํ‘œ์‹œ | |
153+
| โฌœ ๋งˆ์ปค ํด๋ฆญ โ†’ Marker onClick ๋˜๋Š” InfoWindow ์—ด๋ฆผ | |
154+
| โฌœ Controlled: ์Šฌ๋ผ์ด๋”/์…€๋ ‰ํŠธ๋กœ center ๋ณ€๊ฒฝ ์‹œ ์ง€๋„๊ฐ€ ํ•ด๋‹น ์œ„์น˜๋กœ ์ด๋™ | |
155+
| โฌœ Uncontrolled: ์ง€๋„ ๋“œ๋ž˜๊ทธ ํ›„ ref.getCenter()๋กœ ํ˜„์žฌ ์ค‘์‹ฌ ํ™•์ธ | (mock์—์„œ ๋“œ๋ž˜๊ทธ ์‹œ๋ฎฌ ๊ฐ€๋Šฅ ์‹œ) |
156+
157+
---
158+
159+
## ์šฐ์„ ์ˆœ์œ„ ์ œ์•ˆ
160+
161+
1. **๋†’์Œ**: NaverMap controlled/uncontrolled ๋™์ž‘, ์ด๋ฒคํŠธ(onCenterChanged/onZoomChanged) โ€“ ์ผ๋ถ€ ์™„๋ฃŒ.
162+
2. **๋†’์Œ**: Provider/๋กœ๋” โ€“ `window.naver.maps` ์ด๋ฏธ ์žˆ์„ ๋•Œ ์Šคํฌ๋ฆฝํŠธ ์ƒ๋žต, ํ‚ค/ํƒ€์ž„์•„์›ƒ ์—๋Ÿฌ.
163+
3. **์ค‘๊ฐ„**: useNaverMap / useMapInstance ์˜ต์…˜(requireReady, requireMapInstance) ์—๋Ÿฌ ์ผ€์ด์Šค.
164+
4. **์ค‘๊ฐ„**: Marker position/์ด๋ฒคํŠธ, MarkerClusterer ๋“ฑ๋กยทhelpers.
165+
5. **๋‚ฎ์Œ**: ์„œ๋ธŒ๋ชจ๋“ˆ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€, Circle/Polygon ๋“ฑ ์˜ต์…˜ ๋™๊ธฐํ™”.
166+
167+
์ด ๋ชฉ๋ก์„ ๊ธฐ์ค€์œผ๋กœ Vitest/Playwright ํ…Œ์ŠคํŠธ๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ’ˆ์งˆ๊ณผ ๋ฆฌ๊ทธ๋ ˆ์…˜ ๋ฐฉ์ง€์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
export const DEFAULT_CENTER = { lat: 37.5665, lng: 126.978 };
2+
export const TARGET_POSITION = { lat: 37.5172, lng: 127.0473 };
3+
export const NCP_KEY_ID = "jfcrbbeqoh";
4+
export const BUSAN_CENTER = { lat: 35.1796, lng: 129.0756 };
5+
export const JEJU_CENTER = { lat: 33.4996, lng: 126.5312 };
6+
7+
// Marker test positions
8+
export const MARKER_POS_1 = { lat: 37.5665, lng: 126.978 }; // ์„œ์šธ์‹œ์ฒญ
9+
export const MARKER_POS_2 = { lat: 37.4981, lng: 127.0276 }; // ๊ฐ•๋‚จ์—ญ
10+
export const MARKER_POS_3 = { lat: 37.5547, lng: 126.9707 }; // ์„œ์šธ์—ญ
11+
12+
// Circle test positions
13+
export const CIRCLE_CENTER_1 = { lat: 37.5665, lng: 126.978 }; // ์„œ์šธ์‹œ์ฒญ
14+
export const CIRCLE_CENTER_2 = { lat: 37.4981, lng: 127.0276 }; // ๊ฐ•๋‚จ์—ญ
15+
export const CIRCLE_CENTER_3 = { lat: 37.5547, lng: 126.9707 }; // ์„œ์šธ์—ญ
16+
export const CIRCLE_RADIUS_1 = 500; // 500m
17+
export const CIRCLE_RADIUS_2 = 1000; // 1km
18+
export const CIRCLE_RADIUS_3 = 2000; // 2km
19+
20+
// Ellipse test bounds (south/west/north/east)
21+
export const ELLIPSE_BOUNDS_1 = { south: 37.54, west: 126.95, north: 37.59, east: 127.0 };
22+
export const ELLIPSE_BOUNDS_2 = { south: 37.47, west: 127.0, north: 37.52, east: 127.06 };
23+
export const ELLIPSE_BOUNDS_3 = { south: 37.53, west: 126.94, north: 37.57, east: 126.99 };
24+
25+
// Rectangle test bounds (south/west/north/east)
26+
export const RECTANGLE_BOUNDS_1 = { south: 37.54, west: 126.95, north: 37.59, east: 127.0 };
27+
export const RECTANGLE_BOUNDS_2 = { south: 37.47, west: 127.0, north: 37.52, east: 127.06 };
28+
export const RECTANGLE_BOUNDS_3 = { south: 37.53, west: 126.94, north: 37.57, east: 126.99 };
29+
30+
// Polygon test paths (lat/lng)
31+
export const POLYGON_PATHS_1 = [
32+
[
33+
{ lat: 37.5705, lng: 126.9655 },
34+
{ lat: 37.5795, lng: 126.979 },
35+
{ lat: 37.5715, lng: 126.995 },
36+
{ lat: 37.558, lng: 126.9915 },
37+
{ lat: 37.5545, lng: 126.974 }
38+
]
39+
];
40+
41+
export const POLYGON_PATHS_2 = [
42+
[
43+
{ lat: 37.507, lng: 127.006 },
44+
{ lat: 37.5165, lng: 127.0215 },
45+
{ lat: 37.5045, lng: 127.037 },
46+
{ lat: 37.4905, lng: 127.03 },
47+
{ lat: 37.492, lng: 127.0125 }
48+
]
49+
];
50+
51+
export const POLYGON_PATHS_3 = [
52+
[
53+
{ lat: 37.5535, lng: 126.946 },
54+
{ lat: 37.5655, lng: 126.9585 },
55+
{ lat: 37.561, lng: 126.9785 },
56+
{ lat: 37.5465, lng: 126.982 },
57+
{ lat: 37.5405, lng: 126.9625 }
58+
]
59+
];
60+
61+
// GroundOverlay test bounds (south/west/north/east)
62+
export const GROUND_OVERLAY_BOUNDS_1 = { south: 37.54, west: 126.95, north: 37.59, east: 127.0 };
63+
export const GROUND_OVERLAY_BOUNDS_2 = { south: 37.47, west: 127.0, north: 37.52, east: 127.06 };
64+
export const GROUND_OVERLAY_BOUNDS_3 = { south: 37.53, west: 126.94, north: 37.57, east: 126.99 };
65+
66+
// GroundOverlay test urls
67+
export const GROUND_OVERLAY_URL_1 =
68+
"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Crect width='32' height='32' fill='%23ef4444'/%3E%3C/svg%3E#go1";
69+
export const GROUND_OVERLAY_URL_2 =
70+
"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Crect width='32' height='32' fill='%233b82f6'/%3E%3C/svg%3E#go2";
71+
export const GROUND_OVERLAY_URL_3 =
72+
"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Crect width='32' height='32' fill='%2310b981'/%3E%3C/svg%3E#go3";
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!DOCTYPE html>
2+
<html lang="ko">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6+
<title>Map E2E Test App</title>
7+
</head>
8+
<body>
9+
<div id="root"></div>
10+
<script type="module" src="/main.tsx"></script>
11+
</body>
12+
</html>

0 commit comments

Comments
ย (0)