Files
kvitt/web/src/components/Avatar.test.tsx
T
jacobh2 2ae65a5a9f
Build Kvitt images / build (push) Failing after 1h14m5s
W0 web foundation: Vite + React SPA under /app/, sync-pull ledger, auth, tokens, shared components
web/ is the browser client's scaffold: Vite 8, React 19, TypeScript 5.9 strict, React Router 7 (basename /app, every
fixed route with a lazy placeholder page), TanStack Query 5 (refetch on focus and every 60 s), openapi-typescript
types generated from contracts/openapi.yaml with openapi-fetch. Reads go through GET /sync (no REST reads exist for
the ledger, SPEC §7): useLedger() pulls from cursor 0 and then incrementally, restarting on a new epoch or
cursor_ahead. Login pairs the browser as "Web · <browser>" with an invite code (E-3); every call sends the SPEC
§14.3.1 headers, a 401 signs out. kvitt-domain's split, balances, allocation and settlement rules are ported to
web/src/lib and pass every case of contracts/test-vectors. Design tokens from design-spec §2 in tokens.css
(light-dark()), Material Symbols Rounded (Apache-2.0) as generated inline SVG, sv/en catalogs generated from
docs/ux/strings.csv plus web-strings.csv. Gate: cd web && npm run check.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
2026-10-21 21:03:25 +02:00

22 lines
1.1 KiB
TypeScript

import { screen } from '@testing-library/react';
import { describe, expect, it } from 'vitest';
import { renderWithProviders } from '../test/render';
import { Avatar, avatarSlot, initials } from './Avatar';
describe('Avatar', () => {
it('derives initials and slots (AC-4.5, design-spec §2.5)', () => {
expect(initials('Jacob Hagstedt')).toBe('JH');
expect(initials(' anna ')).toBe('A');
expect(initials('Åsa Öberg Lind')).toBe('ÅÖ');
expect(avatarSlot('b', ['b', 'a'])).toBe(2);
expect(avatarSlot('a', ['b', 'a'])).toBe(1);
});
it('shows initials, or the picture, and is announced only when not decorative', () => {
const { rerender, wrap } = renderWithProviders(<Avatar displayName="Anna" slot={2} decorative={false} />);
expect(screen.getByRole('img', { name: 'Anna' })).toHaveTextContent('A');
rerender(wrap(<Avatar displayName="Anna" slot={2} pictureUrl="blob:picture" />));
expect(screen.queryByRole('img', { name: 'Anna' })).not.toBeInTheDocument();
expect(document.querySelector('img')).toHaveAttribute('src', 'blob:picture');
});
});