[BE-03] goods·ticketing 제공 UseCase 경계 계약 동결 테스트 (FR-4)

작업 내용 (설계 의도)

근거 TDD: ../TDD.md “FR-4 결정”, “인터페이스 시그니처 — 동결 대상” / ADR-003

변경 사항

  • B2B 파트너(② 과제)가 코드 변경 없이 경유하는 제공 경계 UseCase 2개의 시그니처를 계약으로 동결하고, 변경 시 조기 감지하는 테스트를 추가한다.
    • goods.CreateMyProductUseCase.execute(CreateMyProductCommand): ProductWithStock
    • ticketing.CreateMyEventUseCase.execute(CreateMyEventCommand): CreateMyEventResult
  • CreateMyEventCommand.ownerUserId: Long 필드 존재를 검증(파트너 Controller가 SecurityContext id를 채우는 접점).
  • CreateMyProductUseCaseOwnershipGuard에 의존(SecurityContext 소유자 해석)함을 검증.
  • 목적: ② 과제 설계·구현이 시작되기 전, 두 UseCase 시그니처가 리팩터링으로 바뀌면 이 테스트가 RED로 알린다. 프로덕션 코드 무변경.

위치

  • backend/src/test/kotlin/com/sportsapp/architecture/ProvidedInterfaceContractTest.kt (신규)
  • 리플렉션 기반 시그니처 assert 또는 ArchUnit methods() 규칙. 기존 architecture/ 스타일 준수.

의존

  • 없음 (독립 — 새 파일만 생성)

다이어그램

처리 흐름

sequenceDiagram
    participant T as ProvidedInterfaceContractTest
    participant U1 as CreateMyProductUseCase
    participant U2 as CreateMyEventUseCase
    T->>U1: execute(CreateMyProductCommand) 반환타입 검증
    T->>U2: execute(CreateMyEventCommand) 반환타입 검증
    T->>U2: CreateMyEventCommand.ownerUserId 존재 검증

클래스 의존

flowchart LR
    Test["ProvidedInterfaceContractTest"] --> Product["CreateMyProductUseCase"]
    Test --> Event["CreateMyEventUseCase"]
    Test --> Cmd["CreateMyEventCommand.ownerUserId"]

테스트 케이스

  • CreateMyProductUseCase.execute가 CreateMyProductCommand를 받아 ProductWithStock를 반환하면 계약이 통과한다
  • CreateMyEventUseCase.execute가 CreateMyEventCommand를 받아 CreateMyEventResult를 반환하면 계약이 통과한다
  • CreateMyEventCommand에 ownerUserId: Long 필드가 존재하면 계약이 통과한다
  • CreateMyProductUseCase가 OwnershipGuard에 의존하면 계약이 통과한다 (SecurityContext 소유자 해석 경로 보증)
  • (위반 시나리오) execute의 파라미터/반환 타입이 바뀌면 계약 테스트가 실패해 ② 경유 파손을 조기 감지한다