From a05855ee2bfc7b63c1f6f51bf3a3739d44d36b9f Mon Sep 17 00:00:00 2001 From: elmocito <42518790+elmocito@users.noreply.github.com> Date: Tue, 6 Oct 2026 15:09:50 +0200 Subject: [PATCH] test(tours): align assignment coverage with row action --- client/src/components/Tours/toursI18n.test.tsx | 15 +++++++++++---- .../components/Tours/toursPermissions.test.tsx | 8 ++++++-- .../shared/CustomSelect.consumers.test.tsx | 11 ++++++++--- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/client/src/components/Tours/toursI18n.test.tsx b/client/src/components/Tours/toursI18n.test.tsx index e86b15e3a..dee72687d 100644 --- a/client/src/components/Tours/toursI18n.test.tsx +++ b/client/src/components/Tours/toursI18n.test.tsx @@ -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( {}} />) await waitFor(() => expect(screen.getByLabelText(toursText(de, 'tours.planner.difficulty.t2'))).toBeInTheDocument()) - rerender() - 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() + 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() }) diff --git a/client/src/components/Tours/toursPermissions.test.tsx b/client/src/components/Tours/toursPermissions.test.tsx index ab62dc77c..4e34a282e 100644 --- a/client/src/components/Tours/toursPermissions.test.tsx +++ b/client/src/components/Tours/toursPermissions.test.tsx @@ -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(<>) + 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) }) diff --git a/client/src/components/shared/CustomSelect.consumers.test.tsx b/client/src/components/shared/CustomSelect.consumers.test.tsx index 9c2ca548b..a75005ae2 100644 --- a/client/src/components/shared/CustomSelect.consumers.test.tsx +++ b/client/src/components/shared/CustomSelect.consumers.test.tsx @@ -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( { planner={planner({ saveOutcome: tour, editingPlaceId: 42 })} tours={[tour]} days={days} loading={false} onAssignToDay={onAssignToDay} onViewGpxTour={vi.fn()} />) - 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) })