mirror of
https://github.com/PR0M3TH3AN/TORCH.git
synced 2026-10-27 07:51:52 +00:00
Refactor cmdRollback to support dependency injection and add comprehensive unit tests covering validation, version listing, and rollback operations. - Refactor `src/cmd-rollback.mjs` to accept `deps` argument. - Create `test/cmd-rollback.test.mjs` with test cases for happy paths and error conditions. Co-authored-by: PR0M3TH3AN <[email protected]>
96 lines
3.0 KiB
JavaScript
96 lines
3.0 KiB
JavaScript
import { describe, it } from 'node:test';
|
|
import assert from 'node:assert';
|
|
import { cmdRollback } from '../src/cmd-rollback.mjs';
|
|
import { ExitError } from '../src/errors.mjs';
|
|
|
|
describe('cmdRollback', () => {
|
|
it('should throw ExitError if target is missing', async () => {
|
|
const deps = {
|
|
error: () => {},
|
|
};
|
|
await assert.rejects(
|
|
async () => cmdRollback(undefined, undefined, {}, deps),
|
|
(err) => err instanceof ExitError && err.code === 1 && err.message === 'Missing target'
|
|
);
|
|
});
|
|
|
|
it('should list versions when list option is true', async () => {
|
|
const logs = [];
|
|
const mockVersions = [{ hash: 'abc', archivedAt: '2023-01-01' }];
|
|
const deps = {
|
|
listPromptVersions: async (target) => {
|
|
assert.strictEqual(target, 'foo.md');
|
|
return mockVersions;
|
|
},
|
|
log: (msg) => logs.push(msg),
|
|
error: () => {},
|
|
};
|
|
|
|
await cmdRollback('foo.md', undefined, { list: true }, deps);
|
|
assert.strictEqual(logs.length, 1);
|
|
assert.deepStrictEqual(JSON.parse(logs[0]), mockVersions);
|
|
});
|
|
|
|
it('should throw ExitError if list versions fails', async () => {
|
|
const deps = {
|
|
listPromptVersions: async () => { throw new Error('fail'); },
|
|
log: () => {},
|
|
error: () => {}, // suppress error output
|
|
};
|
|
|
|
await assert.rejects(
|
|
async () => cmdRollback('foo.md', undefined, { list: true }, deps),
|
|
(err) => err instanceof ExitError && err.code === 1 && err.message === 'List versions failed'
|
|
);
|
|
});
|
|
|
|
it('should rollback to latest if strategy is missing', async () => {
|
|
const logs = [];
|
|
const mockResult = { success: true, restored: 'HEAD' };
|
|
const deps = {
|
|
rollbackPrompt: async (target, strategy) => {
|
|
assert.strictEqual(target, 'foo.md');
|
|
assert.strictEqual(strategy, 'latest');
|
|
return mockResult;
|
|
},
|
|
log: (msg) => logs.push(msg),
|
|
error: () => {},
|
|
};
|
|
|
|
await cmdRollback('foo.md', undefined, {}, deps);
|
|
assert.strictEqual(logs.length, 1);
|
|
assert.deepStrictEqual(JSON.parse(logs[0]), mockResult);
|
|
});
|
|
|
|
it('should rollback to specific strategy', async () => {
|
|
const logs = [];
|
|
const mockResult = { success: true, restored: 'hash123' };
|
|
const deps = {
|
|
rollbackPrompt: async (target, strategy) => {
|
|
assert.strictEqual(target, 'foo.md');
|
|
assert.strictEqual(strategy, 'hash123');
|
|
return mockResult;
|
|
},
|
|
log: (msg) => logs.push(msg),
|
|
error: () => {},
|
|
};
|
|
|
|
await cmdRollback('foo.md', 'hash123', {}, deps);
|
|
assert.strictEqual(logs.length, 1);
|
|
assert.deepStrictEqual(JSON.parse(logs[0]), mockResult);
|
|
});
|
|
|
|
it('should throw ExitError if rollback fails', async () => {
|
|
const deps = {
|
|
rollbackPrompt: async () => { throw new Error('fail'); },
|
|
log: () => {},
|
|
error: () => {},
|
|
};
|
|
|
|
await assert.rejects(
|
|
async () => cmdRollback('foo.md', 'latest', {}, deps),
|
|
(err) => err instanceof ExitError && err.message === 'Rollback failed'
|
|
);
|
|
});
|
|
});
|