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); }
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; } }
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)); }
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); }
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 }
// 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...")); }); }
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); }