2025-10-28 19:46:17 +00:00
|
|
|
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
2026-02-10 15:54:09 +00:00
|
|
|
import { SpfVerifier, SpfQualifier, SpfMechanismType } from '../ts/mail/security/classes.spfverifier.js';
|
2025-10-28 19:46:17 +00:00
|
|
|
|
|
|
|
|
/**
|
2026-02-11 07:55:28 +00:00
|
|
|
* Test email authentication systems: SPF parsing
|
2025-10-28 19:46:17 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// SPF Verifier Tests
|
|
|
|
|
tap.test('SPF Verifier - should parse SPF record', async () => {
|
|
|
|
|
const spfVerifier = new SpfVerifier();
|
2026-02-11 07:55:28 +00:00
|
|
|
|
2025-10-28 19:46:17 +00:00
|
|
|
// Test valid SPF record parsing
|
|
|
|
|
const record = 'v=spf1 a mx ip4:192.168.0.1/24 include:example.org ~all';
|
|
|
|
|
const parsedRecord = spfVerifier.parseSpfRecord(record);
|
2026-02-11 07:55:28 +00:00
|
|
|
|
2025-10-28 19:46:17 +00:00
|
|
|
expect(parsedRecord).toBeTruthy();
|
|
|
|
|
expect(parsedRecord.version).toEqual('spf1');
|
|
|
|
|
expect(parsedRecord.mechanisms.length).toEqual(5);
|
2026-02-11 07:55:28 +00:00
|
|
|
|
2025-10-28 19:46:17 +00:00
|
|
|
// Check specific mechanisms
|
|
|
|
|
expect(parsedRecord.mechanisms[0].type).toEqual(SpfMechanismType.A);
|
|
|
|
|
expect(parsedRecord.mechanisms[0].qualifier).toEqual(SpfQualifier.PASS);
|
2026-02-11 07:55:28 +00:00
|
|
|
|
2025-10-28 19:46:17 +00:00
|
|
|
expect(parsedRecord.mechanisms[1].type).toEqual(SpfMechanismType.MX);
|
|
|
|
|
expect(parsedRecord.mechanisms[1].qualifier).toEqual(SpfQualifier.PASS);
|
2026-02-11 07:55:28 +00:00
|
|
|
|
2025-10-28 19:46:17 +00:00
|
|
|
expect(parsedRecord.mechanisms[2].type).toEqual(SpfMechanismType.IP4);
|
|
|
|
|
expect(parsedRecord.mechanisms[2].value).toEqual('192.168.0.1/24');
|
2026-02-11 07:55:28 +00:00
|
|
|
|
2025-10-28 19:46:17 +00:00
|
|
|
expect(parsedRecord.mechanisms[3].type).toEqual(SpfMechanismType.INCLUDE);
|
|
|
|
|
expect(parsedRecord.mechanisms[3].value).toEqual('example.org');
|
2026-02-11 07:55:28 +00:00
|
|
|
|
2025-10-28 19:46:17 +00:00
|
|
|
expect(parsedRecord.mechanisms[4].type).toEqual(SpfMechanismType.ALL);
|
|
|
|
|
expect(parsedRecord.mechanisms[4].qualifier).toEqual(SpfQualifier.SOFTFAIL);
|
2026-02-11 07:55:28 +00:00
|
|
|
|
2025-10-28 19:46:17 +00:00
|
|
|
// Test invalid record
|
|
|
|
|
const invalidRecord = 'not-a-spf-record';
|
|
|
|
|
const invalidParsed = spfVerifier.parseSpfRecord(invalidRecord);
|
|
|
|
|
expect(invalidParsed).toBeNull();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
tap.test('stop', async () => {
|
|
|
|
|
await tap.stopForcefully();
|
|
|
|
|
});
|
|
|
|
|
|
2026-02-11 07:55:28 +00:00
|
|
|
export default tap.start();
|