Bug 37620: Improve cypress test to reduce random failures

This patch makes some improvements to the Infinite Scroll cypress test to try and prevent random test failures

- Fixes X-Base-Count and X-Total-Count for intercepted requests
- Makes element selection more precise
- Adds an intercepted request returning the requrired result for the filtered search
- Awaits this request before selecting an element from the dropdown
- Awaits all 10 requests triggered by typing "License 50" rather than just the first one
- Ensures that the select dropdown is closed between operations by clicking into another field to remove focus from the select dropdown

Test plan:
1) yarn cypress run --spec t/cypress/integration/InfiniteScrollSelect_spec.ts
or
1) yarn cypress open and select the InfiniteScrollSelect test from the Cypress GUI

Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
(cherry picked from commit 538868d5f5)
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
This commit is contained in:
Matt Blenkinsop 2024-08-19 13:16:00 +00:00 committed by Lucas Gass
parent e9e4d37047
commit a31735fa17
1 changed files with 93 additions and 17 deletions

View File

@ -81,8 +81,8 @@ describe("Infinite scroll", () => {
statusCode: 200,
body: pageTwo,
headers: {
"X-Base-Total-Count": "20",
"X-Total-Count": "20",
"X-Base-Total-Count": "40",
"X-Total-Count": "40",
},
}).as("getPageTwo");
// Scroll the dropdown
@ -94,8 +94,8 @@ describe("Infinite scroll", () => {
statusCode: 200,
body: pageThree,
headers: {
"X-Base-Total-Count": "20",
"X-Total-Count": "20",
"X-Base-Total-Count": "60",
"X-Total-Count": "60",
},
}).as("getPageThree");
// Scroll the dropdown again
@ -193,7 +193,7 @@ describe("Infinite scroll", () => {
"X-Base-Total-Count": "20",
"X-Total-Count": "20",
},
});
}).as("getPageOne");
// Click the button in the toolbar
cy.visit("/cgi-bin/koha/erm/agreements");
@ -201,41 +201,80 @@ describe("Infinite scroll", () => {
cy.get("#agreement_licenses").contains("Add new license").click();
cy.get("#license_id_0 .vs__open-indicator").click();
cy.wait("@getPageOne");
cy.get("#license_id_0").find("li").as("options");
cy.get("@options").should("have.length", 20);
cy.intercept("GET", "/api/v1/erm/licenses*", {
statusCode: 200,
body: pageTwo,
headers: {
"X-Base-Total-Count": "20",
"X-Total-Count": "20",
"X-Base-Total-Count": "40",
"X-Total-Count": "40",
},
}).as("getPageTwo");
// Scroll the dropdown
cy.get(".vs__dropdown-menu").scrollTo("bottom");
cy.get(
"#agreement_license_0 #license_id_0 .vs__dropdown-menu"
).scrollTo("bottom");
cy.wait("@getPageTwo");
cy.intercept("GET", "/api/v1/erm/licenses*", {
statusCode: 200,
body: pageThree,
headers: {
"X-Base-Total-Count": "20",
"X-Total-Count": "20",
"X-Base-Total-Count": "60",
"X-Total-Count": "60",
},
}).as("finalPage");
// Scroll the dropdown again
cy.get(".vs__dropdown-menu").scrollTo("bottom");
cy.get(
"#agreement_license_0 #license_id_0 .vs__dropdown-menu"
).scrollTo("bottom");
cy.wait("@finalPage");
cy.intercept("GET", "/api/v1/erm/licenses*", {
statusCode: 200,
body: [
{
license_id: 50,
name: "License " + 50,
description: "A test license",
type: "local",
status: "active",
started_on: dates["today_iso"],
ended_on: dates["tomorrow_iso"],
user_roles: [],
},
],
headers: {
"X-Base-Total-Count": "20",
"X-Total-Count": "20",
},
}).as("searchFilter");
// Select a license that is not in the first page of results
cy.get("#agreement_license_0 #license_id_0 .vs__search").type(
"License 50{enter}",
"License 50",
{ force: true }
);
cy.wait([
"@searchFilter",
"@searchFilter",
"@searchFilter",
"@searchFilter",
"@searchFilter",
"@searchFilter",
"@searchFilter",
"@searchFilter",
"@searchFilter",
"@searchFilter",
]);
cy.get("#agreement_license_0 #license_id_0 .vs__search").type(
"{enter}",
{ force: true }
);
cy.get("#agreement_license_0").contains("License 50");
// Re-open the dropdown, License 50 will no longer be in the dataset but the label should still show
// First we will click into the notes field to ensure the dropdown is closed
cy.get("#license_notes_0").click();
cy.intercept("GET", "/api/v1/erm/licenses*", {
statusCode: 200,
body: pageOne,
@ -246,13 +285,50 @@ describe("Infinite scroll", () => {
}).as("resetDropdown");
cy.get("#license_id_0 .vs__open-indicator").click();
cy.wait("@resetDropdown");
cy.get("#agreement_licenses").click();
// Close the dropdown
cy.get("#license_id_0 .vs__open-indicator").click();
cy.get("#license_notes_0").click();
cy.get("#agreement_license_0").contains("License 50");
// Select a different license
cy.intercept("GET", "/api/v1/erm/licenses*", {
statusCode: 200,
body: [
{
license_id: 10,
name: "License " + 10,
description: "A test license",
type: "local",
status: "active",
started_on: dates["today_iso"],
ended_on: dates["tomorrow_iso"],
user_roles: [],
},
],
headers: {
"X-Base-Total-Count": "20",
"X-Total-Count": "20",
},
}).as("secondSearchFilter");
cy.get("#license_id_0 .vs__open-indicator").click();
cy.get("#agreement_license_0 #license_id_0 .vs__search").type(
"License 10{enter}",
"License 10",
{ force: true }
);
cy.wait([
"@secondSearchFilter",
"@secondSearchFilter",
"@secondSearchFilter",
"@secondSearchFilter",
"@secondSearchFilter",
"@secondSearchFilter",
"@secondSearchFilter",
"@secondSearchFilter",
"@secondSearchFilter",
"@secondSearchFilter",
]);
cy.get("#agreement_license_0 #license_id_0 .vs__search").type(
"{enter}",
{ force: true }
);
cy.get("#agreement_license_0").contains("License 10");