41 lines
2.0 KiB
TypeScript
41 lines
2.0 KiB
TypeScript
import { readFileSync } from 'node:fs';
|
|
import { join } from 'node:path';
|
|
import { runInNewContext } from 'node:vm';
|
|
import { ModuleKind, ScriptTarget, transpileModule } from 'typescript';
|
|
import { describe, expect, it } from 'vitest';
|
|
|
|
function readParser(): (rate: string, windows: string) => { value: unknown; error: string | null } {
|
|
const source = readFileSync(join(process.cwd(), 'src', 'renderer-settings.ts'), 'utf8');
|
|
const start = source.indexOf('function parseDownloadPolicyFormValue');
|
|
const end = source.indexOf('function updateDownloadPolicyValidation', start);
|
|
if (start < 0 || end < 0) throw new Error('Download policy form parser is unavailable');
|
|
const compiled = transpileModule(`${source.slice(start, end)}\nglobalThis.__parseDownloadPolicyFormValue = parseDownloadPolicyFormValue;`, {
|
|
compilerOptions: { target: ScriptTarget.ES2022, module: ModuleKind.None },
|
|
}).outputText;
|
|
const context: Record<string, unknown> = {};
|
|
runInNewContext(compiled, context);
|
|
return context.__parseDownloadPolicyFormValue as (rate: string, windows: string) => { value: unknown; error: string | null };
|
|
}
|
|
|
|
describe('download policy settings input', () => {
|
|
it('converts a human-friendly MiB/s value into a whole safe byte rate and accepts flexible local windows', () => {
|
|
const parse = readParser();
|
|
|
|
expect(parse('1,5', '22:00-06:00; 09:30 - 12:00')).toEqual({
|
|
value: {
|
|
throttle: { maxBytesPerSecond: 1_572_864 },
|
|
windows: [{ start: '22:00', end: '06:00' }, { start: '09:30', end: '12:00' }]
|
|
},
|
|
error: null
|
|
});
|
|
});
|
|
|
|
it('rejects invalid byte-rate and local-window values without producing a persistence payload', () => {
|
|
const parse = readParser();
|
|
|
|
expect(parse('0', '22:00-06:00')).toEqual({ value: null, error: 'rate' });
|
|
expect(parse('1.25', '22:00-22:00')).toEqual({ value: null, error: 'window' });
|
|
expect(parse('999999999999999999999', '')).toEqual({ value: null, error: 'rate' });
|
|
});
|
|
});
|