deckhearth/test/components/ScannerTips.test.js

61 lines
1.8 KiB
JavaScript
Raw Permalink Normal View History

// @vitest-environment jsdom
import { describe, it, expect, afterEach } from 'vitest';
import { render, screen, cleanup, fireEvent } from '@testing-library/react';
import ScannerTips from '../../components/scanner/ScannerTips';
const TIP_LEADS = [
'Good lighting',
'Fill the frame',
'Hold still',
'Use Batch Scan',
'Switch camera',
];
const TIP_BODIES = [
'avoid glare on foil cards.',
'with one card; keep corners visible.',
'until Auto-detect locks the match.',
'for a pile of photos from your gallery.',
'if the image is dark or mirrored.',
];
describe('ScannerTips', () => {
afterEach(() => cleanup());
it('opens the modal when the trigger is clicked', () => {
render(<ScannerTips />);
expect(screen.queryByRole('dialog')).toBeNull();
fireEvent.click(screen.getByRole('button', { name: 'Scanner Tips' }));
expect(screen.getByRole('dialog')).toBeTruthy();
expect(screen.getByRole('heading', { name: 'Scanner Tips' })).toBeTruthy();
});
it('lists all five locked tips when open', () => {
render(<ScannerTips />);
fireEvent.click(screen.getByRole('button', { name: 'Scanner Tips' }));
for (const lead of TIP_LEADS) {
expect(screen.getByText(lead, { selector: 'strong' })).toBeTruthy();
}
for (const body of TIP_BODIES) {
expect(screen.getByText(body, { exact: false })).toBeTruthy();
}
expect(screen.getAllByRole('listitem')).toHaveLength(5);
});
it('dismisses the modal when the close control is clicked', () => {
render(<ScannerTips />);
fireEvent.click(screen.getByRole('button', { name: 'Scanner Tips' }));
expect(screen.getByRole('dialog')).toBeTruthy();
fireEvent.click(screen.getByRole('button', { name: 'Close' }));
expect(screen.queryByRole('dialog')).toBeNull();
});
});