public void CanMigrateEvents()
        {
            // Arrange
            var container = CreateContainer();
            var eventStore = container.Resolve<EventStore>();
            var aggregate = new Aggregate();
            aggregate.Change();
            WithEventStore(container, session => session.Store(aggregate));

            // Act
            var eventMigrators = new List<IEventMigrator>
                                     {
                                         // deliberately wrong order here
                                         new SecondEventMigrator(),
                                         new FirstEventMigrator()
                                     };
            eventStore.MigrateEvents(eventMigrators);

            // Assert
            History history = null;
            WithEventStore(container, session => history = session.Load<History>(aggregate.Id));
            Assert.That(history.Events, Is.Not.Null);
            Assert.That(history.Events.Count, Is.EqualTo(4));
            Assert.That(history.Events[0], Is.EqualTo("Created1A"));
            Assert.That(history.Events[1], Is.EqualTo("Created2"));
            Assert.That(history.Events[2], Is.EqualTo("Changed1A"));
            Assert.That(history.Events[3], Is.EqualTo("Changed2"));
        }
        public void MergesEvents()
        {
            // Arrange
            var container = CreateContainer();
            var eventStore = container.Resolve<EventStore>();
            var documentStore = container.Resolve<IDocumentStore>();

            // store base aggregate
            var aggregate = new Aggregate();
            using (var documentSession = documentStore.OpenSession())
            {
                var eventStoreSession = eventStore.OpenSession(documentStore, documentSession);
                eventStoreSession.Store(aggregate);
                eventStoreSession.SaveChanges();
            }

            using (var firstSession = documentStore.OpenSession())
            using (var secondSession = documentStore.OpenSession())
            {
                // use optimistic concurrency
                // this will enable merging of events
                secondSession.Advanced.UseOptimisticConcurrency = true;

                var firstEventStoreSession = eventStore.OpenSession(documentStore, firstSession);

                // Act

                // make change to left side
                firstEventStoreSession.Load<Aggregate>(aggregate.Id).FirstAction();

                var secondEventStoreSession = eventStore.OpenSession(documentStore, secondSession);

                // make change to right side
                secondEventStoreSession.Load<Aggregate>(aggregate.Id).SecondAction();

                firstEventStoreSession.SaveChanges();
                secondEventStoreSession.SaveChanges();
            }

            // Assert

            // expect merged result
            using (var documentSession = documentStore.OpenSession())
            {
                var eventStoreSession = eventStore.OpenSession(documentStore, documentSession);
                var mergedAggregate = eventStoreSession.Load<Aggregate>(aggregate.Id);
                // Assert.That(mergedAggregate.GetHistory().Length, Is.EqualTo(3));
            }
        }
        public void LoadsSecondFromUnitOfWork()
        {
            // Arrange
            var aggregate = new Aggregate();
            var container = CreateContainer();
            var eventStore = container.Resolve<EventStore>();
            var eventStoreSession = eventStore.OpenSession(
                container.Resolve<IDocumentStore>(), container.Resolve<IDocumentSession>());
            eventStoreSession.Store(aggregate);

            // Act
            var secondAggregate = eventStoreSession.Load<Aggregate>(aggregate.Id);

            // Assert
            Assert.That(secondAggregate, Is.SameAs(aggregate));
        }
        public void RespectRavenConventions()
        {
            // Arrange
            var container = new WindsorContainer();
            container.Register(Component.For<IDocumentStore>().UsingFactoryMethod(CreateDocumentStore));
            container.Register(
                Component.For<IDocumentSession>().UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession()).LifestyleTransient());
            container.Install(EventStoreInstaller.FromAssembly(Assembly.GetExecutingAssembly()));
            var eventStore = container.Resolve<EventStore>();

            // Act
            var eventStoreSession = eventStore.OpenSession(
                container.Resolve<IDocumentStore>(), container.Resolve<IDocumentSession>());
            var aggregate = new Aggregate();
            eventStoreSession.Store(aggregate);
            eventStoreSession.SaveChanges();

            // Assert
            Assert.That(aggregate.Id, Is.EqualTo("EventStreams-Aggregates-1"));
        }
        public void CanSaveChangesSeveralTimes()
        {
            // Arrange
            var handler = new AggregateHandler();
            var container = CreateContainer(new[] { handler });
            var aggregate = new Aggregate();
            aggregate.Change();
            var eventStore = container.Resolve<EventStore>();
            var eventStoreSession = eventStore.OpenSession(
                container.Resolve<IDocumentStore>(), container.Resolve<IDocumentSession>());
            eventStoreSession.Store(aggregate);

            // Act
            eventStoreSession.SaveChanges();
            Assert.That(aggregate.GetUncommittedChanges().Length, Is.EqualTo(0));
            Assert.That(handler.Changes, Is.EqualTo(1));
            aggregate.Change();
            eventStoreSession.SaveChanges();

            // Assert
            Assert.That(handler.Changes, Is.EqualTo(2));
        }
        public void PlacesAggregateInUnitOfWork()
        {
            // Arrange
            var aggregate = new Aggregate();
            var container = CreateContainer();
            WithEventStore(container, session => session.Store(aggregate));

            // Act
            WithEventStore(container, session =>
                {
                    var a = session.Load<Aggregate>(aggregate.Id);
                    a.Change();
                });

            // Assert
            var documentStore = container.Resolve<IDocumentStore>();
            using (var session = documentStore.OpenSession())
            {
                var es = container.Resolve<EventStore>().OpenSession(documentStore, session);
                var a = es.Load<Aggregate>(aggregate.Id);
                Assert.That(a, Is.Not.Null);
                Assert.That(a.Changed, Is.True);
            }
        }