@@ -2,6 +2,16 @@ import { expect } from '@playwright/test';
22import  type  {  Locator  }  from  '@playwright/test' ; 
33import  {  configs ,  test  }  from  '@utils/test/playwright' ; 
44
5+ /** 
6+  * Simulates an autofill event in an input element with the given value 
7+  */ 
8+ async  function  simulateAutofill ( input : any ,  value : string )  { 
9+   await  input . evaluate ( ( input : any ,  value : string )  =>  { 
10+     ( input  as  HTMLInputElement ) . value  =  value ; 
11+     input . dispatchEvent ( new  Event ( 'input' ,  {  bubbles : true  } ) ) ; 
12+   } ,  value ) ; 
13+ } 
14+ 
515/** 
616 * Simulates a paste event in an input element with the given value 
717 */ 
@@ -429,37 +439,52 @@ configs({ modes: ['ios'] }).forEach(({ title, config }) => {
429439
430440      await  verifyInputValues ( inputOtp ,  [ '1' ,  '9' ,  '3' ,  '' ] ) ; 
431441    } ) ; 
442+   } ) ; 
432443
444+   test . describe ( title ( 'input-otp: autofill functionality' ) ,  ( )  =>  { 
433445    test ( 'should handle autofill correctly' ,  async  ( {  page } )  =>  { 
434446      await  page . setContent ( `<ion-input-otp>Description</ion-input-otp>` ,  config ) ; 
435447
436448      const  firstInput  =  page . locator ( 'ion-input-otp input' ) . first ( ) ; 
449+       await  firstInput . focus ( ) ; 
437450
438-       // Set the value in the 1st input directly and trigger input event 
439-       // this simulates the value being set by autofill 
440-       await  firstInput . evaluate ( ( input )  =>  { 
441-         ( input  as  HTMLInputElement ) . value  =  '1234' ; 
442-         input . dispatchEvent ( new  Event ( 'input' ,  {  bubbles : true  } ) ) ; 
443-       } ) ; 
451+       await  simulateAutofill ( firstInput ,  '1234' ) ; 
444452
445453      const  inputOtp  =  page . locator ( 'ion-input-otp' ) ; 
446454      await  verifyInputValues ( inputOtp ,  [ '1' ,  '2' ,  '3' ,  '4' ] ) ; 
455+ 
456+       const  lastInput  =  page . locator ( 'ion-input-otp input' ) . last ( ) ; 
457+       await  expect ( lastInput ) . toBeFocused ( ) ; 
447458    } ) ; 
448459
449460    test ( 'should handle autofill correctly when it exceeds the length' ,  async  ( {  page } )  =>  { 
450461      await  page . setContent ( `<ion-input-otp>Description</ion-input-otp>` ,  config ) ; 
451462
452463      const  firstInput  =  page . locator ( 'ion-input-otp input' ) . first ( ) ; 
464+       await  firstInput . focus ( ) ; 
453465
454-       // Set the value in the 1st input directly and trigger input event 
455-       // this simulates the value being set by autofill 
456-       await  firstInput . evaluate ( ( input )  =>  { 
457-         ( input  as  HTMLInputElement ) . value  =  '123456' ; 
458-         input . dispatchEvent ( new  Event ( 'input' ,  {  bubbles : true  } ) ) ; 
459-       } ) ; 
466+       await  simulateAutofill ( firstInput ,  '123456' ) ; 
460467
461468      const  inputOtp  =  page . locator ( 'ion-input-otp' ) ; 
462469      await  verifyInputValues ( inputOtp ,  [ '1' ,  '2' ,  '3' ,  '4' ] ) ; 
470+ 
471+       const  lastInput  =  page . locator ( 'ion-input-otp input' ) . last ( ) ; 
472+       await  expect ( lastInput ) . toBeFocused ( ) ; 
473+     } ) ; 
474+ 
475+     test ( 'should handle autofill correctly when it is less than the length' ,  async  ( {  page } )  =>  { 
476+       await  page . setContent ( `<ion-input-otp>Description</ion-input-otp>` ,  config ) ; 
477+ 
478+       const  firstInput  =  page . locator ( 'ion-input-otp input' ) . first ( ) ; 
479+       await  firstInput . focus ( ) ; 
480+ 
481+       await  simulateAutofill ( firstInput ,  '12' ) ; 
482+ 
483+       const  inputOtp  =  page . locator ( 'ion-input-otp' ) ; 
484+       await  verifyInputValues ( inputOtp ,  [ '1' ,  '2' ,  '' ,  '' ] ) ; 
485+ 
486+       const  thirdInput  =  page . locator ( 'ion-input-otp input' ) . nth ( 2 ) ; 
487+       await  expect ( thirdInput ) . toBeFocused ( ) ; 
463488    } ) ; 
464489
465490    test ( 'should handle autofill correctly when using autofill after typing 1 character' ,  async  ( {  page } )  =>  { 
@@ -473,15 +498,27 @@ configs({ modes: ['ios'] }).forEach(({ title, config }) => {
473498      const  secondInput  =  page . locator ( 'ion-input-otp input' ) . nth ( 1 ) ; 
474499      await  secondInput . focus ( ) ; 
475500
476-       // Set the value in the 2nd input directly and trigger input event 
477-       // this simulates the value being set by autofill from the 2nd input 
478-       await  secondInput . evaluate ( ( input )  =>  { 
479-         ( input  as  HTMLInputElement ) . value  =  '1234' ; 
480-         input . dispatchEvent ( new  Event ( 'input' ,  {  bubbles : true  } ) ) ; 
481-       } ) ; 
501+       await  simulateAutofill ( secondInput ,  '1234' ) ; 
482502
483503      const  inputOtp  =  page . locator ( 'ion-input-otp' ) ; 
484504      await  verifyInputValues ( inputOtp ,  [ '1' ,  '2' ,  '3' ,  '4' ] ) ; 
505+ 
506+       const  lastInput  =  page . locator ( 'ion-input-otp input' ) . last ( ) ; 
507+       await  expect ( lastInput ) . toBeFocused ( ) ; 
508+     } ) ; 
509+ 
510+     test ( 'should handle autofill correctly when autofill value contains invalid characters' ,  async  ( {  page } )  =>  { 
511+       await  page . setContent ( `<ion-input-otp pattern="[a-zA-Z]">Description</ion-input-otp>` ,  config ) ; 
512+ 
513+       const  firstInput  =  page . locator ( 'ion-input-otp input' ) . first ( ) ; 
514+       await  firstInput . focus ( ) ; 
515+ 
516+       await  simulateAutofill ( firstInput ,  '1234' ) ; 
517+ 
518+       const  inputOtp  =  page . locator ( 'ion-input-otp' ) ; 
519+       await  verifyInputValues ( inputOtp ,  [ '' ,  '' ,  '' ,  '' ] ) ; 
520+ 
521+       await  expect ( firstInput ) . toBeFocused ( ) ; 
485522    } ) ; 
486523  } ) ; 
487524
0 commit comments