"""Tests for permanence.world.db — reversibility + isolation.""" from __future__ import annotations import socket from unittest.mock import patch from permanence.world.db import MockDatabase def test_create_and_select_are_r1_r2(): db = MockDatabase() assert db.create_table("users", "id").r_level == 2 assert db.select("users").r_level == 1 def test_insert_autocommit_is_r3(): db = MockDatabase() db.create_table("users", "id") res = db.insert("users", {"id": 1, "name": "alice"}) assert res.ok and res.r_level == 3 def test_insert_in_txn_is_r2_and_rollback_restores(): db = MockDatabase() db.create_table("users", "id") db.begin() res = db.insert("users", {"id": 1, "name": "alice"}) assert res.ok and res.r_level == 2 db.rollback() assert db.tables["users"].n_rows() == 0 def test_drop_table_with_backup_is_r4(): db = MockDatabase() db.create_table("users", "id") db.insert("users", {"id": 1, "name": "alice"}) db.snapshot("pre-migration") res = db.drop_table("users") assert res.ok and res.r_level == 4 def test_drop_table_without_backup_is_r5(): db = MockDatabase() db.create_table("users", "id") db.insert("users", {"id": 1, "name": "alice"}) res = db.drop_table("users") assert res.ok and res.r_level == 5 assert "UNRECOVERABLE" in res.message def test_truncate_autocommit_without_backup_is_r5(): db = MockDatabase() db.create_table("events", "id") for i in range(100): db.insert("events", {"id": i, "v": i}) res = db.truncate("events") assert res.ok and res.r_level == 5 def test_truncate_autocommit_with_backup_is_r4(): db = MockDatabase() db.create_table("events", "id") db.insert("events", {"id": 1, "v": 1}) db.snapshot("pre") res = db.truncate("events") assert res.ok and res.r_level == 4 def test_commit_of_drop_escalates_to_r5_without_backup(): db = MockDatabase() db.create_table("orders", "id") db.begin() db.drop_table("orders") res = db.commit() assert res.ok and res.r_level == 5 def test_commit_of_dml_is_r3(): db = MockDatabase() db.create_table("users", "id") db.begin() db.insert("users", {"id": 1, "name": "a"}) db.update("users", 1, {"name": "b"}) res = db.commit() assert res.ok and res.r_level == 3 def test_rollback_is_r2(): db = MockDatabase() db.create_table("t", "id") db.begin() db.insert("t", {"id": 1}) res = db.rollback() assert res.ok and res.r_level == 2 assert db.tables["t"].n_rows() == 0 def test_restore_from_snapshot_undoes_drop(): db = MockDatabase() db.create_table("users", "id") db.insert("users", {"id": 1, "name": "a"}) db.snapshot("pre") db.drop_table("users") assert "users" not in db.tables db.restore("pre") assert "users" in db.tables assert db.tables["users"].n_rows() == 1 def test_mock_db_never_hits_network_or_disk(): with patch("os.remove") as mock_rm, patch.object(socket, "socket") as mock_sock: db = MockDatabase() db.create_table("a", "id") db.insert("a", {"id": 1}) db.snapshot("s1") db.begin() db.update("a", 1, {"x": 9}) db.commit() db.drop_table("a") db.restore("s1") assert mock_rm.call_count == 0 assert mock_sock.call_count == 0