- NEW: src/interceptor.ts — unified XHR/Fetch interceptor (was duplicated 3x) - NEW: src/version.ts — centralized PKG_VERSION (was duplicated 2x) - NEW: src/constants.ts — shared VOLATILE_PARAMS, FIELD_ROLES etc. - NEW: src/engine.test.ts, src/registry.test.ts — 14 new unit tests - browser.ts: use shared normalizeEval, interceptor, withTimeoutMs, PKG_VERSION - intercept.ts, tap.ts: use shared interceptor generators - cascade.ts: extract shared buildFetchProbeJs (90% dedup) - engine.ts: use InternalCliCommand (no more 'as any' casts) - executor.ts: remove all 15 'as StepHandler' type casts - runtime.ts: add withTimeoutMs, IBrowserFactory interface - registry.ts: add InternalCliCommand type for internal fields - validate.ts: add pipeline step name validation - output.ts: remove 'null as any' and '.filter(() => true)' hacks - explore.ts, synthesize.ts: use shared constants - docs: fix V2EX commands (3→6), SKILL.md version, verify example Tests: 88 passed (was 74), tsc --noEmit: 0 errors
107 lines
2.9 KiB
TypeScript
107 lines
2.9 KiB
TypeScript
/**
|
|
* Tests for registry.ts: Strategy enum, cli() registration, helpers.
|
|
*/
|
|
|
|
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import { cli, getRegistry, fullName, strategyLabel, registerCommand, Strategy, type CliCommand } from './registry.js';
|
|
|
|
describe('cli() registration', () => {
|
|
it('registers a command and returns it', () => {
|
|
const cmd = cli({
|
|
site: 'test-registry',
|
|
name: 'hello',
|
|
description: 'A test command',
|
|
strategy: Strategy.PUBLIC,
|
|
browser: false,
|
|
});
|
|
|
|
expect(cmd.site).toBe('test-registry');
|
|
expect(cmd.name).toBe('hello');
|
|
expect(cmd.strategy).toBe(Strategy.PUBLIC);
|
|
expect(cmd.browser).toBe(false);
|
|
expect(cmd.args).toEqual([]);
|
|
});
|
|
|
|
it('puts registered command in the registry', () => {
|
|
cli({
|
|
site: 'test-registry',
|
|
name: 'registered',
|
|
description: 'test',
|
|
});
|
|
|
|
const registry = getRegistry();
|
|
expect(registry.has('test-registry/registered')).toBe(true);
|
|
});
|
|
|
|
it('defaults strategy to COOKIE when browser is true', () => {
|
|
const cmd = cli({
|
|
site: 'test-registry',
|
|
name: 'default-strategy',
|
|
});
|
|
|
|
expect(cmd.strategy).toBe(Strategy.COOKIE);
|
|
expect(cmd.browser).toBe(true);
|
|
});
|
|
|
|
it('defaults strategy to PUBLIC when browser is false', () => {
|
|
const cmd = cli({
|
|
site: 'test-registry',
|
|
name: 'no-browser',
|
|
browser: false,
|
|
});
|
|
|
|
expect(cmd.strategy).toBe(Strategy.PUBLIC);
|
|
});
|
|
|
|
it('overwrites existing command on re-registration', () => {
|
|
cli({ site: 'test-registry', name: 'overwrite', description: 'v1' });
|
|
cli({ site: 'test-registry', name: 'overwrite', description: 'v2' });
|
|
|
|
const reg = getRegistry();
|
|
expect(reg.get('test-registry/overwrite')?.description).toBe('v2');
|
|
});
|
|
});
|
|
|
|
describe('fullName', () => {
|
|
it('returns site/name', () => {
|
|
const cmd: CliCommand = {
|
|
site: 'bilibili', name: 'hot', description: '', args: [],
|
|
};
|
|
expect(fullName(cmd)).toBe('bilibili/hot');
|
|
});
|
|
});
|
|
|
|
describe('strategyLabel', () => {
|
|
it('returns strategy string', () => {
|
|
const cmd: CliCommand = {
|
|
site: 'test', name: 'test', description: '', args: [],
|
|
strategy: Strategy.INTERCEPT,
|
|
};
|
|
expect(strategyLabel(cmd)).toBe('intercept');
|
|
});
|
|
|
|
it('returns public when no strategy set', () => {
|
|
const cmd: CliCommand = {
|
|
site: 'test', name: 'test', description: '', args: [],
|
|
};
|
|
expect(strategyLabel(cmd)).toBe('public');
|
|
});
|
|
});
|
|
|
|
describe('registerCommand', () => {
|
|
it('registers a pre-built command', () => {
|
|
const cmd: CliCommand = {
|
|
site: 'test-registry',
|
|
name: 'direct-reg',
|
|
description: 'directly registered',
|
|
args: [],
|
|
strategy: Strategy.HEADER,
|
|
browser: true,
|
|
};
|
|
registerCommand(cmd);
|
|
|
|
const reg = getRegistry();
|
|
expect(reg.get('test-registry/direct-reg')?.strategy).toBe(Strategy.HEADER);
|
|
});
|
|
});
|