152 lines
4.1 KiB
JavaScript
152 lines
4.1 KiB
JavaScript
import {
|
|
sidebar,
|
|
toggleDashboardSubscriptionsSidebar,
|
|
} from "e2e/support/helpers";
|
|
|
|
import { WEBMAIL_CONFIG } from "../cypress_data";
|
|
|
|
const INBOX_TIMEOUT = 5000;
|
|
const INBOX_INTERVAL = 100;
|
|
|
|
const { WEB_PORT, SMTP_PORT } = WEBMAIL_CONFIG;
|
|
|
|
/**
|
|
* `bun run test-cypress` starts maildev for you via
|
|
* e2e/test/scenarios/docker-compose.yml. To start it manually instead:
|
|
* `docker run -d -p 127.0.0.1:1180:1080 -p 127.0.0.1:1125:1025 maildev/maildev:2.2.1`
|
|
* or
|
|
* `npx maildev -s 1125 -w 1180`
|
|
*/
|
|
export const setupSMTP = () => {
|
|
cy.log("Set up Webmail SMTP server");
|
|
|
|
cy.request("PUT", "/api/email", {
|
|
"email-smtp-host": "localhost",
|
|
"email-smtp-port": SMTP_PORT,
|
|
"email-smtp-username": "admin",
|
|
"email-smtp-password": "admin",
|
|
"email-smtp-security": "none",
|
|
"email-from-address": "mailer@metabase.test",
|
|
"email-from-name": "Metabase",
|
|
"email-reply-to": ["reply-to@metabase.test"],
|
|
});
|
|
|
|
// We must always clear Webmail's inbox before each test
|
|
clearInbox();
|
|
};
|
|
|
|
export const getInbox = (emailsCount) => {
|
|
return getInboxWithRetry(emailsCount);
|
|
};
|
|
|
|
const getInboxWithRetry = (emailsCount, timeout = INBOX_TIMEOUT) => {
|
|
return cy
|
|
.request("GET", `http://localhost:${WEB_PORT}/email`)
|
|
.then((response) => {
|
|
if (
|
|
response.body.length &&
|
|
(emailsCount == null || emailsCount === response.body.length)
|
|
) {
|
|
return cy.wrap(response);
|
|
} else if (timeout > 0) {
|
|
cy.wait(INBOX_INTERVAL);
|
|
return getInboxWithRetry(emailsCount, timeout - INBOX_INTERVAL);
|
|
} else {
|
|
throw new Error("Inbox retry timeout");
|
|
}
|
|
});
|
|
};
|
|
|
|
export const clearInbox = () => {
|
|
return cy.request("DELETE", `http://localhost:${WEB_PORT}/email/all`);
|
|
};
|
|
|
|
export const viewEmailPage = (emailSubject) => {
|
|
const webmailInterface = `http://localhost:${WEB_PORT}`;
|
|
|
|
cy.window().then((win) => (win.location.href = webmailInterface));
|
|
cy.findByText(emailSubject).click();
|
|
};
|
|
|
|
export const openEmailPage = (emailSubject) => {
|
|
const webmailInterface = `http://localhost:${WEB_PORT}`;
|
|
|
|
cy.window().then((win) => (win.location.href = webmailInterface));
|
|
cy.findAllByText(emailSubject).first().click();
|
|
|
|
return cy.hash().then((path) => {
|
|
const htmlPath = `${webmailInterface}${path.slice(1)}/html`;
|
|
cy.window().then((win) => (win.location.href = htmlPath));
|
|
cy.findByText(emailSubject);
|
|
});
|
|
};
|
|
|
|
export const clickSend = () => {
|
|
cy.intercept("POST", "/api/pulse/test").as("emailSent");
|
|
|
|
cy.findByText("Send email now").click();
|
|
cy.wait("@emailSent");
|
|
};
|
|
|
|
export const openAndAddEmailsToSubscriptions = (recipients) => {
|
|
toggleDashboardSubscriptionsSidebar();
|
|
|
|
sidebar().findByText("Set up a dashboard subscription").should("be.visible");
|
|
|
|
cy.findByText("Email it").click();
|
|
|
|
recipients.forEach((recipient) => {
|
|
cy.findByTestId("token-field")
|
|
.find("input")
|
|
.click()
|
|
.type(`${recipient}{downarrow}{enter}`)
|
|
.blur();
|
|
});
|
|
};
|
|
|
|
export const setupSubscriptionWithRecipients = (recipients) => {
|
|
openAndAddEmailsToSubscriptions(recipients);
|
|
sidebar().findByText("Done").click();
|
|
};
|
|
|
|
export const openPulseSubscription = () => {
|
|
sidebar().findByLabelText("Pulse Card").click();
|
|
};
|
|
|
|
export const emailSubscriptionRecipients = () => {
|
|
openPulseSubscription();
|
|
clickSend();
|
|
};
|
|
|
|
export function sendEmailAndAssert(callback) {
|
|
clickSend();
|
|
|
|
cy.request("GET", `http://localhost:${WEB_PORT}/email`).then(({ body }) => {
|
|
callback(body[0]);
|
|
});
|
|
}
|
|
|
|
export function sendEmailAndVisitIt() {
|
|
clickSend();
|
|
const emailUrl = `http://localhost:${WEB_PORT}/email`;
|
|
return cy.request("GET", emailUrl).then(({ body }) => {
|
|
const latest = body.slice(-1)[0];
|
|
cy.visit(`${emailUrl}/${latest.id}/html`);
|
|
});
|
|
}
|
|
|
|
export function sendAlertAndVisitIt() {
|
|
cy.intercept("POST", "/api/notification/send").as("testAlert");
|
|
cy.findByLabelText("New alert")
|
|
.should("be.visible")
|
|
.findByText("Send now")
|
|
.click();
|
|
cy.wait("@testAlert");
|
|
|
|
const emailUrl = `http://localhost:${WEB_PORT}/email`;
|
|
return cy.request("GET", emailUrl).then(({ body }) => {
|
|
const latest = body.slice(-1)[0];
|
|
cy.visit(`${emailUrl}/${latest.id}/html`);
|
|
});
|
|
}
|