// @vitest-environment jsdom
import { describe, it, expect, afterEach } from 'vitest';
import { render, screen, cleanup, fireEvent, waitFor } from '@testing-library/react';
import { ConfirmProvider, useChoice, useConfirm } from '../components/ConfirmDialog';
afterEach(cleanup);
/** UX stage 3 (#694 ยง3): what replaced window.confirm in the admin. */
function Trigger({ onResult }: { onResult: (ok: boolean) => void }) {
const confirm = useConfirm();
return (
);
}
function setup() {
const results: boolean[] = [];
render(
results.push(ok)} />
,
);
fireEvent.click(screen.getByText('go'));
return results;
}
describe('ConfirmDialog', () => {
it('asks in an alertdialog named by its title', () => {
setup();
const dialog = screen.getByRole('alertdialog', { name: 'Delete it?' });
expect(dialog.textContent).toContain('Gone for good.');
});
it('resolves true on confirm and closes', async () => {
const results = setup();
fireEvent.click(screen.getByRole('button', { name: 'Delete' }));
await waitFor(() => expect(results).toEqual([true]));
expect(screen.queryByRole('alertdialog')).toBeNull();
});
it('resolves false on cancel, and on Escape', async () => {
const results = setup();
fireEvent.click(screen.getByRole('button', { name: 'Cancel' }));
await waitFor(() => expect(results).toEqual([false]));
fireEvent.click(screen.getByText('go'));
fireEvent.keyDown(document, { key: 'Escape' });
await waitFor(() => expect(results).toEqual([false, false]));
});
});
/** The concurrent-edit prompt (#601): more than two ways out. */
function ChoiceTrigger({ onResult }: { onResult: (id: string | null) => void }) {
const choose = useChoice();
return (
);
}
describe('useChoice', () => {
it('resolves to the picked action, or null on cancel', async () => {
const results: (string | null)[] = [];
render(
results.push(id)} />
,
);
fireEvent.click(screen.getByText('choose'));
fireEvent.click(screen.getByRole('button', { name: 'Reload (discard mine)' }));
await waitFor(() => expect(results).toEqual(['reload']));
fireEvent.click(screen.getByText('choose'));
fireEvent.click(screen.getByRole('button', { name: 'Overwrite anyway' }));
await waitFor(() => expect(results).toEqual(['reload', 'overwrite']));
fireEvent.click(screen.getByText('choose'));
fireEvent.click(screen.getByRole('button', { name: 'Keep editing' }));
await waitFor(() => expect(results).toEqual(['reload', 'overwrite', null]));
});
});