ci: coverage

This commit is contained in:
imccyu
2026-07-22 17:23:22 +08:00
parent 2431caa9ab
commit 0a91d2cff0
7 changed files with 51 additions and 23 deletions

View File

@@ -238,11 +238,11 @@ describe('DOM default seams (stubbed globals)', () => {
}
const g = globalThis as { document?: unknown; fetch: typeof fetch }
g.document = fakeDoc
g.fetch = ((url: URL | RequestInfo) => Promise.resolve(
String(url).includes('bad')
g.fetch = (url: URL | RequestInfo) => Promise.resolve(
(typeof url === 'string' ? url : url instanceof URL ? url.href : url.url).includes('bad')
? new Response('x', { status: 500 })
: new Response('window.DSHClientProxy.loadPlugin(globalThis.__seamHandoff)', { status: 200 }),
)) as typeof fetch
)
try {
delete win.DSHClientProxy
const ctx = new Context()

View File

@@ -58,16 +58,20 @@ export class FakeApiClient implements IApiClient {
private readonly muxConns: StreamConn<MuxFrame>[] = []
private readonly hostConns: StreamConn<HostFrame>[] = []
// Parameters carry local structural annotations: the CI lint lane runs
// without built lib/, so IApiClient's indexed-access types collapse to any
// and inferred parameters would trip no-unsafe-argument.
readonly sessions: IApiClient['sessions'] = {
list: payload => this.record('session.list', payload, this.onList(payload)),
create: payload => this.record('session.create', payload, this.onCreate(payload)),
history: payload => this.record('session.history', payload, this.onHistory(payload)),
prompt: payload => this.record('session.prompt', payload, this.onPrompt(payload)),
cancel: payload => this.record('session.cancel', payload, this.onCancel(payload)),
list: (payload: unknown) => this.record('session.list', payload, this.onList(payload)),
create: (payload: unknown) => this.record('session.create', payload, this.onCreate(payload)),
history: (payload: { sessionId: SessionId; beforeSeq?: number; maxMessages?: number }) =>
this.record('session.history', payload, this.onHistory(payload)),
prompt: (payload: unknown) => this.record('session.prompt', payload, this.onPrompt(payload)),
cancel: (payload: unknown) => this.record('session.cancel', payload, this.onCancel(payload)),
}
readonly host: IApiClient['host'] = {
describe: payload => this.record('host.describe', payload, this.onDescribe(payload)),
describe: (payload: unknown) => this.record('host.describe', payload, this.onDescribe(payload)),
}
/** When true, streams never fire onOpen (misbehaving-carrier material for the handshake timeout guard). */
@@ -85,8 +89,8 @@ export class FakeApiClient implements IApiClient {
}
readonly events: IApiClient['events'] = {
mux: (_payload, signal, onOpen) => this.openStream(this.muxConns, signal, onOpen),
host: (_payload, signal, onOpen) => this.openStream(this.hostConns, signal, onOpen),
mux: (_payload: unknown, signal: AbortSignal, onOpen?: () => void) => this.openStream(this.muxConns, signal, onOpen),
host: (_payload: unknown, signal: AbortSignal, onOpen?: () => void) => this.openStream(this.hostConns, signal, onOpen),
}
respond(): Promise<{ accepted: false; reason: 'not-pending' }> {