3.4 KiB
3.4 KiB
BAT-014 Implementation
- Status: completed
- Batch: BAT-014
Plan Summary
- planning.md Delivery Plan에 따라 (1)
PortfolioItemschema에symbol추가 → (2)_portfolio_to_item()serialization 보강 → (3) CRUD/list 테스트 expectation 갱신 → (4)docs/interface-contract.md계약 반영 → (5) pytest 검증 순서로 구현 완료. - 사용자가 명시한 핵심 요구대로
GET /v1/portfolios는 asset join 결과를 응답해야 하므로, repository shape(_SELECT_PORTFOLIO+_row_to_portfolio)를 유지한 채 응답 schema/문서/테스트를 정합화했다.
Changed Files
app/schemas/v1.pyPortfolioItem에symbol: str | None = None필드 추가
app/api/v1_portfolios.py_portfolio_to_item()에symbol=portfolio.symbol추가
tests/test_v1_portfolios_list.py- GET
/v1/portfolios응답의symbol == "005930"검증 추가 - 기존
asset_id검증 케이스에도symbolassertion 추가
- GET
tests/test_v1_portfolios_crud.py- POST/PATCH/DELETE 성공 응답에서
symbol == "005930"검증 추가
- POST/PATCH/DELETE 성공 응답에서
docs/interface-contract.md- POST/PATCH/DELETE/GET
/v1/portfolios응답 설명에symbol필드 반영 - GET
/v1/portfolios가 server-sideportfolios JOIN assets결과를 직렬화한다는 설명 추가
- POST/PATCH/DELETE/GET
Execution Log
- BAT-014 planning/index와 REQ-025/026/027/028/032를 읽고 구현 범위를 확정했다.
app/schemas/v1.py에PortfolioItem.symbol필드를 추가했다.app/api/v1_portfolios.py_portfolio_to_item()에symbol=portfolio.symbol매핑을 추가했다.tests/test_v1_portfolios_crud.py의 POST/PATCH/DELETE 성공 케이스에symbol == "005930"assertion을 추가했다.tests/test_v1_portfolios_list.py의 service-token list 케이스와asset_id검증 케이스에symbol == "005930"assertion을 추가했다.docs/interface-contract.md의 POST/PATCH/DELETE/GET/v1/portfolios명세를 갱신해symbol과 join 기반 응답 계약을 명문화했다.app/repositories/postgres.py를 재검토해_row_to_portfolio()가symbol=row[4]를 매핑하고,get()/create_portfolio()/update_portfolio()/soft_delete_portfolio()/list_portfolios()가 모두_SELECT_PORTFOLIO기반 join 결과를 사용함을 확인했다../.venv/bin/python -m pytest tests/test_v1_portfolios_crud.py tests/test_v1_portfolios_list.py -q실행 → 32 passed in 2.13s../.venv/bin/python -m pytest -q전체 회귀 실행 → 371 passed in 11.00s.
Validation
- Targeted regression:
./.venv/bin/python -m pytest tests/test_v1_portfolios_crud.py tests/test_v1_portfolios_list.py -q→ 32 passed in 2.13s
- Full regression:
./.venv/bin/python -m pytest -q→ 371 passed in 11.00s
- Repository join evidence:
_row_to_portfolio()가symbol=row[4]를Portfolio.symbol로 매핑get()/create_portfolio()/update_portfolio()/soft_delete_portfolio()/list_portfolios()가_SELECT_PORTFOLIOjoin 결과를 재사용
Remaining Risks
- R1 (Low): 이번 batch의 symbol 회귀는 FastAPI/TestClient + fake repo 중심이다. 다만 repository 코드 inspection으로 실제 Postgres 경로도
assets.symboljoin 결과를 응답까지 유지함을 확인했다. - R2 (Negligible): pytest 출력에 기존
HTTP_422_UNPROCESSABLE_ENTITYdeprecation warning 2~3건이 남아 있으나 BAT-014 범위와 직접 관련은 없고 기능 실패는 없다.