test(tours): align assignment coverage with row action

This commit is contained in:
elmocito
2026-10-06 15:09:50 +02:00
parent 99f3bbfb09
commit a05855ee2b
3 changed files with 25 additions and 9 deletions
+11 -4
View File
@@ -1,4 +1,5 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { within } from '@testing-library/react'
import en from '@trek/shared/i18n/en'
import de from '@trek/shared/i18n/de'
import fr from '@trek/shared/i18n/fr'
@@ -119,10 +120,16 @@ describe('Tours English and German copy', () => {
seedStore(useSettingsStore, { settings: { language: 'de' } })
const { rerender } = render(<TourListRow tour={tour} onSelect={() => {}} />)
await waitFor(() => expect(screen.getByLabelText(toursText(de, 'tours.planner.difficulty.t2'))).toBeInTheDocument())
rerender(<TourPlannerToursRail planner={planner({ saveOutcome: tour, mode: { type: 'edit-saved', placeId: 42 } })} tours={[tour]} days={[{ id: 7, title: 'Gipfeltag', date: '2026-05-15' } as never]} loading={false} onAssignToDay={vi.fn()} onViewGpxTour={vi.fn()} />)
expect(screen.getByText(toursText(de, 'tours.planner.saved'))).toBeInTheDocument()
fireEvent.click(screen.getByRole('button', { name: toursText(de, 'tours.planner.assignToDay') }))
expect(screen.getByRole('button', { name: /Tag 1.*Gipfeltag/ })).toBeInTheDocument()
const onAssignToDay = vi.fn()
rerender(<TourPlannerToursRail planner={planner({ saveOutcome: tour, mode: { type: 'edit-saved', placeId: 42 } })} tours={[tour]} days={[{ id: 7, title: 'Gipfeltag', date: '2026-05-15' } as never]} loading={false} onAssignToDay={onAssignToDay} onViewGpxTour={vi.fn()} />)
const saveBanner = screen.getByText(toursText(de, 'tours.planner.saved')).closest('[role="status"]')!
expect(within(saveBanner).getByRole('button', { name: toursText(de, 'tours.planner.planAnother') })).toBeInTheDocument()
expect(within(saveBanner).queryByRole('button', { name: toursText(de, 'tours.planner.assignToDay') })).not.toBeInTheDocument()
fireEvent.click(screen.getByRole('button', { name: `${toursText(de, 'tours.addToDay')}: ${tour.name}` }))
const dayOption = screen.getByRole('button', { name: /Gipfeltag/ })
expect(dayOption).toHaveTextContent(/Tag 1/)
fireEvent.click(dayOption)
await waitFor(() => expect(onAssignToDay).toHaveBeenCalledWith(42, 7))
assertNoRawToursKeys()
})
@@ -1,4 +1,4 @@
import { act, cleanup, fireEvent, render, renderHook, screen } from '@testing-library/react'
import { act, cleanup, fireEvent, render, renderHook, screen, within } from '@testing-library/react'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import type { TourListItem } from '@trek/shared'
@@ -141,18 +141,22 @@ describe('Tours permissions without database setup', () => {
} as unknown as TourPlannerController
const assign = vi.fn()
render(<><TourPlannerRail planner={planner} canEdit={canEdit} canAssign={canAssign} /><TourPlannerToursRail planner={planner} tours={[tour]} days={days} loading={false} onAssignToDay={assign} onViewGpxTour={vi.fn()} canEdit={canEdit} canAssign={canAssign} /></>)
const saveBanner = screen.getByText('tours.planner.saved').closest('[role="status"]')!
expect(within(saveBanner).getByRole('button', { name: 'tours.planner.planAnother' })).toBeInTheDocument()
expect(within(saveBanner).queryByRole('button', { name: 'tours.planner.assignToDay' })).not.toBeInTheDocument()
const save = screen.getByRole('button', { name: 'tours.planner.save' }) as HTMLButtonElement
expect(save.disabled).toBe(!canEdit)
fireEvent.click(save)
expect(planner.save).toHaveBeenCalledTimes(canEdit ? 1 : 0)
expect((screen.getByRole('button', { name: 'tours.planner.assignToDay' }) as HTMLButtonElement).disabled).toBe(!canAssign)
const picker = screen.queryByRole('button', { name: 'tours.addToDay: Ridge' })
expect(Boolean(picker)).toBe(canAssign)
if (picker) {
expect(picker).toBeEnabled()
fireEvent.click(picker)
fireEvent.click(screen.getByRole('button', { name: /Summit/ }))
}
expect(assign).toHaveBeenCalledTimes(canAssign ? 1 : 0)
if (canAssign) expect(assign).toHaveBeenCalledWith(tour.place_id, 3)
fireEvent.click(screen.getByRole('option', { name: /Ridge/ }))
expect(planner.openTour).toHaveBeenCalledWith(tour)
})
@@ -72,7 +72,7 @@ describe('CustomSelect consumer contracts', () => {
expect(setDifficulty).toHaveBeenLastCalledWith(4)
})
it('keeps the post-save day menu resolving numeric day ids', async () => {
it('routes post-save assignment through the Tour-row menu and resolves numeric day ids', async () => {
const user = userEvent.setup()
const onAssignToDay = vi.fn().mockResolvedValue(undefined)
render(<TranslationProvider><TourPlannerToursRail
@@ -80,8 +80,13 @@ describe('CustomSelect consumer contracts', () => {
planner={planner({ saveOutcome: tour, editingPlaceId: 42 })}
tours={[tour]} days={days} loading={false} onAssignToDay={onAssignToDay} onViewGpxTour={vi.fn()}
/></TranslationProvider>)
await user.click(screen.getByRole('button', { name: 'Assign to a day' }))
await user.click(screen.getByRole('button', { name: /Day 1/ }))
const saveBanner = screen.getByText('Tour saved').closest('[role="status"]')!
expect(within(saveBanner).getByRole('button', { name: 'Plan another' })).toBeInTheDocument()
expect(within(saveBanner).queryByRole('button', { name: 'Assign to a day' })).not.toBeInTheDocument()
await user.click(screen.getByRole('button', { name: 'Add to day: Ridge walk' }))
const dayOption = screen.getByRole('button', { name: /Summit day/ })
expect(dayOption).toHaveTextContent(/Day 1/)
await user.click(dayOption)
expect(onAssignToDay).toHaveBeenCalledWith(42, 7)
})