public async Task TestMoveNextWithEmptyPagesAndSplitAsync(string initialContinuationToken) { int maxPageSize = 5; List <MockPartitionResponse[]> mockResponsesScenario = MockQueryFactory.GetSplitScenarios(); foreach (MockPartitionResponse[] mockResponse in mockResponsesScenario) { Mock <CosmosQueryClient> mockQueryClient = new Mock <CosmosQueryClient>(); IList <ToDoItem> allItems = MockQueryFactory.GenerateAndMockResponse( mockQueryClient, isOrderByQuery: false, sqlQuerySpec: MockQueryFactory.DefaultQuerySpec, containerRid: MockQueryFactory.DefaultCollectionRid, initContinuationToken: initialContinuationToken, maxPageSize: maxPageSize, mockResponseForSinglePartition: mockResponse, cancellationTokenForMocks: this.cancellationToken); CosmosQueryContext context = MockQueryFactory.CreateContext( mockQueryClient.Object); ItemProducerTree itemProducerTree = new ItemProducerTree( context, MockQueryFactory.DefaultQuerySpec, mockResponse[0].PartitionKeyRange, MockItemProducerFactory.DefaultTreeProduceAsyncCompleteDelegate, new ParallelItemProducerTreeComparer(), CosmosElementEqualityComparer.Value, new TestInjections(simulate429s: false, simulateEmptyPages: false), true, MockQueryFactory.DefaultCollectionRid, maxPageSize, initialContinuationToken: initialContinuationToken); Assert.IsTrue(itemProducerTree.HasMoreResults); List <ToDoItem> itemsRead = new List <ToDoItem>(); while ((await itemProducerTree.TryMoveNextPageAsync(this.cancellationToken)).movedToNextPage) { while (itemProducerTree.TryMoveNextDocumentWithinPage()) { Assert.IsTrue(itemProducerTree.HasMoreResults); if (itemProducerTree.Current != null) { string jsonValue = itemProducerTree.Current.ToString(); ToDoItem item = JsonConvert.DeserializeObject <ToDoItem>(jsonValue); itemsRead.Add(item); } } itemProducerTree.UpdatePriority(); } Assert.IsFalse(itemProducerTree.HasMoreResults); Assert.AreEqual(allItems.Count, itemsRead.Count); List <ToDoItem> exepected = allItems.OrderBy(x => x.id).ToList(); List <ToDoItem> actual = itemsRead.OrderBy(x => x.id).ToList(); CollectionAssert.AreEqual(exepected, actual, new ToDoItemComparer()); } }
/// <summary> /// Pushes a document producer back to the queue. /// </summary> public void PushCurrentItemProducerTree(ItemProducerTree itemProducerTree) { itemProducerTree.UpdatePriority(); this.itemProducerForest.Enqueue(itemProducerTree); }