Fix test suite: ESM module loading and stub isolation (#844)
* Fix test suite: ESM loading and stub isolation (refs #605) Three targeted fixes to reduce suite failures from 9 → 1: 1. package.json: add "type": "module" so Node loads static/js/** as ES modules. Fixes 7 tests in test_compare_js.py and test_reply_recipients_js.py that fail with "SyntaxError: Unexpected token 'export'". 2. test_null_owner_gates.py: add Base and ChatMessage to the core.database stub. Without Base the scheduler test cannot import at collection time; without ChatMessage core/__init__.py fails mid-load when session_manager.py tries to import it, leaving core partially initialised in sys.modules and poisoning the auth manager migration test that runs later in the same file. 3. test_task_scheduler_session_delivery.py: skip gracefully when core.database is stubbed (Base is a MagicMock) rather than crashing. The test passes correctly when run in isolation. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Scope ESM declaration to static/js/ and document isolation workaround Per review feedback on #844: 1. Move "type": "module" from root package.json to static/js/package.json. The root package.json had no type field (defaulted to CJS) and should stay that way — vendored UMD bundles in static/lib/ use require() internally and would break if Node ever tried to load them as ES modules. Node resolves the nearest package.json, so adding it in static/js/ scopes the ESM declaration to just the files the JS unit tests actually load (compare/state.js, emailLibrary/replyRecipients.js). 2. Expand the module-level skip comment in test_task_scheduler_session_delivery to document that it is a temporary isolation workaround, explain root cause (test_null_owner_gates installs a module-level sys.modules stub with no cleanup), record before/after suite numbers, and note the clean path (refactor to fixture-scoped stub). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -14,6 +14,18 @@ from sqlalchemy.orm import sessionmaker
|
||||
from core.database import Base, Session as DbSession
|
||||
from src.task_scheduler import TaskScheduler
|
||||
|
||||
# TEMPORARY ISOLATION WORKAROUND — remove once test_null_owner_gates.py is
|
||||
# refactored to use a fixture-scoped stub instead of module-level sys.modules
|
||||
# patching. When collected after test_null_owner_gates (alphabetical order),
|
||||
# core.database is already a stub whose Base attribute is a MagicMock, so
|
||||
# Base.metadata.create_all() below does nothing and the assertions fail.
|
||||
# The test passes correctly in isolation:
|
||||
# pytest tests/test_task_scheduler_session_delivery.py → 1 passed
|
||||
# Full-suite baseline before this PR: 9 failed, 345 passed (pre-upstream-pull)
|
||||
# Full-suite after this PR: 1 failed, 495 passed, 1 skipped
|
||||
if type(Base).__name__ == "MagicMock":
|
||||
pytest.skip("core.database is stubbed — run this file in isolation", allow_module_level=True)
|
||||
|
||||
|
||||
def _make_db():
|
||||
engine = create_engine("sqlite:///:memory:")
|
||||
|
||||
Reference in New Issue
Block a user