mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-19 05:26:47 +00:00
test(tours): align assignment coverage with row action
This commit is contained in:
@@ -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)
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user