public void ShouldUpdateProductProjection() { var rootId = Guid.NewGuid(); var queueService = new MemoryQueueService(); var appendOnly = new MemoryAppendOnlyStore(queueService); var eventStore = new EventStore(appendOnly); var view = new ProductView(); queueService.Subscribe <ProductCreated>(view); var factory = new AggregateFactory(eventStore); var rootToSave = factory.Create <ProductCatalogAggregate>(rootId); eventStore.AppendToStream <ProductCatalogAggregate>(rootToSave.Id, 1, rootToSave.Changes); var stream = eventStore.LoadEventStream(rootId); var root = new ProductCatalogAggregate(stream); root.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook", "Dell Inspiron 15000")); eventStore.AppendToStream <ProductCatalogAggregate>(root.Id, root.Version, root.Changes); Assert.True(1 == view.Products.Count); Assert.Equal("Notebook", view.Products[0].Name); }
public void AppendOnlyShouldPublish() { var rootId = Guid.NewGuid(); var productId = Guid.NewGuid(); var resolver = new MemoryResolver(); var eventBus = new MemoryEventBus(resolver); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly, eventBus); var productView = new ProductView(); resolver.Register <ProductCreated>(productView); var events = new List <IEvent> { new ProductCreated(productId, "test", "") }; var domainEvents = new List <IDomainEvent> { new ProductCreated(productId, "test", "") }; eventStore.AppendToStream <Guid>(rootId, 0, events, domainEvents.ToArray()); Assert.True(productView.Products.Count == 1); Assert.True(productView.Products.ElementAt(0).Id == productId); }
public void ShouldUpdateProductProjection() { var rootId = Guid.NewGuid(); var resolver = new MemoryResolver(); var eventBus = new MemoryEventBus(resolver); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly, eventBus); var view = new ProductView(); resolver.Register <ProductCreated>(view); var factory = new AggregateFactory(eventStore); var rootToSave = factory.Create <ProductCatalogAggregate>(rootId); eventStore.AppendToStream <ProductCatalogAggregate>(rootToSave.Id, 1, rootToSave.Changes, rootToSave.DomainEvents.ToArray()); var stream = eventStore.LoadEventStream(rootId); var root = new ProductCatalogAggregate(stream); root.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook", "Dell Inspiron 15000")); eventStore.AppendToStream <ProductCatalogAggregate>(root.Id, root.Version, root.Changes, root.DomainEvents.ToArray()); Assert.True(1 == view.Products.Count); Assert.Equal("Notebook", view.Products[0].Name); }
public void ShouldThrowExceptionConflictEvents() { var rootId = Guid.NewGuid(); var eventBus = new MemoryEventBus(new MemoryResolver()); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly, eventBus); var snapShotRepo = new SnapshotRepository(); var factory = new AggregateFactory(eventStore, snapShotRepo); var productAggregate = factory.Create <ProductCatalogAggregate>(rootId); productAggregate.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook Acer Aspire 3", "Notebook Acer Aspire 3 A315-53-348W Intel Core i3-6006U RAM de 4GB HD de 1TB Tela de 15.6” HD Windows 10")); eventStore.AppendToStream <ProductCatalogAggregate>(productAggregate.Id, productAggregate.Version, productAggregate.Changes, productAggregate.DomainEvents.ToArray()); var user1 = factory.Load <ProductCatalogAggregate>(rootId); var user2 = factory.Load <ProductCatalogAggregate>(rootId); user1.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook Asus Vivobook", "Notebook Asus Vivobook X441B-CBA6A de 14 Con AMD A6-9225/4GB Ram/500GB HD/W10")); eventStore.AppendToStream <ProductCatalogAggregate>(user1.Id, user1.Version, user1.Changes, user1.DomainEvents.ToArray()); user2.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook 2 em 1 Dell", "Notebook 2 em 1 Dell Inspiron i14-5481-M11F 8ª Geração Intel Core i3 4GB 128GB SSD 14' Touch Windows 10 Office 365 McAfe")); Assert.Throws <EventStoreConcurrencyException>(() => eventStore.AppendToStream <ProductCatalogAggregate>(user2.Id, user2.Version, user2.Changes, user2.DomainEvents.ToArray()) ); }
public void ShouldCreateMultiplesSnapshots() { var rootId = Guid.NewGuid(); var eventBus = new MemoryEventBus(); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly); var snapShotRepo = new SnapshotRepository(); var factory = new AggregateFactory(eventStore, snapShotRepo); var productAggregate = factory.Create <ProductCatalogAggregate>(rootId); productAggregate.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook Acer Aspire 3", "Notebook Acer Aspire 3 A315-53-348W Intel Core i3-6006U RAM de 4GB HD de 1TB Tela de 15.6” HD Windows 10")); eventStore.AppendToStream <ProductCatalogAggregate>(productAggregate.Id, productAggregate.Version, productAggregate.Changes); var stream = eventStore.LoadEventStream(rootId); snapShotRepo.SaveSnapshot(rootId, productAggregate, stream.Version); productAggregate = factory.Load <ProductCatalogAggregate>(rootId); productAggregate.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook Asus Vivobook", "Notebook Asus Vivobook X441B-CBA6A de 14 Con AMD A6-9225/4GB Ram/500GB HD/W10")); eventStore.AppendToStream <ProductCatalogAggregate>(productAggregate.Id, productAggregate.Version, productAggregate.Changes); stream = eventStore.LoadEventStream(rootId); snapShotRepo.SaveSnapshot(rootId, productAggregate, stream.Version); productAggregate = factory.Load <ProductCatalogAggregate>(rootId); productAggregate.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook 2 em 1 Dell", "Notebook 2 em 1 Dell Inspiron i14-5481-M11F 8ª Geração Intel Core i3 4GB 128GB SSD 14' Touch Windows 10 Office 365 McAfe")); eventStore.AppendToStream <ProductCatalogAggregate>(productAggregate.Id, productAggregate.Version, productAggregate.Changes); stream = eventStore.LoadEventStream(rootId); snapShotRepo.SaveSnapshot(rootId, productAggregate, stream.Version); productAggregate = factory.Load <ProductCatalogAggregate>(rootId); productAggregate.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook Gamer Dell", "Notebook Gamer Dell G3-3590-M60P 9ª Geração Intel Core i7 8GB 512GB SSD Placa Vídeo NVIDIA 1660Ti 15.6' Windows 10")); eventStore.AppendToStream <ProductCatalogAggregate>(productAggregate.Id, productAggregate.Version, productAggregate.Changes); stream = eventStore.LoadEventStream(rootId); snapShotRepo.SaveSnapshot(rootId, productAggregate, stream.Version); productAggregate = factory.Load <ProductCatalogAggregate>(rootId); productAggregate.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook Lenovo 2 em 1 ideapad C340", "Notebook Lenovo 2 em 1 ideapad C340 i7-8565U 8GB 256GB SSD Win10 14' FHD IPS - 81RL0001BR")); eventStore.AppendToStream <ProductCatalogAggregate>(productAggregate.Id, productAggregate.Version, productAggregate.Changes); stream = eventStore.LoadEventStream(rootId); snapShotRepo.SaveSnapshot(rootId, productAggregate, stream.Version); var aggregateReloadedFromSnapshot = factory.Load <ProductCatalogAggregate>(rootId); ProductCatalogAggregate root; long snapshotVersion = 0; var snap = snapShotRepo.TryGetSnapshotById(rootId, out root, out snapshotVersion); stream = eventStore.LoadEventStreamAfterVersion(rootId, snapshotVersion); Assert.True(snap); Assert.True(root != null); Assert.True(snapshotVersion == 6); Assert.True(stream.Events.Count == 0); Assert.True(aggregateReloadedFromSnapshot.Changes.Count == 0); Assert.True(aggregateReloadedFromSnapshot.Id == rootId); Assert.True(aggregateReloadedFromSnapshot.CountProducts() == 5); }
public void ShouldCreateAggregateWithVersionCorrectly() { var queueService = new MemoryQueueService(); var appendOnly = new MemoryAppendOnlyStore(queueService); var eventStore = new EventStore(appendOnly); var rootId = Guid.NewGuid(); var factory = new AggregateFactory(eventStore); var root = factory.Create <ProductCatalogAggregate>(rootId); Assert.True(1 == root.Version); }
public void ShouldCreateAggregateWithVersionCorrectly() { var eventBus = new MemoryEventBus(new MemoryResolver()); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly, eventBus); var rootId = Guid.NewGuid(); var factory = new AggregateFactory(eventStore); var root = factory.Create <ProductCatalogAggregate>(rootId); Assert.True(1 == root.Version); }
public void ShouldAllEventsRegisteredAggregate() { var queueService = new MemoryQueueService(); var appendOnly = new MemoryAppendOnlyStore(queueService); var eventStore = new EventStore(appendOnly); var factory = new AggregateFactory(eventStore); var root = factory.Create <ProductCatalogAggregate>(Guid.NewGuid()); Assert.True(1 == root.Changes.Count); Assert.Equal(typeof(AggregateCreated <Guid>), root.Changes.ElementAt(0).GetType()); }
public void ShouldCreateNewAggregate() { var eventBus = new MemoryEventBus(new MemoryResolver()); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly, eventBus); var rootId = Guid.NewGuid(); var factory = new AggregateFactory(eventStore); var root = factory.Create <ProductCatalogAggregate>(rootId); Assert.Equal(rootId, root.Id); Assert.True(1 == root.Changes.Count); Assert.Equal(typeof(AggregateCreated <Guid>), root.Changes.ElementAt(0).GetType()); }
public void ShouldSaveStream() { var rootId = Guid.NewGuid(); var queueService = new MemoryQueueService(); var appendOnly = new MemoryAppendOnlyStore(queueService); var eventStore = new EventStore(appendOnly); var factory = new AggregateFactory(eventStore); var root = factory.Create <ProductCatalogAggregate>(rootId); eventStore.AppendToStream <ProductCatalogAggregate>(root.Id, root.Version, root.Changes); var stream = eventStore.LoadEventStream(rootId); Assert.Equal(1, stream.Version); Assert.Equal(typeof(AggregateCreated <Guid>), stream.Events.ElementAt(0).GetType()); }
public void ShouldSaveStream() { var rootId = Guid.NewGuid(); var eventBus = new MemoryEventBus(new MemoryResolver()); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly, eventBus); var factory = new AggregateFactory(eventStore); var root = factory.Create <ProductCatalogAggregate>(rootId); eventStore.AppendToStream <ProductCatalogAggregate>(root.Id, root.Version, root.Changes, root.DomainEvents.ToArray()); var stream = eventStore.LoadEventStream(rootId); Assert.Equal(1, stream.Version); Assert.Equal(typeof(AggregateCreated <Guid>), stream.Events.ElementAt(0).GetType()); }
public void ShouldNotAllowCreateAggregatesWithSameId() { var eventBus = new MemoryEventBus(new MemoryResolver()); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly, eventBus); var rootId = Guid.NewGuid(); var factory = new AggregateFactory(eventStore); var root = factory.Create <ProductCatalogAggregate>(rootId); eventStore.AppendToStream <ProductCatalogAggregate>(root.Id, root.Version, root.Changes, root.DomainEvents.ToArray()); Assert.Throws <DuplicatedRootException>(() => factory.Create <ProductCatalogAggregate>(rootId) ); }
public void ShouldNotAllowCreateAggregatesWithSameId() { var queueService = new MemoryQueueService(); var appendOnly = new MemoryAppendOnlyStore(queueService); var eventStore = new EventStore(appendOnly); var rootId = Guid.NewGuid(); var factory = new AggregateFactory(eventStore); var root = factory.Create <ProductCatalogAggregate>(rootId); eventStore.AppendToStream <ProductCatalogAggregate>(root.Id, root.Version, root.Changes); Assert.Throws <DuplicatedRootException>(() => factory.Create <ProductCatalogAggregate>(rootId) ); }
public void ShouldAggregateLoadStream() { var rootId = Guid.NewGuid(); var eventBus = new MemoryEventBus(new MemoryResolver()); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly, eventBus); var factory = new AggregateFactory(eventStore); var rootToSave = factory.Create <ProductCatalogAggregate>(rootId); eventStore.AppendToStream <ProductCatalogAggregate>(rootToSave.Id, 1, rootToSave.Changes, rootToSave.DomainEvents.ToArray()); var root = factory.Load <ProductCatalogAggregate>(rootId); Assert.True(0 == root.Changes.Count); Assert.Equal(rootId, root.Id); }
public void ShouldAggregateLoadStream() { var rootId = Guid.NewGuid(); var queueService = new MemoryQueueService(); var appendOnly = new MemoryAppendOnlyStore(queueService); var eventStore = new EventStore(appendOnly); var factory = new AggregateFactory(eventStore); var rootToSave = factory.Create <ProductCatalogAggregate>(rootId); eventStore.AppendToStream <ProductCatalogAggregate>(rootToSave.Id, 1, rootToSave.Changes); var root = factory.Load <ProductCatalogAggregate>(rootId); Assert.True(0 == root.Changes.Count); Assert.Equal(rootId, root.Id); }
public void AppendOnlyShouldSave() { var rootId = Guid.NewGuid(); var eventBus = new MemoryEventBus(new MemoryResolver()); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly, eventBus); appendOnly.Append(rootId, "NyAggregateType", 1, new List <IEvent> { new ProductCreated(Guid.NewGuid(), "test", "") }); var stream = eventStore.LoadEventStream(rootId); Assert.True(eventStore.Any(rootId)); Assert.True(stream.Version == 1); Assert.True(stream.Events.Any()); }
public void ShouldAddProductToProductCatalog() { var rootId = Guid.NewGuid(); var queueService = new MemoryQueueService(); var appendOnly = new MemoryAppendOnlyStore(queueService); var eventStore = new EventStore(appendOnly); var factory = new AggregateFactory(eventStore); var rootToSave = factory.Create <ProductCatalogAggregate>(rootId); eventStore.AppendToStream <ProductCatalogAggregate>(rootToSave.Id, rootToSave.Version, rootToSave.Changes); var root = factory.Load <ProductCatalogAggregate>(rootId); root.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook", "Dell Inspiron 15000")); Assert.True(root.Changes.Count == 1); Assert.True(root.Changes.ElementAt(0).GetType() == typeof(ProductCreated)); }
public void ShouldIncreaseVersionCorrectly() { var eventBus = new MemoryEventBus(new MemoryResolver()); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly, eventBus); var rootId = Guid.NewGuid(); var factory = new AggregateFactory(eventStore); var root = factory.Create <ProductCatalogAggregate>(rootId); eventStore.AppendToStream <ProductCatalogAggregate>(root.Id, root.Version, root.Changes, root.DomainEvents.ToArray()); root = factory.Load <ProductCatalogAggregate>(rootId); root.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook", "Dell Inspiron 15000")); root.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook Asus Vivobook", "Notebook Asus Vivobook X441B-CBA6A de 14 Con AMD A6-9225/4GB Ram/500GB HD/W10")); root.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook 2 em 1 Dell", "Notebook 2 em 1 Dell Inspiron i14-5481-M11F 8ª Geração Intel Core i3 4GB 128GB SSD 14' Touch Windows 10 Office 365 McAfe")); eventStore.AppendToStream <ProductCatalogAggregate>(root.Id, root.Version, root.Changes, root.DomainEvents.ToArray()); root = factory.Load <ProductCatalogAggregate>(rootId); Assert.True(4 == root.Version); }
public void ShouldMergeEvents() { var eventBus = new MemoryEventBus(new MemoryResolver()); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly, eventBus); var snapShotRepo = new SnapshotRepository(); var factory = new AggregateFactory(eventStore, snapShotRepo); var rootId = Guid.NewGuid(); var handler = new ProductServiceCommandHandler(eventStore, factory); handler.Execute(new CreateProductCatalog(rootId)); var prodId = Guid.NewGuid(); handler.Execute(new CreateProductCommand(rootId, prodId, "Notebook Lenovo 2 em 1 ideapad C340", "Notebook Lenovo 2 em 1 ideapad C340 i7-8565U 8GB 256GB SSD Win10 14' FHD IPS - 81RL0001BR")); var threads = new List <Task>(); threads.Add(Task.Run(() => { var handlerThread1 = new ProductServiceCommandHandler(eventStore, factory); handlerThread1.Execute(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook 2 em 1 Dell", "Notebook 2 em 1 Dell Inspiron i14-5481-M11F 8ª Geração Intel Core i3 4GB 128GB SSD 14' Touch Windows 10 Office 365 McAfe")); })); threads.Add(Task.Run(() => { var handlerThread2 = new ProductServiceCommandHandler(eventStore, factory); handlerThread2.Execute(new ChangeProductNameCommand(rootId, prodId, "Novo nome")); })); Task.WaitAll(threads.ToArray()); var stream = eventStore.LoadEventStream(rootId); var productChanged = (ProductNameChanged)stream.Events.Where(x => x.GetType() == typeof(ProductNameChanged)).FirstOrDefault(); Assert.True(4 == stream.Version); Assert.True("Novo nome" == productChanged.Name); }
public void ShouldIncrementVersionCorrectly() { var rootId = Guid.NewGuid(); var queueService = new MemoryQueueService(); var appendOnly = new MemoryAppendOnlyStore(queueService); var eventStore = new EventStore(appendOnly); var factory = new AggregateFactory(eventStore); var rootToSave = factory.Create <ProductCatalogAggregate>(rootId); eventStore.AppendToStream <ProductCatalogAggregate>(rootToSave.Id, rootToSave.Version, rootToSave.Changes); var stream = eventStore.LoadEventStream(rootId); var root = new ProductCatalogAggregate(stream); root.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook", "Dell Inspiron 15000")); eventStore.AppendToStream <ProductCatalogAggregate>(root.Id, root.Version, root.Changes); stream = eventStore.LoadEventStream(rootId); root = new ProductCatalogAggregate(stream); Assert.Equal(2, stream.Version); Assert.Equal(1, root.CountProducts()); }
public void Setup() { _store = new MemoryAppendOnlyStore(); }