Пример #1
0
        private CosmosSagaStateRepository CreateSut(CosmosSagaStateRepositoryOptions options = null)
        {
            var serializer = new JsonSerializer();

            options ??= CosmosSagaStateRepositoryOptions.Default;

            var sut = new CosmosSagaStateRepository(_fixture.DbContext, serializer, options);

            return(sut);
        }
Пример #2
0
        public async Task LockAsync_should_return_state_if_lock_expired()
        {
            var options = new CosmosSagaStateRepositoryOptions(TimeSpan.Zero);
            var sut     = CreateSut(options);

            var newState = DummyState.New();

            var(firstState, firstLockId) = await sut.LockAsync(newState.Id, newState, CancellationToken.None);

            await Task.Delay(500);

            var(secondState, secondLockId) = await sut.LockAsync(newState.Id, newState, CancellationToken.None);

            secondLockId.Should().NotBe(firstLockId);
            secondState.Should().NotBeNull();
        }
        public async Task ReleaseLockAsync_should_throw_when_release_lock_fails()
        {
            var newState = DummyState.New();

            var coll = NSubstitute.Substitute.For <IMongoCollection <Entities.SagaState> >();

            coll.UpdateOneAsync(Arg.Any <FilterDefinition <Entities.SagaState> >(),
                                Arg.Any <UpdateDefinition <Entities.SagaState> >(),
                                Arg.Any <UpdateOptions>(),
                                Arg.Any <CancellationToken>())
            .ReturnsForAnyArgs((UpdateResult)null);

            var dbContext = NSubstitute.Substitute.For <IDbContext>();

            dbContext.SagaStates.Returns(coll);

            var serializer = NSubstitute.Substitute.For <ISerializer>();
            var options    = new CosmosSagaStateRepositoryOptions(TimeSpan.FromMinutes(1));
            var sut        = new CosmosSagaStateRepository(dbContext, serializer, options);

            var ex = await Assert.ThrowsAsync <LockException>(async() => await sut.ReleaseLockAsync(newState, Guid.NewGuid(), CancellationToken.None));

            ex.Message.Should().Contain("unable to release lock on saga state");
        }
Пример #4
0
 public CosmosSagaStateRepository(IDbContext dbContext, ISerializer serializer, CosmosSagaStateRepositoryOptions options)
 {
     _dbContext  = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
     _serializer = serializer ?? throw new ArgumentNullException(nameof(serializer));
     _options    = options ?? throw new ArgumentNullException(nameof(options));
 }