5.7 KiB
5.7 KiB
BAT-015 Verification
- Status: confirmed
- Batch: BAT-015
Acceptance Mapping
REQ-033: ledger_trades.asset_id → portfolio_id 컬럼명 정합화
- AC-1 (
\d ledger_trades에portfolio_id존재,asset_id부재): Deferred to REL-002 staging — 로컬 DB에ledger_trades테이블이 미생성 상태(BAT-011 release-candidate는 mock 기반 verification으로 진행됨). 마이그레이션20260601_0024는has_table가드로 안전 skip되며, 코드 작성은 완료(migrations/versions/20260601_0024_ledger_trades_portfolio_id_rename.py:36-40). 실 DB 검증은 REL-002 staging에서 수행. - AC-2 (INSERT/SELECT 회귀):
tests/test_v1_portfolios_ledger.py10 PASSED (mock 기반).insert_ledger_trade(portfolio_id=...)시그니처 + 응답 schemaLedgerTradeResponse.portfolio_id일관 검증. - AC-3 (codebase grep
ledger_trades\..*asset_id0건): PASSED.grep -rn "ledger_trades\..*asset_id\|asset_id.*ledger_trades\|insert_ledger_trade.*asset_id\|trade\.asset_id" app/→ 0건 (2026-06-05 implementation smoke). - AC-4 (마이그레이션 lock < 1초, NFR-1): Deferred to REL-002 staging — workspace_purpose 메모리 정합(개발용 워크스페이스). staging dry-run으로 측정.
- AC-5 (전체 pytest 회귀 통과): PASSED. 372 passed, 0 failed (5월 21일 base 368 → +4 누적: test_auth +2, test_app +2).
REQ-034: LoginRequest 추가 필드 거부 enforcement
- AC-1 (정상 username/password → HTTP 200):
tests/test_auth.py기존 회귀 16 PASSED (정상 login flow는 기존 케이스로 회귀 보호). - AC-2 (
no_expiry: true→ HTTP 422 +extra_forbidden):tests/test_auth.py::test_login_rejects_no_expiry_extra_fieldPASSED. 로컬 smoke 응답{"detail":[{"type":"extra_forbidden","loc":["body","no_expiry"],"msg":"Extra inputs are not permitted","input":true}]}확인 (2026-06-05). - AC-3 (임의 추가 필드 → HTTP 422):
tests/test_auth.py::test_login_rejects_arbitrary_extra_fieldPASSED. - AC-4 (grep
extra.*forbidapp/schemas/auth.py 매치): PASSED. app/schemas/auth.py:14model_config = ConfigDict(extra="forbid")매치. - AC-5 (전체 pytest 회귀 통과): PASSED. 372 passed, 0 failed.
REQ-035: GET /health 응답에 db_enabled 필드 추가
- AC-1 (PORTFOLIOHUB_DB_ENABLED=true →
db_enabled: true):tests/test_app.py::test_health_exposes_db_enabled_truePASSED. 로컬 smoke 응답{"status":"ok","service":"portfolio-hub","version":"0.1.0","checked_at":"2026-06-05T13:44:04.724864+09:00","db_enabled":true}확인 (2026-06-05). - AC-2 (PORTFOLIOHUB_DB_ENABLED=false →
db_enabled: false):tests/test_app.py::test_health_exposes_db_enabled_falsePASSED. - AC-3 (5필드 노출 + 기존 4필드 회귀):
tests/test_app.py::test_healthcheck갱신 PASSED (db_enabled추가 검증 포함). 기존status/service/version/checked_at동작 회귀 유지. - AC-4 (baseline grep
db_enabled.*설정값|setting value|ping|readinessdocs/runtime-flows.md): PASSED. docs/runtime-flows.md:97에 의미 명문화 노트 1단락 추가. - AC-5 (interface-contract grep
/health.*db_enableddocs/interface-contract.md): PASSED. docs/interface-contract.md:48GET /health payloadschema에db_enabled필드 추가.
Evidence
- Test:
- 전체 pytest: 372 passed, 0 failed, 3 warnings (2026-06-05, deprecation warnings는 starlette HTTP_422_UNPROCESSABLE_ENTITY alias, 기능 무관)
- 신규 회귀 4건:
test_login_rejects_no_expiry_extra_field,test_login_rejects_arbitrary_extra_field,test_health_exposes_db_enabled_true,test_health_exposes_db_enabled_false - 영향 받은 기존 회귀 갱신:
test_v1_portfolios_ledger.py(portfolio_id 응답 필드),test_v1.py::test_v1_ledger_trade_*(_make_ledger_trade+ body 키),test_daemon_assignment.py::test_ledger_trade_201_when_daemon_matches(mock attribute),test_app.py::test_healthcheck(db_enabled필드 확인 추가)
- Manual:
- 2026-06-05 13:44 KST 로컬 smoke 5건 (implementation.md Execution Log step 5 참조):
- GET /health → 200 +
db_enabled: true - POST /auth/login +
no_expiry: true→ 422 + extra_forbidden - codebase grep ledger_trades.asset_id → 0건
- docs/runtime-flows.md db_enabled 의미 노트 grep → 매치
- docs/interface-contract.md /health payload
db_enabledgrep → 매치
- GET /health → 200 +
- 2026-06-05 13:44 KST 로컬 smoke 5건 (implementation.md Execution Log step 5 참조):
- Logs:
- alembic upgrade head (2026-06-05):
Running upgrade 20260521_0023 -> 20260601_0024, Rename ledger_trades.asset_id to portfolio_id for column-name semantic alignment (REQ-033)—has_tableguard로 안전 skip 확인
- alembic upgrade head (2026-06-05):
Architecture Impact Synchronization (Baseline)
- design.md Architecture Impact:
runtime-flows - Reference Doc Update Plan 이행:
docs/project-structure.md: 갱신 불요 (영향 없음, 기존 모듈 한정 변경) — 변경 없음 확인 ✓docs/runtime-flows.md:db_enabled의미 명문화 노트 line 97 추가 ✓
- 추가 baseline 갱신:
docs/data-model.mdLedgerTrade entity 컬럼명/제약 갱신,docs/interface-contract.md/health payload + LedgerTradeResponse schema 갱신
Result
- Ready for Release: true
- Blocking Issues:
- 없음 (Deferred 2건은 blocker 아님, REL-002 staging에 이연 evidence)
- Deferred Evidence (release execution 시 수집):
- REQ-033 AC-1 (
\d ledger_trades실 DB 컬럼 검증) — REL-002 staging - REQ-033 AC-4 (마이그레이션 lock < 1초 staging dry-run) — REL-002 staging
- 본 워크스페이스 ledger_trades 테이블 미생성 상태 자체는 본 batch 범위 밖 (BAT-011 mock 기반 verification의 후속 항목 후보)
- REQ-033 AC-1 (