feat(ui): add follow button, follows card, and inbox page
Build, Test & Push Frontend / quality-check (push) Successful in 34s
Build, Test & Push Frontend / docker (push) Successful in 23s

This commit is contained in:
lobo committed 2026-10-06 16:22:22 +02:00
1 parent 3aed243e35
commit 43c4862606
23 files changed
+603 -2

No files matched your search

+52
View File
@@ -0,0 +1,52 @@
// @vitest-environment jsdom
import {afterEach, describe, expect, it, vi} from 'vitest';
import {cleanup, screen, waitFor} from '@testing-library/react';
import InboxPage from './InboxPage.jsx';
import {fetchRoutes, json} from '../test/fetchRoutes.js';
import {renderWithProviders} from '../test/renderWithProviders.jsx';
vi.mock('react-i18next', () => import('../test/i18n-mock.js'));
const note = (id, extra) => ({id, kind: 'DIGEST', displayName: 'Lobo', newGames: 0, achievements: 0, statusChanges: 0,
wishlistAdds: 0, createdAt: '2026-10-06T10:00:00Z', read: false, ...extra});
const putCalls = () => fetch.mock.calls.filter(([, init]) => init?.method === 'PUT');
afterEach(() => {
cleanup();
vi.clearAllMocks();
});
describe('InboxPage', () => {
it('showsADigestWithOnlyTheNonZeroPartsAndMarksTheNotesRead', async () => {
fetchRoutes({'GET /api/inbox': json(200, {results: [note(1, {newGames: 12, wishlistAdds: 2})], unread: 1}),
'PUT /api/inbox/read': json(204)});
renderWithProviders(<InboxPage/>);
expect(await screen.findByText('INBOX.DIGEST')).toBeTruthy();
await waitFor(() => expect(putCalls()).toHaveLength(1));
});
it('showsAVisibilityNote', async () => {
fetchRoutes({'GET /api/inbox': json(200, {results: [note(1, {kind: 'VISIBILITY'})], unread: 1}),
'PUT /api/inbox/read': json(204)});
renderWithProviders(<InboxPage/>);
expect(await screen.findByText('INBOX.VISIBILITY')).toBeTruthy();
});
it('saysSoWhenThereAreNoNotesAndMarksNothing', async () => {
fetchRoutes({'GET /api/inbox': json(200, {results: [], unread: 0})});
renderWithProviders(<InboxPage/>);
expect(await screen.findByText('INBOX.EMPTY')).toBeTruthy();
expect(putCalls()).toEqual([]);
});
it('showsAnErrorAndMarksNothingWhenTheLoadFails', async () => {
fetchRoutes({'GET /api/inbox': json(500, {})});
renderWithProviders(<InboxPage/>);
expect(await screen.findByText('INBOX.LOAD_ERROR')).toBeTruthy();
expect(putCalls()).toEqual([]);
});
});