From d46d2cb30b0e9a32dbb4a460cab99dcd96fe830b Mon Sep 17 00:00:00 2001 From: gahusb Date: Tue, 28 Apr 2026 08:45:03 +0900 Subject: [PATCH] test(realestate): truncate tables for isolation instead of file delete Replace os.remove() in conftest autouse fixture with per-table DELETE to avoid Windows SQLite file-lock PermissionError being swallowed silently and leaking state across tests. Remove the inline DELETE workaround from test_profile_api.py that was coupling the test to internal DB knowledge. Co-Authored-By: Claude Sonnet 4.6 --- realestate-lab/tests/conftest.py | 30 ++++++++++++++---------- realestate-lab/tests/test_profile_api.py | 6 +---- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/realestate-lab/tests/conftest.py b/realestate-lab/tests/conftest.py index 8bc1d3d..553b4fe 100644 --- a/realestate-lab/tests/conftest.py +++ b/realestate-lab/tests/conftest.py @@ -7,27 +7,31 @@ import pytest # mkstemp으로 충돌 없는 고유 경로 확보 후 SQLite가 직접 생성하도록 즉시 삭제 _fd, _TMP_DB = tempfile.mkstemp(suffix=".db") os.close(_fd) -os.unlink(_TMP_DB) # let SQLite create it fresh on first init_db() +os.unlink(_TMP_DB) os.environ["REALESTATE_DB_PATH"] = _TMP_DB # app 패키지 import 가능하게 PYTHONPATH 보정 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +# 테이블 목록 — init_db가 생성하는 모든 테이블 +_USER_TABLES = ( + "match_results", # FK CASCADE 대비 자식 테이블 먼저 + "announcement_models", + "announcements", + "user_profile", + "collect_log", +) + + @pytest.fixture(autouse=True) def _clean_db(): - """각 테스트마다 DB 초기화.""" - try: - if os.path.exists(_TMP_DB): - os.remove(_TMP_DB) - except PermissionError: - pass # Windows: SQLite 파일 잠금 해제 전 삭제 실패 무시 + """각 테스트마다 DB 테이블 비우기. 파일 삭제 대신 TRUNCATE 패턴 사용해 + Windows SQLite 파일 잠금 이슈를 회피한다.""" # deferred to ensure REALESTATE_DB_PATH is set before first module load - from app.db import init_db + from app.db import _conn, init_db init_db() + with _conn() as conn: + for table in _USER_TABLES: + conn.execute(f"DELETE FROM {table}") yield - try: - if os.path.exists(_TMP_DB): - os.remove(_TMP_DB) - except PermissionError: - pass # Windows: SQLite 파일 잠금 해제 전 삭제 실패 무시 diff --git a/realestate-lab/tests/test_profile_api.py b/realestate-lab/tests/test_profile_api.py index 807709b..60459c5 100644 --- a/realestate-lab/tests/test_profile_api.py +++ b/realestate-lab/tests/test_profile_api.py @@ -26,11 +26,7 @@ def test_profile_update_accepts_new_fields(): def test_profile_get_returns_defaults_for_new_fields(): from app.main import app - from app.db import upsert_profile, _conn - - # 이전 테스트 데이터 제거 후 새 프로필 삽입 - with _conn() as conn: - conn.execute("DELETE FROM user_profile") + from app.db import upsert_profile upsert_profile({"name": "기본"}) with TestClient(app) as client: