1+ /*---------------------------------------------------------------------------------------------
2+ * Copyright (c) Microsoft Corporation. All rights reserved.
3+ * Licensed under the MIT License. See License.txt in the project root for license information.
4+ *--------------------------------------------------------------------------------------------*/
5+
6+ import { default as assert } from 'assert' ;
7+ import * as vscode from 'vscode' ;
8+ import { DataUri } from '../../common/uri' ;
9+ import { IAccount , AccountType } from '../../github/interface' ;
10+
11+ describe ( 'DataUri.avatarCirclesAsImageDataUris' , ( ) => {
12+ let mockContext : vscode . ExtensionContext ;
13+ let originalFetch : any ;
14+
15+ beforeEach ( ( ) => {
16+ // Save original fetch
17+ originalFetch = global . fetch ;
18+
19+ // Create a mock extension context
20+ mockContext = {
21+ globalStorageUri : vscode . Uri . file ( '/tmp/test-storage' ) ,
22+ } as any as vscode . ExtensionContext ;
23+ } ) ;
24+
25+ afterEach ( ( ) => {
26+ // Restore original fetch
27+ global . fetch = originalFetch ;
28+ } ) ;
29+
30+ it ( 'should handle TLS certificate errors gracefully without crashing' , async ( ) => {
31+ // Mock user with avatar URL
32+ const testUser : IAccount = {
33+ login : 'testuser' ,
34+ id : '123' ,
35+ avatarUrl : 'https://avatars.githubusercontent.com/u/123?v=4' ,
36+ url : 'https://github.com/testuser' ,
37+ accountType : AccountType . User
38+ } ;
39+
40+ // Mock fetch to simulate TLS certificate error
41+ global . fetch = ( ) => Promise . reject (
42+ new Error ( 'request to https://avatars.githubusercontent.com/u/123?v=4 failed, reason: self signed certificate in certificate chain' )
43+ ) ;
44+
45+ // Mock vscode.workspace.fs to simulate cache miss
46+ const originalReadFile = vscode . workspace . fs . readFile ;
47+ const originalWriteFile = vscode . workspace . fs . writeFile ;
48+ const originalCreateDirectory = vscode . workspace . fs . createDirectory ;
49+
50+ vscode . workspace . fs . readFile = ( ) => Promise . reject ( new Error ( 'Cache miss' ) ) ;
51+ vscode . workspace . fs . writeFile = ( ) => Promise . resolve ( ) ;
52+ vscode . workspace . fs . createDirectory = ( ) => Promise . resolve ( ) ;
53+
54+ try {
55+ // This should not throw an error even with TLS issues
56+ const results = await DataUri . avatarCirclesAsImageDataUris ( mockContext , [ testUser ] , 20 , 20 ) ;
57+
58+ // Should return array with undefined for failed fetches
59+ assert . strictEqual ( results . length , 1 ) ;
60+ assert . strictEqual ( results [ 0 ] , undefined ) ;
61+ } finally {
62+ // Restore original functions
63+ vscode . workspace . fs . readFile = originalReadFile ;
64+ vscode . workspace . fs . writeFile = originalWriteFile ;
65+ vscode . workspace . fs . createDirectory = originalCreateDirectory ;
66+ }
67+ } ) ;
68+ } ) ;
0 commit comments