diff --git a/__tests__/components/jobs/job-detail-pane.test.tsx b/__tests__/components/jobs/job-detail-pane.test.tsx new file mode 100644 index 0000000..9e51f87 --- /dev/null +++ b/__tests__/components/jobs/job-detail-pane.test.tsx @@ -0,0 +1,75 @@ +// @vitest-environment jsdom +import { describe, it, expect, vi, beforeEach } from 'vitest' +import { render, screen, fireEvent } from '@testing-library/react' +import '@testing-library/jest-dom' +import type { JobWithRelations } from '@/actions/jobs-page' + +vi.mock('@/actions/claude-jobs', () => ({ + restartClaudeJobAction: vi.fn(), +})) + +vi.mock('sonner', () => ({ toast: { error: vi.fn() } })) + +import { restartClaudeJobAction } from '@/actions/claude-jobs' +import JobDetailPane from '@/components/jobs/job-detail-pane' + +const mockAction = restartClaudeJobAction as ReturnType + +function makeJob(status: JobWithRelations['status']): JobWithRelations { + return { + id: 'job-1', + kind: 'TASK_IMPLEMENTATION', + status, + taskCode: 'T-1', + taskTitle: 'Test taak', + ideaCode: null, + ideaTitle: null, + sprintGoal: null, + sprintCode: null, + productName: 'Scrum4Me', + modelId: null, + inputTokens: null, + outputTokens: null, + cacheReadTokens: null, + cacheWriteTokens: null, + costUsd: null, + branch: null, + prUrl: null, + error: null, + summary: null, + description: null, + verifyResult: null, + startedAt: null, + finishedAt: null, + createdAt: new Date('2026-01-01'), + sprintRunId: null, + } +} + +beforeEach(() => { + vi.clearAllMocks() + mockAction.mockResolvedValue({ success: true }) +}) + +describe('JobDetailPane restart button', () => { + it('toont de knop voor FAILED-jobs', () => { + render() + expect(screen.getByRole('button', { name: /opnieuw starten/i })).toBeInTheDocument() + }) + + it('toont de knop niet voor DONE-jobs', () => { + render() + expect(screen.queryByRole('button', { name: /opnieuw starten/i })).not.toBeInTheDocument() + }) + + it('roept restartClaudeJobAction aan met het juiste id bij klik', () => { + render() + fireEvent.click(screen.getByRole('button', { name: /opnieuw starten/i })) + expect(mockAction).toHaveBeenCalledWith('job-1') + }) + + it('knop is disabled in demo-modus', () => { + render() + expect(screen.getByRole('button', { name: /opnieuw starten/i })).toBeDisabled() + }) +})