diff --git a/frontend/src/lib/recipes/StepList.svelte b/frontend/src/lib/recipes/StepList.svelte new file mode 100644 index 0000000..7c7f104 --- /dev/null +++ b/frontend/src/lib/recipes/StepList.svelte @@ -0,0 +1,32 @@ + + +
+

+ Zubereitung +

+
    + {#each sortedSteps as step (step.stepNumber)} +
  1. +
    + {step.stepNumber} +
    +

    + {step.instruction} +

    +
  2. + {/each} +
+
diff --git a/frontend/src/lib/recipes/StepList.test.ts b/frontend/src/lib/recipes/StepList.test.ts new file mode 100644 index 0000000..5c8697b --- /dev/null +++ b/frontend/src/lib/recipes/StepList.test.ts @@ -0,0 +1,50 @@ +import { describe, it, expect } from 'vitest'; +import { render, screen } from '@testing-library/svelte'; +import StepList from './StepList.svelte'; + +const mockSteps = [ + { stepNumber: 1, instruction: 'Wasser zum Kochen bringen' }, + { stepNumber: 2, instruction: 'Spaghetti al dente kochen' }, + { stepNumber: 3, instruction: 'Sauce bereiten' } +]; + +describe('StepList', () => { + it('renders the section heading', () => { + render(StepList, { props: { steps: mockSteps } }); + expect(screen.getByText(/zubereitung/i)).toBeInTheDocument(); + }); + + it('renders each step instruction', () => { + render(StepList, { props: { steps: mockSteps } }); + expect(screen.getByText('Wasser zum Kochen bringen')).toBeInTheDocument(); + expect(screen.getByText('Spaghetti al dente kochen')).toBeInTheDocument(); + expect(screen.getByText('Sauce bereiten')).toBeInTheDocument(); + }); + + it('renders step numbers', () => { + render(StepList, { props: { steps: mockSteps } }); + expect(screen.getByText('1')).toBeInTheDocument(); + expect(screen.getByText('2')).toBeInTheDocument(); + expect(screen.getByText('3')).toBeInTheDocument(); + }); + + it('renders numbered circles with step numbers', () => { + render(StepList, { props: { steps: mockSteps } }); + const circles = document.querySelectorAll('[data-testid="step-circle"]'); + expect(circles).toHaveLength(3); + }); + + it('renders steps in stepNumber order', () => { + const shuffled = [mockSteps[2], mockSteps[0], mockSteps[1]]; + render(StepList, { props: { steps: shuffled } }); + const circles = document.querySelectorAll('[data-testid="step-circle"]'); + expect(circles[0].textContent).toBe('1'); + expect(circles[1].textContent).toBe('2'); + expect(circles[2].textContent).toBe('3'); + }); + + it('renders empty state when no steps', () => { + render(StepList, { props: { steps: [] } }); + expect(screen.getByText(/zubereitung/i)).toBeInTheDocument(); + }); +});