cloudflare-temp-email-utils.test.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. const test = require('node:test');
  2. const assert = require('node:assert/strict');
  3. const {
  4. buildCloudflareTempEmailHeaders,
  5. getCloudflareTempEmailAddressFromResponse,
  6. normalizeCloudflareTempEmailBaseUrl,
  7. normalizeCloudflareTempEmailDomain,
  8. normalizeCloudflareTempEmailDomains,
  9. normalizeCloudflareTempEmailMailApiMessages,
  10. } = require('../cloudflare-temp-email-utils.js');
  11. test('normalizeCloudflareTempEmailBaseUrl normalizes host and preserves path', () => {
  12. assert.equal(
  13. normalizeCloudflareTempEmailBaseUrl('temp.example.com/api/'),
  14. 'https://temp.example.com/api'
  15. );
  16. assert.equal(
  17. normalizeCloudflareTempEmailBaseUrl('http://127.0.0.1:8787'),
  18. 'http://127.0.0.1:8787'
  19. );
  20. assert.equal(normalizeCloudflareTempEmailBaseUrl('::::'), '');
  21. });
  22. test('normalizeCloudflareTempEmailDomain and domains de-duplicate valid entries', () => {
  23. assert.equal(normalizeCloudflareTempEmailDomain('@Mail.Example.com'), 'mail.example.com');
  24. assert.equal(normalizeCloudflareTempEmailDomain('not-a-domain'), '');
  25. assert.deepEqual(
  26. normalizeCloudflareTempEmailDomains(['mail.example.com', 'MAIL.EXAMPLE.COM', 'bad-value']),
  27. ['mail.example.com']
  28. );
  29. });
  30. test('buildCloudflareTempEmailHeaders includes auth headers and content type when needed', () => {
  31. assert.deepEqual(
  32. buildCloudflareTempEmailHeaders(
  33. {
  34. adminAuth: 'admin-secret',
  35. customAuth: 'site-secret',
  36. },
  37. { json: true }
  38. ),
  39. {
  40. 'x-admin-auth': 'admin-secret',
  41. 'x-custom-auth': 'site-secret',
  42. 'Content-Type': 'application/json',
  43. Accept: 'application/json',
  44. }
  45. );
  46. });
  47. test('normalizeCloudflareTempEmailMailApiMessages extracts sender, subject, code, and address from raw mime', () => {
  48. const messages = normalizeCloudflareTempEmailMailApiMessages({
  49. data: [
  50. {
  51. id: 'mail-1',
  52. address: 'user@example.com',
  53. created_at: '2026-04-13T09:15:00.000Z',
  54. raw: [
  55. 'From: OpenAI <noreply@tm.openai.com>',
  56. 'Subject: =?UTF-8?B?T3BlbkFJIHZlcmlmaWNhdGlvbiBjb2Rl?=',
  57. 'Content-Type: text/plain; charset=UTF-8',
  58. '',
  59. 'Your verification code is 654321.',
  60. ].join('\r\n'),
  61. },
  62. ],
  63. });
  64. assert.equal(messages.length, 1);
  65. assert.equal(messages[0].id, 'mail-1');
  66. assert.equal(messages[0].address, 'user@example.com');
  67. assert.equal(messages[0].subject, 'OpenAI verification code');
  68. assert.equal(messages[0].from.emailAddress.address, 'OpenAI <noreply@tm.openai.com>');
  69. assert.match(messages[0].bodyPreview, /654321/);
  70. });
  71. test('normalizeCloudflareTempEmailMailApiMessages decodes multipart quoted printable html bodies', () => {
  72. const messages = normalizeCloudflareTempEmailMailApiMessages([
  73. {
  74. id: 'mail-2',
  75. address: 'user@example.com',
  76. received_at: '2026-04-13T09:20:00.000Z',
  77. source: [
  78. 'From: ChatGPT <noreply@tm.openai.com>',
  79. 'Subject: Login code',
  80. 'Content-Type: multipart/alternative; boundary="abc123"',
  81. '',
  82. '--abc123',
  83. 'Content-Type: text/html; charset=UTF-8',
  84. 'Content-Transfer-Encoding: quoted-printable',
  85. '',
  86. '<p>Your login code is <strong>112233</strong>.</p>',
  87. '--abc123--',
  88. ].join('\r\n'),
  89. },
  90. ]);
  91. assert.equal(messages.length, 1);
  92. assert.match(messages[0].bodyPreview, /112233/);
  93. assert.equal(messages[0].subject, 'Login code');
  94. });
  95. test('getCloudflareTempEmailAddressFromResponse supports direct and nested response shapes', () => {
  96. assert.equal(getCloudflareTempEmailAddressFromResponse({ address: 'one@example.com' }), 'one@example.com');
  97. assert.equal(getCloudflareTempEmailAddressFromResponse({ data: { address: 'two@example.com' } }), 'two@example.com');
  98. });