Exemple #1
0
        public void Saving_event_source_while_there_is_a_newer_event_source_should_throw_concurency_exception()
        {
            var targetStore = new RavenDBEventStore(_documentStore);
            var id          = Guid.NewGuid();

            int sequenceCounter = 0;

            var events = new SourcedEvent[]
            {
                new CustomerCreatedEvent(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow, "Foo",
                                         35),
                new CustomerNameChanged(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow,
                                        "Name" + sequenceCounter)
            };

            var eventSource = MockRepository.GenerateMock <IEventSource>();

            eventSource.Stub(e => e.EventSourceId).Return(id).Repeat.Any();
            eventSource.Stub(e => e.InitialVersion).Return(0).Repeat.Any();
            eventSource.Stub(e => e.Version).Return(events.Length).Repeat.Any();
            eventSource.Stub(e => e.GetUncommittedEvents()).Return(events).Repeat.Any();

            targetStore.Save(eventSource);

            Action act = () => targetStore.Save(eventSource);

            act.ShouldThrow <ConcurrencyException>();
        }
        public void Retrieved_event_should_having_identical_timestamp_as_persisted()
        {
            var id     = Guid.NewGuid();
            var utcNow = DateTime.UtcNow.Date.AddHours(9).AddTicks(-1);

            var events = new SourcedEvent[]
            {
                new CustomerCreatedEvent(Guid.NewGuid(), id, 0, utcNow, "Foo", 35)
            };

            var eventSource = MockRepository.GenerateMock <IEventSource>();

            eventSource.Stub(e => e.EventSourceId).Return(id);
            eventSource.Stub(e => e.InitialVersion).Return(0);
            eventSource.Stub(e => e.Version).Return(events.Length);
            eventSource.Stub(e => e.GetUncommittedEvents()).Return(events);
            _store.Save(eventSource);

            using (var conn = new SQLiteConnection(_connString))
            {
                conn.Open();

                using (var cmd = new SQLiteCommand("SELECT [TimeStamp] FROM [Events]", conn))
                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var timestamp = (long)reader["Timestamp"];
                            timestamp.Should().Be(utcNow.Ticks);
                        }
                    }
            }
        }
Exemple #3
0
        public void Rolling_back_transaction_should_remove_inserted_rows()
        {
            var id     = Guid.NewGuid();
            var utcNow = DateTime.UtcNow.Date.AddHours(9).AddTicks(-1);

            var events = new SourcedEvent[]
            {
                new CustomerCreatedEvent(Guid.NewGuid(), id, 0, utcNow, "Foo", 35)
            };

            var eventSource = MockRepository.GenerateMock <IEventSource>();

            eventSource.Stub(e => e.EventSourceId).Return(id);
            eventSource.Stub(e => e.InitialVersion).Return(0);
            eventSource.Stub(e => e.Version).Return(events.Length);
            eventSource.Stub(e => e.GetUncommittedEvents()).Return(events);

            _store.Save(eventSource);
            _transaction.Rollback();

            using (var conn = new SQLiteConnection(_connString))
            {
                conn.Open();

                using (var cmd = new SQLiteCommand("SELECT [TimeStamp] FROM [Events]", conn))
                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Assert.Fail("No rows should exist");
                        }
                    }
            }
        }
Exemple #4
0
        public void Retrieving_all_events_should_return_the_same_as_added()
        {
            var targetStore = new RavenDBEventStore(_documentStore);
            var id          = Guid.NewGuid();

            int sequenceCounter = 0;

            var events = new SourcedEvent[]
            {
                new CustomerCreatedEvent(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow, "Foo",
                                         35),
                new CustomerNameChanged(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow,
                                        "Name" + sequenceCounter),
                new CustomerNameChanged(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow,
                                        "Name" + sequenceCounter),
                new CustomerNameChanged(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow,
                                        "Name" + sequenceCounter)
            };

            var eventSource = MockRepository.GenerateMock <IEventSource>();

            eventSource.Stub(e => e.EventSourceId).Return(id);
            eventSource.Stub(e => e.InitialVersion).Return(0);
            eventSource.Stub(e => e.Version).Return(events.Length);
            eventSource.Stub(e => e.GetUncommittedEvents()).Return(events);

            targetStore.Save(eventSource);

            var result = targetStore.GetAllEvents(id);

            result.Count().Should().Be(events.Length);
            result.First().EventIdentifier.Should().Be(events.First().EventIdentifier);
            Assert.IsTrue(result.SequenceEqual(events));
        }
        /// <summary>
        /// Get some events after specified event.
        /// </summary>
        /// <param name="eventId">The id of last event not to be included in result set.</param>
        /// <param name="maxCount">Maximum numer of returned events</param>
        /// <returns>A collection events starting right after <paramref name="eventId"/>.</returns>
        public IEnumerable <SourcedEvent> GetEventsAfter(Guid?eventId, int maxCount)
        {
            var result = new List <SourcedEvent>();

            // Create connection and command.
            using (var connection = new SqlConnection(_connectionString))
            {
                var query = eventId.HasValue
                    ? Queries.SelectEventsAfterQuery
                    : Queries.SelectEventsFromBeginningOfTime;

                using (var command = new SqlCommand(string.Format(query, maxCount), connection))
                {
                    if (eventId.HasValue)
                    {
                        command.Parameters.AddWithValue("EventId", eventId);
                    }
                    connection.Open();

                    // Execute query and create reader.
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            SourcedEvent evnt = ReadSourcedEvent(reader);
                            result.Add(evnt);
                        }
                    }
                }
            }

            return(result);
        }
        /// <summary>
        /// Get all events provided by an specified event source.
        /// </summary>
        /// <param name="eventSourceId">The id of the event source that owns the events.</param>
        /// <returns>All the events from the event source.</returns>
        public IEnumerable <ISourcedEvent> GetAllEventsSinceVersion(Guid id, long version)
        {
            var result = new List <ISourcedEvent>();

            // Create connection and command.
            using (var connection = new SqlConnection(_connectionString))
                using (var command = new SqlCommand(Queries.SelectAllEventsQuery, connection))
                {
                    // Add EventSourceId parameter and open connection.
                    command.Parameters.AddWithValue("EventSourceId", id);
                    command.Parameters.AddWithValue("EventSourceVersion", version);
                    connection.Open();

                    // Execute query and create reader.
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            SourcedEvent evnt = ReadSourcedEvent(reader);
                            result.Add(evnt);
                        }
                    }
                }

            return(result);
        }
        [SetUp] // TODO: Testdriven.net debug runner doesn't recognize inhiret attributes. Use native for now.
        public void Setup()
        {
            SetupDependencies();
            var commandService = BuildCommandService();

            PublishedEvents = new SourcedEvent[0];


            try
            {
                var command = WhenExecutingCommand();

                using (var context = new EventContext())
                {
                    commandService.Execute(command);

                    ExecutedCommand = command;
                    PublishedEvents = context.Events;
                }
            }
            catch (Exception exception)
            {
                CaughtException = exception;
            }
            finally
            {
                Finally();
            }
        }
Exemple #8
0
        public void Saving_event_source_should_succeed()
        {
            var targetStore = new RavenDBEventStore(_documentStore);
            var id          = Guid.NewGuid();

            int sequenceCounter = 0;

            var events = new SourcedEvent[]
            {
                new CustomerCreatedEvent(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow, "Foo",
                                         35),
                new CustomerNameChanged(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow,
                                        "Name" + sequenceCounter),
                new CustomerNameChanged(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow,
                                        "Name" + sequenceCounter),
                new CustomerNameChanged(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow,
                                        "Name" + sequenceCounter)
            };

            var eventSource = MockRepository.GenerateMock <IEventSource>();

            eventSource.Stub(e => e.EventSourceId).Return(id);
            eventSource.Stub(e => e.InitialVersion).Return(0);
            eventSource.Stub(e => e.Version).Return(events.Length);
            eventSource.Stub(e => e.GetUncommittedEvents()).Return(events);

            targetStore.Save(eventSource);
        }
Exemple #9
0
        public void Initializing_from_history_should_not_throw_an_exception_when_the_history_was_empty()
        {
            var theAggregate = new MyAggregateRoot();

            IEnumerable <SourcedEvent> history = new SourcedEvent[0];

            theAggregate.InitializeFromHistory(history);
        }
Exemple #10
0
        static void Process(SourcedEvent evnt)
        {
            Thread.Sleep(200);

            Interlocked.Increment(ref _processedEvents);

            Console.WriteLine("Processing event {0} (id {1})", evnt.EventSequence, evnt.EventIdentifier);
            _bus.Publish(evnt);
        }
Exemple #11
0
        private void ExecuteEvent(SourcedEvent e)
        {
            var method = this.GetType()
                         .GetMethods()
                         .Single(m =>
                                 m.Name == "OnEvent" && m.GetParameters().Length == 1 &&
                                 m.GetParameters().First().ParameterType == e.GetType());

            method.Invoke(this, new[] { e });
        }
        public static SourcedEvent CreateSourcedEvent(this EventMessage @from)
        {
            var @event = new SourcedEvent
            {
                Body = @from.Body
            };

            @from.Headers.ForEach(h => @event.Headers.Add(h.Key, h.Value));

            return(@event);
        }
        public void StoreEvent(SourcedEvent @event, EventStreamId aggregateRootId)
        {
            var uncommittedEvent = new EventMessage
            {
                Body = @event.Body
            };

            @event.Headers.ForEach(h => uncommittedEvent.Headers.Add(h.Key, h.Value));

            GetStream(aggregateRootId).Add(uncommittedEvent);
        }
Exemple #14
0
 private TableEventModel MapToAzureModel(SourcedEvent @event)
 {
     return(new TableEventModel {
         RowKey = @event.EventId.ToString(),
         PartitionKey = @event.Metadata.AggregateId.ToString(),
         EventTypeHint = modelSerializer.GetTypeHint(@event),
         EventDate = @event.Metadata.Date,
         EventVersion = (long)@event.Metadata.Version,
         CommandId = @event.Metadata.CommandId,
         EventJsonData = modelSerializer.Serialize(@event)
     });
 }
Exemple #15
0
        public void RestoreEvent(SourcedEvent e)
        {
            if (Metadata.Version != 0)
            {
                if (Metadata.Version != e.Metadata.Version - 1)
                {
                    throw new DungeonEventRestoreException("Version problem.");
                }
            }

            ExecuteEvent(e);
            Metadata.Version = e.Metadata.Version;
        }
        public void Save_SmokeTest()
        {
            var sequenceCounter = 0;
            var id     = Guid.NewGuid();
            var events = new SourcedEvent[] {
                new CustomerCreatedEvent(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow, "Foo", 35),
                new CustomerNameChanged(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow, "Name" + sequenceCounter),
                new CustomerNameChanged(Guid.NewGuid(), id, sequenceCounter++, DateTime.UtcNow, "Name" + sequenceCounter)
            };
            var source = MockRepository.GenerateMock <IEventSource>();

            source.Stub(e => e.EventSourceId).Return(id);
            source.Stub(e => e.InitialVersion).Return(0);
            source.Stub(e => e.Version).Return(events.Length);
            source.Stub(e => e.GetUncommittedEvents()).Return(events);
            _store.Save(source);
        }
        public void Retrieving_all_events_should_return_the_same_as_added()
        {
            var targetStore = new MsSqlServerEventStore(connectionString);
            var aggregateId = Guid.NewGuid();
            var entityId    = Guid.NewGuid();

            int sequenceCounter = 1;
            var events          = new SourcedEvent[]
            {
                new CustomerCreatedEvent(Guid.NewGuid(), aggregateId, sequenceCounter++, DateTime.UtcNow, "Foo",
                                         35),
                new CustomerNameChanged(Guid.NewGuid(), aggregateId, sequenceCounter++, DateTime.UtcNow,
                                        "Name" + sequenceCounter),
                new CustomerNameChanged(Guid.NewGuid(), aggregateId, sequenceCounter++, DateTime.UtcNow,
                                        "Name" + sequenceCounter),
                new CustomerNameChanged(Guid.NewGuid(), aggregateId, sequenceCounter++, DateTime.UtcNow,
                                        "Name" + sequenceCounter),
                new AccountNameChangedEvent(Guid.NewGuid(), aggregateId, entityId, sequenceCounter++, DateTime.UtcNow, "New Account Title" + sequenceCounter)
            };

            var eventSource = MockRepository.GenerateMock <IEventSource>();

            eventSource.Stub(e => e.EventSourceId).Return(aggregateId);
            eventSource.Stub(e => e.InitialVersion).Return(0);
            eventSource.Stub(e => e.Version).Return(events.Length);
            eventSource.Stub(e => e.GetUncommittedEvents()).Return(events);

            targetStore.Save(eventSource);

            var result = targetStore.GetAllEvents(aggregateId);

            result.Count().Should().Be(events.Length);
            result.First().EventIdentifier.Should().Be(events.First().EventIdentifier);

            var foundEntityId = result.ElementAt(4).As <SourcedEntityEvent>().EntityId;

            foundEntityId.Should().Be(entityId);
        }
 public SourcedEventProcessingElement(int sequenceNumber, SourcedEvent @event)
 {
     SequenceNumber = sequenceNumber;
     _event         = @event;
 }
 public SourcedEventProcessingElement(SourcedEvent @event)
 {
     _event = @event;
 }
Exemple #20
0
 static void OutputEvent(SourcedEvent e)
 {
     Trace.TraceInformation(e.Body.ToString());
 }
Exemple #21
0
 private void CatchAllEventHandler(SourcedEvent e)
 {
     CatchAllEventHandlerInvokeCount++;
 }
Exemple #22
0
 public void MyEventHandlerMethod(SourcedEvent e1, SourcedEvent e2)
 {
 }
Exemple #23
0
 public static void MyEventHandlerMethod(SourcedEvent e)
 {
 }
 public void StoreEvent(SourcedEvent @event, string id)
 {
 }
 public static void OnDomainEvent(SourcedEvent e)
 {
 }
 public void StoreEvent(SourcedEvent @event, EventStreamId aggregateRootId)
 {
     GetStream(aggregateRootId).Add(@event);
 }
 public void OnDomainEvent(SourcedEvent e1, SourcedEvent e2)
 {
 }
Exemple #28
0
 protected void Apply(SourcedEvent e)
 {
     ExecuteEvent(e);
     notCommitedEvents.Add(e);
 }
 public void Add(SourcedEvent @event)
 {
     uncommittedEvents.Add(@event);
 }
 private void CatchAllHandler(SourcedEvent e)
 {
 }