45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
|
|
import tempfile
|
||
|
|
import unittest
|
||
|
|
from unittest.mock import MagicMock, patch
|
||
|
|
|
||
|
|
from baudolo.restore.db import postgres as pg_mod
|
||
|
|
|
||
|
|
|
||
|
|
class TestPostgresSingleTransaction(unittest.TestCase):
|
||
|
|
def test_replay_is_single_transaction_but_preclean_is_not(self) -> None:
|
||
|
|
calls = []
|
||
|
|
|
||
|
|
def _capture(container, argv, **kwargs):
|
||
|
|
calls.append(argv)
|
||
|
|
return MagicMock()
|
||
|
|
|
||
|
|
with tempfile.NamedTemporaryFile(suffix=".sql") as sql:
|
||
|
|
sql.write(b"CREATE TABLE t (id int);\nINSERT INTO t VALUES (1);\n")
|
||
|
|
sql.flush()
|
||
|
|
with patch.object(pg_mod, "docker_exec", side_effect=_capture):
|
||
|
|
pg_mod.restore_postgres_sql(
|
||
|
|
container="db",
|
||
|
|
db_name="discourse",
|
||
|
|
user="discourse",
|
||
|
|
password="pw",
|
||
|
|
sql_path=sql.name,
|
||
|
|
empty=True,
|
||
|
|
)
|
||
|
|
|
||
|
|
self.assertEqual(len(calls), 2, f"expected pre-clean + replay: {calls}")
|
||
|
|
preclean, replay = calls[0], calls[1]
|
||
|
|
self.assertNotIn(
|
||
|
|
"--single-transaction",
|
||
|
|
preclean,
|
||
|
|
"pre-clean must stay multi-statement or it exhausts max_locks on large schemas",
|
||
|
|
)
|
||
|
|
self.assertIn(
|
||
|
|
"--single-transaction",
|
||
|
|
replay,
|
||
|
|
"dump replay must be atomic so a live concurrent writer cannot trip a duplicate-key abort",
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
unittest.main()
|