refactor(tests): lift bq_instance + stub_bq_extractor fixtures to conftest
Pre-fix the fixtures lived inside tests/test_api_admin_materialized.py. Upcoming test files in this branch need them too; conftest is the canonical home so they resolve via pytest's auto-discovery.
This commit is contained in:
parent
baa2efe57f
commit
aa622f2af4
2 changed files with 66 additions and 46 deletions
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
import os
|
||||
from pathlib import Path
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import duckdb
|
||||
import pytest
|
||||
|
|
@ -301,3 +302,68 @@ def bq_access():
|
|||
yield _build
|
||||
from app.main import app as _app
|
||||
_app.dependency_overrides.pop(get_bq_access, None)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def bq_instance(monkeypatch):
|
||||
"""Force instance.yaml to look like a BigQuery deployment for the
|
||||
duration of one test. Patches the cached load_instance_config so
|
||||
/admin/server-config reads / get_value('data_source.bigquery.project')
|
||||
return what we want, without touching the on-disk instance.yaml.
|
||||
|
||||
Tests that need BigQuery-specific admin API behaviour (project_id
|
||||
validation, materialized source_query checks, etc.) depend on this
|
||||
fixture. Yields the fake config dict so callers can inspect it.
|
||||
|
||||
Note: several test files (test_admin_bq_register.py,
|
||||
test_admin_tables_ui_materialized.py, …) define their own local
|
||||
``bq_instance`` fixture. Those local definitions shadow this one
|
||||
inside those files — the conftest copy is the canonical provider for
|
||||
any new test file that imports from this module."""
|
||||
fake_cfg = {
|
||||
"data_source": {
|
||||
"type": "bigquery",
|
||||
"bigquery": {"project": "my-test-project", "location": "us"},
|
||||
},
|
||||
}
|
||||
monkeypatch.setattr(
|
||||
"app.instance_config.load_instance_config",
|
||||
lambda: fake_cfg,
|
||||
raising=False,
|
||||
)
|
||||
from app.instance_config import reset_cache
|
||||
reset_cache()
|
||||
yield fake_cfg
|
||||
reset_cache()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def stub_bq_extractor(monkeypatch):
|
||||
"""Mirror tests/test_admin_bq_register.py — bypasses real-BQ traffic
|
||||
in the post-register rebuild path so the test stays offline. Required
|
||||
whenever the test seeds a remote-mode BQ row via the HTTP API.
|
||||
|
||||
Patches:
|
||||
- ``connectors.bigquery.extractor.rebuild_from_registry`` — returns a
|
||||
minimal success dict so the admin register endpoint's 200/201 path
|
||||
completes without touching a real BQ project.
|
||||
- ``src.orchestrator.SyncOrchestrator`` — replaced with a no-op mock so
|
||||
the post-register orchestrator.rebuild() call doesn't scan the
|
||||
(empty) extracts directory during tests.
|
||||
|
||||
Returns the ``rebuild_from_registry`` MagicMock directly so callers
|
||||
that only need the side-effect patcher can ignore the return value,
|
||||
and callers that want to assert call args can inspect it."""
|
||||
rebuild_mock = MagicMock(return_value={
|
||||
"project_id": "my-test-project",
|
||||
"tables_registered": 1, "errors": [], "skipped": False,
|
||||
})
|
||||
monkeypatch.setattr(
|
||||
"connectors.bigquery.extractor.rebuild_from_registry",
|
||||
rebuild_mock,
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
"src.orchestrator.SyncOrchestrator",
|
||||
lambda *a, **kw: MagicMock(),
|
||||
)
|
||||
return rebuild_mock
|
||||
|
|
|
|||
|
|
@ -18,8 +18,6 @@ Covers PR #145 (re-implementation against 0.24.0 base):
|
|||
Shares the seeded_app + bq_instance fixtures from conftest /
|
||||
test_admin_bq_register.py for parity with the existing BQ test surface.
|
||||
"""
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
|
|
@ -27,50 +25,6 @@ def _auth(token):
|
|||
return {"Authorization": f"Bearer {token}"}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def stub_bq_extractor(monkeypatch):
|
||||
"""Mirror tests/test_admin_bq_register.py — bypasses real-BQ traffic
|
||||
in the post-register rebuild path so the test stays offline. Required
|
||||
whenever the test seeds a remote-mode BQ row via the HTTP API."""
|
||||
rebuild_mock = MagicMock(return_value={
|
||||
"project_id": "my-test-project",
|
||||
"tables_registered": 1, "errors": [], "skipped": False,
|
||||
})
|
||||
monkeypatch.setattr(
|
||||
"connectors.bigquery.extractor.rebuild_from_registry",
|
||||
rebuild_mock,
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
"src.orchestrator.SyncOrchestrator",
|
||||
lambda *a, **kw: MagicMock(),
|
||||
)
|
||||
return rebuild_mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def bq_instance(monkeypatch):
|
||||
"""Force instance.yaml to look like a BigQuery deployment.
|
||||
|
||||
Mirrors tests/test_admin_bq_register.py::bq_instance so the
|
||||
project_id read inside _validate_bigquery_register_payload succeeds.
|
||||
"""
|
||||
fake_cfg = {
|
||||
"data_source": {
|
||||
"type": "bigquery",
|
||||
"bigquery": {"project": "my-test-project", "location": "us"},
|
||||
},
|
||||
}
|
||||
monkeypatch.setattr(
|
||||
"app.instance_config.load_instance_config",
|
||||
lambda: fake_cfg,
|
||||
raising=False,
|
||||
)
|
||||
from app.instance_config import reset_cache
|
||||
reset_cache()
|
||||
yield fake_cfg
|
||||
reset_cache()
|
||||
|
||||
|
||||
def _materialized_payload(**overrides):
|
||||
p = {
|
||||
"name": "orders_90d",
|
||||
|
|
|
|||
Loading…
Reference in a new issue