1+ import  {  describe ,  expect ,  test  }  from  "vitest" ; 
2+ import  {  extractJwt  }  from  "@/features/common/services/utils" ; 
3+ 
4+ describe ( "extractJwt" ,  ( )  =>  { 
5+   test ( "should return empty string for empty input" ,  ( )  =>  { 
6+     expect ( extractJwt ( "" ) ) . toBe ( "" ) ; 
7+     expect ( extractJwt ( null  as  unknown  as  string ) ) . toBe ( "" ) ; 
8+     expect ( extractJwt ( undefined  as  unknown  as  string ) ) . toBe ( "" ) ; 
9+   } ) ; 
10+ 
11+   test ( "should extract JWT from normal input" ,  ( )  =>  { 
12+     const  jwt  =  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" ; 
13+     expect ( extractJwt ( jwt ) ) . toBe ( jwt ) ; 
14+   } ) ; 
15+ 
16+   test ( "should extract JWT with leading/trailing whitespace" ,  ( )  =>  { 
17+     const  jwt  =  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" ; 
18+     const  jwtWithSpaces  =  `  ${ jwt }  ; 
19+     expect ( extractJwt ( jwtWithSpaces ) ) . toBe ( jwt ) ; 
20+   } ) ; 
21+ 
22+   test ( "should compact multiline JWTs by removing all whitespace" ,  ( )  =>  { 
23+     const  multilineJWT  =  `eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9. 
24+ eyJjbGllbnRfaWQiOiJZekV6TUdkb01ISm5PSEJpT0cxaWJEaHlOVEE9IiwicmVzcG9uc2Vf 
25+ dHlwZSI6ImNvZGUiLCJzY29wZSI6ImludHJvc2NwZWN0X3Rva2VucywgcmV2b2tlX3Rva2Vu 
26+ cyIsImlzcyI6ImJqaElSak0xY1hwYWEyMXpkV3RJU25wNmVqbE1iazQ0YlRsTlpqazNkWEU9 
27+ Iiwic3ViIjoiWXpFek1HZG9NSEpuT0hCaU9HMWliRGh5TlRBPSIsImF1ZCI6Imh0dHBzOi8v 
28+ bG9jYWxob3N0Ojg0NDMve3RpZH0ve2FpZH0vb2F1dGgyL2F1dGhvcml6ZSIsImp0aSI6IjE1 
29+ MTYyMzkwMjIiLCJleHAiOiIyMDIxLTA1LTE3VDA3OjA5OjQ4LjAwMCswNTQ1In0. 
30+ IxvaN4ER-PlPgLYzfRhk_JiY4VAow3GNjaK5rYCINFsEPa7VaYnRsaCmQVq8CTgddihEPPXe 
31+ t2laH8_c3WqxY4AeZO5eljwSCobCHzxYdOoFKbpNXIm7dqHg_5xpQz-YBJMiDM1ILOEsER8A 
32+ DyF4NC2sN0K_0t6xZLSAQIRrHvpGOrtYr5E-SllTWHWPmqCkX2BUZxoYNK2FWgQZpuUOD55H 
33+ fsvFXNVQa_5TFRDibi9LsT7Sd_az0iGB0TfAb0v3ZR0qnmgyp5pTeIeU5UqhtbgU9RnUCVmG 
34+ IK-SZYNvrlXgv9hiKAZGhLgeI8hO40utfT2YTYHgD2Aiufqo3RIbJA` ; 
35+ 
36+     const  compactedJWT  =  multilineJWT . replace ( / \s + / g,  "" ) ; 
37+     expect ( extractJwt ( multilineJWT ) ) . toBe ( compactedJWT ) ; 
38+   } ) ; 
39+ 
40+   test ( "should extract JWT from text with other content" ,  ( )  =>  { 
41+     const  jwt  =  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" ; 
42+     const  textWithJWT  =  `Here is my token: ${ jwt }  ; 
43+     expect ( extractJwt ( textWithJWT ) ) . toBe ( jwt ) ; 
44+   } ) ; 
45+ 
46+   test ( "should compact JWT with internal spaces" ,  ( )  =>  { 
47+     // This is a scenario where the JWT itself contains spaces (invalid, but should be handled) 
48+     const  jwtWithSpaces  =  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0 NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" ; 
49+     // The spaces should be removed by our new implementation 
50+     const  compactedJWT  =  jwtWithSpaces . replace ( / \s + / g,  "" ) ; 
51+     expect ( extractJwt ( jwtWithSpaces ) ) . toBe ( compactedJWT ) ; 
52+   } ) ; 
53+ } ) ; 
0 commit comments