diff --git a/.gitignore b/.gitignore index 0a72a8159..ea29e6fff 100644 --- a/.gitignore +++ b/.gitignore @@ -117,4 +117,6 @@ logs/oAuthClient-log.log .node-persist/** -/*.env.* \ No newline at end of file +/*.env.* + +client/cypress/e2e/[1,2]-* \ No newline at end of file diff --git a/client/cypress.config.js b/client/cypress.config.js index 94195edcb..0646f9616 100644 --- a/client/cypress.config.js +++ b/client/cypress.config.js @@ -12,5 +12,6 @@ module.exports = defineConfig({ setupNodeEvents(on, config) { // implement node event listeners here }, + baseUrl: "http://localhost:3000", }, }); diff --git a/client/cypress/e2e/login-and-navigation/login.cy.js b/client/cypress/e2e/login-and-navigation/login.cy.js new file mode 100644 index 000000000..40c5a8774 --- /dev/null +++ b/client/cypress/e2e/login-and-navigation/login.cy.js @@ -0,0 +1,32 @@ +describe("logging in to the application", () => { + // FIXME error message + it("logs in the using wrong credentials", () => { + cy.login("fakeusername", "veryverylongpassword_123@#"); + cy.contains("invalid-email"); + }); + + it("logs in the using wrong password", () => { + cy.login("john@imex.dev", "veryverylongpassword_123@#"); + cy.contains( + "The email and password combination you provided is incorrect." + ); + }); + + it("logs in a non-existent credentials", () => { + cy.login("franz@imex.dev", "veryverylongpassword_123@#"); + cy.contains("A user with this email does not exist."); + }); + + // TODO create disabled account + // it("logs in with a disabled account", () => { + // cy.login("disabled_account@imex.dev", "john123"); + // cy.contains("User account disabled."); + // }); + + // TODO log in to the application + // it("logs in the using the right credentials", () => { + // cy.login("john@imex.dev", "john123"); + + // cy.url().should('include', '/manage') + // }); +}); diff --git a/client/cypress/e2e/login-and-navigation/reset-password.cy.js b/client/cypress/e2e/login-and-navigation/reset-password.cy.js new file mode 100644 index 000000000..3334198f8 --- /dev/null +++ b/client/cypress/e2e/login-and-navigation/reset-password.cy.js @@ -0,0 +1,17 @@ +describe("resetting user password", () => { + it("resets forgotten password with an invalid email", () => { + cy.passwordReset("franz"); + cy.contains("Email is not a valid email"); + }); + + // FIXME error message + it("resets forgotten password with a user that does not exist", () => { + cy.passwordReset("franz@imex.dev"); + cy.contains("user-not-found"); + }); + + it("resets forgotten password using the right credentials", () => { + cy.passwordReset("john@imex.dev"); + cy.contains("A password reset link has been sent to you."); + }); +}); diff --git a/client/cypress/support/commands.js b/client/cypress/support/commands.js index 66ea16ef0..843555c17 100644 --- a/client/cypress/support/commands.js +++ b/client/cypress/support/commands.js @@ -22,4 +22,30 @@ // // // -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) \ No newline at end of file +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) + +Cypress.Commands.add("goToSignInPage", () => { + cy.visit("/"); + cy.contains("Sign In").click(); +}); + +Cypress.Commands.add("login", (username, password) => { + cy.goToSignInPage(); + + cy.get('[data-cy="username"]').type(username); + cy.get('[data-cy="password"]').type(password); + cy.get('[data-cy="sign-in-button"]', { timeout: 2000 }).click(); +}); + +Cypress.Commands.add("passwordReset", (email) => { + cy.goToSignInPage(); + cy.get('[data-cy="reset-password"]').click(); + cy.get('[data-cy="reset-password-email-input"]').type(email); + cy.get('[data-cy="reset-password-button"]').click(); +}); + +Cypress.on("uncaught:exception", (err, runnable) => { + // returning false here prevents Cypress from + // failing the test + return false; +}); diff --git a/client/cypress/support/e2e.js b/client/cypress/support/e2e.js index 0e7290a13..3a2522438 100644 --- a/client/cypress/support/e2e.js +++ b/client/cypress/support/e2e.js @@ -14,7 +14,7 @@ // *********************************************************** // Import commands.js using ES2015 syntax: -import './commands' +import "./commands"; // Alternatively you can use CommonJS syntax: -// require('./commands') \ No newline at end of file +// require('./commands') diff --git a/client/src/components/header/header.component.jsx b/client/src/components/header/header.component.jsx index 1ed3f526d..4df279311 100644 --- a/client/src/components/header/header.component.jsx +++ b/client/src/components/header/header.component.jsx @@ -106,6 +106,7 @@ function Header({ selectedKeys={[selectedHeader]} onClick={handleMenuClick} subMenuCloseDelay={0.3} + data-cy="header-menu" > }> {t("menus.header.home")} @@ -347,8 +348,14 @@ function Header({ currentUser.email || t("general.labels.unknown") } + data-cy="user-sub-menu" > - signOutStart()}> + signOutStart()} + > {t("user.actions.signout")} } placeholder={t("general.labels.username")} + data-cy="username" /> } type="password" placeholder={t("general.labels.password")} + data-cy="password" /> {signInError ? ( @@ -97,11 +99,12 @@ export function SignInComponent({ type="primary" htmlType="submit" loading={loginLoading} + data-cy="sign-in-button" > {t("general.actions.login")} - + diff --git a/client/src/components/user-request-pw-reset/user-request-reset-pw.component.jsx b/client/src/components/user-request-pw-reset/user-request-reset-pw.component.jsx index aac56a0b4..fba8c058e 100644 --- a/client/src/components/user-request-pw-reset/user-request-reset-pw.component.jsx +++ b/client/src/components/user-request-pw-reset/user-request-reset-pw.component.jsx @@ -72,7 +72,7 @@ export function UserRequestResetPw({ }, ]} > - + {passwordReset.error ? ( @@ -82,6 +82,7 @@ export function UserRequestResetPw({ type="primary" htmlType="submit" loading={passwordReset.loading} + data-cy="reset-password-button" > {t("general.actions.submit")}