Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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())
                                                           );
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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());
        }
Exemple #9
0
        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());
        }
Exemple #10
0
        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());
        }
Exemple #11
0
        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());
        }
Exemple #12
0
        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)
                                                    );
        }
Exemple #13
0
        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)
                                                    );
        }
Exemple #14
0
        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);
        }
Exemple #15
0
        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);
        }
Exemple #16
0
        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());
        }
Exemple #17
0
        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));
        }
Exemple #18
0
        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);
        }
Exemple #19
0
        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);
        }
Exemple #20
0
        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();
 }