test: component tests with jsdom and Testing Library

First tests cover the library search debounce (fails on the old looping
version), the Pile of Shame states and the backlog save body. jsdom is
enabled per test file, so the plain util tests stay in the node environment.
This commit is contained in:
lobo committed 2026-09-24 12:06:34 +02:00
1 parent c24c22d5ed
commit bad11807e0
6 files changed
+918

No files matched your search

+50
View File
@@ -0,0 +1,50 @@
// @vitest-environment jsdom
import {afterEach, describe, expect, it, vi} from 'vitest';
import {cleanup, fireEvent, render, screen} from '@testing-library/react';
import {MemoryRouter} from 'react-router-dom';
import PileOfShameCard from './PileOfShameCard.jsx';
vi.mock('react-i18next', () => import('../test/i18n-mock.js'));
const summary = (backlog, extra = {}) => ({
total: backlog + 3,
neverPlayed: 1,
byStatus: {BACKLOG: backlog, PLAYING: 3, FINISHED: 0, COMPLETED: 0, DROPPED: 0},
suggestion: backlog > 0 ? {appid: 220, name: 'Half-Life 2'} : null,
...extra,
});
const renderCard = (props) => render(<MemoryRouter><PileOfShameCard onShuffle={() => {}} {...props}/></MemoryRouter>);
describe('PileOfShameCard', () => {
afterEach(cleanup);
it('shows the first-sync text instead of empty numbers while the first sync runs', () => {
renderCard({summary: {...summary(0), total: 0, byStatus: {BACKLOG: 0}}, syncing: true});
expect(screen.getByText('LIBRARY.SYNCING_FIRST_TIME')).toBeTruthy();
expect(screen.queryByText('DASHBOARD.BACKLOG_EMPTY')).toBeNull();
});
it('hides the shuffle button when there is nothing else to pick', () => {
renderCard({summary: summary(1)});
expect(screen.getByText('Half-Life 2')).toBeTruthy();
expect(screen.queryByRole('button', {name: /DASHBOARD.OTHER_SUGGESTION/})).toBeNull();
});
it('shuffles when the backlog has more than one game', () => {
const onShuffle = vi.fn();
renderCard({summary: summary(2), onShuffle});
fireEvent.click(screen.getByRole('button', {name: /DASHBOARD.OTHER_SUGGESTION/}));
expect(onShuffle).toHaveBeenCalledOnce();
});
it('says the backlog is empty when there is no suggestion', () => {
renderCard({summary: summary(0)});
expect(screen.getByText('DASHBOARD.BACKLOG_EMPTY')).toBeTruthy();
});
});