File size: 3,244 Bytes
1f21206 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { act, cleanup, fireEvent, render, screen } from '@testing-library/react'
import '@testing-library/jest-dom'
import { SessionTaskBar } from './SessionTaskBar'
import { useCLITaskStore } from '../../stores/cliTaskStore'
vi.mock('../../api/cliTasks', () => ({
cliTasksApi: {
getTasksForList: vi.fn(),
resetTaskList: vi.fn(async () => ({ ok: true })),
},
}))
vi.mock('../../i18n', () => ({
useTranslation: () => (key: string) => {
const translations: Record<string, string> = {
'tasks.title': 'Tasks',
'tasks.dismissCompleted': 'Hide completed tasks',
}
return translations[key] ?? key
},
}))
describe('SessionTaskBar', () => {
beforeEach(() => {
useCLITaskStore.setState({
sessionId: 'session-1',
tasks: [],
expanded: false,
completedAndDismissed: false,
dismissedCompletionKey: null,
})
})
afterEach(() => {
cleanup()
useCLITaskStore.getState().clearTasks()
})
it('only shows the dismiss button once every task is completed', () => {
act(() => {
useCLITaskStore.getState().setTasksFromTodos([
{ content: 'first', status: 'completed' },
{ content: 'second', status: 'in_progress', activeForm: 'working' },
])
})
act(() => {
render(<SessionTaskBar />)
})
expect(screen.getByText('Tasks')).toBeInTheDocument()
expect(screen.queryByRole('button', { name: 'Hide completed tasks' })).toBeNull()
})
it('hides the bar after dismissing a completed task set', async () => {
act(() => {
useCLITaskStore.getState().setTasksFromTodos([
{ content: 'first', status: 'completed' },
{ content: 'second', status: 'completed' },
])
})
act(() => {
render(<SessionTaskBar />)
})
await act(async () => {
fireEvent.click(screen.getByRole('button', { name: 'Hide completed tasks' }))
await Promise.resolve()
})
expect(screen.queryByText('Tasks')).toBeNull()
expect(useCLITaskStore.getState().tasks).toEqual([])
})
it('shows the bar again for a new task cycle after a previous completed set was dismissed', async () => {
act(() => {
useCLITaskStore.getState().setTasksFromTodos([
{ content: 'first', status: 'completed' },
])
})
act(() => {
render(<SessionTaskBar />)
})
await act(async () => {
fireEvent.click(screen.getByRole('button', { name: 'Hide completed tasks' }))
await Promise.resolve()
})
expect(screen.queryByText('Tasks')).toBeNull()
act(() => {
useCLITaskStore.getState().setTasksFromTodos([
{ content: 'next task', status: 'in_progress', activeForm: 'running next task' },
])
})
expect(screen.getByText('Tasks')).toBeInTheDocument()
expect(screen.queryByRole('button', { name: 'Hide completed tasks' })).toBeNull()
act(() => {
useCLITaskStore.getState().setTasksFromTodos([
{ content: 'next task', status: 'completed' },
])
})
expect(screen.getByText('Tasks')).toBeInTheDocument()
expect(screen.getByRole('button', { name: 'Hide completed tasks' })).toBeInTheDocument()
})
})
|