33 * invalid guardrails block submit.
44 */
55import { fireEvent , render , screen } from '@testing-library/react' ;
6+ import { MemoryRouter } from 'react-router-dom' ;
67import type { ReactNode } from 'react' ;
78import { beforeEach , describe , expect , it , vi } from 'vitest' ;
89
@@ -22,20 +23,29 @@ vi.mock('@/api/hooks/useFleetOps', () => {
2223} ) ;
2324
2425import { DriverDialog } from './DriverDialog' ;
26+ import type { ComponentProps } from 'react' ;
2527
2628const callbacks = { onClose : vi . fn ( ) , onSaved : vi . fn ( ) , onDelete : vi . fn ( ) , onRefresh : vi . fn ( ) } ;
2729
30+ function renderDialog ( props : ComponentProps < typeof DriverDialog > ) {
31+ return render (
32+ < MemoryRouter >
33+ < DriverDialog { ...props } />
34+ </ MemoryRouter > ,
35+ ) ;
36+ }
37+
2838beforeEach ( ( ) => {
2939 vi . clearAllMocks ( ) ;
3040 h . mutate . mockClear ( ) ;
3141} ) ;
3242
3343describe ( 'DriverDialog guardrails' , ( ) => {
3444 it ( 'submits charge cap + curfew in the create payload' , ( ) => {
35- render ( < DriverDialog item = { null } { ...callbacks } /> ) ;
36- fireEvent . change ( screen . getByLabelText ( ' Display name' ) , { target : { value : 'Teen' } } ) ;
37- fireEvent . change ( screen . getByLabelText ( ' Non-sensitive reference code' ) , { target : { value : 'T1' } } ) ;
38- fireEvent . change ( screen . getByLabelText ( ' Charge cap (%)' ) , { target : { value : '80' } } ) ;
45+ renderDialog ( { item : null , ...callbacks } ) ;
46+ fireEvent . change ( screen . getByLabelText ( / D i s p l a y n a m e / ) , { target : { value : 'Teen' } } ) ;
47+ fireEvent . change ( screen . getByLabelText ( / N o n - s e n s i t i v e r e f e r e n c e c o d e / ) , { target : { value : 'T1' } } ) ;
48+ fireEvent . change ( screen . getByLabelText ( / C h a r g e c a p \( % \) / ) , { target : { value : '80' } } ) ;
3949 fireEvent . change ( screen . getByLabelText ( 'Curfew start' ) , { target : { value : '22:00' } } ) ;
4050 fireEvent . change ( screen . getByLabelText ( 'Curfew end' ) , { target : { value : '06:00' } } ) ;
4151 fireEvent . click ( screen . getByText ( 'Save' ) ) ;
@@ -50,9 +60,9 @@ describe('DriverDialog guardrails', () => {
5060 } ) ;
5161
5262 it ( 'blocks submit on a half-set curfew' , ( ) => {
53- render ( < DriverDialog item = { null } { ...callbacks } /> ) ;
54- fireEvent . change ( screen . getByLabelText ( ' Display name' ) , { target : { value : 'Teen' } } ) ;
55- fireEvent . change ( screen . getByLabelText ( ' Non-sensitive reference code' ) , { target : { value : 'T1' } } ) ;
63+ renderDialog ( { item : null , ...callbacks } ) ;
64+ fireEvent . change ( screen . getByLabelText ( / D i s p l a y n a m e / ) , { target : { value : 'Teen' } } ) ;
65+ fireEvent . change ( screen . getByLabelText ( / N o n - s e n s i t i v e r e f e r e n c e c o d e / ) , { target : { value : 'T1' } } ) ;
5666 fireEvent . change ( screen . getByLabelText ( 'Curfew start' ) , { target : { value : '22:00' } } ) ;
5767 fireEvent . click ( screen . getByText ( 'Save' ) ) ;
5868
@@ -61,16 +71,14 @@ describe('DriverDialog guardrails', () => {
6171 } ) ;
6272
6373 it ( 'seeds guardrails when editing an existing driver' , ( ) => {
64- render (
65- < DriverDialog
66- item = { {
74+ renderDialog ( {
75+ item : {
6776 id : 1 , display_name : 'Teen' , reference_code : 'T1' , status : 'active' ,
6877 max_charge_soc : 80 , curfew_start : '22:00' , curfew_end : '06:00' ,
6978 version : 2 , created_at : '' , updated_at : '' ,
70- } }
71- { ...callbacks }
72- /> ,
73- ) ;
79+ } ,
80+ ...callbacks ,
81+ } ) ;
7482 expect ( screen . getByLabelText ( 'Charge cap (%)' ) ) . toHaveProperty ( 'value' , '80' ) ;
7583 expect ( screen . getByLabelText ( 'Curfew start' ) ) . toHaveProperty ( 'value' , '22:00' ) ;
7684 } ) ;
0 commit comments