← back to Sample Followup Sweep
test/george-transport.test.js
43 lines
'use strict';
const assert = require('node:assert/strict');
const { EventEmitter } = require('node:events');
const { compose } = require('../lib/compose');
const { georgeRequest, createGmailDraftArtifact } = require('../lib/george-transport');
const composed = compose({
name: 'Test Vendor', account_number: '123', sample_email: 'samples@vendor.com',
ship_to: { name: 'Designer Wallcoverings', line1: '15442 Ventura Blvd. #102', city_state_zip: 'Sherman Oaks, CA 91403', phone: '1-888-373-4564' },
}, [{ sku: 'DW-1', requested: '08/01/2026', mfr: 'ABC' }]);
const valid = { account: 'info', to: composed.to, subject: composed.subject, body: composed.html };
const invalid = { ...valid, body: valid.body.replace(/<a href="mailto:info@designerwallcoverings\.com\?subject=Unsubscribe[\s\S]*?<\/a>/, '<a href="https://invalid.example/unsubscribe">unsubscribe</a>') };
let requests = 0;
const requestImpl = (_options, callback) => {
requests += 1;
const req = new EventEmitter();
req.write = () => {};
req.end = () => {
const response = new EventEmitter();
response.statusCode = 200;
callback(response);
response.emit('data', Buffer.from('{"success":true}'));
response.emit('end');
};
return req;
};
(async () => {
for (const path of ['/api/send', '/api/drafts']) {
await assert.rejects(Promise.resolve().then(() => georgeRequest({ path, payload: invalid, requestImpl })), { code: 'PRE_SEND_COMPLIANCE_BLOCKED' });
}
assert.equal(requests, 0, 'blocked payloads must make zero requests');
assert.throws(() => createGmailDraftArtifact(invalid), { code: 'PRE_SEND_COMPLIANCE_BLOCKED' });
assert.equal(createGmailDraftArtifact(valid), valid);
const result = await georgeRequest({ path: '/api/drafts', payload: valid, requestImpl });
assert.equal(result.statusCode, 200);
assert.equal(requests, 1, 'compliant payload should reach the injected transport once');
console.log('george transport fail-closed boundary: PASS');
})().catch((error) => { console.error(error); process.exitCode = 1; });