@@ -50,4 +50,68 @@ describe('cache storage', () => {
5050 expect ( customStorage . setItem ) . toHaveBeenCalledWith ( 'key' , expect . objectContaining ( { data : 'value' } ) )
5151 expect ( customStorage . setItem ) . toHaveBeenCalledWith ( 'another-key' , expect . objectContaining ( { data : 'value' } ) )
5252 } )
53+
54+ describe ( 'keyFragments option' , ( ) => {
55+ it ( 'preserves string fragments in cache key' , async ( ) => {
56+ const storage = {
57+ getItem : vi . fn ( ) ,
58+ setItem : vi . fn ( ) ,
59+ }
60+ const cached = createCachedAsyncStorage ( storage , {
61+ namespace : [ 'provider-name' , { a : 1 } , 'variant-a' ] ,
62+ } )
63+ await cached . setItem ( 'test-key' , 'data' )
64+
65+ expect ( storage . setItem ) . toHaveBeenCalledExactlyOnceWith (
66+ expect . stringMatching ( / ^ p r o v i d e r - n a m e : .+ : v a r i a n t - a : .+ $ / ) ,
67+ expect . objectContaining ( { data : 'data' } ) ,
68+ )
69+ } )
70+
71+ it ( 'generates different keys for different object fragments' , async ( ) => {
72+ const storage = {
73+ getItem : vi . fn ( ) ,
74+ setItem : vi . fn ( ) ,
75+ }
76+
77+ const cachedA = createCachedAsyncStorage ( storage , {
78+ namespace : [ { variant : 'A' } ] ,
79+ } )
80+ const cachedB = createCachedAsyncStorage ( storage , {
81+ namespace : [ { variant : 'B' } ] ,
82+ } )
83+ await cachedA . setItem ( 'key' , 'data' )
84+ await cachedB . setItem ( 'key' , 'data' )
85+
86+ const keyA = storage . setItem . mock . calls . at ( 0 ) ?. at ( 0 ) as string | undefined
87+ const keyB = storage . setItem . mock . calls . at ( 1 ) ?. at ( 0 ) as string | undefined
88+
89+ expect ( storage . setItem ) . toHaveBeenCalledTimes ( 2 )
90+ expect ( keyA ) . toBeDefined ( )
91+ expect ( keyB ) . toBeDefined ( )
92+ expect ( keyA ) . not . toBe ( keyB )
93+ } )
94+
95+ it . each ( [
96+ { input : 'provider/name' } ,
97+ { input : 'provider@v2' } ,
98+ { input : 'provider name' } ,
99+ { input : 'provider:name' } ,
100+ ] ) ( 'sanitizes "$input" in fragments' , async ( { input } ) => {
101+ const storage = {
102+ getItem : vi . fn ( ) ,
103+ setItem : vi . fn ( ) ,
104+ }
105+ const cached = createCachedAsyncStorage ( storage , {
106+ namespace : [ input ] ,
107+ } )
108+
109+ await cached . setItem ( 'test-key' , 'data' )
110+
111+ expect ( storage . setItem ) . toHaveBeenCalledExactlyOnceWith (
112+ expect . not . stringContaining ( input ) ,
113+ expect . objectContaining ( { data : 'data' } ) ,
114+ )
115+ } )
116+ } )
53117} )
0 commit comments