mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-21 06:11:45 +00:00
fix tests for sidebar/settings refactor + weather archive fallback
- DayPlanSidebar: add aria-label to undo button, replace title with aria-label
so tests can still locate buttons by accessible name after tooltip refactor
- tests: switch getByTitle("Add Note") to getByLabelText
- tests: find undo button via aria-label (new expand/collapse button also uses
width:30, breaking the old style-based lookup)
- PlacesSidebar tests: loosen "All" button regex to account for count badge
- DisplaySettingsTab tests: use getByRole for Auto button (two "Auto" spans
coexist for mobile/desktop); handle multiple English matches in lang test
- weatherService tests: past-date case now expects an archive fetch instead
of an immediate no_forecast error
This commit is contained in:
@@ -187,7 +187,7 @@ describe('DayPlanSidebar', () => {
|
||||
const assignments = { '10': [assignment] }
|
||||
render(<DayPlanSidebar {...makeDefaultProps({ days: [day], places: [place], assignments })} />)
|
||||
// The chevron button immediately follows the "Add Note" button (which has a title attribute)
|
||||
const addNoteBtn = screen.getByTitle('Add Note')
|
||||
const addNoteBtn = screen.getByLabelText('Add Note')
|
||||
const chevron = addNoteBtn.nextElementSibling as HTMLButtonElement
|
||||
expect(chevron).toBeTruthy()
|
||||
await user.click(chevron)
|
||||
@@ -201,7 +201,7 @@ describe('DayPlanSidebar', () => {
|
||||
const assignment = buildAssignment({ id: 99, day_id: 10, order_index: 0, place })
|
||||
const assignments = { '10': [assignment] }
|
||||
render(<DayPlanSidebar {...makeDefaultProps({ days: [day], places: [place], assignments })} />)
|
||||
const getChevron = () => screen.getByTitle('Add Note').nextElementSibling as HTMLButtonElement
|
||||
const getChevron = () => screen.getByLabelText('Add Note').nextElementSibling as HTMLButtonElement
|
||||
await user.click(getChevron()) // collapse
|
||||
expect(screen.queryByText('Eiffel Tower')).not.toBeInTheDocument()
|
||||
await user.click(getChevron()) // re-expand
|
||||
@@ -362,28 +362,14 @@ describe('DayPlanSidebar', () => {
|
||||
const user = userEvent.setup()
|
||||
const onUndo = vi.fn()
|
||||
render(<DayPlanSidebar {...makeDefaultProps({ canUndo: true, lastActionLabel: 'Removed place', onUndo })} />)
|
||||
// Find the undo button — it has width 30, height 30 and is not disabled
|
||||
const buttons = screen.getAllByRole('button')
|
||||
// The undo button is the one with the Undo2 icon and is not disabled
|
||||
const undoBtn = buttons.find(btn => {
|
||||
const style = btn.getAttribute('style') || ''
|
||||
return style.includes('width: 30px') || style.includes('width:30px') || (style.includes('30') && !btn.disabled)
|
||||
})
|
||||
if (undoBtn) {
|
||||
await user.click(undoBtn)
|
||||
expect(onUndo).toHaveBeenCalled()
|
||||
}
|
||||
const undoBtn = screen.getByLabelText('Undo')
|
||||
await user.click(undoBtn)
|
||||
expect(onUndo).toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('FE-PLANNER-DAYPLAN-024: undo button not present when onUndo not provided', () => {
|
||||
render(<DayPlanSidebar {...makeDefaultProps({ canUndo: false })} />)
|
||||
// When onUndo is not provided, the undo section is not rendered at all
|
||||
const buttons = screen.getAllByRole('button')
|
||||
const undoBtn = buttons.find(btn => {
|
||||
const style = btn.getAttribute('style') || ''
|
||||
return style.includes('width: 30px')
|
||||
})
|
||||
expect(undoBtn).toBeUndefined()
|
||||
expect(screen.queryByLabelText('Undo')).toBeNull()
|
||||
})
|
||||
|
||||
// ── PDF export ──────────────────────────────────────────────────────────
|
||||
@@ -931,7 +917,7 @@ describe('DayPlanSidebar', () => {
|
||||
const user = userEvent.setup()
|
||||
const day = buildDay({ id: 10, date: '2025-06-01', title: 'Day 1' })
|
||||
render(<DayPlanSidebar {...makeDefaultProps({ days: [day] })} />)
|
||||
const addNoteBtn = screen.getByTitle('Add Note')
|
||||
const addNoteBtn = screen.getByLabelText('Add Note')
|
||||
await user.click(addNoteBtn)
|
||||
expect(mockDayNotesState.openAddNote).toHaveBeenCalled()
|
||||
})
|
||||
|
||||
@@ -1074,6 +1074,7 @@ const DayPlanSidebar = React.memo(function DayPlanSidebar({
|
||||
<button
|
||||
onClick={onUndo}
|
||||
disabled={!canUndo}
|
||||
aria-label={t('undo.button')}
|
||||
onMouseEnter={() => setUndoHover(true)}
|
||||
onMouseLeave={() => setUndoHover(false)}
|
||||
style={{
|
||||
|
||||
@@ -195,7 +195,7 @@ describe('Filter tabs', () => {
|
||||
const assignments = { '1': [buildAssignment({ place: planned, day_id: 1 })] };
|
||||
render(<PlacesSidebar {...defaultProps} places={[planned, unplanned]} assignments={assignments} />);
|
||||
await user.click(screen.getByRole('button', { name: /Unplanned/i }));
|
||||
await user.click(screen.getByRole('button', { name: /^All$/i }));
|
||||
await user.click(screen.getByRole('button', { name: /^All/i }));
|
||||
expect(screen.getByText('Planned Place')).toBeInTheDocument();
|
||||
expect(screen.getByText('Unplanned Place')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user