dns-guide.test.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import assert from 'node:assert/strict';
  2. import dns from 'node:dns';
  3. import { test } from 'node:test';
  4. test('includes live current values for verification and dkim records', async () => {
  5. const originalResolver = dns.promises.Resolver;
  6. const lookup = new Map([
  7. ['example.com', ['v=spf1 ip4:192.0.2.10 a:mail.example.com ~all']],
  8. ['_mailhub.example.com', ['mailhub-verification=verify-token']],
  9. ['mh202607._domainkey.example.com', ['v=DKIM1; k=rsa; p=dkim-public']],
  10. ['_dmarc.example.com', ['v=DMARC1; p=none; rua=mailto:dmarc@example.com; adkim=s; aspf=s; pct=100']]
  11. ]);
  12. dns.promises.Resolver = class FakeResolver {
  13. setServers() {}
  14. async resolveTxt(name) {
  15. const value = lookup.get(name);
  16. if (!value) {
  17. const error = new Error('not found');
  18. error.code = 'ENODATA';
  19. throw error;
  20. }
  21. return value.map((record) => [record]);
  22. }
  23. async resolve4(name) {
  24. return name === 'mail.example.com' ? ['192.0.2.10'] : [];
  25. }
  26. async reverse(ip) {
  27. return ip === '192.0.2.10' ? ['mail.example.com'] : [];
  28. }
  29. };
  30. try {
  31. const { buildDnsGuide } = await import(`../src/dns-guide.js?test=${Date.now()}`);
  32. const guide = await buildDnsGuide({
  33. domain: 'example.com',
  34. selector: 'mh202607',
  35. verificationToken: 'verify-token',
  36. dkimPublic: 'dkim-public',
  37. senderHost: 'mail.example.com',
  38. sendingIp: '192.0.2.10',
  39. spfExtra: '',
  40. dmarcPolicy: 'none',
  41. dmarcRua: 'mailto:dmarc@example.com'
  42. });
  43. const verification = guide.records.find((record) => record.key === 'verification');
  44. const dkim = guide.records.find((record) => record.key === 'dkim');
  45. assert.equal(guide.records.some((record) => record.key === 'ptr'), false);
  46. assert.deepEqual(verification.current, ['mailhub-verification=verify-token']);
  47. assert.deepEqual(dkim.current, ['v=DKIM1; k=rsa; p=dkim-public']);
  48. } finally {
  49. dns.promises.Resolver = originalResolver;
  50. }
  51. });
  52. test('builds PTR as a system delivery check', async () => {
  53. const originalResolver = dns.promises.Resolver;
  54. dns.promises.Resolver = class FakeResolver {
  55. setServers() {}
  56. async reverse(ip) {
  57. return ip === '192.0.2.10' ? ['mail.example.com'] : [];
  58. }
  59. };
  60. try {
  61. const { buildSystemDnsChecks } = await import(`../src/dns-guide.js?test=${Date.now()}-system`);
  62. const checks = await buildSystemDnsChecks({
  63. mailHostname: 'mail.example.com',
  64. sendingIp: '192.0.2.10'
  65. });
  66. assert.equal(checks.ptr.key, 'ptr');
  67. assert.equal(checks.ptr.host, '192.0.2.10');
  68. assert.equal(checks.ptr.value, 'mail.example.com');
  69. assert.equal(checks.ptr.status, 'ok');
  70. assert.deepEqual(checks.ptr.current, ['mail.example.com']);
  71. } finally {
  72. dns.promises.Resolver = originalResolver;
  73. }
  74. });