Add mailcatcher fixtures

This commit is contained in:
Kuba Orlik 2025-09-29 16:46:10 +02:00
parent 6bc0653072
commit e66b5f5679

View File

@ -7,11 +7,64 @@ import * as dgram from "dgram";
import * as http from "http";
import * as fs from "fs/promises";
import { MongoClient } from "mongodb";
import { MONGO_PORT, MONGO_HOST } from "../src/back/config.js";
import {
MONGO_PORT,
MONGO_HOST,
MAILCATCHER_API_PORT,
MAILCATCHER_SMTP_PORT,
} from "../src/back/config.js";
export class MailcatcherMessage {
id: number;
sender: string;
recipients: string[];
subject: string;
size: string;
created_at: string;
constructor({
id,
sender,
recipients,
subject,
size,
created_at,
}: {
id: number;
sender: string;
recipients: string[];
subject: string;
size: string;
created_at: string;
}) {
this.id = id;
this.sender = sender;
this.recipients = recipients;
this.subject = subject;
this.size = size;
this.created_at = created_at;
}
async getBody(format: "html" | "plain" | "source") {
return (await fetch(`${mailcatcher_url}/messages/${this.id}.${format}`)).text();
}
async getURLs(): Promise<string[]> {
const url_regex =
/https?:\/\/[a-z0-9.]+(:[0-9]+)\/[a-zA-Z0-9.\/!@#$%^&*()?\-=]+/g;
const body = await this.getBody("plain");
return Array.from(body.matchAll(url_regex)).map((e) => e[0]);
}
}
export type MailcatcherAPI = {
getLatestMessage: () => Promise<MailcatcherMessage>;
};
type TestFixtures = {
backend: { url: string; env: Record<string, string> };
setMarkdownValue: (field_name: string, value: string) => Promise<void>;
email: MailcatcherAPI;
};
const c8 = "./node_modules/c8/bin/c8.js";
@ -19,6 +72,8 @@ const app_host = process.env.TESTS_RUN_IN_DOCKER
? "test" // the docker name
: "172.17.0.1"; // ip to access localhost from within docker (playwright always runs in docker)
const mailcatcher_url = `http://${app_host}:${MAILCATCHER_API_PORT}`;
export async function waitForHttpPort({
port,
host = app_host,
@ -100,7 +155,10 @@ export const test = base.extend<TestFixtures>({
...(process.env.TESTS_RUN_IN_DOCKER
? { MEILISEARCH_HOST: `http://meilisearch:7700` }
: {}),
MAILCATCHER_HOST: app_host,
MAILCATCHER_SMTP_PORT: String(MAILCATCHER_SMTP_PORT),
SEALIOUS_KILLSWITCH_PORT: `${killswitch_port}`,
SEALIOUS_BASE_URL: `http://${app_host}:${port}`,
};
const backendProcess = spawn(
@ -167,6 +225,19 @@ export const test = base.extend<TestFixtures>({
}
});
},
email: ({}, use) => {
async function getLatestMessage() {
const all_messages = (await (
await fetch(`${mailcatcher_url}/messages`)
).json()) as Record<string, unknown>[];
return new MailcatcherMessage(all_messages.at(-1) as any);
}
async function getURLsFromLatestMessage() {}
return use({
getLatestMessage,
});
},
});
export { expect } from "@playwright/test";