shinkan-jinkendo/frontend/src/utils/planningUnitRoutes.test.js
Lars cb868373f4
All checks were successful
Deploy Development / deploy (push) Successful in 47s
Test Suite / pytest-backend (push) Successful in 41s
Test Suite / lint-backend (push) Successful in 0s
Test Suite / build-frontend (push) Successful in 13s
Test Suite / k6 /health Baseline (push) Successful in 34s
Test Suite / playwright-tests (push) Successful in 1m16s
Test Suite / pytest-backend (pull_request) Successful in 36s
Test Suite / lint-backend (pull_request) Successful in 0s
Test Suite / build-frontend (pull_request) Successful in 13s
Test Suite / k6 /health Baseline (pull_request) Successful in 34s
Test Suite / playwright-tests (pull_request) Successful in 1m13s
Enhance PlanningLayout and TrainingUnitEditPage with unsaved changes handling
- Updated PlanningLayout to conditionally render the PlanningRouteNav based on the current path, improving navigation for planning unit editors.
- Enhanced TrainingUnitEditPage with unsaved changes detection, integrating a prompt for users to confirm before leaving the page with unsaved changes.
- Introduced utility functions for creating a stable snapshot of form data to facilitate dirty-checking, ensuring better user experience during form editing.
- Added tests for the new utility functions to validate their behavior in various scenarios.
2026-05-19 14:39:46 +02:00

62 lines
2.2 KiB
JavaScript

import { describe, expect, it } from 'vitest'
import {
buildPlanUnitEditPath,
buildPlanUnitNewPath,
buildPlanningHubReturnState,
isPlanningUnitEditorPath,
legacyPlanningUnitDeepLinkTarget,
parsePlanningHubQuery,
planningHubPathFromReturnState,
} from './planningUnitRoutes.js'
describe('planningUnitRoutes', () => {
it('buildPlanUnitEditPath', () => {
expect(buildPlanUnitEditPath(42)).toBe('/planning/units/42/edit')
expect(buildPlanUnitEditPath('7')).toBe('/planning/units/7/edit')
expect(buildPlanUnitEditPath(0)).toBe('/planning')
})
it('buildPlanUnitNewPath with query', () => {
expect(buildPlanUnitNewPath({ groupId: 3, plannedDate: '2026-05-20' })).toBe(
'/planning/units/new?group=3&date=2026-05-20'
)
expect(buildPlanUnitNewPath()).toBe('/planning/units/new')
})
it('isPlanningUnitEditorPath', () => {
expect(isPlanningUnitEditorPath('/planning/units/new')).toBe(true)
expect(isPlanningUnitEditorPath('/planning/units/42/edit')).toBe(true)
expect(isPlanningUnitEditorPath('/planning')).toBe(false)
expect(isPlanningUnitEditorPath('/planning/training-modules')).toBe(false)
})
it('legacyPlanningUnitDeepLinkTarget', () => {
expect(legacyPlanningUnitDeepLinkTarget('unit=5')).toBe('/planning/units/5/edit')
expect(legacyPlanningUnitDeepLinkTarget('unit=5&debrief=1')).toBe(
'/planning/units/5/edit?mode=debrief'
)
expect(legacyPlanningUnitDeepLinkTarget('')).toBeNull()
})
it('planning hub return roundtrip', () => {
const state = buildPlanningHubReturnState({
selectedGroupId: '12',
planView: 'calendar',
calendarMonthStr: '2026-06',
assignedToMeOnly: true,
})
const path = planningHubPathFromReturnState(state)
expect(path).toContain('/planning?')
expect(path).toContain('group=12')
expect(path).toContain('view=calendar')
expect(path).toContain('month=2026-06')
expect(path).toContain('mine=1')
const parsed = parsePlanningHubQuery(path.split('?')[1] || '')
expect(parsed.selectedGroupId).toBe('12')
expect(parsed.planView).toBe('calendar')
expect(parsed.calendarMonthStr).toBe('2026-06')
expect(parsed.assignedToMeOnly).toBe(true)
})
})