Reorganize WNDB by responsibility and remove legacy scheme endpoints.\n\nRoute analysis and time-series access through project pools, preserve transactional realtime replacement, and refresh GIS materialized views after writes.\n\nAdd database architecture documentation, live pooling coverage, API contract updates, and executable container verification.\n\nBREAKING CHANGE: legacy scheme APIs and flat app.native.wndb module imports are removed.
84 lines
2.3 KiB
Python
84 lines
2.3 KiB
Python
from contextlib import contextmanager
|
|
|
|
import pytest
|
|
|
|
from app.native.wndb.commands import executor
|
|
from app.native.wndb.core.database import ChangeSet
|
|
|
|
|
|
def test_batch_commits_before_materialized_view_refresh(monkeypatch) -> None:
|
|
events: list[str] = []
|
|
|
|
@contextmanager
|
|
def fake_transaction(_name: str):
|
|
events.append("transaction-enter")
|
|
yield object()
|
|
events.append("transaction-exit")
|
|
|
|
monkeypatch.setattr(executor, "project_transaction", fake_transaction)
|
|
monkeypatch.setattr(
|
|
executor,
|
|
"expand_command",
|
|
lambda _name, change_set: change_set,
|
|
)
|
|
monkeypatch.setattr(
|
|
executor,
|
|
"_execute_update_command",
|
|
lambda _name, _change_set: events.append("write") or ChangeSet(),
|
|
)
|
|
monkeypatch.setattr(
|
|
executor,
|
|
"refresh_materialized_views",
|
|
lambda _name: events.append("refresh"),
|
|
)
|
|
|
|
executor.execute_batch_commands(
|
|
"project_a",
|
|
ChangeSet({"operation": "update", "type": "junction", "id": "J1"}),
|
|
)
|
|
|
|
assert events == [
|
|
"transaction-enter",
|
|
"write",
|
|
"transaction-exit",
|
|
"refresh",
|
|
]
|
|
|
|
|
|
def test_failed_batch_does_not_refresh_materialized_views(monkeypatch) -> None:
|
|
events: list[str] = []
|
|
|
|
@contextmanager
|
|
def fake_transaction(_name: str):
|
|
events.append("transaction-enter")
|
|
try:
|
|
yield object()
|
|
finally:
|
|
events.append("transaction-exit")
|
|
|
|
monkeypatch.setattr(executor, "project_transaction", fake_transaction)
|
|
monkeypatch.setattr(
|
|
executor,
|
|
"expand_command",
|
|
lambda _name, change_set: change_set,
|
|
)
|
|
|
|
def fail_write(_name, _change_set):
|
|
events.append("write")
|
|
raise RuntimeError("write failed")
|
|
|
|
monkeypatch.setattr(executor, "_execute_update_command", fail_write)
|
|
monkeypatch.setattr(
|
|
executor,
|
|
"refresh_materialized_views",
|
|
lambda _name: events.append("refresh"),
|
|
)
|
|
|
|
with pytest.raises(RuntimeError, match="write failed"):
|
|
executor.execute_batch_commands(
|
|
"project_a",
|
|
ChangeSet({"operation": "update", "type": "junction", "id": "J1"}),
|
|
)
|
|
|
|
assert events == ["transaction-enter", "write", "transaction-exit"]
|