def test_serialize_domain_event(self): datetime_now = datetime.datetime(2015, 9, 8, 16, 20, 50, 577429) datetime_now_tzaware = datetime.datetime(2015, 9, 8, 16, 20, 50, 577429, tzinfo=utc_timezone) date_now = datetime.date(2015, 9, 8) event1 = DomainEvent(a=1, b=2, c=datetime_now, d=datetime_now_tzaware, e=date_now, entity_version=0, entity_id='entity1', domain_event_id=3) stored_event = serialize_domain_event( event1, json_encoder_cls=ObjectJSONEncoder) self.assertEqual('DomainEvent::entity1', stored_event.stored_entity_id) self.assertEqual('eventsourcing.domain.model.events#DomainEvent', stored_event.event_topic) self.assertEqual( '{"a":1,"b":2,"c":{"ISO8601_datetime":"2015-09-08T16:20:50.577429"},"d":{"ISO8601_datetime":"2015-09-08T16:20:50.577429+0000"},"domain_event_id":3,"e":{"ISO8601_date":"2015-09-08"},"entity_id":"entity1","entity_version":0}', stored_event.event_attrs)
def test_serialize_domain_event_with_numpy_array(self): try: import numpy except ImportError: numpy = None if numpy is not None: event1 = DomainEvent(a=numpy.array([10.123456]), entity_version=0, entity_id='entity1', domain_event_id=3) stored_event = serialize_domain_event(event1, json_encoder_cls=ObjectJSONEncoder) self.assertEqual('eventsourcing.domain.model.events#DomainEvent', stored_event.event_topic) self.assertEqual('{"a":{"__ndarray__":"\\"\\\\u0093NUMPY\\\\u0001\\\\u0000F\\\\u0000{\'descr\': \'<f8\', \'fortran_order\': False, \'shape\': (1,), } \\\\nm\\\\u00fd\\\\u00f4\\\\u009f5?$@\\""},"domain_event_id":3,"entity_id":"entity1","entity_version":0}', stored_event.event_attrs) else: self.skipTest("Skipped test because numpy is not installed")
def test_construct_sqlalchemy_eventstore(self): # Construct the infrastructure. datastore = SQLAlchemyDatastore(settings=SQLAlchemySettings()) datastore.setup_connection() event_store = construct_sqlalchemy_eventstore( session=datastore.session, contiguous_record_ids=True, application_name=uuid4().hex, ) datastore.setup_table(event_store.record_manager.record_class) self.assertIsInstance(event_store, EventStore) # Store an event. aggregate_id = uuid4() aggregate_version = 0 domain_event = DomainEvent( a=1, originator_id=aggregate_id, originator_version=aggregate_version, ) event_store.append(domain_event) # Get the domain events. events = event_store.get_domain_events(originator_id=aggregate_id) self.assertEqual(len(events), 1) self.assertEqual(events[0], domain_event) # Test the while clause of all_sequence_ids() is filtering on application_name. self.assertEqual(event_store.record_manager.record_class, StoredEventRecord) sequence_ids = event_store.record_manager.list_sequence_ids() self.assertEqual([aggregate_id], sequence_ids) # - check the aggregate ID isn't listed by another application event_store = construct_sqlalchemy_eventstore( session=datastore.session, contiguous_record_ids=True, application_name=uuid4().hex, ) sequence_ids = event_store.record_manager.list_sequence_ids() self.assertEqual([], sequence_ids)
def test_construct_sqlalchemy_eventstore(self): datastore = SQLAlchemyDatastore(settings=SQLAlchemySettings()) datastore.setup_connection() event_store = construct_sqlalchemy_eventstore(datastore.session) datastore.setup_table(event_store.record_manager.record_class) self.assertIsInstance(event_store, EventStore) aggregate_id = uuid4() aggregate_version = 0 domain_event = DomainEvent( a=1, originator_id=aggregate_id, originator_version=aggregate_version, ) event_store.append(domain_event) events = event_store.get_domain_events(originator_id=aggregate_id) self.assertEqual(len(events), 1) self.assertEqual(events[0], domain_event)
def test_entity_lifecycle(self): # Check the factory creates an instance. example1 = register_new_example(a=1, b=2) self.assertIsInstance(example1, Example) # Check the properties of the Example class. self.assertEqual(1, example1.a) self.assertEqual(2, example1.b) # Check the properties of the EventSourcedEntity class. self.assertTrue(example1.id) self.assertEqual(1, example1.version) self.assertTrue(example1.created_on) # Check a second instance with the same values is not "equal" to the first. example2 = register_new_example(a=1, b=2) self.assertNotEqual(example1, example2) # Setup the repo. repo = ExampleRepo(self.event_store) # Check the example entities can be retrieved from the example repository. entity1 = repo[example1.id] self.assertIsInstance(entity1, Example) self.assertEqual(1, entity1.a) self.assertEqual(2, entity1.b) entity2 = repo[example2.id] self.assertIsInstance(entity2, Example) self.assertEqual(1, entity2.a) self.assertEqual(2, entity2.b) # Check the entity can be updated. entity1.a = 100 self.assertEqual(100, repo[entity1.id].a) entity1.b = -200 self.assertEqual(-200, repo[entity1.id].b) self.assertEqual(0, entity1.count_heartbeats()) entity1.beat_heart() entity1.beat_heart() entity1.beat_heart() self.assertEqual(3, entity1.count_heartbeats()) self.assertEqual(3, repo[entity1.id].count_heartbeats()) # Check the entity can be discarded. entity1.discard() # Check the repo now raises a KeyError. self.assertRaises(RepositoryKeyError, repo.__getitem__, entity1.id) # Check the entity can't be discarded twice. self.assertRaises(AssertionError, entity1.discard) # Should fail to validate event with wrong entity ID. self.assertRaises( EntityIDConsistencyError, entity2._validate_originator, DomainEvent(entity_id=entity2.id + 'wrong', entity_version=0)) # Should fail to validate event with wrong entity version. self.assertRaises(EntityVersionConsistencyError, entity2._validate_originator, DomainEvent(entity_id=entity2.id, entity_version=0)) # Should validate event with correct entity ID and version. entity2._validate_originator( DomainEvent(entity_id=entity2.id, entity_version=entity2.version)) # Check an entity can be reregistered with the same ID. replacement_event = Example.Created(entity_id=entity1.id, a=11, b=12) # replacement = Example.mutate(event=replacement_event) publish(event=replacement_event) # Check the replacement entity can be retrieved from the example repository. replacement = repo[entity1.id] assert isinstance(replacement, Example) self.assertEqual(replacement.a, 11) self.assertEqual(replacement.b, 12)