Пример #1
0
        public async Task GivenADocumentDbSagaRepository_WhenSendingQuery()
        {
            _correlationId = Guid.NewGuid();
            var saga = new SimpleSagaResource {
                CorrelationId = _correlationId
            };

            await SagaRepository.Instance.InsertSaga(saga, true);

            _sagaQueryConsumeContext = new Mock <SagaQueryConsumeContext <SimpleSagaResource, InitiateSimpleSaga> >();
            _sagaQueryConsumeContext.Setup(x => x.Query.FilterExpression).Returns(x => x.CorrelationId == _correlationId);
            _sagaPolicy = new Mock <ISagaPolicy <SimpleSagaResource, InitiateSimpleSaga> >();
            _nextPipe   = new Mock <IPipe <SagaConsumeContext <SimpleSagaResource, InitiateSimpleSaga> > >();

            _sagaConsumeContext = new Mock <SagaConsumeContext <SimpleSagaResource, InitiateSimpleSaga> >();
            _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId);

            _sagaConsumeContextFactory = new Mock <IDocumentDbSagaConsumeContextFactory>();
            _sagaConsumeContextFactory.Setup(
                m =>
                m.Create(It.IsAny <IDocumentClient>(), It.IsAny <string>(), It.IsAny <string>(), _sagaQueryConsumeContext.Object,
                         It.Is <SimpleSagaResource>(x => x.CorrelationId == _correlationId), true, It.IsAny <RequestOptions>())).Returns(_sagaConsumeContext.Object);

            var repository = new DocumentDbSagaRepository <SimpleSagaResource>(SagaRepository.Instance.Client, SagaRepository.DatabaseName, SagaRepository.CollectionName, _sagaConsumeContextFactory.Object, null);

            await repository.SendQuery(_sagaQueryConsumeContext.Object, _sagaPolicy.Object, _nextPipe.Object);
        }
        public async Task GivenADocumentDbSagaRepository_WhenSendingAndPolicyReturnsInstance()
        {
            _correlationId     = Guid.NewGuid();
            _cancellationToken = new CancellationToken();

            _context = new Mock <ConsumeContext <InitiateSimpleSaga> >();
            _context.Setup(x => x.CorrelationId).Returns(_correlationId);
            _context.Setup(m => m.CancellationToken).Returns(_cancellationToken);

            _simpleSaga = new SimpleSagaResource {
                CorrelationId = _correlationId
            };

            _policy = new Mock <ISagaPolicy <SimpleSagaResource, InitiateSimpleSaga> >();
            _policy.Setup(x => x.PreInsertInstance(_context.Object, out _simpleSaga)).Returns(true);

            _nextPipe = new Mock <IPipe <SagaConsumeContext <SimpleSagaResource, InitiateSimpleSaga> > >();

            _sagaConsumeContext = new Mock <SagaConsumeContext <SimpleSagaResource, InitiateSimpleSaga> >();
            _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId);

            _sagaConsumeContextFactory = new Mock <IDocumentDbSagaConsumeContextFactory>();
            _sagaConsumeContextFactory.Setup(m => m.Create(It.IsAny <IDocumentClient>(), It.IsAny <string>(), It.IsAny <string>(), _context.Object, It.IsAny <SimpleSagaResource>(), It.IsAny <bool>(), It.IsAny <RequestOptions>())).Returns(
                _sagaConsumeContext.Object);


            var repository = new DocumentDbSagaRepository <SimpleSagaResource>(SagaRepository.Instance.Client, SagaRepository.DatabaseName, SagaRepository.CollectionName, _sagaConsumeContextFactory.Object, null);

            await repository.Send(_context.Object, _policy.Object, _nextPipe.Object);
        }
Пример #3
0
        public async Task GivenADocumentDbSagaRepository_WhenSendingAndInstanceNotReturnedFromPolicy()
        {
            _correlationId     = Guid.NewGuid();
            _cancellationToken = new CancellationToken();

            _context = new Mock <ConsumeContext <InitiateSimpleSaga> >();
            _context.Setup(x => x.CorrelationId).Returns(_correlationId);
            _context.Setup(m => m.CancellationToken).Returns(_cancellationToken);

            _nullSimpleSaga = null;

            _policy = new Mock <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >();
            _policy.Setup(x => x.PreInsertInstance(_context.Object, out _nullSimpleSaga)).Returns(false);

            _nextPipe = new Mock <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >();

            _simpleSaga = new SimpleSaga {
                CorrelationId = _correlationId
            };

            _sagaConsumeContext = new Mock <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> >();
            _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId);

            _sagaConsumeContextFactory = new Mock <IDocumentDbSagaConsumeContextFactory>();
            _sagaConsumeContextFactory.Setup(
                m => m.Create(It.IsAny <IDocumentClient>(), It.IsAny <string>(), It.IsAny <string>(), _context.Object, It.Is <SimpleSaga>(x => x.CorrelationId == _correlationId), true))
            .Returns(_sagaConsumeContext.Object);

            await SagaRepository.Instance.InsertSaga(_simpleSaga);

            var repository = new DocumentDbSagaRepository <SimpleSaga>(SagaRepository.Instance.Client, SagaRepository.DatabaseName, SagaRepository.CollectionName, _sagaConsumeContextFactory.Object);

            await repository.Send(_context.Object, _policy.Object, _nextPipe.Object);
        }
        public async Task GivenADocumentDbSagaRespository_WhenSendingCompletedInstance()
        {
            _correlationId     = Guid.NewGuid();
            _cancellationToken = new CancellationToken();

            var context = new Mock <ConsumeContext <CompleteSimpleSaga> >();

            context.Setup(x => x.CorrelationId).Returns(_correlationId);
            context.Setup(m => m.CancellationToken).Returns(_cancellationToken);

            _simpleSaga = new SimpleSagaResource
            {
                CorrelationId = _correlationId
            };
            await _simpleSaga.Consume(It.IsAny <ConsumeContext <CompleteSimpleSaga> >());

            await SagaRepository.Instance.InsertSaga(_simpleSaga, true);

            _simpleSagaDocument = await SagaRepository.Instance.GetSagaDocument(_simpleSaga.CorrelationId);

            var sagaConsumeContext = new Mock <SagaConsumeContext <SimpleSagaResource, CompleteSimpleSaga> >();

            sagaConsumeContext.SetupGet(x => x.IsCompleted).Returns(true);
            var documentDbSagaConsumeContextFactory = new Mock <IDocumentDbSagaConsumeContextFactory>();

            documentDbSagaConsumeContextFactory.Setup(x => x.Create(It.IsAny <IDocumentClient>(), It.IsAny <string>(), It.IsAny <string>(), context.Object, It.IsAny <SimpleSagaResource>(), true, It.IsAny <RequestOptions>()))
            .Returns(sagaConsumeContext.Object);
            var repository = new DocumentDbSagaRepository <SimpleSagaResource>(SagaRepository.Instance.Client, SagaRepository.DatabaseName, SagaRepository.CollectionName, documentDbSagaConsumeContextFactory.Object, null);

            await repository.Send(context.Object, Mock.Of <ISagaPolicy <SimpleSagaResource, CompleteSimpleSaga> >(), null);
        }
        public async Task GivenADocumentDbSagaRepository_WhenSendingQueryAndSagaNotFound()
        {
            _sagaQueryConsumeContext = new Mock <SagaQueryConsumeContext <SimpleSagaResource, InitiateSimpleSaga> >();
            _sagaQueryConsumeContext.Setup(x => x.Query.FilterExpression).Returns(x => x.CorrelationId == Guid.NewGuid());
            _sagaPolicy = new Mock <ISagaPolicy <SimpleSagaResource, InitiateSimpleSaga> >();
            _nextPipe   = new Mock <IPipe <SagaConsumeContext <SimpleSagaResource, InitiateSimpleSaga> > >();

            var repository = new DocumentDbSagaRepository <SimpleSagaResource>(SagaRepository.Instance.Client, SagaRepository.DatabaseName, SagaRepository.CollectionName);

            await repository.SendQuery(_sagaQueryConsumeContext.Object, _sagaPolicy.Object, _nextPipe.Object);
        }
        public void GivenADocumentDbSagaRepository_WhenProbing()
        {
            _scope = new Mock <ProbeContext>();

            _probeContext = new Mock <ProbeContext>();
            _probeContext.Setup(m => m.CreateScope("sagaRepository")).Returns(_scope.Object);

            var repository = new DocumentDbSagaRepository <SimpleSagaResource>(SagaRepository.Instance.Client, SagaRepository.DatabaseName);

            repository.Probe(_probeContext.Object);
        }
        public void GivenADocumentDbQuerySagaRepository_WhenFindingSaga()
        {
            _correlationId = Guid.NewGuid();

            SagaRepository.Instance.InsertSaga(new SimpleSaga {
                CorrelationId = _correlationId
            }).GetAwaiter().GetResult();

            var repository = new DocumentDbSagaRepository <SimpleSaga>(SagaRepository.Instance.Client, SagaRepository.DatabaseName);

            ISagaQuery <SimpleSaga> query = new SagaQuery <SimpleSaga>(x => x.CorrelationId == _correlationId);

            _result = repository.Find(query).GetAwaiter().GetResult();
        }
        public async Task GivenADocumentDbSagaRepository_WhenSendingAndInstanceNotFound()
        {
            _context = new Mock <ConsumeContext <InitiateSimpleSaga> >();
            _context.Setup(x => x.CorrelationId).Returns(It.IsAny <Guid>());
            _context.Setup(m => m.CancellationToken).Returns(It.IsAny <CancellationToken>());

            _nullSimpleSaga = null;

            _policy = new Mock <ISagaPolicy <SimpleSagaResource, InitiateSimpleSaga> >();
            _policy.Setup(x => x.PreInsertInstance(_context.Object, out _nullSimpleSaga)).Returns(false);

            _nextPipe = new Mock <IPipe <SagaConsumeContext <SimpleSagaResource, InitiateSimpleSaga> > >();

            var repository = new DocumentDbSagaRepository <SimpleSagaResource>(SagaRepository.Instance.Client, SagaRepository.DatabaseName);

            await repository.Send(_context.Object, _policy.Object, _nextPipe.Object);
        }
        public async Task GivenADocumentDbSagaRepository_WhenSendingWithNullCorrelationId()
        {
            var context = new Mock <ConsumeContext <InitiateSimpleSaga> >();

            context.Setup(x => x.CorrelationId).Returns(default(Guid?));

            var repository = new DocumentDbSagaRepository <SimpleSagaResource>(Mock.Of <IDocumentClient>(), "sagaTest");

            try
            {
                await repository.Send(context.Object, Mock.Of <ISagaPolicy <SimpleSagaResource, InitiateSimpleSaga> >(),
                                      Mock.Of <IPipe <SagaConsumeContext <SimpleSagaResource, InitiateSimpleSaga> > >());
            }
            catch (SagaException exception)
            {
                _exception = exception;
            }
        }
Пример #10
0
        public async Task Query_Passes_With_Json_Property_Attribute()
        {
            // Arrange
            var correlationId = Guid.NewGuid();

            _ids.Add(correlationId);
            SagaRepository.Instance.InsertSaga(new SimpleSagaResource {
                CorrelationId = correlationId
            }, false).GetAwaiter().GetResult();
            ISagaQuery <SimpleSagaResource> query = new SagaQuery <SimpleSagaResource>(x => x.CorrelationId == correlationId);

            // Act
            var repository = new DocumentDbSagaRepository <SimpleSagaResource>(SagaRepository.Instance.Client, SagaRepository.DatabaseName);
            var result     = repository.Find(query).GetAwaiter().GetResult();

            // Assert
            Assert.That(result.Single(), Is.EqualTo(correlationId));
        }
Пример #11
0
        public async Task Query_Fails_With_Json_Resolver_Rename()
        {
            // Arrange
            var correlationId = Guid.NewGuid();

            _ids.Add(correlationId);
            SagaRepository.Instance.InsertSaga(new SimpleSaga {
                CorrelationId = correlationId
            }, true).GetAwaiter().GetResult();
            ISagaQuery <SimpleSaga> query = new SagaQuery <SimpleSaga>(x => x.CorrelationId == correlationId);

            // Act
            var repository = new DocumentDbSagaRepository <SimpleSaga>(SagaRepository.Instance.Client, SagaRepository.DatabaseName, JsonSerializerSettingsExtensions.GetSagaRenameSettings <SimpleSaga>());
            var result     = repository.Find(query).GetAwaiter().GetResult();

            // Assert
            Assert.That(result.Any(), Is.False);
        }
Пример #12
0
        public async Task Query_Other_Property_Passes_With_Json_Resolver_Rename()
        {
            // Arrange
            var correlationId = Guid.NewGuid();

            _ids.Add(correlationId);
            var username = Guid.NewGuid().ToString(); // wouldn't actually be a guid, but used this for uniqueness

            SagaRepository.Instance.InsertSaga(new SimpleSaga {
                CorrelationId = correlationId, Username = username
            }, true).GetAwaiter().GetResult();
            ISagaQuery <SimpleSaga> query = new SagaQuery <SimpleSaga>(x => x.Username == username);

            // Act
            var repository = new DocumentDbSagaRepository <SimpleSaga>(SagaRepository.Instance.Client, SagaRepository.DatabaseName, JsonSerializerSettingsExtensions.GetSagaRenameSettings <SimpleSaga>());
            var result     = repository.Find(query).GetAwaiter().GetResult();

            // Assert
            Assert.That(result.Single(), Is.EqualTo(correlationId)); // So it does find it
        }
Пример #13
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            // mirror logger messages to AppInsights
            loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Debug);

            //Configure persistence for Sagas
            Uri endpointUri = new Uri(Configuration.GetValue <string>("CosmosDb:Endpoint"));
            var repositoryEventProcessing = new DocumentDbSagaRepository <EventProcessingState>(
                new DocumentClient(endpointUri, Configuration.GetValue <string>("CosmosDb:AuthKey")),
                Configuration.GetValue <string>("CosmosDb:Database"),
                Configuration.GetValue <string>("CosmosDb:Collection"));
            var repositoryDeviceSync = new DocumentDbSagaRepository <DeviceSynchronizationState>(
                new DocumentClient(endpointUri, Configuration.GetValue <string>("CosmosDb:AuthKey")),
                Configuration.GetValue <string>("CosmosDb:Database"),
                Configuration.GetValue <string>("CosmosDb:Collection"));
            var repositoryResponseSync = new DocumentDbSagaRepository <ResponseState>(
                new DocumentClient(endpointUri, Configuration.GetValue <string>("CosmosDb:AuthKey")),
                Configuration.GetValue <string>("CosmosDb:Database"),
                Configuration.GetValue <string>("CosmosDb:Collection"));

            app.ApplicationServices.GetService <IMassTransitServiceBus>().Start(ep =>
            {
                ep.UseRetry(p => {
                    p.Interval(10, TimeSpan.FromMilliseconds(200));
                    p.Handle <DocumentDbConcurrencyException>();
                    p.Handle <Automatonymous.UnhandledEventException>();
                });
                ep.UseInMemoryOutbox();
                ep.StateMachineSaga(app.ApplicationServices.GetService <EventProcessingStateMachine>(), repositoryEventProcessing);
                ep.StateMachineSaga(app.ApplicationServices.GetService <DeviceSynchronizationStateMachine>(), repositoryDeviceSync);
                ep.StateMachineSaga(app.ApplicationServices.GetService <ResponseStateMachine>(), repositoryResponseSync);
            }, true);

            app.Run(context =>
            {
                return(context.Response.WriteAsync("EventProcessor Tracking Service is running..."));
            });
        }
Пример #14
0
        public async Task GivenADocumentDbSagaRepository_WhenSendingAndPolicyReturnsInstance()
        {
            _correlationId     = Guid.NewGuid();
            _cancellationToken = new CancellationToken();

            _context = new Mock <ConsumeContext <InitiateSimpleSaga> >();
            _context.Setup(x => x.CorrelationId).Returns(_correlationId);
            _context.Setup(m => m.CancellationToken).Returns(_cancellationToken);

            _simpleSaga = new SimpleSagaResource {
                CorrelationId = _correlationId
            };

            var sagaFactory = new FactoryMethodSagaFactory <SimpleSagaResource, InitiateSimpleSaga>(x => _simpleSaga);

            _policy = new NewOrExistingSagaPolicy <SimpleSagaResource, InitiateSimpleSaga>(sagaFactory, true);

            _nextPipe = new Mock <IPipe <SagaConsumeContext <SimpleSagaResource, InitiateSimpleSaga> > >();

            _repository = new DocumentDbSagaRepository <SimpleSagaResource>(SagaRepository.Instance.Client, SagaRepository.DatabaseName,
                                                                            SagaRepository.CollectionName);

            await _repository.Send(_context.Object, _policy, _nextPipe.Object);
        }