feat(worker): auth gate, Dutch login screen, router and 3-tab shell

This commit is contained in:
Bas van Rossem
2026-06-17 16:11:18 +02:00
parent 3511fd8a89
commit 75679256cd
11 changed files with 465 additions and 4 deletions

View File

@@ -0,0 +1,45 @@
import { render, screen, within } from '@testing-library/react';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import App from './App';
import { clearToken, setToken } from './lib/auth-storage';
// Stub the network layer so stub screens render without real requests.
vi.mock('./lib/api', async () => {
const actual = await vi.importActual<typeof import('./lib/api')>('./lib/api');
return {
...actual,
apiFetch: vi.fn().mockResolvedValue([]),
};
});
function renderApp() {
const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } });
return render(
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>,
);
}
describe('App', () => {
afterEach(() => {
clearToken();
});
it('shows the login screen when there is no token', () => {
clearToken();
renderApp();
expect(screen.getByText('E-mailadres')).toBeInTheDocument();
expect(screen.getByRole('button', { name: 'Inloggen' })).toBeInTheDocument();
});
it('shows the tab bar when a token is present', () => {
setToken('tok');
renderApp();
const tabbar = within(screen.getByRole('navigation'));
expect(tabbar.getByText('Stopwatch')).toBeInTheDocument();
expect(tabbar.getByText('Geschiedenis')).toBeInTheDocument();
expect(tabbar.getByText('Instellingen')).toBeInTheDocument();
});
});