[BE-02] 공공체육시설(data.go.kr) 계약 검증 테스트
작업 내용 (설계 의도)
근거 TDD: ../TDD.md “Testing Plan”, ADR-002.
변경 사항
DataGoKrPublicFacilityGatewayImpl의 HTTP 경로·역직렬화·매핑이 mock/실 스키마와 일치하는지 CI 상시 계약 테스트로 락한다. 실 키가 있을 때만 도는 live 스모크를 함께 추가한다. 프로덕션 코드는 건드리지 않고 테스트만 추가.
- fixture
test/resources/fixtures/external/data-go-kr/public-sports-facility.json—response.body.items.item[](cpId·facilNm·roadAddr·la·lo·faciTy·gu·telno) 스키마 캡처. - 계약 테스트(
infrastructure/facility/gateway/DataGoKrPublicFacilityContractTest.kt) — BE-01 하네스로 MockWebServer에 fixture enqueue →PublicSportsFacilityGateway.fetchPage(1, n)호출 →PublicFacility매핑 검증. resultCode≠00·5xx·빈 items →emptyListdegrade 검증(ADR-003 정책 확인, facility는 이미 graceful).- live 태그 스펙 —
DATA_GO_KR_SERVICE_KEYenv 존재 시 실 API 1페이지 호출해 무손실 역직렬화 확인, 부재 시 스킵.
의존
- BE-01 (계약 하네스)
다이어그램
처리 흐름
sequenceDiagram participant T as ContractTest participant M as MockWebServer participant G as DataGoKrPublicFacilityGatewayImpl T->>M: enqueue(public-sports-facility.json) T->>G: fetchPage(1, 10) G->>M: GET /openapi/service/publicSportsFacility/getList M-->>G: fixture G-->>T: List<PublicFacility> (매핑 검증)
클래스 의존
flowchart LR CT["DataGoKrPublicFacilityContractTest"] --> ECS["ExternalContractSupport(BE-01)"] CT --> G["DataGoKrPublicFacilityGatewayImpl"] G --> PF["PublicSportsFacilityGateway"]
테스트 케이스
- fixture 응답의
item[]이PublicFacility로 매핑되며 externalId=cpId, lat=la, lng=lo가 정확히 채워진다(해피). numOfRows만큼 페이지 항목이 반환된다(경계).resultCode≠00응답 시emptyList로 degrade한다(실패/예외).- 빈
item[]응답 시emptyList를 반환한다(엣지). - live 스펙:
DATA_GO_KR_SERVICE_KEY부재 시 스킵되고 CI를 붉게 만들지 않는다(스킵 경로).