mirror of
https://github.com/lukevella/rallly.git
synced 2025-05-20 20:36:19 +02:00
📦️ Update smtp-tester and fix test environment config (#1181)
This commit is contained in:
parent
0a0c38f1d4
commit
f66653c21a
8 changed files with 45 additions and 128 deletions
|
@ -4,4 +4,5 @@ NEXTAUTH_URL=$NEXT_PUBLIC_BASE_URL
|
||||||
SECRET_PASSWORD=abcdef1234567890abcdef1234567890
|
SECRET_PASSWORD=abcdef1234567890abcdef1234567890
|
||||||
DATABASE_URL=postgres://postgres:postgres@localhost:5450/rallly
|
DATABASE_URL=postgres://postgres:postgres@localhost:5450/rallly
|
||||||
SUPPORT_EMAIL=support@rallly.co
|
SUPPORT_EMAIL=support@rallly.co
|
||||||
|
SMTP_HOST=localhost
|
||||||
SMTP_PORT=4025
|
SMTP_PORT=4025
|
111
apps/web/declarations/smpt-tester.d.ts
vendored
111
apps/web/declarations/smpt-tester.d.ts
vendored
|
@ -1,111 +0,0 @@
|
||||||
declare module "smtp-tester" {
|
|
||||||
/**
|
|
||||||
* Initializes the SMTP tester.
|
|
||||||
*
|
|
||||||
* @param port The port of the SMTP server.
|
|
||||||
*/
|
|
||||||
function init(port: number): SmtpTester;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A callback that occurs when an email is received.
|
|
||||||
*
|
|
||||||
* @param recipient The bound recipient. Can be `undefined` if the handler is not bound to a specific recipient.
|
|
||||||
* @param id The local incrementing identifier of the email.
|
|
||||||
* @param email The email being received.
|
|
||||||
*/
|
|
||||||
type OnReceiveEmail = (
|
|
||||||
recipient: string,
|
|
||||||
id: number,
|
|
||||||
email: EmailInfo,
|
|
||||||
) => void;
|
|
||||||
|
|
||||||
type CaptureOneResponse = {
|
|
||||||
address: string;
|
|
||||||
id: string;
|
|
||||||
email: EmailInfo;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* The SMTP tester.
|
|
||||||
*/
|
|
||||||
interface SmtpTester {
|
|
||||||
/**
|
|
||||||
* Binds a callback to a specific recipient that is fired whenever an email is received for that specific recipient.
|
|
||||||
*
|
|
||||||
* @param recipient The recipient to bind to.
|
|
||||||
* @param callback The callback function.
|
|
||||||
*/
|
|
||||||
bind(recipient: string, callback: OnReceiveEmail): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Binds a callback that is fired whenever an email is received.
|
|
||||||
*
|
|
||||||
* @param callback The callback function.
|
|
||||||
*/
|
|
||||||
bind(callback: OnReceiveEmail): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Captures the next email received by the server.
|
|
||||||
*
|
|
||||||
* @param recipient The recipient to capture for. If not specified, the next email received will be captured.
|
|
||||||
* @param options The options for the capture.
|
|
||||||
*/
|
|
||||||
captureOne(
|
|
||||||
recipient: string,
|
|
||||||
options?: CaptureOptions,
|
|
||||||
): Promise<CaptureOneResponse>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stops the running SMTP server.
|
|
||||||
*/
|
|
||||||
stop(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stops the running SMTP server.
|
|
||||||
*
|
|
||||||
* @param callback The callback that is fired when the server has stopped.
|
|
||||||
*/
|
|
||||||
stop(callback: () => void): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Contains information about a received email.
|
|
||||||
*/
|
|
||||||
interface EmailInfo {
|
|
||||||
/**
|
|
||||||
* The sender of the email.
|
|
||||||
*/
|
|
||||||
readonly sender: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The body of the email.
|
|
||||||
*/
|
|
||||||
readonly body: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The HTML body of the email.
|
|
||||||
*/
|
|
||||||
readonly html: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Headers of the email.
|
|
||||||
*/
|
|
||||||
readonly headers: {
|
|
||||||
/**
|
|
||||||
* Who the email was sent from.
|
|
||||||
*/
|
|
||||||
from: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Who the email was sent to.
|
|
||||||
*/
|
|
||||||
to: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The subject of the email.
|
|
||||||
*/
|
|
||||||
subject: string;
|
|
||||||
|
|
||||||
[string]: string;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -92,7 +92,7 @@
|
||||||
"vitest": "^1.3.1",
|
"vitest": "^1.3.1",
|
||||||
"i18next-scanner": "^4.2.0",
|
"i18next-scanner": "^4.2.0",
|
||||||
"i18next-scanner-typescript": "^1.1.1",
|
"i18next-scanner-typescript": "^1.1.1",
|
||||||
"smtp-tester": "^2.0.1",
|
"smtp-tester": "^2.1.0",
|
||||||
"wait-on": "^6.0.1"
|
"wait-on": "^6.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { load } from "cheerio";
|
||||||
import smtpTester from "smtp-tester";
|
import smtpTester from "smtp-tester";
|
||||||
|
|
||||||
const testUserEmail = "test@example.com";
|
const testUserEmail = "test@example.com";
|
||||||
let mailServer: smtpTester.SmtpTester;
|
let mailServer: smtpTester.MailServer;
|
||||||
/**
|
/**
|
||||||
* Get the 6-digit code from the email
|
* Get the 6-digit code from the email
|
||||||
* @returns 6-digit code
|
* @returns 6-digit code
|
||||||
|
@ -14,6 +14,10 @@ const getCode = async () => {
|
||||||
wait: 5000,
|
wait: 5000,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!email.html) {
|
||||||
|
throw new Error("Email doesn't contain HTML");
|
||||||
|
}
|
||||||
|
|
||||||
const $ = load(email.html);
|
const $ = load(email.html);
|
||||||
|
|
||||||
return $("#code").text().trim();
|
return $("#code").text().trim();
|
||||||
|
@ -34,7 +38,8 @@ test.describe.serial(() => {
|
||||||
} catch {
|
} catch {
|
||||||
// User doesn't exist
|
// User doesn't exist
|
||||||
}
|
}
|
||||||
mailServer.stop();
|
|
||||||
|
mailServer.stop(() => {});
|
||||||
});
|
});
|
||||||
|
|
||||||
test.describe("new user", () => {
|
test.describe("new user", () => {
|
||||||
|
@ -109,6 +114,10 @@ test.describe.serial(() => {
|
||||||
wait: 5000,
|
wait: 5000,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!email.html) {
|
||||||
|
throw new Error("Email doesn't contain HTML");
|
||||||
|
}
|
||||||
|
|
||||||
const $ = load(email.html);
|
const $ = load(email.html);
|
||||||
|
|
||||||
const magicLink = $("#magicLink").attr("href");
|
const magicLink = $("#magicLink").attr("href");
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
import { expect, Page, test } from "@playwright/test";
|
import { expect, Page, test } from "@playwright/test";
|
||||||
import smtpTester, { SmtpTester } from "smtp-tester";
|
import smtpTester, { MailServer } from "smtp-tester";
|
||||||
import { NewPollPage } from "tests/new-poll-page";
|
import { NewPollPage } from "tests/new-poll-page";
|
||||||
|
|
||||||
test.describe.serial(() => {
|
test.describe.serial(() => {
|
||||||
let page: Page;
|
let page: Page;
|
||||||
|
|
||||||
let mailServer: SmtpTester;
|
let mailServer: MailServer;
|
||||||
test.beforeAll(async ({ browser }) => {
|
test.beforeAll(async ({ browser }) => {
|
||||||
page = await browser.newPage();
|
page = await browser.newPage();
|
||||||
mailServer = smtpTester.init(4025);
|
mailServer = smtpTester.init(4025);
|
||||||
});
|
});
|
||||||
|
|
||||||
test.afterAll(async () => {
|
test.afterAll(async () => {
|
||||||
mailServer.stop();
|
mailServer.stop(() => {});
|
||||||
});
|
});
|
||||||
|
|
||||||
test("create a new poll", async () => {
|
test("create a new poll", async () => {
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import { expect, Page, test } from "@playwright/test";
|
import { expect, Page, test } from "@playwright/test";
|
||||||
import smtpTester, { SmtpTester } from "smtp-tester";
|
import smtpTester, { MailServer } from "smtp-tester";
|
||||||
import { EditOptionsPage } from "tests/edit-options-page";
|
import { EditOptionsPage } from "tests/edit-options-page";
|
||||||
import { NewPollPage } from "tests/new-poll-page";
|
import { NewPollPage } from "tests/new-poll-page";
|
||||||
|
|
||||||
test.describe("edit options", () => {
|
test.describe("edit options", () => {
|
||||||
let page: Page;
|
let page: Page;
|
||||||
let editOptionsPage: EditOptionsPage;
|
let editOptionsPage: EditOptionsPage;
|
||||||
let mailServer: SmtpTester;
|
let mailServer: MailServer;
|
||||||
|
|
||||||
test.beforeAll(async ({ browser }) => {
|
test.beforeAll(async ({ browser }) => {
|
||||||
page = await browser.newPage();
|
page = await browser.newPage();
|
||||||
|
@ -19,7 +19,7 @@ test.describe("edit options", () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
test.afterAll(async () => {
|
test.afterAll(async () => {
|
||||||
mailServer.stop();
|
mailServer.stop(() => {});
|
||||||
});
|
});
|
||||||
|
|
||||||
test("should show warning when deleting options with votes in them", async () => {
|
test("should show warning when deleting options with votes in them", async () => {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { expect, Page, Request, test } from "@playwright/test";
|
import { expect, Page, Request, test } from "@playwright/test";
|
||||||
import { load } from "cheerio";
|
import { load } from "cheerio";
|
||||||
import smtpTester, { SmtpTester } from "smtp-tester";
|
import smtpTester, { MailServer } from "smtp-tester";
|
||||||
import { PollPage } from "tests/poll-page";
|
import { PollPage } from "tests/poll-page";
|
||||||
|
|
||||||
import { NewPollPage } from "./new-poll-page";
|
import { NewPollPage } from "./new-poll-page";
|
||||||
|
@ -11,7 +11,7 @@ test.describe(() => {
|
||||||
let touchRequest: Promise<Request>;
|
let touchRequest: Promise<Request>;
|
||||||
let editSubmissionUrl: string;
|
let editSubmissionUrl: string;
|
||||||
|
|
||||||
let mailServer: SmtpTester;
|
let mailServer: MailServer;
|
||||||
test.beforeAll(async ({ browser }) => {
|
test.beforeAll(async ({ browser }) => {
|
||||||
mailServer = smtpTester.init(4025);
|
mailServer = smtpTester.init(4025);
|
||||||
page = await browser.newPage();
|
page = await browser.newPage();
|
||||||
|
@ -26,7 +26,7 @@ test.describe(() => {
|
||||||
});
|
});
|
||||||
|
|
||||||
test.afterAll(async () => {
|
test.afterAll(async () => {
|
||||||
mailServer.stop();
|
mailServer.stop(() => {});
|
||||||
});
|
});
|
||||||
|
|
||||||
test("should call touch endpoint", async () => {
|
test("should call touch endpoint", async () => {
|
||||||
|
@ -62,7 +62,7 @@ test.describe(() => {
|
||||||
"Thanks for responding to Monthly Meetup",
|
"Thanks for responding to Monthly Meetup",
|
||||||
);
|
);
|
||||||
|
|
||||||
const $ = load(email.html);
|
const $ = load(email.html as string);
|
||||||
const href = $("#editSubmissionUrl").attr("href");
|
const href = $("#editSubmissionUrl").attr("href");
|
||||||
|
|
||||||
if (!href) {
|
if (!href) {
|
||||||
|
|
26
yarn.lock
26
yarn.lock
|
@ -5060,6 +5060,14 @@
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
iconv-lite "^0.6.3"
|
iconv-lite "^0.6.3"
|
||||||
|
|
||||||
|
"@types/mailparser@^3.4.0":
|
||||||
|
version "3.4.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/mailparser/-/mailparser-3.4.4.tgz#0bd71e205573b9dd9a445e10a8b8cb0e45420998"
|
||||||
|
integrity sha512-C6Znp2QVS25JqtuPyxj38Qh+QoFcLycdxsvcc6IZCGekhaMBzbdTXzwGzhGoYb3TfKu8IRCNV0sV1o3Od97cEQ==
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "*"
|
||||||
|
iconv-lite "^0.6.3"
|
||||||
|
|
||||||
"@types/mdast@^3.0.0":
|
"@types/mdast@^3.0.0":
|
||||||
version "3.0.11"
|
version "3.0.11"
|
||||||
resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz"
|
resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz"
|
||||||
|
@ -5270,6 +5278,14 @@
|
||||||
resolved "https://registry.npmjs.org/@types/smoothscroll-polyfill/-/smoothscroll-polyfill-0.3.1.tgz"
|
resolved "https://registry.npmjs.org/@types/smoothscroll-polyfill/-/smoothscroll-polyfill-0.3.1.tgz"
|
||||||
integrity sha512-+KkHw4y+EyeCtVXET7woHUhIbfWFCflc0E0mZnSV+ZdjPQeHt/9KPEuT7gSW/kFQ8O3EG30PLO++YhChDt8+Ag==
|
integrity sha512-+KkHw4y+EyeCtVXET7woHUhIbfWFCflc0E0mZnSV+ZdjPQeHt/9KPEuT7gSW/kFQ8O3EG30PLO++YhChDt8+Ag==
|
||||||
|
|
||||||
|
"@types/smtp-server@^3.5.7":
|
||||||
|
version "3.5.10"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/smtp-server/-/smtp-server-3.5.10.tgz#06d0338aea519469529847a12b0903678fdd6bea"
|
||||||
|
integrity sha512-i3Jx7sJ2qF52vjaOf3HguulXlWRFf6BSfsRLsIdmytDyVGv7KkhSs+gR9BXJnJWg1Ljkh/56Fh1Xqwa6u6X7zw==
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "*"
|
||||||
|
"@types/nodemailer" "*"
|
||||||
|
|
||||||
"@types/unist@*", "@types/unist@^2.0.0":
|
"@types/unist@*", "@types/unist@^2.0.0":
|
||||||
version "2.0.6"
|
version "2.0.6"
|
||||||
resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz"
|
resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz"
|
||||||
|
@ -12335,11 +12351,13 @@ smtp-server@^3.11.0:
|
||||||
ipv6-normalize "1.0.1"
|
ipv6-normalize "1.0.1"
|
||||||
nodemailer "6.7.3"
|
nodemailer "6.7.3"
|
||||||
|
|
||||||
smtp-tester@^2.0.1:
|
smtp-tester@^2.1.0:
|
||||||
version "2.0.1"
|
version "2.1.0"
|
||||||
resolved "https://registry.npmjs.org/smtp-tester/-/smtp-tester-2.0.1.tgz"
|
resolved "https://registry.yarnpkg.com/smtp-tester/-/smtp-tester-2.1.0.tgz#ed67ef933767cacb8defcbf0683f29d75335a1ca"
|
||||||
integrity sha512-mJicx4trPmlS2PY/ELG4LIKi8JdOGxnvm0/4oQxXErjwBT/crBUlyiMVzeliu69HHWeWRSOdTcNtlc34+1LodA==
|
integrity sha512-HfOBdHkdwoBO+Qb06H8ShVEc08nnvDbtYWzdT5iQMIeInBdLKu17XOhuaC79uM24zPApRfN3JAg627TIy3y/Ww==
|
||||||
dependencies:
|
dependencies:
|
||||||
|
"@types/mailparser" "^3.4.0"
|
||||||
|
"@types/smtp-server" "^3.5.7"
|
||||||
mailparser "^3.5.0"
|
mailparser "^3.5.0"
|
||||||
smtp-server "^3.11.0"
|
smtp-server "^3.11.0"
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue