Files
FlowPilot/tests/auto-step-random-delay.test.js
T

151 lines
3.8 KiB
JavaScript

const assert = require('assert');
const fs = require('fs');
const source = fs.readFileSync('background.js', 'utf8');
function extractFunction(name) {
const start = source.indexOf(`function ${name}(`);
if (start < 0) {
throw new Error(`missing function ${name}`);
}
const paramsStart = source.indexOf('(', start);
let paramsDepth = 0;
let paramsEnd = paramsStart;
for (; paramsEnd < source.length; paramsEnd += 1) {
const ch = source[paramsEnd];
if (ch === '(') paramsDepth += 1;
if (ch === ')') {
paramsDepth -= 1;
if (paramsDepth === 0) {
break;
}
}
}
const braceStart = source.indexOf('{', paramsEnd);
let depth = 0;
let end = braceStart;
for (; end < source.length; end += 1) {
const ch = source[end];
if (ch === '{') depth += 1;
if (ch === '}') {
depth -= 1;
if (depth === 0) {
end += 1;
break;
}
}
}
return source.slice(start, end);
}
const bundle = [
'const AUTO_STEP_DELAY_MIN_ALLOWED_SECONDS = 0;',
'const AUTO_STEP_DELAY_MAX_ALLOWED_SECONDS = 600;',
'const PERSISTED_SETTING_DEFAULTS = { autoStepDelaySeconds: null };',
"const AUTO_RUN_PRE_EXECUTION_DELAYS_BY_STEP_KEY = new Map([['plus-checkout-create', 20000]]);",
'function getStepDefinitionForState(step, state = {}) { return state.definitions?.[step] || null; }',
extractFunction('normalizeAutoStepDelaySeconds'),
extractFunction('resolveLegacyAutoStepDelaySeconds'),
extractFunction('getStepExecutionKeyForState'),
extractFunction('getAutoRunPreExecutionDelayMs'),
].join('\n');
const api = new Function(`${bundle}; return { normalizeAutoStepDelaySeconds, resolveLegacyAutoStepDelaySeconds, getAutoRunPreExecutionDelayMs };`)();
assert.strictEqual(
api.normalizeAutoStepDelaySeconds(''),
null,
'empty input should remain empty instead of being forced to a default delay'
);
assert.strictEqual(
api.normalizeAutoStepDelaySeconds(null, null),
null,
'null input should stay null'
);
assert.strictEqual(
api.normalizeAutoStepDelaySeconds('0'),
0,
'zero seconds should be kept so the UI can explicitly show no extra delay'
);
assert.strictEqual(
api.normalizeAutoStepDelaySeconds('12.9'),
12,
'delay seconds should be floored to an integer'
);
assert.strictEqual(
api.normalizeAutoStepDelaySeconds('-50'),
0,
'negative delay should clamp to zero seconds'
);
assert.strictEqual(
api.normalizeAutoStepDelaySeconds('999'),
600,
'delay should clamp to the configured upper bound'
);
assert.strictEqual(
api.resolveLegacyAutoStepDelaySeconds({}),
undefined,
'missing legacy fields should not synthesize a migrated delay'
);
assert.strictEqual(
api.resolveLegacyAutoStepDelaySeconds({ autoStepRandomDelayMinSeconds: 12 }),
12,
'legacy min-only settings should migrate to that same delay'
);
assert.strictEqual(
api.resolveLegacyAutoStepDelaySeconds({ autoStepRandomDelayMaxSeconds: 18 }),
18,
'legacy max-only settings should migrate to that same delay'
);
assert.strictEqual(
api.resolveLegacyAutoStepDelaySeconds({
autoStepRandomDelayMinSeconds: 12,
autoStepRandomDelayMaxSeconds: 18,
}),
15,
'legacy min/max ranges should migrate to their rounded midpoint'
);
assert.strictEqual(
api.resolveLegacyAutoStepDelaySeconds({
autoStepRandomDelayMinSeconds: '',
autoStepRandomDelayMaxSeconds: '',
}),
null,
'empty legacy settings should migrate to no delay'
);
assert.strictEqual(
api.getAutoRunPreExecutionDelayMs(6, {
definitions: {
6: { key: 'plus-checkout-create' },
},
}),
20000,
'Plus checkout create should wait before step execution'
);
assert.strictEqual(
api.getAutoRunPreExecutionDelayMs(6, {
definitions: {
6: { key: 'clear-login-cookies' },
},
}),
0,
'normal step 6 should not inherit the Plus checkout pre-wait'
);
console.log('auto step delay tests passed');