86 lines
2.8 KiB
TypeScript
86 lines
2.8 KiB
TypeScript
import { ConfigService } from '@nestjs/config';
|
|
import { MailerService } from '@nestjs-modules/mailer';
|
|
import { MailService } from './mail.service';
|
|
|
|
describe('MailService', () => {
|
|
let service: MailService;
|
|
let sendMail: jest.Mock;
|
|
let configGet: jest.Mock;
|
|
|
|
beforeEach(() => {
|
|
sendMail = jest.fn().mockResolvedValue(undefined);
|
|
configGet = jest.fn().mockReturnValue('https://app.example.com');
|
|
|
|
service = new MailService(
|
|
{ sendMail } as unknown as MailerService,
|
|
{ get: configGet } as unknown as ConfigService,
|
|
);
|
|
});
|
|
|
|
it('sends the activation mail with the confirm-email link', async () => {
|
|
await service.userSignUp({
|
|
to: 'user@example.com',
|
|
data: { hash: 'abc123', firstName: 'Max' },
|
|
});
|
|
|
|
expect(sendMail).toHaveBeenCalledTimes(1);
|
|
const call = sendMail.mock.calls[0][0];
|
|
expect(call.to).toBe('user@example.com');
|
|
expect(call.template).toBe('activation');
|
|
expect(call.context.url).toBe(
|
|
'https://app.example.com/confirm-email/abc123',
|
|
);
|
|
expect(call.context.firstName).toBe('Max');
|
|
});
|
|
|
|
it('sends the reset-password mail with the password-change link', async () => {
|
|
await service.forgotPassword({
|
|
to: 'user@example.com',
|
|
data: { hash: 'xyz789', firstName: 'Erika' },
|
|
});
|
|
|
|
expect(sendMail).toHaveBeenCalledTimes(1);
|
|
const call = sendMail.mock.calls[0][0];
|
|
expect(call.to).toBe('user@example.com');
|
|
expect(call.template).toBe('reset-password');
|
|
expect(call.context.url).toBe(
|
|
'https://app.example.com/password-change/xyz789',
|
|
);
|
|
expect(call.context.firstName).toBe('Erika');
|
|
});
|
|
|
|
it('works without a firstName (optional personalization)', async () => {
|
|
await service.userSignUp({
|
|
to: 'user@example.com',
|
|
data: { hash: 'abc123' },
|
|
});
|
|
|
|
const call = sendMail.mock.calls[0][0];
|
|
expect(call.context.firstName).toBeUndefined();
|
|
});
|
|
|
|
it('sends the cashbox export mail with the PDF attachment', async () => {
|
|
const attachment = Buffer.from('%PDF-1.4 fake');
|
|
|
|
await service.cashboxExport(
|
|
{
|
|
to: 'vorstand@example.com, kassier@example.com',
|
|
data: { teamName: 'Team A', from: '2026-08-01', to: '2026-08-31' },
|
|
},
|
|
attachment,
|
|
'kassenbuch_team-a_2026-08-01_2026-08-31.pdf',
|
|
);
|
|
|
|
expect(sendMail).toHaveBeenCalledTimes(1);
|
|
const call = sendMail.mock.calls[0][0];
|
|
expect(call.to).toBe('vorstand@example.com, kassier@example.com');
|
|
expect(call.template).toBe('cashbox-export');
|
|
expect(call.context.teamName).toBe('Team A');
|
|
expect(call.context.from).toBe('2026-08-01');
|
|
expect(call.context.to).toBe('2026-08-31');
|
|
expect(call.attachments).toEqual([
|
|
{ filename: 'kassenbuch_team-a_2026-08-01_2026-08-31.pdf', content: attachment },
|
|
]);
|
|
});
|
|
});
|