jiraCloud/test/jobMessageParser.test.js
jmcqueen efc64a227c Add Webex inbound OAuth flow and room-to-Jira job request pipeline.
Introduces integration-based webhook registration, message parsing, dry-run
monitoring, JSM ticket creation, and OAuth token refresh for DC Ops spaces.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-28 08:27:52 -04:00

139 lines
4.4 KiB
JavaScript

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' });
});
});