import { faker } from "@faker-js/faker"; declare global { namespace Cypress { interface Chainable { /** * Logs in with a random user. Yields the user and adds an alias to the user * * @returns {typeof login} * @memberof Chainable * @example * cy.login() * @example * cy.login({ email: 'whatever@example.com' }) */ login: typeof login; /** * Deletes the current @user * * @returns {typeof cleanupUser} * @memberof Chainable * @example * cy.cleanupUser() * @example * cy.cleanupUser({ email: 'whatever@example.com' }) */ cleanupUser: typeof cleanupUser; /** * Extends the standard visit command to wait for the page to load * * @returns {typeof visitAndCheck} * @memberof Chainable * @example * cy.visitAndCheck('/') * @example * cy.visitAndCheck('/', 500) */ visitAndCheck: typeof visitAndCheck; } } } function login({ email = faker.internet.email(undefined, undefined, "example.com"), }: { email?: string; } = {}) { cy.then(() => ({ email })).as("user"); cy.exec( `npx ts-node --require tsconfig-paths/register ./cypress/support/create-user.ts "${email}"` ).then(({ stdout }) => { const cookieValue = stdout .replace(/.*(?.*)<\/cookie>.*/s, "$") .trim(); cy.setCookie("__session", cookieValue); }); return cy.get("@user"); } function cleanupUser({ email }: { email?: string } = {}) { if (email) { deleteUserByEmail(email); } else { cy.get("@user").then((user) => { const email = (user as { email?: string }).email; if (email) { deleteUserByEmail(email); } }); } cy.clearCookie("__session"); } function deleteUserByEmail(email: string) { cy.exec( `npx ts-node --require tsconfig-paths/register ./cypress/support/delete-user.ts "${email}"` ); cy.clearCookie("__session"); } // We're waiting a second because of this issue happen randomly // https://github.com/cypress-io/cypress/issues/7306 // Also added custom types to avoid getting detached // https://github.com/cypress-io/cypress/issues/7306#issuecomment-1152752612 // =========================================================== function visitAndCheck(url: string, waitTime: number = 1000) { cy.visit(url); cy.location("pathname").should("contain", url).wait(waitTime); } Cypress.Commands.add("login", login); Cypress.Commands.add("cleanupUser", cleanupUser); Cypress.Commands.add("visitAndCheck", visitAndCheck);