feat: T1016 dns_config probe + server-side drift detection + Crucible DNS DRIFT badge
This commit is contained in:
90
server/web/src/help/buildManager.test.ts
Normal file
90
server/web/src/help/buildManager.test.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
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');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user