public async Task SaveEvents_does_not_insert_pending_event_entities_if_fails_to_insert_correlation_entities() { // Arrange var fixture = new Fixture(); var user = new FakeUser(Guid.NewGuid(), fixture.Create <string>()); user.ChangeUsername(fixture.Create <string>()); IList <IDomainEvent> domainEvents = user.FlushPendingEvents().ToList(); var correlationId = Guid.NewGuid(); var batch = new TableBatchOperation(); batch.Insert(new TableEntity { PartitionKey = AggregateEntity.GetPartitionKey(typeof(FakeUser), user.Id), RowKey = Correlation.GetRowKey(correlationId), }); await s_eventTable.ExecuteBatchAsync(batch); // Act Func <Task> action = () => _sut.SaveEvents <FakeUser>(domainEvents, correlationId: correlationId); // Assert action.ShouldThrow <DuplicateCorrelationException>(); string filter = PendingEvent.GetFilter(typeof(FakeUser), user.Id); var query = new TableQuery <PendingEvent> { FilterString = filter }; IEnumerable <PendingEvent> actual = await s_eventTable.ExecuteQuerySegmentedAsync(query, default); actual.Should().BeEmpty(); }
private async Task <List <PendingEvent> > GetPendingEvents(string partition, CancellationToken cancellationToken) { string filter = PendingEvent.GetFilter(partition); var query = new TableQuery <PendingEvent> { FilterString = filter }; return(new List <PendingEvent>(await _eventTable .ExecuteQuery(query, cancellationToken) .ConfigureAwait(false))); }
public async Task FlushPendingEvents_absorbs_exception_caused_by_that_some_pending_event_already_deleted_since_loaded() { // Arrange var messageBus = new CompletableMessageBus(); var sut = new AzureEventPublisher(s_eventTable, s_serializer, messageBus); var fixture = new Fixture(); var user = new FakeUser(Guid.NewGuid(), fixture.Create <string>()); user.ChangeUsername(fixture.Create <string>()); var pendingEvents = new List <PendingEvent>( from message in user.FlushPendingEvents() let messageId = Guid.NewGuid() let envelope = new Envelope <IDomainEvent>(messageId, message) select PendingEvent.Create(typeof(FakeUser), envelope, s_serializer)); var batch = new TableBatchOperation(); foreach (PendingEvent pendingEvent in pendingEvents) { batch.Insert(pendingEvent); } await s_eventTable.ExecuteBatchAsync(batch); // Act Func <Task> action = async() => { Task flushTask = sut.FlushPendingEvents <FakeUser>(user.Id, CancellationToken.None); await s_eventTable.ExecuteAsync(TableOperation.Delete(pendingEvents.OrderBy(e => e.GetHashCode()).First())); messageBus.Complete(); await flushTask; }; // Assert action.ShouldNotThrow(); string filter = PendingEvent.GetFilter(typeof(FakeUser), user.Id); var query = new TableQuery { FilterString = filter }; TableQuerySegment actual = await s_eventTable.ExecuteQuerySegmentedAsync(query, default); actual.Should().BeEmpty(); }
public async Task FlushPendingEvents_does_not_delete_pending_events_if_fails_to_send() { // Arrange var exception = new InvalidOperationException(); IMessageBus messageBus = Mock.Of <IMessageBus>( x => x.Send(It.IsAny <IEnumerable <Envelope> >(), default) == Task.FromException(exception)); var sut = new AzureEventPublisher(s_eventTable, s_serializer, messageBus); var fixture = new Fixture(); var user = new FakeUser(Guid.NewGuid(), fixture.Create <string>()); user.ChangeUsername(fixture.Create <string>()); string operationId = fixture.Create <string>(); var correlationId = Guid.NewGuid(); string contributor = fixture.Create <string>(); var pendingEvents = new List <PendingEvent>( from message in user.FlushPendingEvents() let messageId = Guid.NewGuid() let envelope = new Envelope <IDomainEvent>(messageId, message, operationId, correlationId, contributor) select PendingEvent.Create(typeof(FakeUser), envelope, s_serializer)); var batch = new TableBatchOperation(); foreach (PendingEvent pendingEvent in pendingEvents) { batch.Insert(pendingEvent); } await s_eventTable.ExecuteBatchAsync(batch); // Act Func <Task> action = () => sut.FlushPendingEvents <FakeUser>(user.Id); // Assert action.ShouldThrow <InvalidOperationException>(); string filter = PendingEvent.GetFilter(typeof(FakeUser), user.Id); var query = new TableQuery <PendingEvent> { FilterString = filter }; TableQuerySegment <PendingEvent> actual = await s_eventTable.ExecuteQuerySegmentedAsync(query, default); actual.ShouldAllBeEquivalentTo(pendingEvents); }
public async Task SaveEvents_inserts_pending_event_entities_correctly() { // Arrange var fixture = new Fixture(); var user = new FakeUser(Guid.NewGuid(), fixture.Create <string>()); user.ChangeUsername(fixture.Create <string>()); IList <IDomainEvent> domainEvents = user.FlushPendingEvents().ToList(); string operationId = fixture.Create <string>(); var correlationId = Guid.NewGuid(); string contributor = fixture.Create <string>(); // Act await _sut.SaveEvents <FakeUser>(domainEvents, operationId, correlationId, contributor); // Assert string filter = PendingEvent.GetFilter(typeof(FakeUser), user.Id); var query = new TableQuery <PendingEvent> { FilterString = filter }; IEnumerable <PendingEvent> actual = await s_eventTable.ExecuteQuerySegmentedAsync(query, default); actual.ShouldAllBeEquivalentTo( from domainEvent in domainEvents let envelope = new Envelope <IDomainEvent>( Guid.NewGuid(), domainEvent, operationId, correlationId, contributor) select PendingEvent.Create(typeof(FakeUser), envelope, _serializer), opts => opts .Excluding(e => e.MessageId) .Excluding(e => e.Timestamp) .Excluding(e => e.ETag) .WithStrictOrdering()); }
public async Task FlushPendingEvents_deletes_all_pending_events() { // Arrange var sut = new AzureEventPublisher(s_eventTable, s_serializer, Mock.Of <IMessageBus>()); var fixture = new Fixture(); var user = new FakeUser(Guid.NewGuid(), fixture.Create <string>()); user.ChangeUsername(fixture.Create <string>()); var envelopes = new List <Envelope <IDomainEvent> >( from domainEvent in user.FlushPendingEvents() let messageId = Guid.NewGuid() select new Envelope <IDomainEvent>(messageId, domainEvent)); var batch = new TableBatchOperation(); foreach (Envelope <IDomainEvent> envelope in envelopes) { batch.Insert(PendingEvent.Create(typeof(FakeUser), envelope, s_serializer)); } await s_eventTable.ExecuteBatchAsync(batch); // Act await sut.FlushPendingEvents <FakeUser>(user.Id); // Assert string filter = PendingEvent.GetFilter(typeof(FakeUser), user.Id); var query = new TableQuery { FilterString = filter }; TableQuerySegment actual = await s_eventTable.ExecuteQuerySegmentedAsync(query, default); actual.Results.Should().BeEmpty(); }