Exemplo n.º 1
0
        public async Task TestLoadingSavedEvents()
        {
            var stream      = "FooAggregate";
            var aggregateId = "id0123";

            // TODO - Keep this overload for use with no metadata
            await _eventStore.SaveAsync(stream, aggregateId, 0, new IDomainEvent[]
            {
                new FooEvent(DateTime.MaxValue, aggregateId, 24),
                new BarEvent(DateTime.MinValue, aggregateId, 38),
            });

            // This looks cumbersome ?!
            // We can use our DomainEvent base class instead of IDomainEvent - does this help? - try it
            var evts = new List <EventData <IDomainEvent> >
            {
                EventData.From(
                    new Dictionary <string, object>
                {
                    { "user_ip", "127.0.0.1" }
                },
                    new FooEvent(DateTime.MaxValue, aggregateId, 24) as IDomainEvent
                    ),
                EventData.From(
                    new Dictionary <string, object>
                {
                    { "user_ip", "127.0.0.2" }
                },
                    new BarEvent(DateTime.MinValue, aggregateId, 38) as IDomainEvent
                    )
            };

            var events = (await _eventStore.LoadAsync(stream, aggregateId)).ToArray();

            Assert.AreEqual(2, events.Length);

            var fooEvent = events[0].Event as FooEvent;

            Assert.AreEqual(1, events[0].Id);

            Assert.IsNotNull(fooEvent);

            Assert.AreEqual(DateTime.MaxValue, fooEvent.CreatedAt);
            Assert.AreEqual(aggregateId, fooEvent.AggregateId);
            Assert.AreEqual(24, fooEvent.FooField);

            var barEvent = events[1].Event as BarEvent;

            Assert.AreEqual(2, events[1].Id);

            Assert.IsNotNull(barEvent);

            Assert.AreEqual(DateTime.MinValue, barEvent.CreatedAt);
            Assert.AreEqual(aggregateId, barEvent.AggregateId);
            Assert.AreEqual(38, barEvent.BarField);
        }