From c03eb36b560af482c153e22c80a21057e7a30a65 Mon Sep 17 00:00:00 2001 From: Nikitha Chettiar Date: Thu, 10 Nov 2022 10:18:31 -0800 Subject: [PATCH] Hotfix - Page iterator reset counter (#1046) * reset the cursor * adding test with large numbers --- src/tasks/PageIterator.ts | 3 +- test/common/tasks/PageIterator.ts | 86 ++++++++++++++++++++++- test/development/workload/PageIterator.ts | 33 --------- 3 files changed, 87 insertions(+), 35 deletions(-) diff --git a/src/tasks/PageIterator.ts b/src/tasks/PageIterator.ts index 9bb32df71..5f34223e1 100644 --- a/src/tasks/PageIterator.ts +++ b/src/tasks/PageIterator.ts @@ -98,7 +98,7 @@ export class PageIterator { * @private * Member holding the current position on the collection */ - private cursor: number + private cursor: number; /** * @public @@ -161,6 +161,7 @@ export class PageIterator { const response: PageCollection = await graphRequest.get(); this.collection = response.value; + this.cursor = 0; this.nextLink = response["@odata.nextLink"]; this.deltaLink = response["@odata.deltaLink"]; } diff --git a/test/common/tasks/PageIterator.ts b/test/common/tasks/PageIterator.ts index 8978f7a94..2d7c3ea6a 100644 --- a/test/common/tasks/PageIterator.ts +++ b/test/common/tasks/PageIterator.ts @@ -7,7 +7,7 @@ import { assert } from "chai"; -import { Client } from "../../../src/index"; +import { ChaosHandler, ChaosHandlerOptions, ChaosStrategy, Client, ClientOptions } from "../../../src/index"; import { PageIterator, PageIteratorCallback } from "../../../src/tasks/PageIterator"; import { getClient } from "../../test-helper"; @@ -134,4 +134,88 @@ describe("PageIterator.ts", () => { assert.isTrue(pageIterator.isComplete()); }); }); + describe("Test iteration using ChaosHandler", () => { + it("testing with 5000 results in initial and next page", async () => { + const middleware = new ChaosHandler(); + + const getPageCollection = () => { + const initialPageResultValues: any[] = []; + for (let i = 0; i < 5000; i++) { + initialPageResultValues[i] = { event: "value" + i }; + } + return { + value: initialPageResultValues, + "@odata.nextLink": "nextURL", + additionalContent: "additional content", + }; + }; + const clientOptions: ClientOptions = { + middleware, + }; + + const nextPageResultValues: any[] = []; + + for (let i = 0; i < 5000; i++) { + nextPageResultValues[i] = { event: "valueNext" + i }; + } + const responseBody = { value: nextPageResultValues }; + let countNextPageResult = 0; + const callback: PageIteratorCallback = (data) => { + + if (data["event"] === "valueNext" + countNextPageResult) { + countNextPageResult++; + } + + return true; + }; + + const middlewareOptions = [new ChaosHandlerOptions(ChaosStrategy.MANUAL, "middleware options for pageIterator", 200, 0, JSON.stringify(responseBody), new Headers({ "Content-Type": "application/json", "content-length": "100" }))]; + const requestOptions = { middlewareOptions }; + + const client = Client.initWithMiddleware(clientOptions); + const pageIterator = new PageIterator(client, getPageCollection(), callback, requestOptions); + await pageIterator.iterate(); + + assert.equal(countNextPageResult, 5000); + }); + + it("Evaluate next page result being fetched", async () => { + const middleware = new ChaosHandler(); + const getPageCollection = () => { + return { + value: [{ event1: "value1" }, { event2: "value2" }], + "@odata.nextLink": "nextURL", + additionalContent: "additional content", + }; + }; + const clientOptions: ClientOptions = { + middleware, + }; + const responseBody = { value: [{ event3: "value3" }, { event4: "value4" }] }; + let counter = 1; + let countNextPageResult = 0; + const callback: PageIteratorCallback = (data) => { + assert.equal(data["event" + counter], "value" + counter); + + if (data["event" + counter] === "value3") { + countNextPageResult++; + } + + if (data["event" + counter] === "value4") { + countNextPageResult++; + } + counter++; + return true; + }; + + const middlewareOptions = [new ChaosHandlerOptions(ChaosStrategy.MANUAL, "middleware options for pageIterator", 200, 0, JSON.stringify(responseBody), new Headers({ "Content-Type": "application/json", "content-length": "100" }))]; + const requestOptions = { middlewareOptions }; + + const client = Client.initWithMiddleware(clientOptions); + const pageIterator = new PageIterator(client, getPageCollection(), callback, requestOptions); + await pageIterator.iterate(); + + assert.equal(countNextPageResult, 2); + }); + }); }); diff --git a/test/development/workload/PageIterator.ts b/test/development/workload/PageIterator.ts index 8077997a9..3168bfb19 100644 --- a/test/development/workload/PageIterator.ts +++ b/test/development/workload/PageIterator.ts @@ -8,10 +8,6 @@ import { Event } from "@microsoft/microsoft-graph-types"; import { assert } from "chai"; -import { Client, ClientOptions } from "../../../src"; -import { ChaosHandler } from "../../../src/middleware/ChaosHandler"; -import { ChaosHandlerOptions } from "../../../src/middleware/options/ChaosHandlerOptions"; -import { ChaosStrategy } from "../../../src/middleware/options/ChaosStrategy"; import { GraphRequestOptions, PageIterator, PageIteratorCallback } from "../../../src/tasks/PageIterator"; import { getClient } from "../test-helper"; const client = getClient(); @@ -91,33 +87,4 @@ describe("PageIterator", () => { assert.isTrue(pageIterator.isComplete()); } }).timeout(30 * 1000); - - // TODO - Temporariliy commenting this test. - it("setting middleware with pageIterator", async () => { - const middleware = new ChaosHandler(); - const getPageCollection = () => { - return { - value: [], - "@odata.nextLink": "nextURL", - additionalContent: "additional content", - }; - }; - const clientOptions: ClientOptions = { - middleware, - }; - const responseBody = { value: [{ event1: "value1" }, { event2: "value2" }] }; - let counter = 1; - const callback: PageIteratorCallback = (data) => { - assert.equal(data["event" + counter], "value" + counter); - counter++; - return true; - }; - - const middlewareOptions = [new ChaosHandlerOptions(ChaosStrategy.MANUAL, "middleware options for pageIterator", 200, 0, JSON.stringify(responseBody), new Headers({ "Content-Type": "application/json", "content-length": "100" }))]; - const requestOptions = { middlewareOptions }; - - const client = Client.initWithMiddleware(clientOptions); - const pageIterator = new PageIterator(client, getPageCollection(), callback, requestOptions); - await pageIterator.iterate(); - }); });