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>
139 lines
4.4 KiB
JavaScript
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' });
|
|
});
|
|
});
|