Files
accounted/extensions/general/email/__tests__/email-provider.test.ts
T
Jakob Wennberg 523fba0419 feat(email): SMTP mailer behind the EmailService seam (EMAIL_PROVIDER=smtp); Resend stays the hosted default (#1746)
SmtpEmailService (nodemailer 9.0.5, exact-pinned) behind the existing EmailService seam. Provider resolution: EMAIL_PROVIDER wins, else RESEND_API_KEY selects Resend (hosted byte-identical), else SMTP_HOST selects SMTP. From header is built exactly like the Resend service after #1956 (no 'via <app>', fromAddress honored, platform-sender retry). STARTTLS is required by default (requireTLS) with SMTP_REQUIRE_TLS=false as an explicit opt-out for a plaintext LAN relay. Docs, env examples and the generated extension registry updated.
2026-08-30 11:54:47 +02:00

52 lines
1.9 KiB
TypeScript

import { describe, it, expect, afterEach, vi } from 'vitest'
import { createEmailService, resolveEmailProvider } from '../lib/email-provider'
import { ResendEmailService } from '../lib/resend-service'
import { SmtpEmailService } from '../lib/smtp-service'
afterEach(() => {
vi.unstubAllEnvs()
})
describe('resolveEmailProvider', () => {
it('defaults to resend when nothing is configured (unconfigured = no-op, as before)', () => {
vi.stubEnv('EMAIL_PROVIDER', '')
vi.stubEnv('RESEND_API_KEY', '')
vi.stubEnv('SMTP_HOST', '')
expect(resolveEmailProvider()).toBe('resend')
expect(createEmailService()).toBeInstanceOf(ResendEmailService)
})
it('picks smtp from SMTP_HOST when no Resend key exists (self-host path)', () => {
vi.stubEnv('EMAIL_PROVIDER', '')
vi.stubEnv('RESEND_API_KEY', '')
vi.stubEnv('SMTP_HOST', 'smtp.example.se')
expect(resolveEmailProvider()).toBe('smtp')
expect(createEmailService()).toBeInstanceOf(SmtpEmailService)
})
// Hosted stays hosted: SMTP variables on the side never move mail.
it('keeps Resend when both are present', () => {
vi.stubEnv('EMAIL_PROVIDER', '')
vi.stubEnv('RESEND_API_KEY', 're_x')
vi.stubEnv('SMTP_HOST', 'smtp.example.se')
expect(resolveEmailProvider()).toBe('resend')
})
it('honours EMAIL_PROVIDER as the explicit choice, case-insensitively', () => {
vi.stubEnv('RESEND_API_KEY', 're_x')
vi.stubEnv('EMAIL_PROVIDER', ' SMTP ')
expect(resolveEmailProvider()).toBe('smtp')
vi.stubEnv('EMAIL_PROVIDER', 'resend')
vi.stubEnv('RESEND_API_KEY', '')
vi.stubEnv('SMTP_HOST', 'smtp.example.se')
expect(resolveEmailProvider()).toBe('resend')
})
it('ignores an unknown EMAIL_PROVIDER value', () => {
vi.stubEnv('EMAIL_PROVIDER', 'sendgrid')
vi.stubEnv('RESEND_API_KEY', '')
vi.stubEnv('SMTP_HOST', 'smtp.example.se')
expect(resolveEmailProvider()).toBe('smtp')
})
})