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"]