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
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
import duckdb
|
import duckdb
|
||||||
import pytest
|
import pytest
|
||||||
|
|
@ -301,3 +302,68 @@ def bq_access():
|
||||||
yield _build
|
yield _build
|
||||||
from app.main import app as _app
|
from app.main import app as _app
|
||||||
_app.dependency_overrides.pop(get_bq_access, None)
|
_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 /
|
Shares the seeded_app + bq_instance fixtures from conftest /
|
||||||
test_admin_bq_register.py for parity with the existing BQ test surface.
|
test_admin_bq_register.py for parity with the existing BQ test surface.
|
||||||
"""
|
"""
|
||||||
from unittest.mock import MagicMock
|
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -27,50 +25,6 @@ def _auth(token):
|
||||||
return {"Authorization": f"Bearer {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):
|
def _materialized_payload(**overrides):
|
||||||
p = {
|
p = {
|
||||||
"name": "orders_90d",
|
"name": "orders_90d",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue