Files
payload/packages/plugin-cloud/src/plugin.spec.ts
2024-07-11 15:27:01 -04:00

177 lines
5.3 KiB
TypeScript

import type { Config, Payload } from 'payload'
import { jest } from '@jest/globals'
import { nodemailerAdapter } from '@payloadcms/email-nodemailer'
import nodemailer from 'nodemailer'
import { defaults } from 'payload'
import { payloadCloudPlugin } from './plugin.js'
const mockedPayload: Payload = jest.fn() as unknown as Payload
describe('plugin', () => {
let createTransportSpy: jest.Spied<any>
const skipVerify = true
beforeEach(() => {
createTransportSpy = jest.spyOn(nodemailer, 'createTransport').mockImplementationOnce(() => {
return {
transporter: {
name: 'Nodemailer - SMTP',
},
verify: jest.fn(),
} as unknown as ReturnType<typeof nodemailer.createTransport>
})
const createTestAccountSpy = jest.spyOn(nodemailer, 'createTestAccount').mockResolvedValueOnce({
pass: 'password',
user: 'user',
web: 'ethereal.email',
} as unknown as nodemailer.TestAccount)
})
describe('not in Payload Cloud', () => {
it('should return unmodified config', async () => {
const plugin = payloadCloudPlugin()
const config = await plugin(createConfig())
assertNoCloudStorage(config)
expect(config.email).toBeUndefined()
})
})
describe('in Payload Cloud', () => {
beforeEach(() => {
process.env.PAYLOAD_CLOUD = 'true'
process.env.PAYLOAD_CLOUD_EMAIL_API_KEY = 'test-key'
process.env.PAYLOAD_CLOUD_DEFAULT_DOMAIN = 'test-domain.com'
})
describe('storage', () => {
// eslint-disable-next-line jest/expect-expect
it('should default to using payload cloud storage', async () => {
const plugin = payloadCloudPlugin()
const config = await plugin(createConfig())
assertCloudStorage(config)
})
// eslint-disable-next-line jest/expect-expect
it('should allow opt-out', async () => {
const plugin = payloadCloudPlugin({ storage: false })
const config = await plugin(createConfig())
assertNoCloudStorage(config)
})
})
describe('email', () => {
it('should default to using payload cloud email', async () => {
const plugin = payloadCloudPlugin()
const config = await plugin(createConfig())
expect(createTransportSpy).toHaveBeenCalledWith(
expect.objectContaining({
host: 'smtp.resend.com',
}),
)
})
it('should allow opt-out', async () => {
const plugin = payloadCloudPlugin({ email: false })
const config = await plugin(createConfig())
expect(config.email).toBeUndefined()
})
it('should allow PAYLOAD_CLOUD_EMAIL_* env vars to be unset', async () => {
delete process.env.PAYLOAD_CLOUD_EMAIL_API_KEY
delete process.env.PAYLOAD_CLOUD_DEFAULT_DOMAIN
const plugin = payloadCloudPlugin()
const config = await plugin(createConfig())
expect(config.email).toBeUndefined()
})
it('should not modify existing email transport', async () => {
const logSpy = jest.spyOn(console, 'log')
const existingTransport = nodemailer.createTransport({
name: 'existing-transport',
// eslint-disable-next-line @typescript-eslint/require-await
send: async (mail) => {
console.log('mock send', mail)
},
version: '0.0.1',
})
const configWithTransport = createConfig({
email: await nodemailerAdapter({
defaultFromAddress: 'test@test.com',
defaultFromName: 'Test',
skipVerify,
transport: existingTransport,
}),
})
const plugin = payloadCloudPlugin()
const config = await plugin(configWithTransport)
expect(logSpy).toHaveBeenCalledWith(
expect.stringContaining('Payload Cloud Email is enabled but'),
)
// expect(config.email).toBeUndefined()
})
it('should allow setting fromName and fromAddress', async () => {
const defaultFromName = 'Test'
const defaultFromAddress = 'test@test.com'
const configWithPartialEmail = createConfig({
email: await nodemailerAdapter({
defaultFromAddress,
defaultFromName,
skipVerify,
}),
})
const plugin = payloadCloudPlugin()
const config = await plugin(configWithPartialEmail)
const emailConfig = config.email as Awaited<ReturnType<typeof nodemailerAdapter>>
const initializedEmail = emailConfig({ payload: mockedPayload })
expect(initializedEmail.defaultFromName).toEqual(defaultFromName)
expect(initializedEmail.defaultFromAddress).toEqual(defaultFromAddress)
expect(createTransportSpy).toHaveBeenCalledWith(
expect.objectContaining({
host: 'smtp.resend.com',
}),
)
})
})
})
})
function assertCloudStorage(config: Config) {
expect(config.upload?.useTempFiles).toEqual(true)
}
function assertNoCloudStorage(config: Config) {
expect(config.upload?.useTempFiles).toBeFalsy()
}
async function assertCloudEmail(config: Config) {
expect(config.email && 'name' in config.email).toStrictEqual('Nodemailer - SMTP')
}
function createConfig(overrides?: Partial<Config>): Config {
return {
...defaults,
...overrides,
} as Config
}