Exemplo n.º 1
0
        public async Task DispatchAsync_should_publish_events()
        {
            var topicFactory = new TopicClientFactory(_connStr);
            var logger       = NSubstitute.Substitute.For <ILogger <EventProducer <DummyAggregate, Guid> > >();
            var sut          = new EventProducer <DummyAggregate, Guid>(topicFactory, "test", _eventSerializer, logger);

            await CreateTopicAsync(sut.TopicName);

            int expectedMessagesCount = 3;

            var subscriptionClient = new SubscriptionClient(_connStr, sut.TopicName, SubscriptionName);

            subscriptionClient.RegisterMessageHandler(
                async(msg, tkn) =>
            {
                --expectedMessagesCount;
                await subscriptionClient.CompleteAsync(msg.SystemProperties.LockToken);
            },
                (ex) => Task.CompletedTask);

            var aggregate = new DummyAggregate(Guid.NewGuid());

            aggregate.DoSomething("lorem");
            aggregate.DoSomething("ipsum");

            await sut.DispatchAsync(aggregate);

            var timeout = 30 * 1000;
            var timer   = new Stopwatch();

            timer.Start();
            while (true)
            {
                if (expectedMessagesCount < 1 || timer.ElapsedMilliseconds > timeout)
                {
                    break;
                }
                await Task.Delay(200);
            }

            expectedMessagesCount.Should().Be(0);
        }
        public async Task AppendAsync_should_store_events()
        {
            var db = await _fixture.CreateTestDatabaseAsync();

            var sut = new EventsRepository <DummyAggregate, Guid>(db, _eventSerializer);

            var aggregate = new DummyAggregate(Guid.NewGuid());

            aggregate.DoSomething("foo");
            aggregate.DoSomething("bar");

            await sut.AppendAsync(aggregate);

            var container = db.GetContainer("Events");
            var response  = await container.GetItemLinqQueryable <dynamic>()
                            .CountAsync();

            response.StatusCode.Should().Be(HttpStatusCode.OK);
            response.Resource.Should().Be(3);
        }
        public async Task RehydrateAsync_should_store_events()
        {
            var db = await _fixture.CreateTestDatabaseAsync();

            var sut = new EventsRepository <DummyAggregate, Guid>(db, _eventSerializer);

            var aggregate = new DummyAggregate(Guid.NewGuid());

            aggregate.DoSomething("lorem");
            aggregate.DoSomething("ipsum");

            await sut.AppendAsync(aggregate);

            var rehydrated = await sut.RehydrateAsync(aggregate.Id);

            rehydrated.Should().NotBeNull();
            rehydrated.Id.Should().Be(aggregate.Id);
            rehydrated.Events.Should().BeEmpty();
            rehydrated.WhatHappened.Should().HaveCount(3)
            .And.Contain("created")
            .And.Contain("lorem")
            .And.Contain("ipsum");
        }
        public async Task AppendAsync_should_store_events()
        {
            var connStr = new Uri(_fixture.ConnectionString);
            var logger  = NSubstitute.Substitute.For <ILogger <EventStoreConnectionWrapper> >();

            using var conn = new EventStoreConnectionWrapper(connStr, logger);

            var serializer = NSubstitute.Substitute.For <IEventSerializer>();

            var sut = new EventsRepository <DummyAggregate, Guid>(conn, serializer);

            var aggregate = new DummyAggregate(Guid.NewGuid());

            aggregate.DoSomething("foo");
            aggregate.DoSomething("bar");

            await sut.AppendAsync(aggregate);

            var rehydrated = await sut.RehydrateAsync(aggregate.Id);

            rehydrated.Should().NotBeNull();
            rehydrated.Version.Should().Be(3);
        }
        public async Task AppendAsync_should_throw_AggregateException_when_version_mismatch()
        {
            var db = await _fixture.CreateTestDatabaseAsync();

            var sut = new EventsRepository <DummyAggregate, Guid>(db, _eventSerializer);

            var aggregateId = Guid.NewGuid();

            var tasks = Enumerable.Range(1, 3)
                        .Select(i =>
            {
                var aggregate = new DummyAggregate(aggregateId);
                aggregate.DoSomething($"foo|{i}");
                return(sut.AppendAsync(aggregate));
            }).ToArray();

            await Assert.ThrowsAsync <AggregateException>(async() => await Task.WhenAll(tasks));
        }