OWASP/SSO_Project

View on GitHub
cypress/support/commands.js

Summary

Maintainability
A
0 mins
Test Coverage
// Get all emails
Cypress.Commands.add("getEmails", () => {
    cy.request("http://"+Cypress.env("MAILHOST")+":8025/api/v2/messages").its("body");
});

// Just get the last email
Cypress.Commands.add("getLastEmail", () => {
    return cy.getEmails().then(emails => {
        let result = null;
        if(emails.count > 0) {
            const sortedItems = emails.items.slice().sort((a, b) => b.Created - a.Created);
            result = sortedItems[0];
        }
        return cy.wrap(result);
    });
});

// Only get the relevant parts from the last email, mostly used
Cypress.Commands.add("getLastEmailBody", () => {
    return cy.getLastEmail().then(email => {
        const body = email.Content.Body.replace(/=\s+/g, "");
        const linkParts = body.match(/(https?:\/\/([^\/]+?)\/#(\/([^\/]+?)(?:(?:\/)([^\/]+?))?))\s*----/);
        const link = {
            full: linkParts[1],
            host: linkParts[2],
            path: linkParts[3],
            endpoint: linkParts[4],
        };
        if(linkParts.length > 4) {
            link.token = linkParts[5];
        }
        
        return cy.wrap({
            body,
            link,
        });
    });
});

// Check if user is logged in
Cypress.Commands.add("isAuthenticated", () => {
    cy.url().should("include", "/audit");
});

// Check if user is at landing page (= login)
Cypress.Commands.add("isGuest", () => {
    cy.url().should("match", /#\/$/);
});

// Expect number of audit logs
Cypress.Commands.add("expectLogIncrease", num => {
    cy.get(".data-logs .accordion-row").should("have.length", Cypress.env("logLogCount") + num);
});

// Shortcut to log in (-> showing 2fa screen)
Cypress.Commands.add("login", () => {
    cy.registerUser(); // If we need a login, we will need the user as well
    cy.visit("/");

    cy.get("#email").type(Cypress.env("emailAddress"));
    cy.get("#password").type(Cypress.env("basePassword"));
    cy.get(".btn").click();
});

// Shortcut to authenticate (login+2fa)
Cypress.Commands.add("authenticate", () => {
    cy.login();
    
    cy.get("#confirmEmail").click();
    cy.get(".alert-success").should("be.visible");
    
    cy.wait(1000);
    cy.getLastEmailBody().then(email => {
        expect(email.link.endpoint).to.equal("two-factor");
        cy.visit(email.link.path);
        cy.isAuthenticated();
        
        cy.wrap(true);
    });
});

// Assumes you"re on /audit
Cypress.Commands.add("logout", () => {
    cy.get("#logout").click();
    cy.isGuest();
});

// Reset database to empty
Cypress.Commands.add("clearData", () => {
    cy.task("sqlBulk", [
        "SET FOREIGN_KEY_CHECKS = 0",
        "TRUNCATE audit",
        "TRUNCATE authenticators",
        "TRUNCATE emailConfirm",
        "TRUNCATE passwords",
        "TRUNCATE userSessions",
        "TRUNCATE websites",
        "TRUNCATE users",
        "SET FOREIGN_KEY_CHECKS = 1",
    ]);
});

// Add basic user to not have to register all the time again
// Ignores if the user already exists
Cypress.Commands.add("registerUser", () => {
    cy.task("sqlBulk", [["INSERT IGNORE INTO users (username, created, last_login) VALUES (?, NOW(), NULL)", Cypress.env("emailAddress")]]).then(result => {
        cy.task("sqlBulk", [[
            "INSERT IGNORE INTO passwords (userId, password, created) VALUES (?, ?, NOW())", [
                result[0].insertId, Cypress.env("basePasswordHash"),
            ]
        ]]);
    });
});