public When_a_commit_is_persisted()
            {
                Given(() =>
                {
                    UseThe((ICommit) new CommitBuilder().WithCheckpoint("123").Build());

                    var eventStore = A.Fake <IPersistStreams>();
                    A.CallTo(() => eventStore.GetFrom(A <string> .Ignored)).Returns(new[] { The <ICommit>() });

                    var adapter = new NEventStoreAdapter(eventStore, 11, pollingInterval, 100, () => DateTime.UtcNow);

                    WithSubject(_ => adapter.Subscribe);
                });

                When(() =>
                {
                    Subject(null, new Subscriber
                    {
                        HandleTransactions = (transactions, info) =>
                        {
                            transactionHandledSource.SetResult(transactions.First());

                            return(Task.FromResult(0));
                        }
                    }, "someId");
                });
            }
            public When_the_persistency_engine_is_temporarily_unavailable()
            {
                Given(() =>
                {
                    UseThe((ICommit) new CommitBuilder().WithCheckpoint("123").Build());

                    var eventStore = A.Fake <IPersistStreams>();
                    A.CallTo(() => eventStore.GetFrom(A <string> .Ignored)).Returns(new[] { The <ICommit>() });
                    A.CallTo(() => eventStore.GetFrom(A <string> .Ignored)).Throws(new ApplicationException()).Once();

                    var adapter = new NEventStoreAdapter(eventStore, 11, pollingInterval, 100, () => DateTime.UtcNow);

                    WithSubject(_ => adapter.Subscribe);
                });

                When(() =>
                {
                    Subject(null, new Subscriber
                    {
                        HandleTransactions = (transactions, info) =>
                        {
                            actualTransaction = transactions.First();
                            return(Task.FromResult(0));
                        }
                    }, "someId");
                });
            }
            public When_a_commit_is_already_projected()
            {
                Given(() =>
                {
                    ICommit projectedCommit   = new CommitBuilder().WithCheckpoint("123").Build();
                    ICommit unprojectedCommit = new CommitBuilder().WithCheckpoint("124").Build();

                    var eventStore = A.Fake <IPersistStreams>();
                    A.CallTo(() => eventStore.GetFrom(A <string> .Ignored)).Returns(new[] { projectedCommit, unprojectedCommit });
                    A.CallTo(() => eventStore.GetFrom("123")).Returns(new[] { unprojectedCommit });

                    var adapter = new NEventStoreAdapter(eventStore, 11, 1.Seconds(), 100, () => DateTime.UtcNow);
                    WithSubject(_ => adapter.Subscribe);
                });

                When(() =>
                {
                    Subject(123, new Subscriber
                    {
                        HandleTransactions = (transactions, info) =>
                        {
                            transactionHandledSource.SetResult(transactions.First());

                            return(Task.FromResult(0));
                        }
                    }, "someId");
                });
            }
            public When_requesting_a_subscription_beyond_the_highest_available_checkpoint()
            {
                Given(() =>
                {
                    var eventStore = A.Fake <IPersistStreams>();
                    A.CallTo(() => eventStore.GetFrom("999")).Returns(new ICommit[0]);

                    var adapter = new NEventStoreAdapter(eventStore, 11, 1.Seconds(), 100, () => DateTime.UtcNow);

                    WithSubject(_ => adapter.Subscribe);
                });

                When(() =>
                {
                    Subject(1000, new Subscriber
                    {
                        HandleTransactions = (transactions, info) =>
                        {
                            throw new InvalidOperationException("The adapter should not provide any events.");
                        },
                        NoSuchCheckpoint = info =>
                        {
                            noSuchCheckpointRaised.SetResult(true);

                            return(Task.FromResult(0));
                        }
                    }, "myIde");
                });
            }
        public override void Create(BoundedContext boundedContext, IDependencyResolver resolver)
        {
            m_ConstructAggregates = resolver.HasService(typeof(IConstructAggregates))
                ? (IConstructAggregates)resolver.GetService(typeof(IConstructAggregates))
                : null;

            m_ConnectionFactory = resolver.HasService(typeof(IConnectionFactory))
                ? (IConnectionFactory)resolver.GetService(typeof(IConnectionFactory))
                : new ConfigurationConnectionFactory(null);

            IStoreEvents eventStore = m_ConfigureEventStore(new CommitDispatcher(boundedContext.EventsPublisher), m_ConnectionFactory).Build();

            EventStoreAdapter = new NEventStoreAdapter(eventStore, m_ConstructAggregates);
        }
            public When_there_are_no_more_commits()
            {
                Given(() =>
                {
                    var streamPersister = A.Fake <IPersistStreams>();

                    A.CallTo(() => streamPersister.GetFrom(A <string> .Ignored)).ReturnsLazily <IEnumerable <ICommit>, string>(checkpointToken =>
                    {
                        pollingTimeStamps.Add(new PollingCall(checkpointToken, DateTime.UtcNow));
                        if (pollingTimeStamps.Count == 4)
                        {
                            pollingCompleted.SetResult(true);
                        }

                        long checkPoint = (checkpointToken != null) ? long.Parse(checkpointToken) : 0;
                        long offsetToDetectAheadSubscriber = 1;

                        if (checkPoint <= (subscriptionCheckpoint - offsetToDetectAheadSubscriber))
                        {
                            return(new CommitBuilder().WithCheckpoint(checkPoint + 1).BuildAsEnumerable());
                        }
                        else
                        {
                            return(new ICommit[0]);
                        }
                    });

                    var adapter = new NEventStoreAdapter(streamPersister, 0, pollingInterval, 100, () => DateTime.UtcNow);
                    WithSubject(_ => adapter.Subscribe);
                });

                When(() =>
                {
                    return(Subject(subscriptionCheckpoint, new Subscriber
                    {
                        HandleTransactions = (transactions, info) => Task.FromResult(0)
                    }, "someId"));
                });
            }
            When_a_subscription_starts_after_zero_checkpoint_and_another_subscription_starts_after_null_checkpoint_while_the_first_subscription_is_loading_the_first_page_from_the_event_store()
            {
                Given(() =>
                {
                    eventStore = A.Fake <IPersistStreams>();
                    A.CallTo(() => eventStore.GetFrom(A <string> .Ignored)).ReturnsLazily(call =>
                    {
                        string checkpointString = call.GetArgument <string>(0);

                        long checkpoint = string.IsNullOrEmpty(checkpointString)
                            ? 0
                            : long.Parse(checkpointString, CultureInfo.InvariantCulture);

                        aSubscriptionStartedLoading.Set();

                        if (!secondSubscriptionCreated.Wait(TimeSpan.FromSeconds(10)))
                        {
                            throw new InvalidOperationException("The second subscription has not been created in 10 seconds.");
                        }

                        // Give the second subscription enough time to access the cache.
                        Thread.Sleep(TimeSpan.FromSeconds(1));

                        return(checkpoint > 0
                            ? new ICommit[0]
                            : new ICommit[] { new CommitBuilder().WithCheckpoint("1").Build() });
                    });

                    var adapter = new NEventStoreAdapter(eventStore, 11, pollingInterval, 100, () => DateTime.UtcNow);
                    WithSubject(_ => adapter.Subscribe);
                });

                When(() =>
                {
                    Subject(
                        0,
                        new Subscriber
                    {
                        HandleTransactions = (transactions, info) => Task.FromResult(0)
                    },
                        "firstId");

                    if (!aSubscriptionStartedLoading.Wait(TimeSpan.FromSeconds(10)))
                    {
                        throw new InvalidOperationException("The first subscription has not started loading in 10 seconds.");
                    }

                    Subject(
                        null,
                        new Subscriber
                    {
                        HandleTransactions = (transactions, info) =>
                        {
                            secondSubscriptionReceivedTheTransaction.Set();
                            return(Task.FromResult(0));
                        }
                    },
                        "secondId"
                        );

                    secondSubscriptionCreated.Set();
                });
            }