Files
AetherForge/server/web/src/help/buildManager.test.ts

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');
});
});