YeonGyu-Kim
|
527c0f971c
|
fix(#160): harden delete_session contract — idempotency, race-safety, typed partial-failure
Addresses review feedback on initial #160 implementation:
1. delete_session() contract now explicit:
- Idempotent: delete(x); delete(x) is safe, second call returns False
- Race-safe: TOCTOU between exists()/unlink() eliminated via unlink-then-catch
- Partial-failure typed: permission/IO errors wrapped in SessionDeleteError (OSError subclass)
so callers can distinguish 'not found' (return False) from 'could not delete' (raise)
2. New SessionDeleteError class for partial-failure surfacing.
Distinct from SessionNotFoundError (KeyError subclass for missing loads).
3. Caller audit confirmed: no code outside session_store globs .port_sessions
or imports DEFAULT_SESSION_DIR. Storage layout is fully encapsulated.
4. Added tests/test_session_store.py — 18 tests covering:
- list_sessions: empty/missing/sorted/non-json filter
- session_exists: true/false/missing-dir
- load_session: SessionNotFoundError typing (KeyError subclass, not FileNotFoundError)
- delete_session idempotency: first/second/never-existed calls
- delete_session partial-failure: SessionDeleteError wraps OSError
- delete_session race-safety: concurrent deletion returns False, not raise
- Full save->list->exists->load->delete roundtrip
All 18 tests pass. Merge-ready: contract documented, caller-audited, race-safe.
|
2026-04-22 17:11:26 +09:00 |
|