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>()); }
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)); }
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)); }