Raise NTE to $400 when a new WO space opens, align /createWO defaults with SC_WO_OPEN_MIN_NTE, limit the daily digest to all non-invoiced COMPLETED WOs, and add unit tests. Co-authored-by: Cursor <cursoragent@cursor.com>
91 lines
3.1 KiB
JavaScript
91 lines
3.1 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import {
|
|
createWorkOrderNteService,
|
|
getWoOpenMinNte,
|
|
} from '../src/services/workOrderNteService.js';
|
|
|
|
test('getWoOpenMinNte defaults to 400', () => {
|
|
const prev = process.env.SC_WO_OPEN_MIN_NTE;
|
|
delete process.env.SC_WO_OPEN_MIN_NTE;
|
|
assert.equal(getWoOpenMinNte(), 400);
|
|
if (prev !== undefined) process.env.SC_WO_OPEN_MIN_NTE = prev;
|
|
});
|
|
|
|
test('getWoOpenMinNte returns 0 when disabled', () => {
|
|
const prev = process.env.SC_WO_OPEN_MIN_NTE;
|
|
process.env.SC_WO_OPEN_MIN_NTE = '0';
|
|
assert.equal(getWoOpenMinNte(), 0);
|
|
if (prev !== undefined) process.env.SC_WO_OPEN_MIN_NTE = prev;
|
|
else delete process.env.SC_WO_OPEN_MIN_NTE;
|
|
});
|
|
|
|
test('ensureWorkOrderMinimumNte skips when NTE is at or above floor', async () => {
|
|
const { ensureWorkOrderMinimumNte } = createWorkOrderNteService({
|
|
getWorkOrderForNte: async () => ({ Nte: 500 }),
|
|
updateWorkOrderNte: async () => {
|
|
throw new Error('should not PATCH');
|
|
},
|
|
});
|
|
|
|
const result = await ensureWorkOrderMinimumNte(123, { minNte: 400, hintNte: 500 });
|
|
assert.deepEqual(result, { updated: false, nte: 500 });
|
|
});
|
|
|
|
test('ensureWorkOrderMinimumNte skips when hintNte equals floor', async () => {
|
|
let patched = false;
|
|
const { ensureWorkOrderMinimumNte } = createWorkOrderNteService({
|
|
getWorkOrderForNte: async () => {
|
|
throw new Error('should not GET');
|
|
},
|
|
updateWorkOrderNte: async () => {
|
|
patched = true;
|
|
},
|
|
});
|
|
|
|
const result = await ensureWorkOrderMinimumNte(123, { minNte: 400, hintNte: 400 });
|
|
assert.equal(patched, false);
|
|
assert.deepEqual(result, { updated: false, nte: 400 });
|
|
});
|
|
|
|
test('ensureWorkOrderMinimumNte bumps when hintNte is below floor', async () => {
|
|
let patchedTo = null;
|
|
const { ensureWorkOrderMinimumNte } = createWorkOrderNteService({
|
|
getWorkOrderForNte: async () => {
|
|
throw new Error('should not GET');
|
|
},
|
|
updateWorkOrderNte: async (_woId, nte) => {
|
|
patchedTo = nte;
|
|
},
|
|
});
|
|
|
|
const result = await ensureWorkOrderMinimumNte(456, { minNte: 400, hintNte: 250 });
|
|
assert.equal(patchedTo, 400);
|
|
assert.deepEqual(result, { updated: true, previousNte: 250, nte: 400 });
|
|
});
|
|
|
|
test('ensureWorkOrderMinimumNte bumps null/zero NTE via GET fallback', async () => {
|
|
let patchedTo = null;
|
|
const { ensureWorkOrderMinimumNte } = createWorkOrderNteService({
|
|
getWorkOrderForNte: async () => ({ Nte: 0 }),
|
|
updateWorkOrderNte: async (_woId, nte) => {
|
|
patchedTo = nte;
|
|
},
|
|
});
|
|
|
|
const result = await ensureWorkOrderMinimumNte(789, { minNte: 400 });
|
|
assert.equal(patchedTo, 400);
|
|
assert.deepEqual(result, { updated: true, previousNte: 0, nte: 400 });
|
|
});
|
|
|
|
test('ensureWorkOrderMinimumNte skips when minNte is 0', async () => {
|
|
const { ensureWorkOrderMinimumNte } = createWorkOrderNteService({
|
|
getWorkOrderForNte: async () => ({ Nte: 100 }),
|
|
updateWorkOrderNte: async () => {
|
|
throw new Error('should not PATCH');
|
|
},
|
|
});
|
|
|
|
const result = await ensureWorkOrderMinimumNte(123, { minNte: 0, hintNte: 100 });
|
|
assert.deepEqual(result, { updated: false, skipped: true });
|
|
});
|