# Author: Sandeep Belgavi import tempfile import unittest from pathlib import Path from pattern_06 import EventHub, FakeWorker, demo class EventTests(unittest.TestCase): def setUp(self): self.tmp = tempfile.TemporaryDirectory() self.path = Path(self.tmp.name) / 'state.db' self.hub = EventHub(self.path) self.event = dict(id='a', incident='inc', severity=4, version=1) def tearDown(self): self.hub.close() self.tmp.cleanup() def test_duplicate(self): self.assertEqual(self.hub.accept(self.event), 'accepted') self.assertEqual(self.hub.accept(self.event), 'duplicate') self.assertEqual(self.hub.db.execute('SELECT count(*) FROM outbox').fetchone()[0], 1) def test_conflicting_identifier(self): self.hub.accept(self.event) with self.assertRaises(ValueError): self.hub.accept(dict(self.event, severity=2)) def test_transaction_rollback(self): with self.assertRaises(RuntimeError): self.hub.accept(self.event, fail=True) for table in ('inbox', 'incidents', 'outbox'): self.assertEqual(self.hub.db.execute('SELECT count(*) FROM ' + table).fetchone()[0], 0) def test_delivery_replay(self): self.hub.accept(self.event) worker = FakeWorker() with self.assertRaises(RuntimeError): self.hub.drain(worker, True) self.hub.drain(worker) self.assertEqual(len(worker.receipts), 1) def test_restart(self): self.hub.accept(self.event) self.hub.close() self.hub = EventHub(self.path) self.assertEqual(self.hub.accept(self.event), 'duplicate') def test_out_of_order_severity(self): self.hub.accept(self.event) self.hub.accept(dict(self.event, id='b', severity=1)) self.assertEqual(self.hub.db.execute('SELECT severity FROM incidents').fetchone()[0], 4) def test_schema(self): for change in ({'version': 2}, {'severity': True}, {'severity': 0}, {'id': ''}): with self.assertRaises(ValueError): self.hub.accept(dict(self.event, **change)) def test_demo(self): self.assertEqual(demo(), {'first': 'accepted', 'repeat': 'duplicate', 'deliveries': 1, 'severity': 4}) if __name__ == '__main__': unittest.main()