visual-journal / src /components /workbench-status-strip.test.tsx
Visual Journal deploy
Deploy 5554830 to Docker Space
e4e0afe
Raw
History Blame Contribute Delete
8.16 kB
import { WorkbenchStatusStrip } from './workbench-status-strip';
import { I18nProvider } from '@/lib/i18n';
import assert from 'node:assert/strict';
import { describe, it } from 'node:test';
import { renderToStaticMarkup } from 'react-dom/server';
describe('WorkbenchStatusStrip', () => {
it('shows model, request route, streaming mode, requested image count, and runtime state before generation', () => {
const html = renderToStaticMarkup(
<I18nProvider>
<WorkbenchStatusStrip
model='gpt-image-2'
routeLabel='images-sse'
streamStatus='自动'
requestSummaryLabel='请求 1 张图片'
/>
</I18nProvider>
);
assert.match(html, /当前请求路径已就绪/);
assert.match(html, /gpt-image-2/);
assert.match(html, /images-sse/);
assert.match(html, /自动/);
assert.match(html, /请求 1 张图片/);
});
it('shows explicit parallel batch state when the user enabled it for the current request', () => {
const html = renderToStaticMarkup(
<I18nProvider>
<WorkbenchStatusStrip
model='gpt-image-2'
routeLabel='默认线路'
streamStatus='自动'
parallelBatchEnabled
requestSummaryLabel='请求 2 张图片'
/>
</I18nProvider>
);
assert.match(html, /并发已启用/);
});
it('reserves the request mode slot before runtime details arrive', () => {
const html = renderToStaticMarkup(
<I18nProvider>
<WorkbenchStatusStrip
model='gpt-image-2'
routeLabel='默认线路'
streamStatus='非流式'
requestSummaryLabel='请求 1 张图片'
/>
</I18nProvider>
);
assert.match(html, /data-request-mode-placeholder="true"/);
assert.match(html, /aria-hidden="true"/);
assert.match(html, /请求方式/);
assert.doesNotMatch(html, /invisible/);
});
it('renders checking, disconnected, route-limited, and custom override runtime states explicitly', () => {
const checkingHtml = renderToStaticMarkup(
<I18nProvider>
<WorkbenchStatusStrip
model='gpt-image-2'
routeLabel='服务器默认'
streamStatus='非流式'
requestSummaryLabel='请求 1 张图片'
runtimeHealthStatus='checking'
/>
</I18nProvider>
);
const disconnectedHtml = renderToStaticMarkup(
<I18nProvider>
<WorkbenchStatusStrip
model='gpt-image-2'
routeLabel='服务器默认'
streamStatus='非流式'
requestSummaryLabel='请求 1 张图片'
runtimeHealthStatus='disconnected'
/>
</I18nProvider>
);
const routeLimitedHtml = renderToStaticMarkup(
<I18nProvider>
<WorkbenchStatusStrip
model='gpt-image-2'
routeLabel='服务器默认'
streamStatus='自动'
requestSummaryLabel='请求 1 张图片'
runtimeHealthStatus='route-limited'
/>
</I18nProvider>
);
const customOverrideHtml = renderToStaticMarkup(
<I18nProvider>
<WorkbenchStatusStrip
model='gpt-image-2'
routeLabel='使用自定义上游'
streamStatus='非流式'
requestSummaryLabel='请求 1 张图片'
runtimeHealthStatus='custom-override'
/>
</I18nProvider>
);
assert.match(checkingHtml, /正在读取运行时状态/);
assert.match(checkingHtml, /animate-spin/);
assert.match(disconnectedHtml, /未取得运行时状态/);
assert.match(routeLimitedHtml, /当前路由受限/);
assert.match(customOverrideHtml, /使用自定义上游/);
});
it('shows request mode health details and suggested channel env in the status strip', () => {
const html = renderToStaticMarkup(
<I18nProvider>
<WorkbenchStatusStrip
model='gpt-image-2'
routeLabel='服务器默认'
streamStatus='自动'
requestSummaryLabel='请求 1 张图片'
channelRouting={{
effectiveRequestModes: ['images-non-stream', 'images-sse'],
requestModeHealth: [
{
mode: 'images-non-stream',
configuredCredentialCount: 2,
healthyCredentialCount: 1,
configuredChannelCount: 2,
healthyChannelCount: 1
},
{
mode: 'responses-sse',
configuredCredentialCount: 1,
healthyCredentialCount: 0,
configuredChannelCount: 1,
healthyChannelCount: 0
}
]
}}
runtimeLastFailure={{
scope: 'channel',
status: 403,
code: 'image_generation_disabled',
requestMode: 'responses-sse'
}}
/>
</I18nProvider>
);
assert.match(html, /请求方式/);
assert.match(html, /images-non-stream/);
assert.match(html, /可用于请求/);
assert.match(html, /responses-sse/);
assert.match(html, /冷却中或待探测/);
assert.match(html, /最近渠道失败/);
assert.match(html, /HTTP 403/);
assert.match(html, /responses-sse/);
assert.match(html, /OPENAI_CHANNEL_N_REQUEST_MODES=images-non-stream/);
assert.match(html, /建议的环境变量/);
});
it('keeps request mode details constrained on narrow screens', () => {
const html = renderToStaticMarkup(
<I18nProvider>
<WorkbenchStatusStrip
model='gpt-image-2'
routeLabel='服务器默认'
streamStatus='自动'
requestSummaryLabel='请求 1 张图片'
channelRouting={{
effectiveRequestModes: ['images-non-stream'],
requestModeHealth: [
{
mode: 'images-non-stream',
configuredCredentialCount: 1,
healthyCredentialCount: 1,
configuredChannelCount: 1,
healthyChannelCount: 1
}
]
}}
/>
</I18nProvider>
);
assert.match(html, /group static max-w-full shrink-0 sm:relative sm:basis-auto/);
assert.match(html, /min-h-11 min-w-11 cursor-pointer/);
assert.match(html, /sr-only sm:not-sr-only/);
assert.match(html, /relative flex w-full min-w-0 flex-wrap/);
assert.match(html, /sm:w-auto/);
assert.match(html, /hidden h-3 w-px shrink-0 sm:block/);
assert.match(html, /hidden truncate sm:inline/);
assert.match(html, /absolute inset-x-0 top-full/);
assert.match(html, /sm:right-auto sm:left-0 sm:w-\[min\(88vw,28rem\)\]/);
assert.match(html, /xl:right-0 xl:left-auto/);
});
});