feat(planner): implement C1 weekly planner home screen (#26)
Three-breakpoint layout (mobile/tablet/desktop) with VarietyScoreCard, WeekStrip, DayMealCard components. Server loads week plan and variety score via API; read-only role behavior derived from benutzer.rolle. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
56
frontend/src/lib/planner/VarietyScoreCard.test.ts
Normal file
56
frontend/src/lib/planner/VarietyScoreCard.test.ts
Normal file
@@ -0,0 +1,56 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { render, screen } from '@testing-library/svelte';
|
||||
import VarietyScoreCard from './VarietyScoreCard.svelte';
|
||||
|
||||
const baseProps = {
|
||||
score: 7.5,
|
||||
ingredientOverlaps: [],
|
||||
showReviewLink: false
|
||||
};
|
||||
|
||||
describe('VarietyScoreCard', () => {
|
||||
it('renders the variety score', () => {
|
||||
render(VarietyScoreCard, { props: baseProps });
|
||||
expect(screen.getByText('7.5')).toBeTruthy();
|
||||
});
|
||||
|
||||
it('renders "/10" denominator', () => {
|
||||
render(VarietyScoreCard, { props: baseProps });
|
||||
expect(screen.getByText('/10')).toBeTruthy();
|
||||
});
|
||||
|
||||
it('renders a progress bar with correct aria attributes', () => {
|
||||
render(VarietyScoreCard, { props: baseProps });
|
||||
const bar = screen.getByRole('progressbar');
|
||||
expect(bar.getAttribute('aria-valuenow')).toBe('7.5');
|
||||
expect(bar.getAttribute('aria-valuemin')).toBe('0');
|
||||
expect(bar.getAttribute('aria-valuemax')).toBe('10');
|
||||
});
|
||||
|
||||
it('renders ingredient overlap warnings', () => {
|
||||
render(VarietyScoreCard, {
|
||||
props: {
|
||||
...baseProps,
|
||||
ingredientOverlaps: [{ ingredientName: 'Tomate', days: ['2026-03-30', '2026-03-31'] }]
|
||||
}
|
||||
});
|
||||
expect(screen.getByText(/Tomate/)).toBeTruthy();
|
||||
expect(screen.getByText(/2 Mahlzeiten/)).toBeTruthy();
|
||||
});
|
||||
|
||||
it('shows review link when showReviewLink is true', () => {
|
||||
render(VarietyScoreCard, { props: { ...baseProps, showReviewLink: true } });
|
||||
const link = screen.getByRole('link', { name: /Variety.*überprüfen|Review variety/i });
|
||||
expect(link).toBeTruthy();
|
||||
});
|
||||
|
||||
it('hides review link by default', () => {
|
||||
render(VarietyScoreCard, { props: baseProps });
|
||||
expect(screen.queryByRole('link', { name: /variety/i })).toBeNull();
|
||||
});
|
||||
|
||||
it('renders with score 0', () => {
|
||||
render(VarietyScoreCard, { props: { ...baseProps, score: 0 } });
|
||||
expect(screen.getByText('0')).toBeTruthy();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user