import { cleanup, render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { JobPanel } from '../../../src/components/JobPanel';
import type { ExportResult } from '../../../src/export';
afterEach(() => {
cleanup();
vi.restoreAllMocks();
});
describe('JobPanel result selection', () => {
it('downloads only the selected generated results as ZIP', async () => {
const user = userEvent.setup();
const onSaveZip = vi.fn();
const first = result('one', 'one.png');
const second = result('two', 'two.png');
render(
);
await waitFor(() =>
expect(
screen.getByRole('button', {
name: 'Download selected as ZIP (2)',
})
).toBeEnabled()
);
await user.click(
screen.getByRole('checkbox', { name: 'Select two.png for ZIP' })
);
await user.click(
screen.getByRole('button', { name: 'Download selected as ZIP (1)' })
);
expect(onSaveZip).toHaveBeenCalledWith([first]);
});
it('marks browser-rejected media as download-only and does not offer Preview', () => {
vi.spyOn(HTMLMediaElement.prototype, 'canPlayType').mockReturnValue('');
const output = mediaResult('audio', 'archive.flac', 'audio/flac');
render(
);
expect(screen.queryByRole('button', { name: 'Preview' })).toBeNull();
expect(
screen.getByText(/Download only: The browser reports no native/iu)
).toBeVisible();
expect(screen.getByRole('button', { name: 'Save result' })).toBeEnabled();
});
it('shows the exact split interval and per-result verification state', () => {
const output = {
...mediaResult('segment', 'clip-001.mp4', 'video/mp4'),
timeRange: { startSeconds: 1.25, endSeconds: 3.5 },
};
render(
);
expect(
screen.getByText(
'Segment range 00:00:01.250–00:00:03.500 · 00:00:02.250 duration'
)
).toBeVisible();
expect(screen.getByText(/created · verification warning/iu)).toBeVisible();
expect(
screen.getByText('Output was created, but its verification probe failed.')
).toBeVisible();
});
});
function result(id: string, fileName: string): ExportResult {
const blob = new Blob([id], { type: 'image/png' });
return {
id,
planId: `plan-${id}`,
outputId: `output-${id}`,
fileName,
blob,
mimeType: blob.type,
role: 'thumbnail',
size: blob.size,
createdAt: '2026-01-01T00:00:00.000Z',
};
}
function mediaResult(
id: string,
fileName: string,
mimeType: string
): ExportResult {
const blob = new Blob([id], { type: mimeType });
return {
id,
planId: `plan-${id}`,
outputId: `output-${id}`,
fileName,
blob,
mimeType,
role: 'media',
size: blob.size,
createdAt: '2026-01-01T00:00:00.000Z',
};
}