"""Author: Sandeep Belgavi. Failure and persistence contracts for pattern 11.""" import pathlib import tempfile import unittest from pattern_11 import ActionStore class ActionTests(unittest.TestCase): def setUp(self): self.store = ActionStore() self.addCleanup(self.store.close) def test_retry_has_one_effect(self): self.store.reserve('a', '1', 'api') self.assertEqual(self.store.reserve('a', '1', 'api'), 'reserved') self.assertEqual(self.store.active(), 1) def test_conflicting_intent_rejected(self): self.store.reserve('a', '1', 'api') with self.assertRaises(ValueError): self.store.reserve('a', '1', 'db') self.assertEqual(self.store.active(), 1) def test_atomic_failure(self): with self.assertRaises(RuntimeError): self.store.reserve('a', '1', 'api', fail=True) self.assertEqual(self.store.active(), 0) self.assertEqual(self.store.reserve('a', '1', 'api'), 'reserved') def test_compensation_and_retry_do_not_reapply(self): self.store.reserve('a', '1', 'api') self.store.compensate('a', '1') self.store.compensate('a', '1') self.assertEqual(self.store.reserve('a', '1', 'api'), 'compensated') self.assertEqual(self.store.active(), 0) def test_permission_denial_precedes_effect(self): with self.assertRaises(PermissionError): self.store.reserve('a', '1', 'api', authorized=False) self.assertEqual(self.store.active(), 0) def test_tenant_scoped_keys(self): self.store.reserve('a', '1', 'api') self.store.reserve('b', '1', 'api') self.store.compensate('a', '1') self.assertEqual(self.store.active(), 1) def test_restart_preserves_receipt(self): with tempfile.TemporaryDirectory() as folder: path = str(pathlib.Path(folder) / 'actions.db') one = ActionStore(path) one.reserve('a', '1', 'api') one.close() two = ActionStore(path) try: self.assertEqual(two.reserve('a', '1', 'api'), 'reserved') self.assertEqual(two.active(), 1) finally: two.close() def test_unknown_compensation(self): with self.assertRaises(KeyError): self.store.compensate('a', 'missing') if __name__ == '__main__': unittest.main()