import { describe, it } from 'node:test'; import assert from 'node:assert/strict'; import { buildTicketFields, parseJobMessage } from '../services/jobMessageParser.js'; const roomConfig = { jobNamePattern: '\\b[A-Z][A-Z0-9]{4,}\\d\\b', jiraDefaults: { serviceDeskId: '171', requestTypeId: '289', environment: 'PROD', }, intents: { rerun: { keywords: ['rerun'], summaryTemplate: 'Rerun job {{jobName}}', descriptionTemplate: 'Requested via Webex by {{personEmail}}:\n\n{{originalText}}', }, force_ok: { keywords: ['force ok', 'force okay', 'forceok'], summaryTemplate: 'Force OK job {{jobName}}', descriptionTemplate: 'Requested via Webex by {{personEmail}}:\n\n{{originalText}}', urgency: 'High', }, }, }; describe('parseJobMessage', () => { it('matches rerun with job name', () => { const result = parseJobMessage({ text: 'Please rerun this job ADWTFRCETRNS1', roomConfig, }); assert.equal(result.outcome, 'match'); assert.equal(result.intent, 'rerun'); assert.equal(result.jobName, 'ADWTFRCETRNS1'); }); it('matches casual rerun phrasing', () => { const result = parseJobMessage({ text: 'Heya OPs can we rerun AMSSHIPDEX1, thanks', roomConfig, }); assert.equal(result.outcome, 'match'); assert.equal(result.intent, 'rerun'); assert.equal(result.jobName, 'AMSSHIPDEX1'); }); it('matches force ok intent', () => { const result = parseJobMessage({ text: 'Please force okay the job AIFDB4APPRECYCLE1', roomConfig, }); assert.equal(result.outcome, 'match'); assert.equal(result.intent, 'force_ok'); assert.equal(result.jobName, 'AIFDB4APPRECYCLE1'); }); it('skips general chat without intent', () => { const result = parseJobMessage({ text: 'Good morning team', roomConfig, }); assert.equal(result.outcome, 'skip'); assert.equal(result.skipReason, 'no_intent'); }); it('skips dashboard question without job name', () => { const result = parseJobMessage({ text: 'Can someone look at the dashboard?', roomConfig, }); assert.equal(result.outcome, 'skip'); assert.equal(result.skipReason, 'no_intent'); }); it('skips intent-only messages', () => { const result = parseJobMessage({ text: 'Please rerun this job soon', roomConfig, }); assert.equal(result.outcome, 'skip'); assert.equal(result.skipReason, 'no_job_name'); assert.equal(result.intent, 'rerun'); }); it('skips job-only messages', () => { const result = parseJobMessage({ text: 'ADWTFRCETRNS1 failed overnight', roomConfig, }); assert.equal(result.outcome, 'skip'); assert.equal(result.skipReason, 'no_intent'); }); }); describe('buildTicketFields', () => { it('builds JSM payload with PROD environment', () => { const parseResult = parseJobMessage({ text: 'Please rerun this job ADWTFRCETRNS1', roomConfig, }); const payload = buildTicketFields({ roomConfig, parseResult, personEmail: 'user@ae.com', }); assert.equal(payload.serviceDeskId, '171'); assert.equal(payload.requestTypeId, '289'); assert.equal(payload.requestFieldValues.summary, 'Rerun job ADWTFRCETRNS1'); assert.match(payload.requestFieldValues.description, /user@ae\.com/); assert.deepEqual(payload.requestFieldValues.customfield_10231, [{ value: 'PROD' }]); assert.equal(payload.raiseOnBehalfOf, 'user@ae.com'); }); it('includes urgency for force_ok', () => { const parseResult = parseJobMessage({ text: 'Please force ok job AMSSHIPDEX1', roomConfig, }); const payload = buildTicketFields({ roomConfig, parseResult, personEmail: 'ops@ae.com', }); assert.equal(payload.requestFieldValues.summary, 'Force OK job AMSSHIPDEX1'); assert.deepEqual(payload.requestFieldValues.customfield_10264, { value: 'High' }); }); });