コード例 #1
0
        public async Task ReleaseLockAsync_should_use_not_transaction_when_type_invalid()
        {
            var state  = DummyState.New();
            var lockId = Guid.NewGuid();

            var transaction = new NullTransaction();

            var updateResult = NSubstitute.Substitute.ForPartsOf <UpdateResult>();

            updateResult.MatchedCount.ReturnsForAnyArgs(1);

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

            repo.UpdateOneAsync((FilterDefinition <Entities.SagaState>)null,
                                (UpdateDefinition <Entities.SagaState>)null,
                                (UpdateOptions)null,
                                CancellationToken.None)
            .ReturnsForAnyArgs(updateResult);

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

            dbContext.SagaStates.Returns(repo);

            var serializer = NSubstitute.Substitute.For <ISerializer>();
            var sut        = new MongoSagaStateRepository(dbContext, serializer, MongoSagaStateRepositoryOptions.Default);

            await sut.ReleaseLockAsync <DummyState>(state, lockId, transaction);

            await repo.Received(1)
            .UpdateOneAsync(Arg.Any <FilterDefinition <Entities.SagaState> >(),
                            Arg.Any <UpdateDefinition <Entities.SagaState> >(),
                            Arg.Any <UpdateOptions>(),
                            Arg.Any <CancellationToken>());
        }
コード例 #2
0
        public async Task ReleaseLockAsync_should_throw_when_update_fails()
        {
            var state  = DummyState.New();
            var lockId = Guid.NewGuid();

            var transaction = new NullTransaction();

            var updateResult = NSubstitute.Substitute.ForPartsOf <UpdateResult>();

            updateResult.MatchedCount.ReturnsForAnyArgs(0);

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

            repo.UpdateOneAsync((FilterDefinition <Entities.SagaState>)null,
                                (UpdateDefinition <Entities.SagaState>)null,
                                (UpdateOptions)null,
                                CancellationToken.None)
            .ReturnsForAnyArgs(updateResult);

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

            dbContext.SagaStates.Returns(repo);

            var serializer = NSubstitute.Substitute.For <ISerializer>();
            var sut        = new MongoSagaStateRepository(dbContext, serializer, MongoSagaStateRepositoryOptions.Default);

            await Assert.ThrowsAsync <LockException>(async() =>
                                                     await sut.ReleaseLockAsync <DummyState>(state, lockId, transaction));
        }
コード例 #3
0
ファイル: MongoUnitOfWork.cs プロジェクト: plunix/OpenSleigh
        public Task <ITransaction> StartTransactionAsync(CancellationToken cancellationToken = default)
        {
            var transactionOptions = new TransactionOptions(ReadConcern.Majority, ReadPreference.Primary, WriteConcern.WMajority);

            ITransaction transaction;

            try
            {
                //TODO: the async overload might freeze if transactions are not supported
                var session = _client.StartSession();
                session.StartTransaction(transactionOptions);
                transaction = new MongoTransaction(session);
            }
            catch (NotSupportedException ex)
            {
                _logger.LogWarning($"unable to start MongoDB transaction : {ex.Message}");
                transaction = new NullTransaction();
            }

            return(Task.FromResult(transaction));
        }