Files
wehub-resource-sync 070959e133
landing-page-staging / Deploy landing page to staging (push) Has been skipped
landing-page-ci / Validate landing page (push) Failing after 4s
visual-baseline / Capture visual baselines (push) Has been cancelled
bake-plugin-previews / Bake plugin previews (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:00:47 +08:00

87 lines
1.9 KiB
TypeScript

// @vitest-environment jsdom
import { cleanup, render, screen } from '@testing-library/react';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { TerminalViewer } from '../../src/components/workspace/TerminalViewer';
import { I18nProvider } from '../../src/i18n';
vi.mock('@xterm/xterm', () => ({
Terminal: class {
cols = 80;
rows = 24;
options: { theme?: unknown } = {};
loadAddon() {}
open() {}
onData() {
return { dispose() {} };
}
write() {}
dispose() {}
},
}));
vi.mock('@xterm/addon-fit', () => ({
FitAddon: class {
fit() {}
},
}));
vi.mock('../../src/state/projects', () => ({
createTerminal: vi.fn(),
killTerminal: vi.fn(),
resizeTerminal: vi.fn(),
sendTerminalStdin: vi.fn(),
terminalStreamUrl: vi.fn(
(projectId: string, terminalId: string) =>
`/api/projects/${projectId}/terminals/${terminalId}/stream`,
),
}));
class StubEventSource {
static CLOSED = 2;
readyState = 0;
constructor(readonly url: string) {}
addEventListener() {}
close() {
this.readyState = StubEventSource.CLOSED;
}
}
beforeEach(() => {
vi.stubGlobal(
'ResizeObserver',
class {
observe() {}
unobserve() {}
disconnect() {}
},
);
vi.stubGlobal('EventSource', StubEventSource);
});
afterEach(() => {
cleanup();
vi.unstubAllGlobals();
vi.clearAllMocks();
});
describe('TerminalViewer', () => {
it('shows localized loading copy while the initial terminal connection is pending', () => {
render(
<I18nProvider initial="zh-CN">
<TerminalViewer terminalId="term-1" projectId="project-1" onClose={vi.fn()} />
</I18nProvider>,
);
const loading = screen.getByTestId('terminal-loading');
expect(loading.textContent).toContain('正在启动项目终端…');
expect(loading.textContent).toContain('正在连接项目目录,通常只需几秒。');
});
});