Files
portfolio-hub/docs/srs/Testing/req-042_trade-pnl-api-test-coverage.md
T
genichinandClaude Opus 4.8 f37ef87c8c docs(dcy-007): draft + approve REQ-039~042 (trade history + realized PnL API)
dcy-007 분해 완료: 체결내역 조회(REQ-039, GET /trades), 실현 PnL 집계(REQ-040, GET /pnl/realized with WAC), WAC 산출 로직(REQ-041, service/domain 격리), 테스트 커버리지(REQ-042).

팀장 confirm-req 완료:
- 4건 모두 Proposed → Approved (dcy-007 결정·발견사항 반영, R-1 경고필드 포함, blocker 없음)
- M1(6/22) fast-track, 단일 batch 예정
- docs/srs/index.md: Next ID REQ-043, Register 4건 Approved, Change Log 갱신
- docs/discovery/dcy-007: 생성된 REQ 참조 업데이트

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-06-18 16:07:33 +09:00

101 lines
5.7 KiB
Markdown

# REQ-042: 체결 내역/실현 PnL API 테스트 커버리지 (WAC 시나리오 기댓값 대조, 날짜 필터, 422)
- Status: Approved
- Type: Testing
- Priority: High
- Owner: Justin Ko
## Intent
- REQ-039(체결 내역 조회), REQ-040(실현 PnL 집계), REQ-041(WAC 산출 로직)의 구현 산출물에 대해, WAC 시나리오 기댓값 대조·날짜 필터 경계·422 오류·R-1 경고 필드를 포함한 단위/통합 테스트를 정의한다.
- 테스트는 구현자(delivery)가 아닌 독립 QC 시점에서도 검증 가능해야 하며, AC를 충족하는 최소 evidence를 제공해야 한다(dcy-007 NFR-3, S-1, S-2).
- WAC 기댓값 수기 계산 대조(시나리오별 fixture 사용)와 날짜 필터 경계 테스트를 의무 포함한다.
## Requirement
- 아래 테스트 파일을 신규 작성해야 한다:
- `tests/test_wac_calculation.py` — WAC 산출 로직 순수 단위 테스트(DB 불필요).
- `tests/test_v1_portfolios_trades.py` — 체결 내역 엔드포인트 통합 테스트(TestClient).
- `tests/test_v1_portfolios_pnl.py` — 실현 PnL 엔드포인트 통합 테스트(TestClient).
- 각 테스트 파일은 pytest 단독 실행 가능해야 한다(`pytest tests/test_wac_calculation.py` 등).
- 테스트 픽스처는 portfolio_ledger INSERT로 알려진 buy/sell 데이터를 설정하고, 수기 계산 기댓값과 API 응답을 대조해야 한다.
## Acceptance Criteria
1. Given `tests/test_wac_calculation.py` 실행, When `pytest tests/test_wac_calculation.py`, Then 다음 시나리오 모두 통과:
- 단순 buy → sell WAC 수기 기댓값 일치(dcy-007 S-2 기준)
- 다중 buy → 부분 sell WAC(AC-1 of REQ-041 기댓값: 199,300)
- 빈 입력 → total_pnl=0, cost_basis_from=None
- sell 수량 초과(running_qty=0) → data_completeness_warning 비어 있지 않음
2. Given `tests/test_v1_portfolios_trades.py` 실행, When `pytest tests/test_v1_portfolios_trades.py`, Then 다음 시나리오 모두 통과:
- `date=YYYY-MM-DD` 단일 날짜 필터 — 해당일 건수 일치
- `from`/`to` 범위 필터 — 경계 날짜 포함 건수 일치
- 날짜 파라미터 누락 → HTTP 422
- 날짜 형식 오류 → HTTP 422
- 해당 기간 0건 → HTTP 200 + empty items
- 비소유자 token → HTTP 403
- 존재하지 않는 portfolio_id → HTTP 404
3. Given `tests/test_v1_portfolios_pnl.py` 실행, When `pytest tests/test_v1_portfolios_pnl.py`, Then 다음 시나리오 모두 통과:
- buy 2회 + sell 1회 픽스처, `total_realized_pnl` 수기 기댓값 일치(REQ-040 AC-1 기댓값: 199,300)
- `from`/`to` 파라미터 누락 → HTTP 422
- 기간 내 매도 0건 → HTTP 200 + total_realized_pnl=0 + items=[]
- data_completeness_warning 필드: 이력 완전 시 null, 불완전 시 비어 있지 않음(R-1 경고 반영)
- symbol 필터 적용 — 해당 symbol 매도만 집계
- 비소유자 token → HTTP 403
4. Given 3개 테스트 파일 전체 실행, When `pytest tests/test_wac_calculation.py tests/test_v1_portfolios_trades.py tests/test_v1_portfolios_pnl.py -v`, Then 전체 PASSED(0 failed) + 각 파일 실행 결과 출력 존재.
5. Given `tests/test_wac_calculation.py`, When DB 컨테이너 없이 실행(`PORTFOLIOHUB_DB_ENABLED` 미설정 환경), Then WAC 단위 테스트가 통과(DB 격리 확인, REQ-041 AC-8 연동).
6. Given REQ-039~041 구현 후 기존 테스트 스위트(`pytest` 전체) 실행, When 실행, Then 기존 통과 테스트가 모두 계속 통과(회귀 없음).
## Impacted Area
- Docs:
- 없음 (테스트 파일만 추가)
- Modules:
- 없음 (기존 소스 파일 수정 없음 — 테스트 전용 REQ)
- Tests:
- `tests/test_wac_calculation.py` 신규
- `tests/test_v1_portfolios_trades.py` 신규
- `tests/test_v1_portfolios_pnl.py` 신규
## Notes
- 이 REQ는 REQ-039/040/041의 검증 근거를 명시적으로 확보하기 위한 Testing REQ다. 구현 코드를 직접 생산하지 않으므로 별도 REQ로 분리.
- 통합 테스트(TestClient 기반)는 DB-enabled 환경(`PORTFOLIOHUB_DB_ENABLED=true`)에서 실행하거나 모킹 전략을 사용할 수 있다. 모킹 전략과 실 DB 사용 여부는 구현 단계에서 결정.
- AC-1의 수기 기댓값(199,300)은 REQ-041 AC-1과 동일한 픽스처를 사용해야 한다.
- dcy-007 S-1/S-2 성공 기준의 측정 근거는 이 REQ의 테스트 실행 결과가 된다.
- Source: dcy-007 NFR-3, S-1, S-2, R-1.
## Change Log
### CHG-20260618-01
- Date: 2026-06-18
- Author: Justin Ko
#### Change Summary
- 최초 생성 — dcy-007 confirm-discovery 후 draft-req 실행. 체결 내역/PnL API 테스트 커버리지 산출물.
#### Intent
- dcy-007 NFR-3(PnL 로직 단위 테스트), S-1/S-2(기댓값 대조 통합 테스트)를 Testing REQ로 정규화. WAC 시나리오 기댓값과 R-1 경고 필드 검증을 의무 포함.
#### Acceptance Criteria Delta
- Added:
- AC-1~6 최초 작성
#### Impacted Area Delta
- Tests: tests/test_wac_calculation.py, tests/test_v1_portfolios_trades.py, tests/test_v1_portfolios_pnl.py — 최초 지정
#### Delivery Trace Delta
- Batches: none (미정)
- Releases: none (미정)
#### Revalidation Impact
- Reverification Needed: no
- Existing Implementation Invalidated: no
- Status Recommendation: keep-current
- Follow-up Action: confirm-req 후 REQ-039/040/041과 동일 batch 편입(검증 REQ로서 구현 REQ와 동행)
#### Validation Plan
- pytest 실행으로 AC-1~6 직접 검증; 전체 스위트 회귀(AC-6)는 기존 pytest baseline과 비교
### CHG-20260618-02
- Date: 2026-06-18
- Author: 팀장 (Claude)
#### Change Summary
- confirm-req: `Proposed` → `Approved`. WAC 시나리오 기댓값·날짜필터·422·R-1 경고 검증 AC가 REQ-039~041과 정합, blocker 없음. 구현 REQ와 동일 batch. M1 fast-track.