Raise frontend branch coverage from 86.84% to 93.78%

Branches were the weakest metric and had the least headroom above the
85% floor. These are tests for decision paths that were genuinely
unexercised, not padding.

The largest gaps were systemic rather than per-file: the
`err instanceof Error ? ... : fallback` branch was untested across eight
data hooks, useVacationDays had no dedicated test file at all, and
Calendar.tsx's missing-workspace/child/personalData fallbacks were never
hit.

Left deliberately uncovered, with reasons: `?? fallback` guards whose
fallback cannot occur given how the value is constructed upstream, and
guards behind buttons that are disabled whenever the guard would matter.
Reaching those means calling handlers directly, which tests the test
rather than the app.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RXMhc9nT6sNz1SL4j8dznL
This commit is contained in:
2026-09-14 18:54:56 +02:00
parent 8869ea8e55
commit c5481a05f0
23 changed files with 1063 additions and 5 deletions
@@ -203,6 +203,25 @@ describe('DayOverridesInput', () => {
const submitButton = screen.getByTestId('add-override-button') as HTMLButtonElement
expect(submitButton.disabled).toBe(true)
})
it('does not call onAdd when the form is submitted with no date entered', async () => {
render(
<DayOverridesInput
overrides={[]}
onAdd={mockOnAdd}
onRemove={mockOnRemove}
workspaceId="ws-1"
/>
)
// Submit the form directly (bypassing the disabled submit button) to
// exercise the handler's own empty-date guard.
fireEvent.submit(screen.getByTestId('add-override-form'))
await waitFor(() => {
expect(mockOnAdd).not.toHaveBeenCalled()
})
})
})
describe('removing override', () => {
@@ -222,6 +241,26 @@ describe('DayOverridesInput', () => {
expect(mockOnRemove).toHaveBeenCalledWith('do-1')
})
})
it('swallows an onRemove failure instead of throwing (handled by the parent)', async () => {
mockOnRemove.mockRejectedValueOnce(new Error('delete failed'))
render(
<DayOverridesInput
overrides={mockOverrides}
onAdd={mockOnAdd}
onRemove={mockOnRemove}
workspaceId="ws-1"
/>
)
fireEvent.click(screen.getByTestId('remove-override-do-1'))
await waitFor(() => {
expect(mockOnRemove).toHaveBeenCalledWith('do-1')
})
// The item is still rendered — the component didn't crash on the rejection.
expect(screen.getByTestId('override-item-do-1')).toBeInTheDocument()
})
})
describe('loading state', () => {