0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2024-12-30 20:33:54 -05:00
logto/packages/connectors/connector-smtp/src/index.test.ts
Gao Sun 6b322a537c
refactor: add connector packages
the initial commit to move all connector packages to the main
repo.
2023-04-01 15:53:14 +08:00

123 lines
4.3 KiB
TypeScript

import { VerificationCodeType } from '@logto/connector-kit';
import type { Transporter } from 'nodemailer';
import nodemailer from 'nodemailer';
import createConnector from './index.js';
import {
mockedConfig,
mockedOauth2AuthWithKey,
mockedOauth2AuthWithToken,
mockedTlsOptionsWithTls,
mockedTlsOptionsWithoutTls,
mockedConnectionOptionsValid,
mockedConnectionOptionsInvalid,
mockedDebuggingOptions,
mockedSecurityOptions,
} from './mock.js';
import { smtpConfigGuard } from './types.js';
const { jest } = import.meta;
const getConfig = jest.fn().mockResolvedValue(mockedConfig);
const sendMail = jest.fn();
// @ts-expect-error for testing
jest.spyOn(nodemailer, 'createTransport').mockReturnValue({ sendMail } as Transporter);
describe('SMTP connector', () => {
afterEach(() => {
jest.clearAllMocks();
});
it('init without throwing errors', async () => {
await expect(createConnector({ getConfig })).resolves.not.toThrow();
});
it('should send mail with proper options', async () => {
const connector = await createConnector({ getConfig });
await connector.sendMessage({
to: 'foo',
type: VerificationCodeType.Register,
payload: { code: '123456' },
});
expect(sendMail).toHaveBeenCalledWith({
from: '<notice@test.smtp>',
subject: 'Logto Register with SMTP',
text: 'This is for register purposes only. Your verification code is 123456.',
to: 'foo',
});
});
it('should send mail with proper subject', async () => {
const connector = await createConnector({ getConfig });
await connector.sendMessage({
to: 'bar',
type: VerificationCodeType.SignIn,
payload: { code: '234567' },
});
expect(sendMail).toHaveBeenCalledWith({
from: '<notice@test.smtp>',
subject: 'Logto Sign-In with SMTP 234567',
text: 'This is for sign-in purposes only. Your verification code is 234567.',
to: 'bar',
});
});
});
describe('Test config guard', () => {
it('basic config', () => {
const result = smtpConfigGuard.safeParse(mockedConfig);
expect(result.success && result.data).toMatchObject(expect.objectContaining(mockedConfig));
});
it('config with oauth2 auth (private key needed)', () => {
const testConfig = { ...mockedConfig, auth: mockedOauth2AuthWithKey };
const result = smtpConfigGuard.safeParse(testConfig);
expect(result.success && result.data).toMatchObject(expect.objectContaining(testConfig));
});
it('config with oauth2 auth (token needed)', () => {
const testConfig = { ...mockedConfig, auth: mockedOauth2AuthWithToken };
const result = smtpConfigGuard.safeParse(testConfig);
expect(result.success && result.data).toMatchObject(expect.objectContaining(testConfig));
});
it('config with tls options (with additional `tls` configuration)', () => {
const testConfig = { ...mockedConfig, ...mockedTlsOptionsWithTls };
const result = smtpConfigGuard.safeParse(testConfig);
expect(result.success && result.data).toMatchObject(
expect.objectContaining(mockedTlsOptionsWithTls)
);
});
it('config with tls options (without additional `tls` configuration)', () => {
const testConfig = { ...mockedConfig, ...mockedTlsOptionsWithoutTls };
const result = smtpConfigGuard.safeParse(testConfig);
expect(result.success && result.data).toMatchObject(expect.objectContaining(mockedConfig));
});
it('config with VALID connection options', () => {
const testConfig = { ...mockedConfig, ...mockedConnectionOptionsValid };
const result = smtpConfigGuard.safeParse(testConfig);
expect(result.success && result.data).toMatchObject(expect.objectContaining(testConfig));
});
it('config with INVALID connection options', () => {
const testConfig = { ...mockedConfig, ...mockedConnectionOptionsInvalid };
const result = smtpConfigGuard.safeParse(testConfig);
expect(result.success && result.data).toMatchObject(expect.objectContaining(mockedConfig));
});
it('config with debugging and security options', () => {
const testConfig = {
...mockedConfig,
...mockedDebuggingOptions,
...mockedSecurityOptions,
};
const result = smtpConfigGuard.safeParse(testConfig);
expect(result.success && result.data).toMatchObject(expect.objectContaining(testConfig));
});
});