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

102 lines
2.9 KiB
TypeScript

// @vitest-environment jsdom
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { TheaterTranscript } from '../../../src/components/Theater/TheaterTranscript';
import type { CritiqueState } from '../../../src/components/Theater/state/reducer';
afterEach(() => cleanup());
const idle: CritiqueState = { phase: 'idle' };
describe('<TheaterTranscript> (Phase 8)', () => {
it('shows the loading copy while the transcript fetch is in flight', () => {
render(
<TheaterTranscript
state={idle}
status="loading"
error={null}
speed="instant"
onSpeedChange={() => undefined}
/>,
);
expect(screen.getByText('Loading transcript…')).toBeTruthy();
});
it('renders an alert with the error message when status is error', () => {
render(
<TheaterTranscript
state={idle}
status="error"
error="404 not found"
speed="instant"
onSpeedChange={() => undefined}
/>,
);
expect(screen.getByRole('alert').textContent).toContain('404 not found');
});
it('shows the empty copy when nothing has been replayed yet', () => {
render(
<TheaterTranscript
state={idle}
status="idle"
error={null}
speed="instant"
onSpeedChange={() => undefined}
/>,
);
expect(
screen.getByText('No transcript to replay yet. Run a critique to record one.'),
).toBeTruthy();
});
it('renders the read-only badge + speed picker for a running replay', () => {
const state: CritiqueState = {
phase: 'running',
runId: 'r',
config: { cast: ['critic'], maxRounds: 3, threshold: 8, scale: 10, protocolVersion: 1 },
rounds: [{ n: 1, mustFix: 0, panelists: {} }],
activeRound: 1,
activePanelist: null,
warnings: [],
};
render(
<TheaterTranscript
state={state}
status="playing"
error={null}
speed="instant"
onSpeedChange={() => undefined}
/>,
);
expect(screen.getByText('Read-only')).toBeTruthy();
expect(screen.getByRole('combobox')).toBeTruthy();
});
it('fires onSpeedChange when the user picks a different speed', () => {
const onSpeedChange = vi.fn();
const state: CritiqueState = {
phase: 'running',
runId: 'r',
config: { cast: ['critic'], maxRounds: 3, threshold: 8, scale: 10, protocolVersion: 1 },
rounds: [{ n: 1, mustFix: 0, panelists: {} }],
activeRound: 1,
activePanelist: null,
warnings: [],
};
render(
<TheaterTranscript
state={state}
status="playing"
error={null}
speed="instant"
onSpeedChange={onSpeedChange}
/>,
);
fireEvent.change(screen.getByRole('combobox'), { target: { value: 'paused' } });
expect(onSpeedChange).toHaveBeenCalledWith('paused');
});
});