test: add session-boundary risk reload e2e regressions (#376) #386

Merged
jihoson merged 2 commits from feature/issue-376-session-boundary-e2e into feature/v3-session-policy-stream 2026-03-02 03:33:19 +09:00
Collaborator

Summary

  • 세션 경계 전환에서 리스크 파라미터가 실제로 재로딩되는지 trading_cycle 통합 회귀 테스트 2건을 추가했습니다.
  • 케이스 1: US_PRE -> US_DAY 경계에서 US_MIN_PRICE override가 적용/해제되어 주문 차단 -> 허용으로 전환되는지 검증합니다.
  • 케이스 2: 세션 전환 시 프로필 JSON 파싱 실패가 발생해도 기본값 폴백으로 주문 흐름이 유지되는지 검증합니다.
  • 감사 문서 REQ-V3-002 상태를 E2E 증적 기준으로 ✅ 완료로 갱신했습니다.

Scope Mapping

  • REQ: REQ-V3-002
  • TASK: TASK-CODE-007
  • TEST: TEST-ACC-016

Validation

  • ruff check tests/test_main.py docs/ouroboros/80_implementation_audit.md
  • pytest -q tests/test_main.py -k "session_boundary_reloads_us_min_price_override_in_trading_cycle or session_boundary_falls_back_when_profile_reload_fails"
  • python3 scripts/validate_ouroboros_docs.py
  • python3 scripts/validate_governance_assets.py origin/feature/v3-session-policy-stream...HEAD
  • python3 scripts/validate_docs_sync.py
## Summary - 세션 경계 전환에서 리스크 파라미터가 실제로 재로딩되는지 `trading_cycle` 통합 회귀 테스트 2건을 추가했습니다. - 케이스 1: `US_PRE -> US_DAY` 경계에서 `US_MIN_PRICE` override가 적용/해제되어 주문 차단 -> 허용으로 전환되는지 검증합니다. - 케이스 2: 세션 전환 시 프로필 JSON 파싱 실패가 발생해도 기본값 폴백으로 주문 흐름이 유지되는지 검증합니다. - 감사 문서 `REQ-V3-002` 상태를 E2E 증적 기준으로 `✅ 완료`로 갱신했습니다. ## Scope Mapping - REQ: `REQ-V3-002` - TASK: `TASK-CODE-007` - TEST: `TEST-ACC-016` ## Validation - `ruff check tests/test_main.py docs/ouroboros/80_implementation_audit.md` - `pytest -q tests/test_main.py -k "session_boundary_reloads_us_min_price_override_in_trading_cycle or session_boundary_falls_back_when_profile_reload_fails"` - `python3 scripts/validate_ouroboros_docs.py` - `python3 scripts/validate_governance_assets.py origin/feature/v3-session-policy-stream...HEAD` - `python3 scripts/validate_docs_sync.py`
agentson added 1 commit 2026-03-02 03:24:08 +09:00
test: add session-boundary risk reload e2e regressions (#376)
All checks were successful
Gitea CI / test (push) Successful in 32s
Gitea CI / test (pull_request) Successful in 33s
928e60877c
Author
Collaborator

PR #386 코드 리뷰 — test: add session-boundary risk reload e2e regressions (#376)

범위: 세션 경계 리스크 파라미터 재로딩 E2E 회귀 테스트 추가 + 감사 문서 상태 업데이트


통과 항목

1. 테스트 커버리지 — 두 가지 핵심 경로 검증

테스트 검증 내용 결과
test_session_boundary_reloads_us_min_price_override_in_trading_cycle US_PRE(US_MIN_PRICE=8.0) → US_DAY(US_MIN_PRICE=5.0) 세션 전환 시 override 적용/해제
test_session_boundary_falls_back_when_profile_reload_fails JSON 깨진 상태로 세션 전환 → override 빈 맵 → 기본값(5.0) 폴백 유지

2. 구현과 테스트 일치 확인

_parse_session_risk_profiles() 파싱 실패 경로:

raw ≠ _SESSION_RISK_PROFILES_RAW
→ json.loads 실패 → parsed_map = {}
→ _SESSION_RISK_PROFILES_MAP = {} 업데이트
→ merged = {} → _resolve_market_setting fallback = settings.US_MIN_PRICE = 5.0

테스트 2가 "폴백 시 기본값 유지"를 정확히 검증하고 있음.

3. 문서 상태 업데이트

  • REQ-V3-002: ⚠️ 부분 → 완료 (세션 경계 E2E 회귀 테스트 보강 완료)
  • GAP-3: ⚠️ 부분 해소 → 해소 (#327 + #376)
  • 요구사항 레지스트리 버전 1.0.6 → 1.0.7 업데이트
  • "테스트 미존재 (잔여)" 항목에서 세션 전환 훅/재로딩 항목 이동

4. 로컬 실행 결과

  • 신규 테스트 2개: 2 passed in 1.19s
  • test_main.py 전체: 164 passed in 7.96s

⚠️ 소견 (Non-blocking)

전역 상태 테스트 격리 미비

_SESSION_RISK_LAST_BY_MARKET, _SESSION_RISK_OVERRIDES_BY_MARKET, _SESSION_RISK_PROFILES_RAW, _SESSION_RISK_PROFILES_MAP은 모듈 수준 전역 변수입니다.

현재 두 테스트가 서로 다른 마켓 market.code = "US_NASDAQ" 를 공유하고, 테스트 실행 순서에 따라 전역 상태가 다르게 남습니다. 순서가 바뀌어도 현재 케이스에서는 통과하지만, 미래에 유사 테스트가 추가될 때 순서 의존성이 발생할 수 있습니다.

권장 패턴:

@pytest.fixture(autouse=True)
def _reset_session_risk_globals():
    import src.main as m
    m._SESSION_RISK_LAST_BY_MARKET.clear()
    m._SESSION_RISK_OVERRIDES_BY_MARKET.clear()
    m._SESSION_RISK_PROFILES_RAW = "{}"
    m._SESSION_RISK_PROFILES_MAP = {}
    yield
    m._SESSION_RISK_LAST_BY_MARKET.clear()
    m._SESSION_RISK_OVERRIDES_BY_MARKET.clear()

이 소견은 Non-blocking이며 별도 이슈/PR로 추적 가능합니다.


결론

LGTM — REQ-V3-002 잔여 갭 해소 확인, 테스트 로직 구현과 일치, 문서 상태 업데이트 적절.
전역 상태 격리는 후속 개선 항목으로 추적 권장.

## PR #386 코드 리뷰 — test: add session-boundary risk reload e2e regressions (#376) **범위**: 세션 경계 리스크 파라미터 재로딩 E2E 회귀 테스트 추가 + 감사 문서 상태 업데이트 --- ### ✅ 통과 항목 **1. 테스트 커버리지 — 두 가지 핵심 경로 검증** | 테스트 | 검증 내용 | 결과 | |--------|-----------|------| | `test_session_boundary_reloads_us_min_price_override_in_trading_cycle` | US_PRE(`US_MIN_PRICE=8.0`) → US_DAY(`US_MIN_PRICE=5.0`) 세션 전환 시 override 적용/해제 | ✅ | | `test_session_boundary_falls_back_when_profile_reload_fails` | JSON 깨진 상태로 세션 전환 → override 빈 맵 → 기본값(`5.0`) 폴백 유지 | ✅ | **2. 구현과 테스트 일치 확인** `_parse_session_risk_profiles()` 파싱 실패 경로: ``` raw ≠ _SESSION_RISK_PROFILES_RAW → json.loads 실패 → parsed_map = {} → _SESSION_RISK_PROFILES_MAP = {} 업데이트 → merged = {} → _resolve_market_setting fallback = settings.US_MIN_PRICE = 5.0 ``` 테스트 2가 "폴백 시 기본값 유지"를 정확히 검증하고 있음. **3. 문서 상태 업데이트** - `REQ-V3-002`: ⚠️ 부분 → ✅ 완료 (세션 경계 E2E 회귀 테스트 보강 완료) - `GAP-3`: ⚠️ 부분 해소 → ✅ 해소 (#327 + #376) - 요구사항 레지스트리 버전 1.0.6 → 1.0.7 업데이트 - "테스트 미존재 (잔여)" 항목에서 세션 전환 훅/재로딩 항목 ❌ → ✅ 이동 **4. 로컬 실행 결과** - 신규 테스트 2개: 2 passed in 1.19s ✅ - test_main.py 전체: 164 passed in 7.96s ✅ --- ### ⚠️ 소견 (Non-blocking) **전역 상태 테스트 격리 미비** `_SESSION_RISK_LAST_BY_MARKET`, `_SESSION_RISK_OVERRIDES_BY_MARKET`, `_SESSION_RISK_PROFILES_RAW`, `_SESSION_RISK_PROFILES_MAP`은 모듈 수준 전역 변수입니다. 현재 두 테스트가 서로 다른 마켓 `market.code = "US_NASDAQ"` 를 공유하고, 테스트 실행 순서에 따라 전역 상태가 다르게 남습니다. 순서가 바뀌어도 현재 케이스에서는 통과하지만, 미래에 유사 테스트가 추가될 때 순서 의존성이 발생할 수 있습니다. 권장 패턴: ```python @pytest.fixture(autouse=True) def _reset_session_risk_globals(): import src.main as m m._SESSION_RISK_LAST_BY_MARKET.clear() m._SESSION_RISK_OVERRIDES_BY_MARKET.clear() m._SESSION_RISK_PROFILES_RAW = "{}" m._SESSION_RISK_PROFILES_MAP = {} yield m._SESSION_RISK_LAST_BY_MARKET.clear() m._SESSION_RISK_OVERRIDES_BY_MARKET.clear() ``` 이 소견은 Non-blocking이며 별도 이슈/PR로 추적 가능합니다. --- ### 결론 **LGTM** — REQ-V3-002 잔여 갭 해소 확인, 테스트 로직 구현과 일치, 문서 상태 업데이트 적절. 전역 상태 격리는 후속 개선 항목으로 추적 권장.
agentson added 1 commit 2026-03-02 03:30:48 +09:00
test: harden session-risk global reset isolation
All checks were successful
Gitea CI / test (push) Successful in 33s
Gitea CI / test (pull_request) Successful in 33s
ca9e1ad0e2
Author
Collaborator

추가 리뷰 — test: harden session-risk global reset isolation

커밋: ca9e1ad test: harden session-risk global reset isolation


소견 반영 확인

기존 _reset_kill_switch_state autouse fixture 내 세션 리스크 전역 변수 리셋 코드를 내부 함수로 추출하고, 초기화 sentinel 값을 수정:

변경 전

_SESSION_RISK_LAST_BY_MARKET.clear()
_SESSION_RISK_OVERRIDES_BY_MARKET.clear()
_SESSION_RISK_PROFILES_MAP.clear()
main_module._SESSION_RISK_PROFILES_RAW = "__reset__"
# (yield 전/후 두 번 중복)

변경 후

def _reset_session_risk_globals() -> None:
    _SESSION_RISK_LAST_BY_MARKET.clear()
    _SESSION_RISK_OVERRIDES_BY_MARKET.clear()
    _SESSION_RISK_PROFILES_MAP.clear()
    main_module._SESSION_RISK_PROFILES_RAW = "{}"
# yield 전/후 각 1회 호출

두 가지 개선:

  1. DRY: yield 전/후 중복 4줄 → 내부 함수 1회 호출로 단일화
  2. sentinel 값 정정: "__reset__" (유효하지 않은 JSON) → "{}" (유효한 JSON 빈 객체)
    • _parse_session_risk_profiles()raw == _SESSION_RISK_PROFILES_RAW 캐시 비교가 의미 있는 값으로 동작하게 됨
    • 실제 테스트의 SESSION_RISK_PROFILES_JSON 값과 충돌 없음

로컬 실행: 164 passed in 8.01s

LGTM — 추가 소견 없음. 머지 준비 완료.

## 추가 리뷰 — test: harden session-risk global reset isolation **커밋**: `ca9e1ad test: harden session-risk global reset isolation` --- ### ✅ 소견 반영 확인 기존 `_reset_kill_switch_state` autouse fixture 내 세션 리스크 전역 변수 리셋 코드를 내부 함수로 추출하고, 초기화 sentinel 값을 수정: **변경 전** ```python _SESSION_RISK_LAST_BY_MARKET.clear() _SESSION_RISK_OVERRIDES_BY_MARKET.clear() _SESSION_RISK_PROFILES_MAP.clear() main_module._SESSION_RISK_PROFILES_RAW = "__reset__" # (yield 전/후 두 번 중복) ``` **변경 후** ```python def _reset_session_risk_globals() -> None: _SESSION_RISK_LAST_BY_MARKET.clear() _SESSION_RISK_OVERRIDES_BY_MARKET.clear() _SESSION_RISK_PROFILES_MAP.clear() main_module._SESSION_RISK_PROFILES_RAW = "{}" # yield 전/후 각 1회 호출 ``` 두 가지 개선: 1. **DRY**: yield 전/후 중복 4줄 → 내부 함수 1회 호출로 단일화 2. **sentinel 값 정정**: `"__reset__"` (유효하지 않은 JSON) → `"{}"` (유효한 JSON 빈 객체) - `_parse_session_risk_profiles()`의 `raw == _SESSION_RISK_PROFILES_RAW` 캐시 비교가 의미 있는 값으로 동작하게 됨 - 실제 테스트의 SESSION_RISK_PROFILES_JSON 값과 충돌 없음 **로컬 실행**: 164 passed in 8.01s ✅ **LGTM** — 추가 소견 없음. 머지 준비 완료.
jihoson merged commit 4710aa2d66 into feature/v3-session-policy-stream 2026-03-02 03:33:19 +09:00
jihoson deleted branch feature/issue-376-session-boundary-e2e 2026-03-02 03:33:19 +09:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: jihoson/The-Ouroboros#386