85 lines
3.8 KiB
TypeScript
85 lines
3.8 KiB
TypeScript
import { describe, it, expect, vi } from 'vitest';
|
|
import { render, screen } from '@testing-library/svelte';
|
|
import { userEvent } from '@testing-library/user-event';
|
|
import DayMealCard from './DayMealCard.svelte';
|
|
|
|
const slot = {
|
|
id: 's1',
|
|
slotDate: '2026-03-30',
|
|
recipe: { id: 'r1', name: 'Pasta Bolognese', effort: 'Easy', cookTimeMin: 30 }
|
|
};
|
|
|
|
describe('DayMealCard', () => {
|
|
it('renders recipe name', () => {
|
|
render(DayMealCard, { props: { slot, isToday: false, readonly: false } });
|
|
expect(screen.getByText('Pasta Bolognese')).toBeTruthy();
|
|
});
|
|
|
|
it('shows Jetzt kochen link and Tauschen button when not readonly and onaddrecipe provided', () => {
|
|
render(DayMealCard, { props: { slot, isToday: false, readonly: false, onaddrecipe: vi.fn() } });
|
|
expect(screen.getByRole('link', { name: /Jetzt kochen/i })).toBeTruthy();
|
|
expect(screen.getByRole('button', { name: /Tauschen/i })).toBeTruthy();
|
|
});
|
|
|
|
it('Tauschen button calls onaddrecipe when clicked', async () => {
|
|
const onaddrecipe = vi.fn();
|
|
const user = userEvent.setup();
|
|
render(DayMealCard, { props: { slot, isToday: false, readonly: false, onaddrecipe } });
|
|
await user.click(screen.getByRole('button', { name: /Tauschen/i }));
|
|
expect(onaddrecipe).toHaveBeenCalledOnce();
|
|
});
|
|
|
|
it('hides Tauschen button when onaddrecipe not provided', () => {
|
|
render(DayMealCard, { props: { slot, isToday: false, readonly: false } });
|
|
expect(screen.queryByRole('button', { name: /Tauschen/i })).toBeNull();
|
|
});
|
|
|
|
it('hides action links when readonly', () => {
|
|
render(DayMealCard, { props: { slot, isToday: false, readonly: true, onaddrecipe: vi.fn() } });
|
|
expect(screen.queryByRole('link', { name: /Jetzt kochen/i })).toBeNull();
|
|
expect(screen.queryByRole('button', { name: /Tauschen/i })).toBeNull();
|
|
});
|
|
|
|
it('applies today styling when isToday is true', () => {
|
|
render(DayMealCard, { props: { slot, isToday: true, readonly: false } });
|
|
const card = screen.getByTestId('day-meal-card');
|
|
expect(card.getAttribute('data-today')).toBe('true');
|
|
});
|
|
|
|
it('applies selected styling when isSelected is true and not today', () => {
|
|
render(DayMealCard, { props: { slot, isToday: false, isSelected: true, readonly: false } });
|
|
const card = screen.getByTestId('day-meal-card');
|
|
expect(card.getAttribute('data-selected')).toBe('true');
|
|
});
|
|
|
|
it('renders empty state when slot has no recipe', () => {
|
|
render(DayMealCard, { props: { slot: { id: 's2', slotDate: '2026-03-31', recipe: null }, isToday: false, readonly: false } });
|
|
expect(screen.getByText(/Kein Gericht/i)).toBeTruthy();
|
|
});
|
|
|
|
it('shows cook time and effort metadata', () => {
|
|
render(DayMealCard, { props: { slot, isToday: false, readonly: false } });
|
|
expect(screen.getByText(/30 Min/)).toBeTruthy();
|
|
expect(screen.getByText(/Easy/)).toBeTruthy();
|
|
});
|
|
|
|
it('empty state shows add button when onaddrecipe provided', () => {
|
|
const onaddrecipe = vi.fn();
|
|
render(DayMealCard, { props: { slot: { id: 's2', slotDate: '2026-03-31', recipe: null }, isToday: false, readonly: false, onaddrecipe } });
|
|
expect(screen.getByRole('button', { name: /Gericht hinzufügen/i })).toBeTruthy();
|
|
});
|
|
|
|
it('add button calls onaddrecipe when clicked', async () => {
|
|
const onaddrecipe = vi.fn();
|
|
const user = userEvent.setup();
|
|
render(DayMealCard, { props: { slot: { id: 's2', slotDate: '2026-03-31', recipe: null }, isToday: false, readonly: false, onaddrecipe } });
|
|
await user.click(screen.getByRole('button', { name: /Gericht hinzufügen/i }));
|
|
expect(onaddrecipe).toHaveBeenCalledOnce();
|
|
});
|
|
|
|
it('empty state hides add button when onaddrecipe not provided', () => {
|
|
render(DayMealCard, { props: { slot: { id: 's2', slotDate: '2026-03-31', recipe: null }, isToday: false, readonly: false } });
|
|
expect(screen.queryByRole('button', { name: /Gericht hinzufügen/i })).toBeNull();
|
|
});
|
|
});
|