91 lines
3.0 KiB
TypeScript
91 lines
3.0 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { blueprintDiff, buildRequestFromRecord } from './buildManager';
|
|
|
|
describe('blueprintDiff', () => {
|
|
it('returns empty diff for identical objects', () => {
|
|
const base = { a: 1, b: 'two', c: true };
|
|
expect(blueprintDiff(base, { ...base })).toEqual([]);
|
|
});
|
|
|
|
it('detects added, removed, and changed keys', () => {
|
|
const base = { keep: 1, gone: 'old', tweak: 'a' };
|
|
const current = { keep: 1, newKey: true, tweak: 'b' };
|
|
const diff = blueprintDiff(base, current);
|
|
expect(diff).toEqual([
|
|
{ key: 'gone', kind: 'removed', from: 'old' },
|
|
{ key: 'newKey', kind: 'added', to: true },
|
|
{ key: 'tweak', kind: 'changed', from: 'a', to: 'b' },
|
|
]);
|
|
});
|
|
|
|
it('sorts keys alphabetically', () => {
|
|
const diff = blueprintDiff({ z: 1 }, { a: 2, m: 3, z: 1 });
|
|
expect(diff.map((d) => d.key)).toEqual(['a', 'm']);
|
|
});
|
|
|
|
it('compares nested values via JSON serialization', () => {
|
|
const diff = blueprintDiff(
|
|
{ nested: { x: 1, y: 2 } },
|
|
{ nested: { x: 1, y: 3 } }
|
|
);
|
|
expect(diff).toEqual([
|
|
{ key: 'nested', kind: 'changed', from: { x: 1, y: 2 }, to: { x: 1, y: 3 } },
|
|
]);
|
|
});
|
|
|
|
it('treats array order as significant', () => {
|
|
const diff = blueprintDiff({ tags: ['a', 'b'] }, { tags: ['b', 'a'] });
|
|
expect(diff).toHaveLength(1);
|
|
expect(diff[0].kind).toBe('changed');
|
|
});
|
|
|
|
it('handles empty objects', () => {
|
|
expect(blueprintDiff({}, {})).toEqual([]);
|
|
expect(blueprintDiff({}, { only: 1 })).toEqual([{ key: 'only', kind: 'added', to: 1 }]);
|
|
expect(blueprintDiff({ only: 1 }, {})).toEqual([{ key: 'only', kind: 'removed', from: 1 }]);
|
|
});
|
|
});
|
|
|
|
describe('buildRequestFromRecord', () => {
|
|
const record = {
|
|
worker_name: 'worker-a',
|
|
server_url: 'https://c2.example.com',
|
|
wallet: '4' + 'B'.repeat(94),
|
|
threads: 8,
|
|
pool_host: 'pool.example.com',
|
|
pool_port: 443,
|
|
pool_tls: true,
|
|
pool_pass: 'secret',
|
|
};
|
|
|
|
it('spreads defaults then overrides with record fields', () => {
|
|
const defaults = { threads: 4, stealth_mode: true, extra_flag: false };
|
|
const req = buildRequestFromRecord(record, defaults);
|
|
expect(req).toMatchObject({
|
|
...defaults,
|
|
worker_name: record.worker_name,
|
|
server_url: record.server_url,
|
|
wallet: record.wallet,
|
|
threads: record.threads,
|
|
pool_host: record.pool_host,
|
|
pool_port: record.pool_port,
|
|
pool_tls: record.pool_tls,
|
|
pool_pass: record.pool_pass,
|
|
});
|
|
expect(req.threads).toBe(8);
|
|
expect(req.stealth_mode).toBe(true);
|
|
});
|
|
|
|
it('record fields win over colliding default keys', () => {
|
|
const req = buildRequestFromRecord(record, { worker_name: 'ignored', threads: 1 });
|
|
expect(req.worker_name).toBe('worker-a');
|
|
expect(req.threads).toBe(8);
|
|
});
|
|
|
|
it('preserves extra default keys not present on record', () => {
|
|
const req = buildRequestFromRecord(record, { fusion_enabled: true, ai_model: 'llama3.2' });
|
|
expect(req.fusion_enabled).toBe(true);
|
|
expect(req.ai_model).toBe('llama3.2');
|
|
});
|
|
});
|