public async Task Should_not_dispose_release_operations_when_operations_not_successful() { var fakeContainer = new FakeContainer(); var fakeCosmosClient = new FakeCosmosClient(fakeContainer); var containerHolderHolderResolver = new ContainerHolderResolver(new FakeProvider(fakeCosmosClient), new ContainerInformation("fakeContainer", new PartitionKeyPath("/deep/down")), "fakeDatabase"); var storageSession = new StorageSession(containerHolderHolderResolver, new ContextBag(), true); var operation = new ThrowOnApplyOperation { PartitionKey = new PartitionKey("PartitionKey1") }; storageSession.AddOperation(operation); var releaseOperation = new ReleaseLockOperation { PartitionKey = new PartitionKey("PartitionKey1") }; storageSession.AddOperation(releaseOperation); try { await((ICompletableSynchronizedStorageSession)storageSession).CompleteAsync(); } catch { // ignored } Assert.That(releaseOperation.WasApplied, Is.False); Assert.That(releaseOperation.WasDisposed, Is.False); }
public async Task Should_execute_operations_with_same_partition_key_together() { var fakeContainer = new FakeContainer(); var fakeCosmosClient = new FakeCosmosClient(fakeContainer); var containerHolderHolderResolver = new ContainerHolderResolver(new FakeProvider(fakeCosmosClient), new ContainerInformation("fakeContainer", new PartitionKeyPath("/deep/down")), "fakeDatabase"); var storageSession = new StorageSession(containerHolderHolderResolver, new ContextBag(), true); var firstOperation = new FakeOperation { PartitionKey = new PartitionKey("PartitionKey1") }; storageSession.AddOperation(firstOperation); var secondOperation = new FakeOperation { PartitionKey = new PartitionKey("PartitionKey1") }; storageSession.AddOperation(secondOperation); await((ICompletableSynchronizedStorageSession)storageSession).CompleteAsync(); Assert.That(firstOperation.WasApplied, Is.True); Assert.That(secondOperation.WasApplied, Is.True); Assert.That(firstOperation.AppliedBatch, Is.EqualTo(secondOperation.AppliedBatch), "Operations with the same partition key must be in the same batch"); }
public void Should_execute_and_dispose_release_operations_with_different_partition_key_distinct_when_not_completed() { var fakeContainer = new FakeContainer(); var fakeCosmosClient = new FakeCosmosClient(fakeContainer); var containerHolderHolderResolver = new ContainerHolderResolver(new FakeProvider(fakeCosmosClient), new ContainerInformation("fakeContainer", new PartitionKeyPath("/deep/down")), "fakeDatabase"); var storageSession = new StorageSession(containerHolderHolderResolver, new ContextBag(), true); var firstReleaseOperation = new ReleaseLockOperation { PartitionKey = new PartitionKey("PartitionKey1") }; storageSession.AddOperation(firstReleaseOperation); var secondReleaseOperation = new ReleaseLockOperation { PartitionKey = new PartitionKey("PartitionKey2") }; storageSession.AddOperation(secondReleaseOperation); storageSession.Dispose(); Assert.That(firstReleaseOperation.WasApplied, Is.True); Assert.That(secondReleaseOperation.WasApplied, Is.True); Assert.That(firstReleaseOperation.WasDisposed, Is.True); Assert.That(secondReleaseOperation.WasDisposed, Is.True); Assert.That(firstReleaseOperation.AppliedBatch, Is.Not.EqualTo(secondReleaseOperation.AppliedBatch), "Release operations with the different partition keys must be in different batches."); }
public void Should_execute_and_dispose_release_operations_as_best_effort() { var fakeContainer = new FakeContainer { TransactionalBatchFactory = () => new ThrowsOnExecuteAsyncTransactionalBatch() }; var fakeCosmosClient = new FakeCosmosClient(fakeContainer); var containerHolderHolderResolver = new ContainerHolderResolver(new FakeProvider(fakeCosmosClient), new ContainerInformation("fakeContainer", new PartitionKeyPath("/deep/down")), "fakeDatabase"); var storageSession = new StorageSession(containerHolderHolderResolver, new ContextBag(), true); var firstReleaseOperation = new ReleaseLockOperation { PartitionKey = new PartitionKey("PartitionKey1") }; storageSession.AddOperation(firstReleaseOperation); var secondReleaseOperation = new ReleaseLockOperation { PartitionKey = new PartitionKey("PartitionKey2") }; storageSession.AddOperation(secondReleaseOperation); Assert.DoesNotThrow(() => storageSession.Dispose()); Assert.That(firstReleaseOperation.WasApplied, Is.True); Assert.That(secondReleaseOperation.WasApplied, Is.True); Assert.That(firstReleaseOperation.WasDisposed, Is.True); Assert.That(secondReleaseOperation.WasDisposed, Is.True); }
public void Should_dispose_operations() { var fakeCosmosClient = new FakeCosmosClient(null); var containerHolderHolderResolver = new ContainerHolderResolver(new FakeProvider(fakeCosmosClient), null, "fakeDatabase"); var storageSession = new StorageSession(containerHolderHolderResolver, new ContextBag(), true); var firstOperation = new FakeOperation(); storageSession.AddOperation(firstOperation); var secondOperation = new FakeOperation(); storageSession.AddOperation(secondOperation); storageSession.Dispose(); Assert.That(firstOperation.WasDisposed, Is.True); Assert.That(firstOperation.WasApplied, Is.False); Assert.That(secondOperation.WasDisposed, Is.True); Assert.That(secondOperation.WasApplied, Is.False); }
public async Task Should_not_complete_when_marked_as_do_not_complete() { var fakeCosmosClient = new FakeCosmosClient(null); var containerHolderHolderResolver = new ContainerHolderResolver(new FakeProvider(fakeCosmosClient), new ContainerInformation("fakeContainer", new PartitionKeyPath("")), "fakeDatabase"); var storageSession = new StorageSession(containerHolderHolderResolver, new ContextBag(), false); var firstOperation = new FakeOperation(); storageSession.AddOperation(firstOperation); var secondOperation = new FakeOperation(); storageSession.AddOperation(secondOperation); await((ICompletableSynchronizedStorageSession)storageSession).CompleteAsync(); Assert.That(firstOperation.WasDisposed, Is.False); Assert.That(firstOperation.WasApplied, Is.False); Assert.That(secondOperation.WasDisposed, Is.False); Assert.That(secondOperation.WasApplied, Is.False); }
public void Should_throw_when_no_container_available() { var fakeCosmosClient = new FakeCosmosClient(null); var containerHolderHolderResolver = new ContainerHolderResolver(new FakeProvider(fakeCosmosClient), null, "fakeDatabase"); var storageSession = new StorageSession(containerHolderHolderResolver, new ContextBag(), true); var operation = new FakeOperation(); storageSession.AddOperation(operation); var exception = Assert.ThrowsAsync <Exception>(async() => await((ICompletableSynchronizedStorageSession)storageSession).CompleteAsync()); Assert.That(exception.Message, Is.EqualTo("Unable to retrieve the container name and the partition key during processing. Make sure that either `persistence.Container()` is used or the relevant container information is available on the message handling pipeline.")); }