@@ -33,6 +33,7 @@ describe('GitGraphView', () => {
3333 let repoManager : RepoManager ;
3434
3535 let spyOnLog : jest . SpyInstance ;
36+ let spyOnLogError : jest . SpyInstance ;
3637 let spyOnGetRepos : jest . SpyInstance ;
3738 let spyOnIsGitExecutableUnknown : jest . SpyInstance ;
3839
@@ -49,6 +50,7 @@ describe('GitGraphView', () => {
4950 repoManager = new RepoManager ( dataSource , extensionState , onDidChangeConfiguration . subscribe , logger ) ;
5051
5152 spyOnLog = jest . spyOn ( logger , 'log' ) ;
53+ spyOnLogError = jest . spyOn ( logger , 'logError' ) ;
5254 spyOnGetRepos = jest . spyOn ( repoManager , 'getRepos' ) ;
5355 spyOnIsGitExecutableUnknown = jest . spyOn ( dataSource , 'isGitExecutableUnknown' ) ;
5456
@@ -3467,6 +3469,103 @@ describe('GitGraphView', () => {
34673469 } ) ;
34683470 } ) ;
34693471
3472+ describe ( 'sendMessage' , ( ) => {
3473+ beforeEach ( ( ) => {
3474+ GitGraphView . createOrShow ( '/path/to/extension' , dataSource , extensionState , avatarManager , repoManager , logger , null ) ;
3475+ spyOnLog . mockReset ( ) ;
3476+ spyOnLogError . mockReset ( ) ;
3477+ } ) ;
3478+
3479+ it ( 'Should send a message to the Webview' , async ( ) => {
3480+ // Setup
3481+ const mockedWebviewPanel = vscode . getMockedWebviewPanel ( 0 ) ;
3482+ jest . spyOn ( utils , 'viewScm' ) . mockResolvedValueOnce ( null ) ;
3483+ jest . spyOn ( mockedWebviewPanel . panel . webview , 'postMessage' ) . mockResolvedValueOnce ( true ) ;
3484+
3485+ // Run
3486+ mockedWebviewPanel . mocks . panel . webview . onDidReceiveMessage ( {
3487+ command : 'viewScm'
3488+ } ) ;
3489+
3490+ // Assert
3491+ await waitForExpect ( ( ) => {
3492+ expect ( mockedWebviewPanel . panel . webview . postMessage ) . toHaveBeenCalledWith ( {
3493+ command : 'viewScm' ,
3494+ error : null
3495+ } ) ;
3496+ expect ( spyOnLog ) . not . toHaveBeenCalled ( ) ;
3497+ expect ( spyOnLogError ) . not . toHaveBeenCalled ( ) ;
3498+ } ) ;
3499+ } ) ;
3500+
3501+ it ( 'Should log an error message when Webview.postMessage rejects, and the GitGraphView hasn\'t been disposed' , async ( ) => {
3502+ // Setup
3503+ const mockedWebviewPanel = vscode . getMockedWebviewPanel ( 0 ) ;
3504+ jest . spyOn ( utils , 'viewScm' ) . mockResolvedValueOnce ( null ) ;
3505+ jest . spyOn ( mockedWebviewPanel . panel . webview , 'postMessage' ) . mockRejectedValueOnce ( null ) ;
3506+
3507+ // Run
3508+ mockedWebviewPanel . mocks . panel . webview . onDidReceiveMessage ( {
3509+ command : 'viewScm'
3510+ } ) ;
3511+
3512+ // Assert
3513+ await waitForExpect ( ( ) => {
3514+ expect ( mockedWebviewPanel . panel . webview . postMessage ) . toHaveBeenCalledWith ( {
3515+ command : 'viewScm' ,
3516+ error : null
3517+ } ) ;
3518+ expect ( spyOnLog ) . not . toHaveBeenCalled ( ) ;
3519+ expect ( spyOnLogError ) . toHaveBeenCalledWith ( 'Unable to send "viewScm" message to the Git Graph View.' ) ;
3520+ } ) ;
3521+ } ) ;
3522+
3523+ it ( 'Should log an information message when Webview.postMessage rejects, and the GitGraphView has been disposed' , async ( ) => {
3524+ // Setup
3525+ const mockedWebviewPanel = vscode . getMockedWebviewPanel ( 0 ) ;
3526+ jest . spyOn ( utils , 'viewScm' ) . mockResolvedValueOnce ( null ) ;
3527+ jest . spyOn ( mockedWebviewPanel . panel . webview , 'postMessage' ) . mockImplementationOnce ( ( ) => {
3528+ GitGraphView . currentPanel ! . dispose ( ) ;
3529+ return Promise . reject ( ) ;
3530+ } ) ;
3531+
3532+ // Run
3533+ mockedWebviewPanel . mocks . panel . webview . onDidReceiveMessage ( {
3534+ command : 'viewScm'
3535+ } ) ;
3536+
3537+ // Assert
3538+ await waitForExpect ( ( ) => {
3539+ expect ( mockedWebviewPanel . panel . webview . postMessage ) . toHaveBeenCalledWith ( {
3540+ command : 'viewScm' ,
3541+ error : null
3542+ } ) ;
3543+ expect ( spyOnLog ) . toHaveBeenCalledWith ( 'The Git Graph View was disposed while sending "viewScm" message.' ) ;
3544+ expect ( spyOnLogError ) . not . toHaveBeenCalled ( ) ;
3545+ } ) ;
3546+ } ) ;
3547+
3548+ it ( 'Shouldn\'t send a message to the Webview if it has been disposed' , async ( ) => {
3549+ // Setup
3550+ const mockedWebviewPanel = vscode . getMockedWebviewPanel ( 0 ) ;
3551+ jest . spyOn ( utils , 'viewScm' ) . mockResolvedValueOnce ( null ) ;
3552+ jest . spyOn ( mockedWebviewPanel . panel . webview , 'postMessage' ) . mockResolvedValueOnce ( true ) ;
3553+
3554+ // Run
3555+ GitGraphView . currentPanel ! . dispose ( ) ;
3556+ mockedWebviewPanel . mocks . panel . webview . onDidReceiveMessage ( {
3557+ command : 'viewScm'
3558+ } ) ;
3559+
3560+ // Assert
3561+ await waitForExpect ( ( ) => {
3562+ expect ( mockedWebviewPanel . panel . webview . postMessage ) . not . toHaveBeenCalled ( ) ;
3563+ expect ( spyOnLog ) . toHaveBeenCalledWith ( 'The Git Graph View has already been disposed, ignored sending "viewScm" message.' ) ;
3564+ expect ( spyOnLogError ) . not . toHaveBeenCalled ( ) ;
3565+ } ) ;
3566+ } ) ;
3567+ } ) ;
3568+
34703569 describe ( 'getHtmlForWebview' , ( ) => {
34713570 beforeEach ( ( ) => {
34723571 jest . spyOn ( utils , 'getNonce' ) . mockReturnValueOnce ( '1a2b3c4d5e6f1a2b3c4d5e6f1a2b3c4d' ) ;
0 commit comments