public async Task When_an_exception_is_thrown_during_a_read_model_update_then_it_is_logged_on_its_bus() { var projector = new Projector <Order.ItemAdded>(() => new ReadModelDbContext()) { OnUpdate = (work, e) => { throw new Exception("oops!"); } }; var itemAdded = new Order.ItemAdded { AggregateId = Any.Guid(), SequenceNumber = 1, ProductName = Any.AlphanumericString(10, 20), Price = Any.Decimal(0.01m), Quantity = 100 }; var errors = new List <Domain.EventHandlingError>(); using (var catchup = CreateReadModelCatchup(projector)) using (var db = new EventStoreDbContext()) { db.Events.Add(itemAdded.ToStorableEvent()); db.SaveChanges(); catchup.EventBus.Errors.Subscribe(errors.Add); await catchup.Run(); } var error = errors.Single(e => e.AggregateId == itemAdded.AggregateId); error.SequenceNumber.Should().Be(itemAdded.SequenceNumber); error.Event .ShouldHave() .Properties(p => p.SequenceNumber) .EqualTo(itemAdded); }
public void When_Metadata_Actor_is_not_set_then_Event_Actor_will_be_null() { var sourceEvent = new Order.ItemAdded(); var storableEvent = sourceEvent.ToStorableEvent(); storableEvent.Actor.Should().BeNull(); }
public async Task When_classes_not_implementing_IEvent_are_used_to_query_the_event_store_then_only_the_corresponding_events_are_queried() { var eventsQueried = 0; var expectedEventsQueried = 0; Events.Write(20, _ => { Event e = null; switch (Any.Int(1, 3)) { case 1: e = (Event)Events.Any(); break; case 2: e = new Order.ItemAdded(); break; case 3: e = new Order.ItemRemoved(); break; } if (e is Order.ItemAdded || e is Order.ItemRemoved) { expectedEventsQueried++; } e.AggregateId = Guid.NewGuid(); return(e); }); var projector1 = Projector.CreateFor <ItemAdded>(e => { eventsQueried++; }); var projector2 = Projector.CreateFor <ItemRemoved>(e => { eventsQueried++; }); using (var catchup = CreateReadModelCatchup(projector1, projector2)) { await catchup.Run(); } eventsQueried.Should().Be(expectedEventsQueried); }
public void Event_Actor_is_populated_from_Event_Metadata() { var actor = Any.Email(); var sourceEvent = new Order.ItemAdded { Metadata = { Actor = actor } }; var storableEvent = sourceEvent.ToStorableEvent(); storableEvent.Actor.Should().Be(actor); }
public async Task A_dynamic_projector_can_specify_which_events_to_query() { var eventsQueried = 0; var expectedEventsQueried = 0; Events.Write(20, _ => { Event e = null; switch (Any.Int(1, 3)) { case 1: e = (Event)Events.Any(); break; case 2: e = new Order.ItemAdded(); break; case 3: e = new Order.ItemRemoved(); break; } if (e is Order.ItemAdded || e is Order.ItemRemoved) { expectedEventsQueried++; } e.AggregateId = Guid.NewGuid(); return(e); }); using (var catchup = CreateReadModelCatchup(Projector.CreateDynamic(e => { eventsQueried++; }, "Order.ItemAdded", "Order.ItemRemoved"))) { await catchup.Run(); } eventsQueried.Should().Be(expectedEventsQueried); }
private static void UpdateReservedInventory(DbContext db, Order.ItemAdded e) { var inventoryRecord = db.Set <ProductInventory>() .SingleOrDefault(r => r.ProductName == e.ProductName) .IfNotNull() .Then(r => r) .Else(() => { var r = new ProductInventory { ProductName = e.ProductName }; db.Set <ProductInventory>().Add(r); return(r); }); inventoryRecord.QuantityReserved += e.Quantity; db.SaveChanges(); }
public void UpdateProjection(Order.ItemAdded @event) { }