diff --git a/frontend/src/app.d.ts b/frontend/src/app.d.ts index 6c9d3a6..d510808 100644 --- a/frontend/src/app.d.ts +++ b/frontend/src/app.d.ts @@ -12,7 +12,7 @@ declare global { rolle: 'planer' | 'mitglied'; }; haushalt?: { - id: string; + id: string | undefined; name: string; }; } diff --git a/frontend/src/hooks.server.test.ts b/frontend/src/hooks.server.test.ts index b27342e..708071e 100644 --- a/frontend/src/hooks.server.test.ts +++ b/frontend/src/hooks.server.test.ts @@ -101,6 +101,36 @@ describe('auth guard (hooks.server.ts handle)', () => { expect(resolve).toHaveBeenCalledWith(event); }); + it('handles user without household gracefully', async () => { + mockGet.mockResolvedValue({ + data: { + data: { + id: '456', + displayName: 'Neu', + householdId: null, + householdName: null, + householdRole: null, + email: 'neu@example.com', + systemRole: 'user' + } + }, + error: undefined + }); + + const { event, resolve } = createEvent('/planner', 'valid-session'); + await handle({ event, resolve }); + expect(event.locals.benutzer).toEqual({ + id: '456', + name: 'Neu', + rolle: 'mitglied' + }); + expect(event.locals.haushalt).toEqual({ + id: undefined, + name: 'Kein Haushalt' + }); + expect(resolve).toHaveBeenCalledWith(event); + }); + it('redirects to /login with redirect param when session validation fails', async () => { mockGet.mockResolvedValue({ data: undefined, error: { status: 401 } }); diff --git a/frontend/src/hooks.server.ts b/frontend/src/hooks.server.ts index afa1868..0f60418 100644 --- a/frontend/src/hooks.server.ts +++ b/frontend/src/hooks.server.ts @@ -39,11 +39,11 @@ export const handle: Handle = async ({ event, resolve }) => { event.locals.benutzer = { id: user.id!, name: user.displayName!, - rolle: user.householdRole as 'planer' | 'mitglied' + rolle: (user.householdRole as 'planer' | 'mitglied') ?? 'mitglied' }; event.locals.haushalt = { - id: user.householdId!, - name: user.householdName! + id: user.householdId ?? undefined, + name: user.householdName ?? 'Kein Haushalt' }; return resolve(event);