public async Task ReleaseLockAsync_should_use_not_transaction_when_not_available() { var state = DummyState.New(); var lockId = Guid.NewGuid(); 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); dbContext.Transaction.ReturnsNull(); var serializer = NSubstitute.Substitute.For <IPersistenceSerializer>(); var sut = new MongoSagaStateRepository(dbContext, serializer, MongoSagaStateRepositoryOptions.Default); await sut.ReleaseLockAsync <DummyState>(state, lockId); 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 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 <IPersistenceSerializer>(); var sut = new MongoSagaStateRepository(dbContext, serializer, MongoSagaStateRepositoryOptions.Default); await Assert.ThrowsAsync <LockException>(async() => await sut.ReleaseLockAsync <DummyState>(state, lockId)); }
public async Task ReleaseLockAsync_should_throw_when_input_null() { var dbContext = NSubstitute.Substitute.For <IDbContext>(); var serializer = NSubstitute.Substitute.For <IPersistenceSerializer>(); var sut = new MongoSagaStateRepository(dbContext, serializer, MongoSagaStateRepositoryOptions.Default); await Assert.ThrowsAsync <ArgumentNullException>(async() => await sut.ReleaseLockAsync <DummyState>(null, Guid.NewGuid())); }
private MongoSagaStateRepository CreateSut(MongoSagaStateRepositoryOptions options = null) { var serializer = new JsonSerializer(); options ??= MongoSagaStateRepositoryOptions.Default; var sut = new MongoSagaStateRepository(_fixture.DbContext, serializer, options); return(sut); }
public async Task LockAsync_should_throw_if_item_locked() { var serializer = new JsonSerializer(); var options = new MongoSagaStateRepositoryOptions(TimeSpan.FromMinutes(1)); var sut = new MongoSagaStateRepository(_fixture.DbContext, serializer, options); var newState = DummyState.New(); var(state, lockId) = await sut.LockAsync(newState.Id, newState, CancellationToken.None); var ex = await Assert.ThrowsAsync <LockException>(async() => await sut.LockAsync(newState.Id, newState, CancellationToken.None)); ex.Message.Should().Contain($"saga state '{state.Id}' is already locked"); }
public async Task LockAsync_should_create_and_return_locked_item_if_not_existing() { var serializer = new JsonSerializer(); var options = new MongoSagaStateRepositoryOptions(TimeSpan.FromMinutes(1)); var sut = new MongoSagaStateRepository(_fixture.DbContext, serializer, options); var newState = DummyState.New(); var(state, lockId) = await sut.LockAsync(newState.Id, newState, CancellationToken.None); state.Should().NotBeNull(); state.Id.Should().Be(newState.Id); state.Bar.Should().Be(newState.Bar); state.Foo.Should().Be(newState.Foo); }
public async Task LockAsync_should_allow_different_saga_state_types_to_share_the_correlation_id() { var serializer = new JsonSerializer(); var options = new MongoSagaStateRepositoryOptions(TimeSpan.FromMinutes(1)); var sut = new MongoSagaStateRepository(_fixture.DbContext, serializer, options); var newState = DummyState.New(); var(state, lockId) = await sut.LockAsync(newState.Id, newState, CancellationToken.None); var newState2 = new DummyState2(state.Id); newState2.Id.Should().Be(newState.Id); var(state2, lockId2) = await sut.LockAsync(newState2.Id, newState2, CancellationToken.None); state2.Should().NotBeNull(); state2.Id.Should().Be(newState.Id); }
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 <IPersistenceSerializer>(); var options = new MongoSagaStateRepositoryOptions(TimeSpan.FromMinutes(1)); var sut = new MongoSagaStateRepository(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"); }