diff --git a/cypress.config.js b/cypress.config.js index 97f47c4..08ff5bc 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -2,6 +2,7 @@ const { defineConfig } = require("cypress"); module.exports = defineConfig({ e2e: { + baseUrl: 'https://frontendbootcamp.proshore.eu/', setupNodeEvents(on, config) { // implement node event listeners here }, diff --git a/cypress.env.json b/cypress.env.json new file mode 100644 index 0000000..470251b --- /dev/null +++ b/cypress.env.json @@ -0,0 +1,5 @@ +{ + "APP_EMAIL": "test@test.com", + "APP_PASSWORD": "test123" + } + \ No newline at end of file diff --git a/cypress/e2e/auth/auth.cy.js b/cypress/e2e/auth/auth.cy.js new file mode 100644 index 0000000..3c115f0 --- /dev/null +++ b/cypress/e2e/auth/auth.cy.js @@ -0,0 +1,118 @@ +const { getRandomEmail, getRandomString } = require("../../../utilites/helper"); +const forgotPassword_PO = require("../../page_objects/forgotPassword_PO"); +const loginPagePO = require("../../page_objects/login_PO"); + +describe("authentication module", function () { + beforeEach(function () { + loginPagePO.visitLoginPage(); + }); + it("URL should be https://frontendbootcamp.proshore.eu/accounts/login", function () { + cy.url().should( + "eq", + "https://frontendbootcamp.proshore.eu/accounts/login" + ); + }); + it("verify valid login", function () { + cy.login(); + }); + + it(" should not be submit with empty details", function () { + loginPagePO.clickOnLoginButton(); + loginPagePO.elements.loginBtn().should("be.disabled"); + }); + + it("Verify the validation msg when login is attempted with less than 6 letter password", function () { + const randomGenerateEmail = getRandomEmail(); + const randomGenerateName = getRandomString(3); + loginPagePO.typeEmail(randomGenerateEmail); + loginPagePO.typePassword(randomGenerateName); + loginPagePO.clickOnLoginButton(); + loginPagePO.verifyPasswordLengthErrorMessage(); + }); + it("Verify the login process with invalidLogin credentials ", function () { + const randomGenerateEmail = getRandomEmail(); + const randomGenerateName = getRandomString(7); + loginPagePO.typeEmail(randomGenerateEmail); + loginPagePO.typePassword(randomGenerateName); + loginPagePO.clickOnLoginButton(); + loginPagePO.verifyInvalidCredentialAlertMessage(); + }); + it("Password should be visible by clicking the toggle_icon eye-slash", function () { + const randomGenerateName = getRandomString(5); + loginPagePO.typePassword(randomGenerateName); + cy.get("#showPassword").click(); + cy.get("#password").invoke("attr", "type").should("eq", "text"); + }); + it("It should not be submit with empty email address", function () { + const randomGenerateName = getRandomString(6); + loginPagePO.typePassword(randomGenerateName); + loginPagePO.clickOnLoginButton(); + loginPagePO.elements.loginBtn().should("be.disabled"); + }); + it("Should not be submit with empty password", function () { + const randomGenerateEmail = getRandomEmail(); + loginPagePO.typeEmail(randomGenerateEmail); + loginPagePO.clickOnLoginButton(); + loginPagePO.elements.loginBtn().should("be.disabled"); + }); + it("It should not be submit with correct email address and incorrect password", function () { + const randomGenerateName = getRandomString(7); + loginPagePO.typeEmail(Cypress.env("APP_EMAIL")); + loginPagePO.typePassword(randomGenerateName); + loginPagePO.clickOnLoginButton(); + loginPagePO.verifyInvalidCredentialAlertMessage(); + }); + + it("It should not be submit with incorrect email address and correct password", function () { + const randomGenerateEmail = getRandomEmail(); + loginPagePO.typeEmail(randomGenerateEmail); + loginPagePO.typePassword(Cypress.env("APP_PASSWORD")); + loginPagePO.clickOnLoginButton(); + loginPagePO.verifyInvalidCredentialAlertMessage(); + }); + it("clicked on forget password redirected to forget password page", function () { + forgotPassword_PO.visitForgotPasswordPage(); + }); + + it(" should be submit with empty emailaddress", function () { + forgotPassword_PO.visitForgotPasswordPage(); + forgotPassword_PO.clickOnGetResetLink(); + // forgotPassword_PO.verifyEmptyCredentialAlertMessage(); + + // cy.on(".window:alert", (txt) => { + // expect(txt).to.contains("Please fill out the field"); + }); + + it(" should be submit with incorrect email address in reset password page", function () { + forgotPassword_PO.visitForgotPasswordPage(); + const randomGenerateEmail = getRandomEmail(); + forgotPassword_PO.typeEmail(randomGenerateEmail); + forgotPassword_PO.clickOnGetResetLink(); + forgotPassword_PO.verifyInvalidCredentialAlertMessage(); + }); + it(" should be submit with correct email address in reset password page", function () { + forgotPassword_PO.visitForgotPasswordPage(); + forgotPassword_PO.typeEmail("test@test.com"); + forgotPassword_PO.clickOnGetResetLink(); + forgotPassword_PO.getResetLink(); + + // cy.get(".form-heading-title").should("have.text", "Check your mail"); + }); + + it("Access admin portal via url", function () { + cy.url().should( + "eq", + "https://frontendbootcamp.proshore.eu/accounts/login" + ); + + cy.location("origin").then((URL) => { + expect(URL).to.eq("https://frontendbootcamp.proshore.eu"); + cy.visit(URL + "/tracker"); + cy.get(".form-heading-title").should("have.text", "Log in"); + cy.url().should( + "eq", + "https://frontendbootcamp.proshore.eu/accounts/login?next=/tracker" + ); + }); + }); +}); diff --git a/cypress/page_objects/forgotPassword_PO.js b/cypress/page_objects/forgotPassword_PO.js new file mode 100644 index 0000000..da3525f --- /dev/null +++ b/cypress/page_objects/forgotPassword_PO.js @@ -0,0 +1,38 @@ +class forgotPassword_PO { + elements = { + emailInput: () => cy.get("#email.form-control"), + getResetLinkButton: () => cy.get('[data-cy="forgetPasswordResetButton"]'), + loginError: () => cy.get(".alert-message"), + getResetLink: () => cy.get(".form-heading-title"), + validationError: () => cy.on(".window:alert"), + }; + visitForgotPasswordPage() { + cy.get(".forgot-password").click(); + cy.url().should( + "eq", + "https://frontendbootcamp.proshore.eu/accounts/password-forgot" + ); + } + + typeEmail(email) { + this.elements.emailInput().type(email); + } + clickOnGetResetLink() { + this.elements.getResetLinkButton().click(); + } + verifyInvalidCredentialAlertMessage() { + this.elements + .loginError() + .should("have.text", "User with given email address not found"); + } + getResetLink() { + this.elements.getResetLink().click(); + } + // verifyEmptyCredentialAlertMessage(){ + // this.elements.validationError. + // // on(".window:alert", (txt) => { + // should("contains","Please fill out the field"); + // } +} + +module.exports = new forgotPassword_PO(); diff --git a/cypress/page_objects/login_PO.js b/cypress/page_objects/login_PO.js new file mode 100644 index 0000000..4238a8a --- /dev/null +++ b/cypress/page_objects/login_PO.js @@ -0,0 +1,39 @@ +class login_PO { + elements = { + emailInput: () => cy.get('[data-cy="emailInputField"]').eq(0), + passwordInput: () => cy.get('[data-cy="emailInputField"]').eq(1), + loginBtn: () => cy.get('[data-cy="loginButton"]'), + loginError: () => cy.get(".alert-message"), + validationError: () => cy.get(".text-danger"), + }; + visitLoginPage() { + cy.visit("https://frontendbootcamp.proshore.eu/accounts/login"); + cy.url().should( + "eq", + "https://frontendbootcamp.proshore.eu/accounts/login" + ); + } + + typeEmail(email) { + this.elements.emailInput().type(email); + } + typePassword(password) { + this.elements.passwordInput().type(password); + } + clickOnLoginButton() { + this.elements.loginBtn().click({ force: true }); + } + + verifyPasswordLengthErrorMessage() { + this.elements + .validationError() + .should("have.text", "Password length must be at least 6 characters."); + } + verifyInvalidCredentialAlertMessage() { + this.elements + .loginError() + .should("have.text", "Please enter valid email or password."); + } +} + +module.exports = new login_PO(); diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 66ea16e..c7632eb 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -22,4 +22,13 @@ // // // -- 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('login', () => { + cy.clearCookies() + cy.clearLocalStorage() + cy.get("#email").type(Cypress.env("APP_EMAIL")) + cy.get("#password").type(Cypress.env("APP_PASSWORD")) + .type("{enter}") + cy.url().should("eq","https://frontendbootcamp.proshore.eu/tracker") + }) + \ No newline at end of file diff --git a/utilites/helper.js b/utilites/helper.js new file mode 100644 index 0000000..37c98ce --- /dev/null +++ b/utilites/helper.js @@ -0,0 +1,19 @@ +function getRandomString(length = 5) { + const characters = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; +} + +function getRandomEmail() { + const randomString = getRandomString(); + return randomString + "@gmail.com"; +} + +module.exports = { + getRandomString, + getRandomEmail, +};