diff --git a/CHANGELOG.md b/CHANGELOG.md index 072f708..14524a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ --- +## 2026-07-27 + +### ✅ [QA] #532 지역 표시 계층화 — 검증 통과 +- `formatRegion()` 설계서(docs/design/532-region-display/README.md) 명세대로 구현됨을 확인 +- 단위 테스트 추가: `frontend/__tests__/region.test.ts` (falsy, 계층 조인, `null`/빈 토큰/더미 `나라` 제거, 단일 토큰, 전량 더미, trim 8케이스) — 전부 통과 +- `tsc --noEmit` 통과, 프론트 전체 jest 스위트(4 suites, 21 tests) 통과 +- 실제 dev DB 데이터(`region: "한국|서울|"` 등)로 엣지케이스 재확인 — 설계서 예시와 일치 +- 04-QA → 05-Designer 로 전진 + ## 2026-07-19 ### 📋 설계서/Redmine 현행화 — #545/#533/#532 파이프라인 정지 점검 diff --git a/frontend/__tests__/region.test.ts b/frontend/__tests__/region.test.ts new file mode 100644 index 0000000..eddf126 --- /dev/null +++ b/frontend/__tests__/region.test.ts @@ -0,0 +1,44 @@ +/** + * #532 — formatRegion() 순수 함수 단위 테스트. + * 설계서: docs/design/532-region-display/README.md + */ +import { formatRegion } from "@/lib/region"; + +describe("formatRegion", () => { + it("falsy 입력은 빈 문자열", () => { + expect(formatRegion("")).toBe(""); + expect(formatRegion(null)).toBe(""); + expect(formatRegion(undefined)).toBe(""); + }); + + it("파이프 구분 지역을 계층(breadcrumb)으로 변환한다", () => { + expect(formatRegion("한국|서울|강남구")).toBe("한국 › 서울 › 강남구"); + }); + + it("'null' 토큰(대소문자 무시)은 제거한다", () => { + expect(formatRegion("일본|null")).toBe("일본"); + expect(formatRegion("일본|NULL")).toBe("일본"); + }); + + it("빈 토큰은 제거한다", () => { + expect(formatRegion("한국||관악구")).toBe("한국 › 관악구"); + }); + + it("더미 토큰 '나라'는 제거한다", () => { + expect(formatRegion("나라|서울")).toBe("서울"); + }); + + it("단일 토큰은 그대로 반환한다", () => { + expect(formatRegion("한국")).toBe("한국"); + }); + + it("모든 토큰이 더미/빈 값이면 빈 문자열", () => { + expect(formatRegion("한국|")).toBe("한국"); + expect(formatRegion("|")).toBe(""); + expect(formatRegion("나라|null|")).toBe(""); + }); + + it("토큰 앞뒤 공백은 trim 된다", () => { + expect(formatRegion(" 한국 | 서울 ")).toBe("한국 › 서울"); + }); +});