kill-the-newsletter/src/test.ts

86 lines
2.4 KiB
TypeScript
Raw Normal View History

2020-03-21 08:31:30 +01:00
import { webServer, emailServer } from ".";
2020-03-19 15:48:31 +01:00
import nodemailer from "nodemailer";
2020-03-20 18:48:53 +01:00
import axios from "axios";
import qs from "qs";
2020-03-18 20:21:44 +01:00
2020-03-19 02:44:21 +01:00
test("create feed", async () => {
2020-03-20 20:08:04 +01:00
const identifier = await createFeed();
2020-03-18 20:33:10 +01:00
2020-03-21 16:58:28 +01:00
expect(await getFeed(identifier)).toMatch("My Feed");
2020-03-18 20:21:44 +01:00
});
2020-03-19 01:16:00 +01:00
2020-03-19 05:20:28 +01:00
describe("receive email", () => {
test("HTML content", async () => {
2020-03-20 20:08:04 +01:00
const identifier = await createFeed();
2020-03-21 16:58:28 +01:00
await emailClient.sendMail({
2020-03-19 05:20:28 +01:00
from: "publisher@example.com",
2020-03-21 08:31:30 +01:00
to: `${identifier}@kill-the-newsletter.com`,
2020-03-19 05:20:28 +01:00
subject: "New Message",
html: "<p>HTML content</p>"
});
2020-03-21 16:58:28 +01:00
const feed = await getFeed(identifier);
2020-03-19 05:20:28 +01:00
expect(feed).toMatch("publisher@example.com");
expect(feed).toMatch("New Message");
expect(feed).toMatch("HTML content");
});
test("text content", async () => {
2020-03-20 20:08:04 +01:00
const identifier = await createFeed();
2020-03-21 16:58:28 +01:00
await emailClient.sendMail({
2020-03-19 05:20:28 +01:00
from: "publisher@example.com",
2020-03-21 08:31:30 +01:00
to: `${identifier}@kill-the-newsletter.com`,
2020-03-19 05:20:28 +01:00
subject: "New Message",
text: "TEXT content"
});
2020-03-21 16:58:28 +01:00
const feed = await getFeed(identifier);
2020-03-19 05:20:28 +01:00
expect(feed).toMatch("TEXT content");
});
test("truncation", async () => {
2020-03-20 20:08:04 +01:00
const identifier = await createFeed();
2020-03-19 05:20:28 +01:00
for (const repetition of [...new Array(4).keys()])
2020-03-21 16:58:28 +01:00
await emailClient.sendMail({
2020-03-19 05:20:28 +01:00
from: "publisher@example.com",
2020-03-21 08:31:30 +01:00
to: `${identifier}@kill-the-newsletter.com`,
2020-03-19 05:20:28 +01:00
subject: "New Message",
text: `REPETITION ${repetition} `.repeat(10_000)
});
2020-03-21 16:58:28 +01:00
const feed = await getFeed(identifier);
2020-03-19 05:20:28 +01:00
expect(feed).toMatch("REPETITION 3");
expect(feed).not.toMatch("REPETITION 0");
2020-03-21 16:58:28 +01:00
});
2020-03-22 15:23:05 +01:00
2020-03-23 02:27:03 +01:00
test("nonexistent address", async () => {
2020-03-22 15:23:05 +01:00
await emailClient.sendMail({
from: "publisher@example.com",
2020-03-23 02:27:03 +01:00
to: "nonexistent@kill-the-newsletter.com",
2020-03-22 15:23:05 +01:00
subject: "New Message",
html: "<p>HTML content</p>"
});
});
2020-03-19 05:20:28 +01:00
});
2020-03-19 04:36:02 +01:00
2020-03-19 01:16:00 +01:00
afterAll(() => {
2020-03-20 22:31:46 +01:00
webServer.close();
2020-03-20 19:03:19 +01:00
// FIXME: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/43268
2020-03-20 22:31:46 +01:00
emailServer.close(() => {});
2020-03-19 01:16:00 +01:00
});
2020-03-19 04:36:02 +01:00
2020-03-21 16:58:28 +01:00
const webClient = axios.create({ baseURL: "http://localhost:8000" });
const emailClient = nodemailer.createTransport("smtp://localhost:2525");
2020-03-19 04:36:02 +01:00
async function createFeed(): Promise<string> {
2020-03-20 18:48:53 +01:00
return (
2020-03-21 16:58:28 +01:00
await webClient.post(
"/",
2020-03-20 18:48:53 +01:00
qs.stringify({
name: "My Feed"
})
)
).data.match(/(\w{20}).xml/)![1];
2020-03-19 04:36:02 +01:00
}
2020-03-19 05:20:28 +01:00
2020-03-21 16:58:28 +01:00
async function getFeed(identifier: string): Promise<string> {
return (await webClient.get(`/feeds/${identifier}.xml`)).data;
2020-03-19 05:20:28 +01:00
}