Files
Mastermind/test/helpers.test.mjs

63 lines
2.3 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {
applyRulesToEmail,
buildPCOBody,
buildRFIBody,
extractDomain,
extractFirstJobNumber,
validatePassword
} from '../web/src/lib/helpers.js';
test('extractDomain returns normalized domain', () => {
assert.equal(extractDomain('Jane Doe <Jane.Doe@Example.COM>'), 'example.com');
assert.equal(extractDomain('no-domain'), '');
});
test('extractFirstJobNumber finds the first long job number', () => {
assert.equal(extractFirstJobNumber('RE: Job 0222600001 - panel issue'), '0222600001');
assert.equal(extractFirstJobNumber('ticket 12345 only'), '');
});
test('validatePassword enforces the documented rules', () => {
assert.equal(validatePassword('short'), 'Password must be at least 12 characters.');
assert.equal(validatePassword('lowercaseonly1'), 'Password must include an uppercase letter.');
assert.equal(validatePassword('UPPERCASEONLY1'), 'Password must include a lowercase letter.');
assert.equal(validatePassword('NoDigitsHere!'), 'Password must include a number.');
assert.equal(validatePassword('ValidPassword1'), null);
});
test('applyRulesToEmail returns the first matching rule', async () => {
const match = await applyRulesToEmail(
{
from_addr: 'pm@gc.example.com',
subject: '0222600001 change request',
body_text: 'Please review the change request.',
thread_key: 'thread-1'
},
[
{ id: '1', enabled: true, match_type: 'subject_contains', match_value: '0222600001', project_id: 'project-a' },
{ id: '2', enabled: true, match_type: 'from_domain', match_value: 'example.com', project_id: 'project-b' }
]
);
assert.deepEqual(match, { projectId: 'project-a', confidence: 0.9, ruleId: '1' });
});
test('draft builders include key context from the source email', () => {
const email = {
id: 'email-1',
subject: 'Need clarification',
from_addr: 'pm@example.com',
date: '2026-03-01',
body_text: 'Line one\nLine two'
};
const project = { name: 'Tower A', job_number: '0222600001' };
assert.match(buildPCOBody(email, project), /Potential Change Order/);
assert.match(buildPCOBody(email, project), /Tower A/);
assert.match(buildRFIBody(email, project), /RFI/);
assert.match(buildRFIBody(email, project), /> Line one/);
});