diff --git a/bun.lockb b/bun.lockb index 0c3cf5e3..a07a0f82 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 85ff108e..10bce2b5 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "jest-date-mock": "^1.0.10", "jest-wip-reporter": "^2.1.0", "open": "^10.1.0", + "puppeteer": "^24.19.0", "ts-jest": "^29.1.1", "ts-unused-exports": "^10.0.1", "tsx": "^4.9.3", diff --git a/src/sync-worker/training-summary/training_summary_email.ts b/src/sync-worker/training-summary/training_summary_email.ts index 668f5ac6..ab3e1cd9 100644 --- a/src/sync-worker/training-summary/training_summary_email.ts +++ b/src/sync-worker/training-summary/training_summary_email.ts @@ -18,7 +18,7 @@ const TRAINING_SUMMARY_EMAIL_INTERVAL: Duration = Duration.fromObject({ hours: 12, // Temp for testing. }); -const generateTrainingSummaryEmail = ( +export const generateTrainingSummaryEmail = ( emailAddress: EmailAddress, content: EmailContent ): Email => ({ diff --git a/tests/sync-worker/training-summary/generate-training-summary-email.test.ts b/tests/sync-worker/training-summary/generate-training-summary-email.test.ts new file mode 100644 index 00000000..5c7dd5c0 --- /dev/null +++ b/tests/sync-worker/training-summary/generate-training-summary-email.test.ts @@ -0,0 +1,55 @@ +import {EmailContent} from '../../../src/sync-worker/training-summary/gather-email-content'; +import { + initTestFramework, + TestFramework, +} from '../../read-models/test-framework'; +import {EmailAddress} from '../../../src/types/email-address'; +import {Email} from '../../../src/types'; +import puppeteer from 'puppeteer'; +import express from 'express'; +import { generateTrainingSummaryEmail } from '../../../src/sync-worker/training-summary/training_summary_email'; + +const renderEmail = async (email: Email) => { + const outputPath = './email_screenshot.png'; + const browser = await puppeteer.launch(); + const app = express(); + app.get('/', (req, res) => res.send(email.html)); + const server = app.listen(40000, 'localhost'); + const page = await browser.newPage(); + await page.goto('http://localhost:40000'); + await page.setViewport({width: 1080, height: 1024}); + await page.screenshot({ + path: outputPath, + }); + await browser.close(); + await new Promise(res => server.close(res)); + return outputPath; +}; + +describe('Training summary email', () => { + const emailAddress: EmailAddress = 'test@localhost' as EmailAddress; + let framework: TestFramework; + beforeEach(async () => { + framework = await initTestFramework(); + }); + afterEach(() => { + framework.close(); + }); + describe('render email', () => { + let email: Email; + let rendered: string; + beforeEach(async () => { + const content: EmailContent = { + trainingStatsPerEquipment: [], + totalActiveMembers: 0, + membersJoinedWithin30Days: 0, + }; + email = generateTrainingSummaryEmail(emailAddress, content); + rendered = await renderEmail(email); + }); + + it('Is successfully rendered', () => { + expect(rendered).toBeDefined(); + }); + }); +});