From 622ea58cd1fff9eabb473f36dfbf49c968cd1dc7 Mon Sep 17 00:00:00 2001 From: joungmin Date: Mon, 27 Jul 2026 13:49:26 +0900 Subject: [PATCH] =?UTF-8?q?[QA]=20#532=20formatRegion=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=20=ED=86=B5=EA=B3=BC=20=E2=80=94=20=EB=8B=A8=EC=9C=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - frontend/__tests__/region.test.ts: 설계서(docs/design/532-region-display) 엣지케이스 8종(falsy/계층조인/null토큰/빈토큰/더미제거/단일토큰/전량더미/trim) 검증 - tsc --noEmit, jest 전체 스위트 통과 확인 - 실제 dev DB region 데이터로 엣지케이스 재확인 Refs #532 --- CHANGELOG.md | 9 +++++++ frontend/__tests__/region.test.ts | 44 +++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 frontend/__tests__/region.test.ts 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("한국 › 서울"); + }); +});