Beispiel #1
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);
        }
Beispiel #2
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);
        }
Beispiel #3
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())
                                                           );
        }
Beispiel #4
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);
        }
Beispiel #5
0
        public async Task Handler_BuildUnTracked_ReturnToTracked()
        {
            build.MarkAsUnTracked(DateTime.Now);
            await eventStore.AppendToStream <Build>(build.Id, build.GetUncommitedChanges());

            await markAsTrackedBuildHandler.Handle(fakeCommand, CancellationToken.None);

            var editedBuild = await RestoreBuild();

            Assert.Equal(fakeCommand.DistributionId, editedBuild.DistributionId);
            Assert.Equal(ArtifactState.ReturnToTracked, editedBuild.ArtifactState);
            Assert.False(editedBuild.IsUnTracked);
        }
Beispiel #6
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);
        }
        public void REGISTER_PROJECTIONS()
        {
            var appendStore = new FileAppendOnlyStore(@"C:\Users\wydev\Documents\GitHub\Clones\lokad-iddd-sample\DomainTests\Store\");
            var eventStore  = new EventStore(appendStore);
            var publisher   = new DomainEventPublisher(eventStore, 0, 500);
            var store       = new FileDocumentReaderWriter <CustomerId, CustomerTransactions>(@"C:\Users\wydev\Documents\GitHub\Clones\lokad-iddd-sample\DomainTests\Store\",
                                                                                              new ViewStrategy(@"C:\Users\wydev\Documents\GitHub\Clones\lokad-iddd-sample\DomainTests\Views\"));
            IDocumentWriter <CustomerId, CustomerTransactions> writer = store;

            var projection = new CustomerTransactionsProjection(writer);

            publisher.RegisterProjection(projection);
            var id     = new CustomerId(2);
            var @event = new CustomerCreated
            {
                Id       = id,
                Name     = "Microsoft",
                Currency = Currency.Eur
            };

            IList <IEvent> Changes = new List <IEvent>();

            Changes.Add(@event);

            eventStore.AppendToStream(id, 0, Changes);

            publisher.ProcessNewEvents();
        }
Beispiel #8
0
        public async Task when_document_ttl_is_configured_then_documents_have_that_ttl_set()
        {
            const string DatabaseName = "AppendingTestsCosmosOnly";

            var client         = DocumentClientFactory.Create(DatabaseName);
            var collectionName = "TtlTests_" + Guid.NewGuid();
            var storageEngine  = await StorageEngineFactory.Create(DatabaseName,
                                                                   o =>
            {
                o.CollectionName            = collectionName;
                o.DefaultTimeToLiveSeconds  = -1;
                o.DocumentTimeToLiveSeconds = 10;
            });

            await storageEngine.Initialise();

            var streamId = Guid.NewGuid().ToString();
            var store    = new EventStore(storageEngine);
            await store.AppendToStream(streamId, 0, new EventData(Guid.NewGuid(), new OrderCreated(streamId)));

            var commitsLink = UriFactory.CreateDocumentCollectionUri(DatabaseName, collectionName);
            var eventsQuery = client.CreateDocumentQuery <DocumentDbStorageEvent>(commitsLink)
                              .Where(x => x.StreamId == streamId)
                              .OrderBy(x => x.EventNumber)
                              .AsDocumentQuery();

            var response = await eventsQuery.ExecuteNextAsync <DocumentDbStorageEvent>();

            Assert.That(response.First().TimeToLiveSeconds, Is.EqualTo(10));
        }
Beispiel #9
0
        private static void Main(string[] args)
        {
            ObjectContainer.SetContainer(new AutofacContainerObject());

            var applictionInitializer = new EventHandleProvider();

            applictionInitializer.Initialize(Assembly.GetExecutingAssembly());

            var commandInitializer = new CommandHandleProvider();

            commandInitializer.Initialize(Assembly.GetExecutingAssembly());

            ObjectContainer.RegisterInstance(applictionInitializer);
            ObjectContainer.RegisterInstance(commandInitializer);

            var dbConnection = new MySqlConnection(_mysqlConnection);

            var persistence = new SnapshotPersistence(dbConnection);

            var binarySerializer = new DefaultBinarySerializer();

            var snapshotRepository = new SnapshotRepository(persistence, new SnapshotFactory(binarySerializer));

            var eventPersistence = new EventStorePersistence(dbConnection);

            var eventFactory = new EventStreamFactory(binarySerializer);

            var eventStore = new EventStore(eventPersistence, eventFactory);

            IRepository repository = new EventSouringRepository(eventStore, snapshotRepository);

            var comamndHandler = ObjectContainer.Resolve<CommandHandleProvider>();

            var changePasswordCommand = new ChangePasswordCommand("90ca0d59-65e6-403b-82c5-8df967cc8e22", "2222222", "11111");

            var commandContext = new CommandContext(repository);

            var commandHanldeAction = comamndHandler.GetInternalCommandHandle(typeof(ChangePasswordCommand));
            commandHanldeAction(commandContext, changePasswordCommand);

            var aggregateRoots = commandContext.AggregateRoots;

            IList<IEvent> unCommitEvents = null;

            foreach (var item in aggregateRoots)
            {
                unCommitEvents = item.Value.Commit();
            }

            var aggregateRoot = aggregateRoots.FirstOrDefault().Value;

            eventStore.AppendToStream(aggregateRoot.AggregateRootId, new EventStream(aggregateRoot.Version, unCommitEvents));

            snapshotRepository.Create(aggregateRoot);

            Console.WriteLine("改方法执行完毕...");
        }
        public async Task Handler_RemoveTag_BuildTagRemoved()
        {
            build.AddTag("new_Tag");
            build.AddTag("new_Tag_2");
            await eventStore.AppendToStream <Build>(build.Id, build.GetUncommitedChanges());

            var command = new UpdateBuildTags()
            {
                BuildId = build.Id,
                Tags    = Array.Empty <string>()
            };

            await updateBuildTagsHandler.Handle(command, CancellationToken.None);

            var editedBuild = await RestoreBuild();

            Assert.Equal(command.Tags, editedBuild.Tags);
            Assert.Equal(ArtifactState.Updated, editedBuild.ArtifactState);
        }
        /// <summary>
        /// Конструктор.
        /// </summary>
        public UpdateBuildTagsCommandHandlerTests()
        {
            eventStore = new EventStore(new MemoryChangesetRepository(), new Mock <IMediator>().Object);

            updateBuildTagsHandler = new UpdateBuildTagsHandler(
                new AggregateRepository(eventStore, new Mock <ILogger <AggregateRepository> >().Object),
                new Mock <ILogger <UpdateBuildTagsHandler> >().Object,
                new CollectionsComparer()
                );
            build = CreateBuild();
            eventStore.AppendToStream <Build>(build.Id, build.GetUncommitedChanges()).GetAwaiter().GetResult();
        }
Beispiel #12
0
        public IActionResult Post([FromBody] PaymentIntent intent, string paymentReference)
        {
            if (!ModelState.IsValid)
            {
                return(new ValidationErrorResult(ModelState));
            }


            eventStore.AppendToStream(paymentReference, 0, new EventData(Guid.NewGuid(), new PaymentIntentAdded()));

            return(Ok());
        }
Beispiel #13
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);
        }
Beispiel #14
0
        public async Task when_a_read_operation_is_successful_the_log_callback_is_called()
        {
            var logCount = 0;
            var sut      = new EventStore(await CreateStorageEngine(t => logCount++));
            var streamId = Guid.NewGuid().ToString();

            await sut.AppendToStream(streamId, 0, new EventData(Guid.NewGuid(), new OrderCreated("TEST-ORDER")));

            await sut.ReadStreamForwards(streamId);

            Assert.That(logCount, Is.EqualTo(2));
        }
Beispiel #15
0
        public async Task when_a_write_operation_is_successful_the_log_callback_is_called()
        {
            ResponseInformation response = null;
            var sut      = new EventStore(await CreateStorageEngine(t => response = t));
            var streamId = Guid.NewGuid().ToString();

            await sut.AppendToStream(streamId, 0, new EventData(Guid.NewGuid(), new OrderCreated("TEST-ORDER")));

            Assert.NotNull(response);
            TestContext.Out.WriteLine($"Charge: {response.RequestCharge}");
            TestContext.Out.WriteLine($"Quota Usage: {response.CurrentResourceQuotaUsage}");
            TestContext.Out.WriteLine($"Max Resource Quote: {response.MaxResourceQuota}");
            TestContext.Out.WriteLine($"Response headers: {response.ResponseHeaders}");
        }
        public async Task Handler_CanChange_CreatedEventLifeCycleStateChanged()
        {
            SetupInit(true, true);
            await eventStore.AppendToStream <Build>(build.Id, build.GetUncommitedChanges());

            await changeBuildStateHandler.Handle(FakeCommand, CancellationToken.None);

            var editedBuild = await RestoreBuild();

            Assert.Equal(FakeCommand.NewState, editedBuild.LifeCycleState);
            Assert.Equal(ArtifactState.Updated, editedBuild.ArtifactState);
            Assert.Equal(FakeCommand.BuildId, editedBuild.Id);
            VerifyChangeSuffixMethod();
        }
        public async Task Handler_UpdateBuild_BuildUpdated()
        {
            SetupInit(LifeCycleState.Release);
            fakeCommand.Location      = Location + "_R";
            fakeCommand.Number        = new VersionNumber("1.0.0.1");
            fakeCommand.ReleaseNumber = new VersionNumber("1.0.0");
            fakeCommand.Suffixes      = new List <string>()
            {
                "R"
            };
            await eventStore.AppendToStream <Build>(build.Id, build.GetUncommitedChanges());

            await updateBuildHandler.Handle(fakeCommand, CancellationToken.None);

            var updatedBuild = await RestoreBuild();

            Assert.Equal(fakeCommand.Location, updatedBuild.Location);
            Assert.Equal(fakeCommand.Suffixes, updatedBuild.Suffixes);
            Assert.Equal(fakeCommand.Number, updatedBuild.Number);
            Assert.Equal(fakeCommand.ReleaseNumber, updatedBuild.ReleaseNumber);
            Assert.Equal(fakeCommand.BuildId, updatedBuild.Id);
            Assert.Equal(LifeCycleState.Release, updatedBuild.LifeCycleState);
        }
Beispiel #18
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());
        }
        /// <summary>
        /// Конструктор.
        /// </summary>
        public ChangeBuildStateHandlerTests()
        {
            eventStore = new EventStore(new MemoryChangesetRepository(), new Mock <IMediator>().Object);

            changeBuildStateHandler = new ChangeBuildStateHandler(
                new AggregateRepository(eventStore, new Mock <ILogger <AggregateRepository> >().Object),
                new Mock <ILogger <ChangeBuildStateHandler> >().Object,
                buildStateChangeCheckerMock.Object,
                buildLifeCycleStateMapperMock.Object,
                buildSyncServiceMock.Object
                );

            build = CreateBuild();

            eventStore.AppendToStream <Build>(build.Id, build.GetUncommitedChanges()).GetAwaiter().GetResult();
        }
Beispiel #20
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)
                                                    );
        }
Beispiel #21
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());
        }
Beispiel #22
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());
        }
Beispiel #23
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)
                                                    );
        }
Beispiel #24
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);
        }
Beispiel #25
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);
        }
Beispiel #26
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));
        }
Beispiel #27
0
        public async Task when_reading_a_stream_that_has_deleted_events_the_stream_can_still_be_read()
        {
            const string databaseName   = "ReadingPartialStreamTests";
            const string collectionName = "Commits";

            var client        = DocumentClientFactory.Create(databaseName);
            var storageEngine = await StorageEngineFactory.Create(databaseName, o => o.CollectionName = collectionName);

            var eventStore = new EventStore(storageEngine);
            var streamId   = Guid.NewGuid().ToString();
            await eventStore.AppendToStream(streamId, 0, new EventData(Guid.NewGuid(), new OrderCreated(streamId)), new EventData(Guid.NewGuid(), new OrderDispatched(streamId)));

            await SimulateTimeToLiveExpiration(databaseName, collectionName, client, streamId);

            var stream = await eventStore.ReadStreamForwards(streamId);

            Assert.That(stream.Count, Is.EqualTo(1));
            Assert.That(stream.First().EventBody, Is.InstanceOf <OrderDispatched>());
            Assert.That(stream.First().EventNumber, Is.EqualTo(2));
        }