import assert from 'node:assert/strict'
import { describe, it } from 'node:test'
import {
assembleComposedMime,
encodeHeaderValue,
encodeUtf8Base64,
formatAddressHeader,
} from './gmail-mime.ts'
describe('formatAddressHeader', () => {
it('returns null for empty values', () => {
assert.equal(formatAddressHeader(undefined), null)
assert.equal(formatAddressHeader([]), null)
assert.equal(formatAddressHeader(['', ' ']), null)
})
it('keeps a single already-formatted address', () => {
assert.equal(formatAddressHeader('sponsor-kcd@10xn.dev'), 'sponsor-kcd@10xn.dev')
assert.equal(
formatAddressHeader('"Kent C. Dodds" <me@kentcdodds.com>'),
'"Kent C. Dodds" <me@kentcdodds.com>',
)
})
it('joins an address list with commas', () => {
assert.equal(
formatAddressHeader(['sponsor-kcd@10xn.dev', 'Pierre Burgy <pierre@strapi.com>']),
'sponsor-kcd@10xn.dev, Pierre Burgy <pierre@strapi.com>',
)
})
it('RFC 2047 encodes a non-ASCII display name', () => {
assert.equal(
formatAddressHeader('Pierre Burgy 🥐 <pierre@strapi.com>'),
'=?UTF-8?B?' + encodeUtf8Base64('Pierre Burgy 🥐') + '?= <pierre@strapi.com>',
)
})
})
describe('assembleComposedMime', () => {
it('includes To, Cc, and Bcc headers', () => {
const assembled = assembleComposedMime({
from: '"Kent C. Dodds" <me@kentcdodds.com>',
to: 'Verity <influencercontact@corp.stardesk.net>',
cc: ['sponsor-kcd@10xn.dev'],
bcc: 'me+log@kentcdodds.com',
subject: 'Re: Partnership Opportunity X StarDesk',
body: ['Hey Verity,', 'I have a team that will take it from here.', '- Kent'],
})
assert.match(assembled.mime, /^From: "Kent C\. Dodds" <me@kentcdodds\.com>/m)
assert.match(assembled.mime, /^To: Verity <influencercontact@corp\.stardesk\.net>/m)
assert.match(assembled.mime, /^Cc: sponsor-kcd@10xn\.dev/m)
assert.match(assembled.mime, /^Bcc: me\+log@kentcdodds\.com/m)
assert.match(assembled.mime, /^Subject: Re: Partnership Opportunity X StarDesk/m)
assert.equal(assembled.cc, 'sponsor-kcd@10xn.dev')
assert.equal(assembled.bcc, 'me+log@kentcdodds.com')
assert.match(assembled.text, /I have a team that will take it from here\./)
})
it('omits missing Cc and Bcc headers', () => {
const assembled = assembleComposedMime({
from: 'me@kentcdodds.com',
to: 'pierre@strapi.com',
subject: 'Hello',
body: 'Hi',
})
assert.doesNotMatch(assembled.mime, /^Cc:/m)
assert.doesNotMatch(assembled.mime, /^Bcc:/m)
})
it('rejects an empty body', () => {
assert.throws(
() =>
assembleComposedMime({
from: 'me@kentcdodds.com',
to: 'pierre@strapi.com',
subject: 'Hello',
body: ['', ' '],
}),
/non-empty body/,
)
})
})
describe('encodeHeaderValue', () => {
it('leaves ASCII headers alone', () => {
assert.equal(encodeHeaderValue('Re: Epic Web / Strapi'), 'Re: Epic Web / Strapi')
})
})