1- import { describe , it , expect , beforeEach , beforeAll } from 'vitest'
1+ import { describe , it , expect , beforeEach } from 'vitest'
22import { ApiKeyStorage , type Storage } from './api-key-storage'
33
4- // Debug logging for CI - TODO: remove after debugging
5- const DEBUG = true
6- const log = ( ...args : unknown [ ] ) => {
7- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- DEBUG may change
8- if ( DEBUG ) {
9- console . log ( '[ApiKeyStorage Test]' , ...args )
10- }
11- }
12-
134describe ( 'ApiKeyStorage' , ( ) => {
145 let storage : ApiKeyStorage
156 let mockStorageData : Record < string , string >
167 let mockStorage : Storage
178 const testKeyMaterial = 'test-key-material-for-encryption'
189
19- beforeAll ( ( ) => {
20- // Log environment info - eslint disabled for debug logging
21- /* eslint-disable @typescript-eslint/no-unnecessary-condition */
22- log ( '=== Environment Info ===' )
23- log ( 'crypto available:' , typeof crypto !== 'undefined' )
24- log ( 'crypto.subtle available:' , typeof crypto ?. subtle !== 'undefined' )
25- log ( 'globalThis.crypto available:' , typeof globalThis . crypto !== 'undefined' )
26- log ( 'globalThis.crypto.subtle available:' , typeof globalThis . crypto ?. subtle !== 'undefined' )
27- if ( typeof crypto !== 'undefined' && crypto . subtle ) {
28- log ( 'crypto.subtle methods:' , Object . keys ( crypto . subtle ) )
29- }
30- log ( '========================' )
31- /* eslint-enable @typescript-eslint/no-unnecessary-condition */
32- } )
33-
3410 beforeEach ( ( ) => {
3511 // Create in-memory storage mock (no global stubbing needed)
3612 mockStorageData = { }
3713 mockStorage = {
3814 getItem : ( key : string ) => {
39- const value = mockStorageData [ key ]
4015 // eslint-disable-next-line unicorn/no-null -- localStorage API returns null
41- const result = value ?? null
42- log ( `mockStorage.getItem('${ key } '):` , value ? `${ value . slice ( 0 , 50 ) } ...` : 'null' )
43- return result
16+ return mockStorageData [ key ] ?? null
4417 } ,
4518 setItem : ( key : string , value : string ) => {
46- log ( `mockStorage.setItem('${ key } '):` , value . slice ( 0 , 50 ) + '...' )
4719 mockStorageData [ key ] = value
4820 } ,
4921 removeItem : ( key : string ) => {
50- log ( `mockStorage.removeItem('${ key } ')` )
5122 // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
5223 delete mockStorageData [ key ]
5324 } ,
@@ -58,7 +29,6 @@ describe('ApiKeyStorage', () => {
5829 keyMaterial : testKeyMaterial ,
5930 storage : mockStorage ,
6031 } )
61- log ( 'Created new ApiKeyStorage instance with keyMaterial:' , testKeyMaterial )
6232 } )
6333
6434 describe ( 'saveApiKey' , ( ) => {
@@ -96,30 +66,10 @@ describe('ApiKeyStorage', () => {
9666 it ( 'should retrieve and decrypt saved API key' , async ( ) => {
9767 const apiKey = 'test-api-key-456'
9868
99- log ( '--- Test: should retrieve and decrypt saved API key ---' )
100- log ( 'Input apiKey:' , apiKey )
101-
102- try {
103- log ( 'Calling saveApiKey...' )
104- await storage . saveApiKey ( apiKey )
105- log ( 'saveApiKey completed, mockStorageData:' , JSON . stringify ( mockStorageData ) )
106- } catch ( error ) {
107- log ( 'saveApiKey FAILED with error:' , error )
108- throw error
109- }
69+ await storage . saveApiKey ( apiKey )
70+ const retrieved = await storage . getApiKey ( )
11071
111- try {
112- log ( 'Calling getApiKey...' )
113- const retrieved = await storage . getApiKey ( )
114- log ( 'getApiKey returned:' , retrieved )
115- log ( 'Expected:' , apiKey )
116- log ( 'Match:' , retrieved === apiKey )
117-
118- expect ( retrieved ) . toBe ( apiKey )
119- } catch ( error ) {
120- log ( 'getApiKey FAILED with error:' , error )
121- throw error
122- }
72+ expect ( retrieved ) . toBe ( apiKey )
12373 } )
12474
12575 it ( 'should return undefined when no API key is stored' , async ( ) => {
@@ -195,34 +145,10 @@ describe('ApiKeyStorage', () => {
195145 it ( 'should successfully decrypt after multiple save/retrieve cycles' , async ( ) => {
196146 const keys = [ 'key1' , 'key2' , 'key3' ]
197147
198- log ( '--- Test: should successfully decrypt after multiple save/retrieve cycles ---' )
199-
200148 for ( const key of keys ) {
201- log ( `\nCycle for key: '${ key } '` )
202- try {
203- log ( 'Calling saveApiKey...' )
204- await storage . saveApiKey ( key )
205- log (
206- 'saveApiKey completed, stored value:' ,
207- mockStorageData [ 'bugzilla_api_key' ] ?. slice ( 0 , 50 ) ,
208- )
209- } catch ( error ) {
210- log ( 'saveApiKey FAILED:' , error )
211- throw error
212- }
213-
214- try {
215- log ( 'Calling getApiKey...' )
216- const retrieved = await storage . getApiKey ( )
217- log ( 'getApiKey returned:' , retrieved )
218- log ( 'Expected:' , key )
219- log ( 'Match:' , retrieved === key )
220-
221- expect ( retrieved ) . toBe ( key )
222- } catch ( error ) {
223- log ( 'getApiKey FAILED:' , error )
224- throw error
225- }
149+ await storage . saveApiKey ( key )
150+ const retrieved = await storage . getApiKey ( )
151+ expect ( retrieved ) . toBe ( key )
226152 }
227153 } )
228154 } )
0 commit comments