111 lines
3 KiB
TypeScript
111 lines
3 KiB
TypeScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
|
|
import {
|
|
MutationValidationError,
|
|
buildBdMutationArgs,
|
|
validateMutationPayload,
|
|
executeMutation,
|
|
} from '../../src/lib/mutations';
|
|
|
|
const root = 'C:/Users/Zenchant/codex/beadboard';
|
|
|
|
test('validateMutationPayload rejects invalid payloads', () => {
|
|
assert.throws(
|
|
() => validateMutationPayload('create', { projectRoot: '', title: '' }),
|
|
(error: unknown) => error instanceof MutationValidationError,
|
|
);
|
|
});
|
|
|
|
test('buildBdMutationArgs maps reopen correctly', () => {
|
|
const payload = validateMutationPayload('reopen', {
|
|
projectRoot: root,
|
|
id: 'bb-123',
|
|
reason: 'retry work',
|
|
});
|
|
|
|
const args = buildBdMutationArgs('reopen', payload);
|
|
assert.deepEqual(args, ['reopen', 'bb-123', '-r', 'retry work', '--json']);
|
|
});
|
|
|
|
test('buildBdMutationArgs maps update issue type correctly', () => {
|
|
const payload = validateMutationPayload('update', {
|
|
projectRoot: root,
|
|
id: 'bb-123',
|
|
issueType: 'feature',
|
|
});
|
|
|
|
const args = buildBdMutationArgs('update', payload);
|
|
assert.deepEqual(args, ['update', 'bb-123', '-t', 'feature', '--json']);
|
|
});
|
|
|
|
test('buildBdMutationArgs maps comment correctly', () => {
|
|
const payload = validateMutationPayload('comment', {
|
|
projectRoot: root,
|
|
id: 'bb-123',
|
|
text: 'Added notes',
|
|
});
|
|
|
|
const args = buildBdMutationArgs('comment', payload);
|
|
assert.deepEqual(args, ['comments', 'add', 'bb-123', 'Added notes', '--json']);
|
|
});
|
|
|
|
test('executeMutation surfaces bridge failures in normalized response', async () => {
|
|
const payload = validateMutationPayload('close', {
|
|
projectRoot: root,
|
|
id: 'bb-123',
|
|
reason: 'completed',
|
|
});
|
|
|
|
const result = await executeMutation('close', payload, {
|
|
runBdCommand: async ({ args }) => {
|
|
assert.deepEqual(args, ['close', 'bb-123', '-r', 'completed', '--json']);
|
|
return {
|
|
success: false,
|
|
classification: 'non_zero_exit',
|
|
command: 'bd.exe',
|
|
args,
|
|
cwd: root,
|
|
stdout: '',
|
|
stderr: 'cannot close',
|
|
code: 1,
|
|
durationMs: 3,
|
|
error: 'cannot close',
|
|
};
|
|
},
|
|
});
|
|
|
|
assert.equal(result.ok, false);
|
|
assert.equal(result.error?.classification, 'non_zero_exit');
|
|
});
|
|
|
|
test('executeMutation returns successful normalized response', async () => {
|
|
const payload = validateMutationPayload('update', {
|
|
projectRoot: root,
|
|
id: 'bb-123',
|
|
status: 'in_progress',
|
|
priority: 1,
|
|
});
|
|
|
|
const result = await executeMutation('update', payload, {
|
|
runBdCommand: async ({ args }) => {
|
|
assert.deepEqual(args, ['update', 'bb-123', '-s', 'in_progress', '-p', '1', '--json']);
|
|
return {
|
|
success: true,
|
|
classification: null,
|
|
command: 'bd.exe',
|
|
args,
|
|
cwd: root,
|
|
stdout: '{"id":"bb-123"}',
|
|
stderr: '',
|
|
code: 0,
|
|
durationMs: 2,
|
|
error: null,
|
|
};
|
|
},
|
|
});
|
|
|
|
assert.equal(result.ok, true);
|
|
assert.equal(result.operation, 'update');
|
|
assert.equal(result.command.success, true);
|
|
});
|