From 44aa3cf5989789ccf454165b9dcafe72c0c66bdd Mon Sep 17 00:00:00 2001 From: danjov Date: Mon, 24 Oct 2022 11:47:13 +0200 Subject: [PATCH 1/6] Streamline app version for (local) automated tests --- .github/workflows/ci.yml | 2 +- src/client/cypress/e2e/admin/aboutSettings.cy.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b7202d15..5ceeb877c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,4 +45,4 @@ jobs: wait-on-timeout: 120 working-directory: ./src/client env: - REACT_APP_VERSION: 0.1.99+cypress + REACT_APP_VERSION: 0.0.99+dev diff --git a/src/client/cypress/e2e/admin/aboutSettings.cy.js b/src/client/cypress/e2e/admin/aboutSettings.cy.js index c161f38cd..6444a2b59 100644 --- a/src/client/cypress/e2e/admin/aboutSettings.cy.js +++ b/src/client/cypress/e2e/admin/aboutSettings.cy.js @@ -10,11 +10,11 @@ describe("Admin about page tests", () => { it("shows version information linking the corresponding release on GitHub.", () => { cy.get('[data-cy="version"]') - .should("contain", "0.1.99+cypress") + .should("contain", "0.0.99+dev") .should( "have.attr", "href", - "https://github.com/geoadmin/suite-bdms/releases/tag/v0.1.99", + "https://github.com/geoadmin/suite-bdms/releases/tag/v0.0.99", ); }); From c0cf048d5c4a04ee82887d44a102310c761a0676 Mon Sep 17 00:00:00 2001 From: danjov Date: Mon, 24 Oct 2022 11:48:45 +0200 Subject: [PATCH 2/6] Fix typos --- .../cypress/e2e/{borholeList.cy.js => boreholeList.cy.js} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/client/cypress/e2e/{borholeList.cy.js => boreholeList.cy.js} (98%) diff --git a/src/client/cypress/e2e/borholeList.cy.js b/src/client/cypress/e2e/boreholeList.cy.js similarity index 98% rename from src/client/cypress/e2e/borholeList.cy.js rename to src/client/cypress/e2e/boreholeList.cy.js index 0db3c7682..6f5faff0f 100644 --- a/src/client/cypress/e2e/borholeList.cy.js +++ b/src/client/cypress/e2e/boreholeList.cy.js @@ -1,7 +1,7 @@ import editorUser from "../fixtures/editorUser.json"; import adminUser from "../fixtures/adminUser.json"; -describe("Bore hole list tests", () => { +describe("Borehole list tests", () => { it("Boreholes are displayed in correct order with editor login", () => { // Login as editor cy.intercept("/api/v1/geoapi/canton").as("geoapi"); @@ -94,7 +94,7 @@ describe("Bore hole list tests", () => { secondRow.contains("td", "09.11.2021"); thirdRow.contains("td", "12.10.2021"); - // sort by bore hole type (column of original name) + // sort by borehole type (column of original name) cy.contains("div", "Borehole type").click(); cy.wait("@borehole"); firstRow = cy.get("tbody").children().first(); From 8ff7f8d73655bab5ae1f7ea58802f8a8d459de91 Mon Sep 17 00:00:00 2001 From: danjov Date: Mon, 24 Oct 2022 13:25:36 +0200 Subject: [PATCH 3/6] Reuse login code for cypress tests --- .../cypress/e2e/admin/userAdministration.cy.js | 12 +++--------- src/client/cypress/e2e/boreholeList.cy.js | 14 +++----------- src/client/cypress/e2e/codeList.cy.js | 16 ++++------------ src/client/cypress/e2e/editor/bulkedit.cy.js | 8 ++------ .../cypress/e2e/editor/emptyMessages.cy.js | 6 ++---- .../cypress/e2e/editor/instrumentation.cy.js | 6 ++---- src/client/cypress/e2e/editor/location.cy.js | 6 ++---- src/client/cypress/e2e/filter.cy.js | 8 +++----- src/client/cypress/e2e/testHelpers.js | 11 +++++++++++ 9 files changed, 32 insertions(+), 55 deletions(-) diff --git a/src/client/cypress/e2e/admin/userAdministration.cy.js b/src/client/cypress/e2e/admin/userAdministration.cy.js index 613d6ee39..ade563c5e 100644 --- a/src/client/cypress/e2e/admin/userAdministration.cy.js +++ b/src/client/cypress/e2e/admin/userAdministration.cy.js @@ -1,13 +1,10 @@ -import { interceptApiCalls } from "../testHelpers"; +import { interceptApiCalls, login } from "../testHelpers"; describe("Admin settings test", () => { it("displays correct message when enabling user.", () => { interceptApiCalls(); - // login - cy.visit("/setting/admin"); - cy.contains("button", "Login").click(); - cy.wait("@geoapi"); + login("/setting/admin"); cy.get('[data-cy="user-list-table-body"]') .children() @@ -75,10 +72,7 @@ describe("Admin settings test", () => { it("can add user with admin role.", () => { interceptApiCalls(); - // login - cy.visit("/setting/admin"); - cy.contains("button", "Login").click(); - cy.wait("@geoapi"); + login("/setting/admin"); cy.get('[data-cy="user-list-table-body"]') .children() diff --git a/src/client/cypress/e2e/boreholeList.cy.js b/src/client/cypress/e2e/boreholeList.cy.js index 6f5faff0f..cf2493920 100644 --- a/src/client/cypress/e2e/boreholeList.cy.js +++ b/src/client/cypress/e2e/boreholeList.cy.js @@ -1,17 +1,14 @@ import editorUser from "../fixtures/editorUser.json"; import adminUser from "../fixtures/adminUser.json"; +import { login } from "../e2e/testHelpers"; describe("Borehole list tests", () => { it("Boreholes are displayed in correct order with editor login", () => { // Login as editor - cy.intercept("/api/v1/geoapi/canton").as("geoapi"); cy.intercept("/api/v1/borehole").as("borehole"); - cy.intercept("/api/v1/user", editorUser); + login(); - cy.visit("/"); - cy.contains("button", "Login").click(); - cy.wait("@geoapi"); cy.get("div[id=map]").should("be.visible"); cy.get("tbody").children().should("have.length", 27); @@ -108,13 +105,8 @@ describe("Borehole list tests", () => { it("Boreholes are displayed in correct order with admin login", () => { // Login as admin - cy.intercept("/api/v1/geoapi/canton").as("geoapi"); - cy.intercept("/api/v1/user", adminUser); - - cy.visit("/editor"); - cy.contains("button", "Login").click(); - cy.wait("@geoapi"); + login("/editor"); cy.get("div[id=map]").should("be.visible"); // sort by creation date diff --git a/src/client/cypress/e2e/codeList.cy.js b/src/client/cypress/e2e/codeList.cy.js index 3b141442f..eccf4533f 100644 --- a/src/client/cypress/e2e/codeList.cy.js +++ b/src/client/cypress/e2e/codeList.cy.js @@ -1,15 +1,13 @@ import adminUser from "../fixtures/adminUser.json"; import editorUser from "../fixtures/editorUser.json"; +import { login } from "../e2e/testHelpers"; describe("Codelist translations tests", () => { it("Admin can open codelist translation section", () => { // Login and navigate to editor settings - cy.intercept("/api/v1/geoapi/canton").as("geoapi"); cy.intercept("/api/v1/user", adminUser); - cy.visit("/"); - cy.contains("button", "Login").click(); - cy.wait("@geoapi"); + login(); cy.get("div[id=map]").should("be.visible"); cy.get("i[class='th big icon']").click(); @@ -27,12 +25,9 @@ describe("Codelist translations tests", () => { }); it("Admin can edit translations", () => { - cy.intercept("/api/v1/geoapi/canton").as("geoapi"); cy.intercept("/api/v1/user", adminUser); - cy.visit("/"); - cy.contains("button", "Login").click(); - cy.wait("@geoapi"); + login(); cy.get("div[id=map]").should("be.visible"); cy.get("i[class='th big icon']").click(); @@ -102,12 +97,9 @@ describe("Codelist translations tests", () => { it("Editor cannot open codelist translation section", () => { // login as editor - cy.intercept("/api/v1/geoapi/canton").as("geoapi"); cy.intercept("/api/v1/user", editorUser); - cy.visit("/"); - cy.contains("button", "Login").click(); - cy.wait("@geoapi"); + login(); cy.get("div[id=map]").should("be.visible"); cy.get("i[class='th big icon']").click(); diff --git a/src/client/cypress/e2e/editor/bulkedit.cy.js b/src/client/cypress/e2e/editor/bulkedit.cy.js index 5edd8b686..4038f119a 100644 --- a/src/client/cypress/e2e/editor/bulkedit.cy.js +++ b/src/client/cypress/e2e/editor/bulkedit.cy.js @@ -1,17 +1,13 @@ -import { createBorehole, deleteBorehole } from "../testHelpers"; +import { createBorehole, deleteBorehole, login } from "../testHelpers"; describe("Test the borehole bulk edit feature.", () => { beforeEach(() => { - cy.intercept("/api/v1/geoapi/canton").as("geoapi"); cy.intercept("/api/v1/borehole").as("borehole"); cy.intercept("/api/v1/borehole/edit", req => { return (req.alias = `edit_${req.body.action.toLowerCase()}`); }); - // login - cy.visit("/editor"); - cy.contains("button", "Login").click(); - cy.wait("@geoapi"); + login("/editor"); }); it("opens the bulk edit dialog with all boreholes selected", () => { diff --git a/src/client/cypress/e2e/editor/emptyMessages.cy.js b/src/client/cypress/e2e/editor/emptyMessages.cy.js index b74514249..354e620bf 100644 --- a/src/client/cypress/e2e/editor/emptyMessages.cy.js +++ b/src/client/cypress/e2e/editor/emptyMessages.cy.js @@ -2,16 +2,14 @@ import { interceptApiCalls, newUneditableBorehole, deleteBorehole, + login, } from "../testHelpers"; describe("Messages for empty profiles", () => { beforeEach(() => { interceptApiCalls(); - cy.visit("/editor"); - cy.contains("button", "Login").click(); - cy.wait("@geoapi"); - + login("/editor"); newUneditableBorehole(); }); diff --git a/src/client/cypress/e2e/editor/instrumentation.cy.js b/src/client/cypress/e2e/editor/instrumentation.cy.js index a7585a95e..bdd624d51 100644 --- a/src/client/cypress/e2e/editor/instrumentation.cy.js +++ b/src/client/cypress/e2e/editor/instrumentation.cy.js @@ -2,16 +2,14 @@ import { interceptApiCalls, newUneditableBorehole, deleteBorehole, + login, } from "../testHelpers"; describe("Instrumentation tests", () => { beforeEach(() => { interceptApiCalls(); - // login - cy.visit("/editor"); - cy.contains("button", "Login").click(); - cy.wait("@geoapi"); + login("/editor"); newUneditableBorehole().as("borehole_id"); cy.get('[data-cy="completion-menu-item"]').click(); diff --git a/src/client/cypress/e2e/editor/location.cy.js b/src/client/cypress/e2e/editor/location.cy.js index cfe8396e5..64bc52d7d 100644 --- a/src/client/cypress/e2e/editor/location.cy.js +++ b/src/client/cypress/e2e/editor/location.cy.js @@ -2,16 +2,14 @@ import { deleteBorehole, interceptApiCalls, newEditableBorehole, + login, } from "../testHelpers"; describe("Tests for 'Location' edit page.", () => { beforeEach(() => { interceptApiCalls(); - // login - cy.visit("/"); - cy.contains("button", "Login").click(); - cy.wait("@geoapi"); + login(); // go to edit cy.get('[data-cy="menu"]').click(); diff --git a/src/client/cypress/e2e/filter.cy.js b/src/client/cypress/e2e/filter.cy.js index ddc424296..0c4c33c53 100644 --- a/src/client/cypress/e2e/filter.cy.js +++ b/src/client/cypress/e2e/filter.cy.js @@ -1,10 +1,8 @@ +import { login } from "../e2e/testHelpers"; + describe("Search filter tests", () => { beforeEach(() => { - cy.intercept("/api/v1/geoapi/canton").as("geoapi"); - - cy.visit("/"); - cy.contains("button", "Enter as viewer").click(); - cy.wait("@geoapi"); + login(); }); it("has search filters", () => { diff --git a/src/client/cypress/e2e/testHelpers.js b/src/client/cypress/e2e/testHelpers.js index a44fa60bb..25e0c5190 100644 --- a/src/client/cypress/e2e/testHelpers.js +++ b/src/client/cypress/e2e/testHelpers.js @@ -18,6 +18,17 @@ export const interceptApiCalls = () => { }); }; +/** + * Login into the application with the pre-filled user for the development environment. + * @param {string} visitUrl The url to visit after logging in. Default is the root path. + */ +export const login = (visitUrl = "/") => { + cy.intercept("/api/v1/geoapi/canton").as("geoapi"); + cy.visit(visitUrl); + cy.contains("button", "Login").click(); + cy.wait("@geoapi"); +}; + export const newEditableBorehole = () => { const id = newUneditableBorehole(); cy.contains("a", "Start editing").click(); From 4d2c9123635ada00e9e7ac3b6bec8b9e438c5e60 Mon Sep 17 00:00:00 2001 From: danjov Date: Mon, 24 Oct 2022 13:39:08 +0200 Subject: [PATCH 4/6] Remove obsolete cy.intercept statement --- src/client/cypress/e2e/testHelpers.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/client/cypress/e2e/testHelpers.js b/src/client/cypress/e2e/testHelpers.js index 25e0c5190..086dd617a 100644 --- a/src/client/cypress/e2e/testHelpers.js +++ b/src/client/cypress/e2e/testHelpers.js @@ -4,7 +4,6 @@ const adminUserAuth = { }; export const interceptApiCalls = () => { - cy.intercept("/api/v1/geoapi/canton").as("geoapi"); cy.intercept("/api/v1/borehole").as("borehole"); cy.intercept("/api/v1/borehole/profile/layer").as("layer"); cy.intercept("/api/v1/borehole/edit", req => { From 0bf6074b8413b616b13968f67a09e795b1b8ecdd Mon Sep 17 00:00:00 2001 From: danjov Date: Mon, 24 Oct 2022 14:12:41 +0200 Subject: [PATCH 5/6] Reuse login code and simplify admin/editor login --- .../cypress/e2e/admin/aboutSettings.cy.js | 8 ++----- src/client/cypress/e2e/boreholeList.cy.js | 12 +++-------- src/client/cypress/e2e/codeList.cy.js | 17 ++++----------- src/client/cypress/e2e/testHelpers.js | 21 +++++++++++++++++++ 4 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/client/cypress/e2e/admin/aboutSettings.cy.js b/src/client/cypress/e2e/admin/aboutSettings.cy.js index 6444a2b59..d9676765e 100644 --- a/src/client/cypress/e2e/admin/aboutSettings.cy.js +++ b/src/client/cypress/e2e/admin/aboutSettings.cy.js @@ -1,12 +1,8 @@ -import { interceptApiCalls } from "../testHelpers"; +import { login } from "../testHelpers"; import license from "../../fixtures/license.json"; describe("Admin about page tests", () => { - beforeEach(() => { - interceptApiCalls(); - cy.visit("/setting/about"); - cy.contains("button", "Login").click(); - }); + beforeEach(() => login("/setting/about")); it("shows version information linking the corresponding release on GitHub.", () => { cy.get('[data-cy="version"]') diff --git a/src/client/cypress/e2e/boreholeList.cy.js b/src/client/cypress/e2e/boreholeList.cy.js index cf2493920..4d746186a 100644 --- a/src/client/cypress/e2e/boreholeList.cy.js +++ b/src/client/cypress/e2e/boreholeList.cy.js @@ -1,13 +1,9 @@ -import editorUser from "../fixtures/editorUser.json"; -import adminUser from "../fixtures/adminUser.json"; -import { login } from "../e2e/testHelpers"; +import { loginAsAdmin, loginAsEditor } from "../e2e/testHelpers"; describe("Borehole list tests", () => { it("Boreholes are displayed in correct order with editor login", () => { - // Login as editor cy.intercept("/api/v1/borehole").as("borehole"); - cy.intercept("/api/v1/user", editorUser); - login(); + loginAsEditor(); cy.get("div[id=map]").should("be.visible"); @@ -104,9 +100,7 @@ describe("Borehole list tests", () => { }); it("Boreholes are displayed in correct order with admin login", () => { - // Login as admin - cy.intercept("/api/v1/user", adminUser); - login("/editor"); + loginAsAdmin("/editor"); cy.get("div[id=map]").should("be.visible"); // sort by creation date diff --git a/src/client/cypress/e2e/codeList.cy.js b/src/client/cypress/e2e/codeList.cy.js index eccf4533f..2190ba61b 100644 --- a/src/client/cypress/e2e/codeList.cy.js +++ b/src/client/cypress/e2e/codeList.cy.js @@ -1,13 +1,9 @@ -import adminUser from "../fixtures/adminUser.json"; -import editorUser from "../fixtures/editorUser.json"; -import { login } from "../e2e/testHelpers"; +import { loginAsAdmin, loginAsEditor } from "../e2e/testHelpers"; describe("Codelist translations tests", () => { it("Admin can open codelist translation section", () => { // Login and navigate to editor settings - cy.intercept("/api/v1/user", adminUser); - - login(); + loginAsAdmin(); cy.get("div[id=map]").should("be.visible"); cy.get("i[class='th big icon']").click(); @@ -25,9 +21,7 @@ describe("Codelist translations tests", () => { }); it("Admin can edit translations", () => { - cy.intercept("/api/v1/user", adminUser); - - login(); + loginAsAdmin(); cy.get("div[id=map]").should("be.visible"); cy.get("i[class='th big icon']").click(); @@ -96,10 +90,7 @@ describe("Codelist translations tests", () => { }); it("Editor cannot open codelist translation section", () => { - // login as editor - cy.intercept("/api/v1/user", editorUser); - - login(); + loginAsEditor(); cy.get("div[id=map]").should("be.visible"); cy.get("i[class='th big icon']").click(); diff --git a/src/client/cypress/e2e/testHelpers.js b/src/client/cypress/e2e/testHelpers.js index 086dd617a..ab5eefbc3 100644 --- a/src/client/cypress/e2e/testHelpers.js +++ b/src/client/cypress/e2e/testHelpers.js @@ -1,3 +1,6 @@ +import adminUser from "../fixtures/adminUser.json"; +import editorUser from "../fixtures/editorUser.json"; + const adminUserAuth = { user: "admin", password: "swissforages", @@ -28,6 +31,24 @@ export const login = (visitUrl = "/") => { cy.wait("@geoapi"); }; +/** + * Login into the application as admin. + * @param {string} visitUrl The url to visit after logging in. Default is the root path. + */ +export const loginAsAdmin = (visitUrl = "/") => { + cy.intercept("/api/v1/user", adminUser); + login(visitUrl); +}; + +/** + * Login into the application as editor. + * @param {string} visitUrl The url to visit after logging in. Default is the root path. + */ +export const loginAsEditor = (visitUrl = "/") => { + cy.intercept("/api/v1/user", editorUser); + login(visitUrl); +}; + export const newEditableBorehole = () => { const id = newUneditableBorehole(); cy.contains("a", "Start editing").click(); From 0ec6fe5eee1c906c400d24f623b25bafffcb1f78 Mon Sep 17 00:00:00 2001 From: danjov Date: Mon, 24 Oct 2022 14:42:22 +0200 Subject: [PATCH 6/6] Correctly setup interception before logging in --- src/client/cypress/e2e/admin/aboutSettings.cy.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/client/cypress/e2e/admin/aboutSettings.cy.js b/src/client/cypress/e2e/admin/aboutSettings.cy.js index d9676765e..b24df7783 100644 --- a/src/client/cypress/e2e/admin/aboutSettings.cy.js +++ b/src/client/cypress/e2e/admin/aboutSettings.cy.js @@ -2,9 +2,9 @@ import { login } from "../testHelpers"; import license from "../../fixtures/license.json"; describe("Admin about page tests", () => { - beforeEach(() => login("/setting/about")); - it("shows version information linking the corresponding release on GitHub.", () => { + login("/setting/about"); + cy.get('[data-cy="version"]') .should("contain", "0.0.99+dev") .should( @@ -16,6 +16,7 @@ describe("Admin about page tests", () => { it("shows license information (with fixtures)", () => { cy.intercept("/license.json", license); + login("/setting/about"); cy.get('[data-cy^="credits-"]').should("have.length", 2); cy.get('[data-cy="credits-example-js@0.0.999"]').should( @@ -29,6 +30,7 @@ describe("Admin about page tests", () => { }); it("shows license information (without fixtures)", () => { + login("/setting/about"); cy.get('[data-cy^="credits-"]').should("have.length.above", 0); }); });