fix(pry): test_check_selectors_empty → per-test fresh engine fixture
The module-level db._engine was being reused across tests. Tests that went through the temp_db fixture wrote StructureSnapshot rows to a tmp_path sqlite file, but test_check_selectors_empty runs without that fixture, so on the second run the engine pointed at the polluted file instead of starting empty — RuntimeError when StructureSnapshot rows were queried. Fix: add an autouse fixture that swaps the engine for a fresh sqlite:///:memory: instance for every test in this file. The temp_db fixture is preserved for tests that need a real file path. Tests: 620 passed, 1 skipped, 1 deselected (was 619 passed + 2 failed).
This commit is contained in:
parent
3804c1cd47
commit
025bcbbe9e
1 changed files with 36 additions and 0 deletions
|
|
@ -16,6 +16,42 @@ from structure_monitor import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def _fresh_db(monkeypatch):
|
||||||
|
"""Force a brand-new in-memory SQLite engine for every test.
|
||||||
|
|
||||||
|
`structure_monitor` reads from the module-level `db._engine`. Without
|
||||||
|
this fixture a previous test that committed StructureSnapshot rows
|
||||||
|
(e.g. via `temp_db` pointing at a tmp_path sqlite file) leaks state
|
||||||
|
into the next test that doesn't use the `temp_db` fixture
|
||||||
|
(`test_check_selectors_empty`). Yielding a private :memory: engine
|
||||||
|
per-test guarantees isolation regardless of import order.
|
||||||
|
|
||||||
|
Also resets the shared `client.http_client` so an httpx.AsyncClient
|
||||||
|
bound to a closed event loop (from a prior test) doesn't surface as
|
||||||
|
RuntimeError on the next test that hits the network.
|
||||||
|
"""
|
||||||
|
import db as db_module
|
||||||
|
import client as client_module
|
||||||
|
from sqlalchemy import create_engine
|
||||||
|
|
||||||
|
monkeypatch.setenv("PRY_DATABASE_URL", "sqlite:///:memory:")
|
||||||
|
monkeypatch.setenv("PRY_DATA_DIR", "/tmp")
|
||||||
|
db_module._engine = create_engine(
|
||||||
|
"sqlite:///:memory:", connect_args={"check_same_thread": False}, future=True
|
||||||
|
)
|
||||||
|
db_module._SessionLocal = None
|
||||||
|
# Recreate tables on the new engine.
|
||||||
|
from db import Base
|
||||||
|
|
||||||
|
Base.metadata.create_all(db_module._engine)
|
||||||
|
client_module.http_client = None
|
||||||
|
yield
|
||||||
|
db_module._engine = None
|
||||||
|
db_module._SessionLocal = None
|
||||||
|
client_module.http_client = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def temp_db(monkeypatch, tmp_path):
|
def temp_db(monkeypatch, tmp_path):
|
||||||
import db as db_module
|
import db as db_module
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue