11import { resolve } from 'path'
22import { extensions , Extension , commands } from 'vscode'
3- import { setup , setupWorkspace } from './setup'
3+ import { setup , setupWithGlobalRecheck , setupWorkspace } from './setup'
44import { flushPromises } from './test/util/jest'
55import {
66 getConfigValue ,
@@ -24,6 +24,7 @@ import {
2424 MIN_CLI_VERSION
2525} from './cli/dvc/constants'
2626import { extractSemver , ParsedSemver } from './cli/dvc/version'
27+ import { delay } from './util/time'
2728
2829jest . mock ( 'vscode' )
2930jest . mock ( './vscode/config' )
@@ -32,7 +33,6 @@ jest.mock('./vscode/quickPick')
3233jest . mock ( './vscode/toast' )
3334jest . mock ( './vscode/workspaceFolders' )
3435jest . mock ( './processExecution' )
35- jest . mock ( './setupUtil' )
3636
3737const mockedExtensions = jest . mocked ( extensions )
3838const mockedCommands = jest . mocked ( commands )
@@ -63,6 +63,7 @@ const mockedVscodePython = {
6363}
6464
6565const mockedCwd = __dirname
66+ const mockedGetAvailable = jest . fn ( )
6667const mockedGetCliVersion = jest . fn ( )
6768const mockedGetFirstWorkspaceFolder = jest . mocked ( getFirstWorkspaceFolder )
6869const mockedHasRoots = jest . fn ( )
@@ -259,6 +260,7 @@ describe('setupWorkspace', () => {
259260
260261describe ( 'setup' , ( ) => {
261262 const extension = {
263+ getAvailable : mockedGetAvailable ,
262264 getCliVersion : mockedGetCliVersion ,
263265 getRoots : mockedGetRoots ,
264266 hasRoots : mockedHasRoots ,
@@ -618,3 +620,102 @@ describe('setup', () => {
618620 expect ( mockedInitialize ) . not . toHaveBeenCalled ( )
619621 } )
620622} )
623+
624+ describe ( 'setupWithGlobalRecheck' , ( ) => {
625+ const extension = {
626+ getAvailable : mockedGetAvailable ,
627+ getCliVersion : mockedGetCliVersion ,
628+ getRoots : mockedGetRoots ,
629+ hasRoots : mockedHasRoots ,
630+ initialize : mockedInitialize ,
631+ isPythonExtensionUsed : mockedIsPythonExtensionUsed ,
632+ resetMembers : mockedResetMembers ,
633+ setAvailable : mockedSetAvailable ,
634+ setCliCompatible : mockedSetCliCompatible ,
635+ setRoots : mockedSetRoots ,
636+ setupWorkspace : mockedSetupWorkspace ,
637+ unsetPythonBinPath : mockedUnsetPythonBinPath
638+ }
639+
640+ it ( 'should periodically check to see if the CLI is available globally if the extension fails to initialize' , async ( ) => {
641+ mockedGetFirstWorkspaceFolder . mockReturnValue ( mockedCwd )
642+
643+ const mockedRecheckInterval = 0
644+
645+ mockedGetAvailable
646+ . mockReturnValueOnce ( false )
647+ . mockReturnValueOnce ( false )
648+ . mockReturnValueOnce ( false )
649+
650+ mockedGetCliVersion
651+ . mockResolvedValueOnce ( undefined )
652+ . mockResolvedValueOnce ( undefined )
653+ . mockResolvedValueOnce ( LATEST_TESTED_CLI_VERSION )
654+ . mockResolvedValueOnce ( LATEST_TESTED_CLI_VERSION )
655+
656+ await setupWithGlobalRecheck ( extension , mockedRecheckInterval )
657+
658+ expect ( mockedGetCliVersion ) . toHaveBeenCalledTimes ( 1 )
659+ expect ( mockedGetAvailable ) . toHaveBeenCalledTimes ( 1 )
660+
661+ await delay ( mockedRecheckInterval )
662+
663+ expect ( mockedGetCliVersion ) . toHaveBeenCalledTimes ( 2 )
664+ expect ( mockedGetAvailable ) . toHaveBeenCalledTimes ( 2 )
665+
666+ await delay ( mockedRecheckInterval )
667+
668+ expect ( mockedGetCliVersion ) . toHaveBeenCalledTimes ( 4 )
669+ expect ( mockedGetAvailable ) . toHaveBeenCalledTimes ( 3 )
670+
671+ await delay ( mockedRecheckInterval )
672+
673+ expect ( mockedGetCliVersion ) . toHaveBeenCalledTimes ( 4 )
674+ expect ( mockedGetAvailable ) . toHaveBeenCalledTimes ( 3 )
675+ } )
676+
677+ it ( 'should not periodically check to see if the CLI is available globally if the extension initializes' , async ( ) => {
678+ mockedGetFirstWorkspaceFolder . mockReturnValue ( mockedCwd )
679+
680+ mockedGetAvailable . mockReturnValueOnce ( true )
681+
682+ mockedGetCliVersion . mockResolvedValueOnce ( LATEST_TESTED_CLI_VERSION )
683+
684+ await setupWithGlobalRecheck ( extension , 0 )
685+
686+ expect ( mockedGetCliVersion ) . toHaveBeenCalledTimes ( 1 )
687+ expect ( mockedGetAvailable ) . toHaveBeenCalledTimes ( 1 )
688+
689+ await delay ( 0 )
690+
691+ expect ( mockedGetCliVersion ) . toHaveBeenCalledTimes ( 1 )
692+ expect ( mockedGetAvailable ) . toHaveBeenCalledTimes ( 1 )
693+
694+ await delay ( 0 )
695+
696+ expect ( mockedGetCliVersion ) . toHaveBeenCalledTimes ( 1 )
697+ expect ( mockedGetAvailable ) . toHaveBeenCalledTimes ( 1 )
698+ } )
699+
700+ it ( 'should stop checking if the extension is available globally if it initializes' , async ( ) => {
701+ mockedGetFirstWorkspaceFolder . mockReturnValue ( mockedCwd )
702+
703+ mockedGetAvailable . mockReturnValueOnce ( false ) . mockReturnValueOnce ( true )
704+ mockedGetCliVersion . mockResolvedValueOnce ( undefined )
705+
706+ await setupWithGlobalRecheck ( extension , 0 )
707+
708+ expect ( mockedGetCliVersion ) . toHaveBeenCalledTimes ( 1 )
709+ expect ( mockedGetAvailable ) . toHaveBeenCalledTimes ( 1 )
710+
711+ await delay ( 0 )
712+
713+ expect ( mockedGetCliVersion ) . toHaveBeenCalledTimes ( 1 )
714+ expect ( mockedGetAvailable ) . toHaveBeenCalledTimes ( 2 )
715+
716+ await delay ( 0 )
717+
718+ expect ( mockedGetCliVersion ) . toHaveBeenCalledTimes ( 1 )
719+ expect ( mockedGetAvailable ) . toHaveBeenCalledTimes ( 2 )
720+ } )
721+ } )
0 commit comments