public async Task ChangeFeedIteratorCore_DeleteAfterCreate() { ContainerProperties properties = new ContainerProperties(id: Guid.NewGuid().ToString(), partitionKeyPath: ChangeFeedIteratorCoreTests.PartitionKey); properties.ChangeFeedPolicy.FullFidelityRetention = TimeSpan.FromMinutes(5); ContainerResponse response = await this.database.CreateContainerAsync( properties, cancellationToken : this.cancellationToken); ContainerInternal container = (ContainerInternal)response; // Insert documents and then delete them int totalDocuments = 50; IList <ToDoActivity> createdItems = await this.CreateRandomItems(container, totalDocuments, randomPartitionKey : true); foreach (ToDoActivity item in createdItems) { await container.DeleteItemAsync <ToDoActivity>(item.id, new PartitionKey(item.pk)); } FeedIterator <ToDoActivityWithMetadata> changefeedIterator = container.GetChangeFeedIterator <ToDoActivityWithMetadata>( ChangeFeedStartFrom.Beginning(), ChangeFeedMode.Incremental); while (changefeedIterator.HasMoreResults) { FeedResponse <ToDoActivityWithMetadata> feedResponse = await changefeedIterator.ReadNextAsync(this.cancellationToken); Assert.AreEqual(HttpStatusCode.NotModified, feedResponse.StatusCode, "Incremental Change Feed does not present intermediate results and should return nothing."); if (feedResponse.StatusCode == HttpStatusCode.NotModified) { break; } } }
private static async Task <ItemResponse <TestDoc> > DeleteItemAsync( ContainerInternal containerCore, TestDoc testDoc) { ItemResponse <TestDoc> deleteResponse = await containerCore.DeleteItemAsync <TestDoc>( testDoc.Id, new PartitionKey(testDoc.PK)); Assert.AreEqual(HttpStatusCode.NoContent, deleteResponse.StatusCode); Assert.IsNull(deleteResponse.Resource); return(deleteResponse); }
public async Task ChangeFeedIteratorCore_WithFullFidelity() { ContainerProperties properties = new ContainerProperties(id: Guid.NewGuid().ToString(), partitionKeyPath: ChangeFeedIteratorCoreTests.PartitionKey); properties.ChangeFeedPolicy.FullFidelityRetention = TimeSpan.FromMinutes(5); ContainerResponse response = await this.database.CreateContainerAsync( properties, cancellationToken : this.cancellationToken); ContainerInternal container = (ContainerInternal)response; // FF does not work with StartFromBeginning currently, so we capture an initial continuation. FeedIterator <ToDoActivityWithMetadata> fullFidelityIterator = container.GetChangeFeedIterator <ToDoActivityWithMetadata>( ChangeFeedStartFrom.Now(), ChangeFeedMode.FullFidelity); string initialContinuation = null; while (fullFidelityIterator.HasMoreResults) { try { FeedResponse <ToDoActivityWithMetadata> feedResponse = await fullFidelityIterator.ReadNextAsync(this.cancellationToken); initialContinuation = feedResponse.ContinuationToken; } catch (CosmosException cosmosException) when(cosmosException.StatusCode == HttpStatusCode.NotModified) { initialContinuation = cosmosException.Headers.ContinuationToken; break; } } // Insert documents and then delete them int totalDocuments = 50; IList <ToDoActivity> createdItems = await this.CreateRandomItems(container, totalDocuments, randomPartitionKey : true); foreach (ToDoActivity item in createdItems) { await container.DeleteItemAsync <ToDoActivity>(item.id, new PartitionKey(item.pk)); } // Resume Change Feed and verify we pickup all the events fullFidelityIterator = container.GetChangeFeedIterator <ToDoActivityWithMetadata>( ChangeFeedStartFrom.ContinuationToken(initialContinuation), ChangeFeedMode.FullFidelity); int detectedEvents = 0; bool hasInserts = false; bool hasDeletes = false; while (fullFidelityIterator.HasMoreResults) { try { FeedResponse <ToDoActivityWithMetadata> feedResponse = await fullFidelityIterator.ReadNextAsync(this.cancellationToken); foreach (ToDoActivityWithMetadata item in feedResponse) { Assert.IsNotNull(item.metadata, "Metadata not present"); Assert.IsNotNull(item.metadata.operationType, "Metadata has no operationType"); hasInserts |= item.metadata.operationType == "create"; hasDeletes |= item.metadata.operationType == "delete"; } detectedEvents += feedResponse.Count; } catch (CosmosException cosmosException) when(cosmosException.StatusCode == HttpStatusCode.NotModified) { break; } } Assert.AreEqual(2 * totalDocuments, detectedEvents, "Full Fidelity should include inserts and delete events."); Assert.IsTrue(hasInserts, "No metadata for create operationType found"); Assert.IsTrue(hasDeletes, "No metadata for delete operationType found"); }