docs(tess): remediate M5 qualification findings
All checks were successful
ci/woodpecker/pr/ci Pipeline was successful
All checks were successful
ci/woodpecker/pr/ci Pipeline was successful
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||
import {
|
||||
attachInteractionSession,
|
||||
sendInteractionMessage,
|
||||
stopInteractionSession,
|
||||
} from './gateway-api.js';
|
||||
|
||||
const gateway = 'https://gateway.example.test';
|
||||
const cookie = 'session=test';
|
||||
const base = { agentName: 'Nova', correlationId: 'corr-1', sessionId: 'session-1' };
|
||||
|
||||
afterEach(() => vi.unstubAllGlobals());
|
||||
|
||||
/** The TUI must preserve gateway denial type/status rather than treating it as success. */
|
||||
describe('interaction gateway error mapping', (): void => {
|
||||
it.each([
|
||||
{
|
||||
name: 'attach unauthorized',
|
||||
response: { status: 401, message: 'Invalid or expired session' },
|
||||
invoke: (): Promise<unknown> => attachInteractionSession(gateway, cookie, base),
|
||||
expected:
|
||||
'Failed to attach interaction session (401): {"message":"Invalid or expired session"}',
|
||||
},
|
||||
{
|
||||
name: 'send invalid request',
|
||||
response: { status: 400, message: 'Content and idempotency key are required' },
|
||||
invoke: (): Promise<unknown> =>
|
||||
sendInteractionMessage(gateway, cookie, {
|
||||
...base,
|
||||
content: 'hello',
|
||||
idempotencyKey: 'message-1',
|
||||
}),
|
||||
expected:
|
||||
'Failed to send interaction message (400): {"message":"Content and idempotency key are required"}',
|
||||
},
|
||||
{
|
||||
name: 'stop forbidden',
|
||||
response: { status: 403, message: 'Runtime termination approval denied' },
|
||||
invoke: (): Promise<unknown> =>
|
||||
stopInteractionSession(gateway, cookie, { ...base, approvalRef: 'approval-1' }),
|
||||
expected:
|
||||
'Failed to stop interaction session (403): {"message":"Runtime termination approval denied"}',
|
||||
},
|
||||
])(
|
||||
'$name preserves the typed gateway denial in the CLI error',
|
||||
async ({ response, invoke, expected }) => {
|
||||
vi.stubGlobal(
|
||||
'fetch',
|
||||
vi.fn(
|
||||
async () =>
|
||||
new Response(JSON.stringify({ message: response.message }), {
|
||||
status: response.status,
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
}),
|
||||
),
|
||||
);
|
||||
|
||||
await expect(invoke()).rejects.toThrow(expected);
|
||||
},
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user