Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kentcdodds/google

src/gmail-mime.test.ts

89 lines · 2.8 KB · TypeScript
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')
	})
})