def test_cache_raises_aggregate_not_found_when_projector_func_returns_none( self): transcoder = JSONTranscoder() transcoder.register(UUIDAsHex()) transcoder.register(DecimalAsStr()) transcoder.register(DatetimeAsISO()) transcoder.register(EmailAddressAsStr()) event_recorder = SQLiteAggregateRecorder(SQLiteDatastore(":memory:")) event_recorder.create_table() event_store = EventStore( mapper=Mapper(transcoder=transcoder), recorder=event_recorder, ) repository = Repository( event_store, cache_maxsize=2, ) aggregate = Aggregate() event_store.put(aggregate.collect_events()) self.assertEqual(1, repository.get(aggregate.id).version) aggregate.trigger_event(Aggregate.Event) event_store.put(aggregate.collect_events()) with self.assertRaises(AggregateNotFound): repository.get(aggregate.id, projector_func=lambda _, __: None)
def test_cache_fastforward_false(self): transcoder = JSONTranscoder() transcoder.register(UUIDAsHex()) transcoder.register(DecimalAsStr()) transcoder.register(DatetimeAsISO()) transcoder.register(EmailAddressAsStr()) event_recorder = SQLiteAggregateRecorder(SQLiteDatastore(":memory:")) event_recorder.create_table() event_store = EventStore( mapper=Mapper(transcoder=transcoder), recorder=event_recorder, ) repository = Repository( event_store, cache_maxsize=2, fastforward=False, ) aggregate = Aggregate() event_store.put(aggregate.collect_events()) self.assertEqual(1, repository.get(aggregate.id).version) aggregate.trigger_event(Aggregate.Event) event_store.put(aggregate.collect_events()) self.assertEqual(1, repository.get(aggregate.id).version)
def test_trigger_event(self): a = Aggregate() # Check the aggregate can trigger further events. a.trigger_event(AggregateEvent) self.assertLess(a.created_on, a.modified_on) pending = a.collect_events() self.assertEqual(len(pending), 2) self.assertIsInstance(pending[0], AggregateCreated) self.assertEqual(pending[0].originator_version, 1) self.assertIsInstance(pending[1], AggregateEvent) self.assertEqual(pending[1].originator_version, 2)
def test_repr_baseclass(self): a = Aggregate() expect = (f"Aggregate(id={a.id!r}, " "version=1, " f"created_on={a.created_on!r}, " f"modified_on={a.modified_on!r}" ")") self.assertEqual(expect, repr(a)) a.trigger_event(AggregateEvent) expect = (f"Aggregate(id={a.id!r}, " "version=2, " f"created_on={a.created_on!r}, " f"modified_on={a.modified_on!r}" ")") self.assertEqual(expect, repr(a))
def test_cache_maxsize_nonzero(self): transcoder = JSONTranscoder() transcoder.register(UUIDAsHex()) transcoder.register(DecimalAsStr()) transcoder.register(DatetimeAsISO()) transcoder.register(EmailAddressAsStr()) event_recorder = SQLiteAggregateRecorder(SQLiteDatastore(":memory:")) event_recorder.create_table() event_store = EventStore( mapper=Mapper(transcoder=transcoder), recorder=event_recorder, ) repository = Repository(event_store, cache_maxsize=2) self.assertEqual(type(repository.cache), LRUCache) aggregate1 = Aggregate() self.assertFalse(aggregate1.id in repository) event_store.put(aggregate1.collect_events()) self.assertTrue(aggregate1.id in repository) aggregate2 = Aggregate() self.assertFalse(aggregate2.id in repository) event_store.put(aggregate2.collect_events()) self.assertTrue(aggregate2.id in repository) aggregate3 = Aggregate() self.assertFalse(aggregate3.id in repository) event_store.put(aggregate3.collect_events()) self.assertTrue(aggregate3.id in repository) self.assertFalse(aggregate1.id in repository.cache.cache) self.assertEqual(1, repository.get(aggregate1.id).version) self.assertEqual(1, repository.get(aggregate2.id).version) self.assertEqual(1, repository.get(aggregate3.id).version) aggregate1.trigger_event(Aggregate.Event) event_store.put(aggregate1.collect_events()) self.assertEqual(2, repository.get(aggregate1.id).version)
def test(self): app = BankAccountsWithAutomaticSnapshotting() # Check snapshotting is enabled by setting snapshotting_intervals only. self.assertTrue(app.snapshots) # Open an account. account_id = app.open_account("Alice", "*****@*****.**") # Check there are no snapshots. snapshots = list(app.snapshots.get(account_id)) self.assertEqual(len(snapshots), 0) # Trigger twelve more events. for _ in range(12): app.credit_account(account_id, Decimal("10.00")) # Check the account is at version 13. account = app.get_account(account_id) self.assertEqual(account.version, 13) # Check snapshots have been taken at regular intervals. snapshots = list(app.snapshots.get(account_id)) self.assertEqual(len(snapshots), 2) self.assertEqual(snapshots[0].originator_version, 5) self.assertEqual(snapshots[1].originator_version, 10) # Check another type of aggregate is not snapshotted. aggregate = Aggregate() for _ in range(10): aggregate.trigger_event(Aggregate.Event) app.save(aggregate) # Check snapshots have not been taken at regular intervals. snapshots = list(app.snapshots.get(aggregate.id)) self.assertEqual(len(snapshots), 0)