[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.jsonresponse.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 → emptyList degrade 검증(ADR-003 정책 확인, facility는 이미 graceful).
  • live 태그 스펙 — DATA_GO_KR_SERVICE_KEY env 존재 시 실 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를 붉게 만들지 않는다(스킵 경로).