Add password reset email tests
This commit is contained in:
parent
0440110da9
commit
6362526168
|
|
@ -0,0 +1,58 @@
|
|||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
vi.mock('@/lib/nodemailer', () => ({
|
||||
transporter: {
|
||||
sendMail: vi.fn(),
|
||||
},
|
||||
}));
|
||||
|
||||
import { transporter } from '@/lib/nodemailer';
|
||||
import { sendPasswordResetEmail } from '@/lib/nodemailer/reset-password';
|
||||
|
||||
describe('sendPasswordResetEmail', () => {
|
||||
const originalEnv = { ...process.env };
|
||||
const sendMailMock = vi.mocked(transporter.sendMail);
|
||||
|
||||
beforeEach(() => {
|
||||
process.env = {
|
||||
...originalEnv,
|
||||
NODEMAILER_EMAIL: 'sender@example.com',
|
||||
NODEMAILER_PASSWORD: 'secret',
|
||||
};
|
||||
sendMailMock.mockReset();
|
||||
sendMailMock.mockResolvedValue({ messageId: 'msg-123' } as never);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
process.env = { ...originalEnv };
|
||||
});
|
||||
|
||||
it('escapes interpolated values before building the HTML email', async () => {
|
||||
await sendPasswordResetEmail({
|
||||
email: 'user@example.com',
|
||||
name: '<Admin & Co.>',
|
||||
resetUrl: 'https://example.com/reset-password?token=a b&next=<script>',
|
||||
});
|
||||
|
||||
expect(sendMailMock).toHaveBeenCalledTimes(1);
|
||||
const [mailOptions] = sendMailMock.mock.calls[0];
|
||||
|
||||
expect(mailOptions.html).toContain('Hi <Admin,');
|
||||
expect(mailOptions.html).toContain('href="https://example.com/reset-password?token=a%20b&next=%3Cscript%3E"');
|
||||
expect(mailOptions.html).not.toContain('<script>');
|
||||
expect(mailOptions.text).toContain('https://example.com/reset-password?token=a%20b&next=%3Cscript%3E');
|
||||
});
|
||||
|
||||
it('throws when reset email credentials are missing', async () => {
|
||||
delete process.env.NODEMAILER_EMAIL;
|
||||
delete process.env.NODEMAILER_PASSWORD;
|
||||
|
||||
await expect(
|
||||
sendPasswordResetEmail({
|
||||
email: 'user@example.com',
|
||||
name: 'User',
|
||||
resetUrl: 'https://example.com/reset-password?token=test',
|
||||
})
|
||||
).rejects.toThrow('Email credentials not configured');
|
||||
});
|
||||
});
|
||||
Loading…
Reference in New Issue