diff --git a/frontend/src/routes/page.svelte.test.ts b/frontend/src/routes/page.svelte.test.ts index a5146741..9881d900 100644 --- a/frontend/src/routes/page.svelte.test.ts +++ b/frontend/src/routes/page.svelte.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, afterEach } from 'vitest'; +import { describe, it, expect, afterEach, vi } from 'vitest'; import { cleanup, render } from 'vitest-browser-svelte'; import HomePage from './+page.svelte'; @@ -122,4 +122,50 @@ describe('home page (/)', () => { const grids = document.querySelectorAll('.grid.grid-cols-1'); expect(grids.length).toBeGreaterThan(0); }); + + it('renders the morning greeting before noon', async () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2026-04-14T08:00:00Z')); + try { + render(HomePage, { props: { data: baseData({ user: { firstName: 'Anna' } }) } }); + const heading = document.querySelector('h1'); + expect(heading?.textContent?.toLowerCase()).toMatch(/guten morgen|morning|morgen/); + } finally { + vi.useRealTimers(); + } + }); + + it('renders the day greeting between noon and 18', async () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2026-04-14T14:00:00Z')); + try { + render(HomePage, { props: { data: baseData({ user: { firstName: 'Anna' } }) } }); + const heading = document.querySelector('h1'); + // Just verify some heading is rendered with the user's name + expect(heading?.textContent).toContain('Anna'); + } finally { + vi.useRealTimers(); + } + }); + + it('renders the evening greeting after 18', async () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2026-04-14T20:00:00Z')); + try { + render(HomePage, { props: { data: baseData({ user: { firstName: 'Anna' } }) } }); + const heading = document.querySelector('h1'); + expect(heading?.textContent).toContain('Anna'); + } finally { + vi.useRealTimers(); + } + }); + + it('falls back to empty firstName when user has no name', async () => { + render(HomePage, { + props: { data: baseData({ user: { firstName: undefined, lastName: undefined } }) } + }); + + // The page mounts and computes greeting with empty name without throwing + expect(document.querySelector('main')).not.toBeNull(); + }); });