@@ -13,7 +13,8 @@ import {
1313 CancellationToken ,
1414 WorkspaceConfiguration ,
1515 MessageItem ,
16- ConfigurationTarget
16+ ConfigurationTarget ,
17+ EventEmitter
1718} from 'vscode'
1819import {
1920 DEFAULT_EXPERIMENTS_OUTPUT ,
@@ -94,6 +95,7 @@ import { MAX_SELECTED_EXPERIMENTS } from '../../../experiments/model/status'
9495import { Pipeline } from '../../../pipeline'
9596import { ColumnLike } from '../../../experiments/columns/like'
9697import * as Clipboard from '../../../vscode/clipboard'
98+ import { ExperimentsOutput } from '../../../data'
9799
98100const { openFileInEditor } = FileSystem
99101
@@ -593,8 +595,18 @@ suite('Experiments Test Suite', () => {
593595 } ) . timeout ( WEBVIEW_TEST_TIMEOUT )
594596
595597 it ( 'should handle a message to push an experiment' , async ( ) => {
596- const { experiments, mockMessageReceived } =
597- await stubWorkspaceGettersWebview ( disposable )
598+ const {
599+ experiments,
600+ experimentsModel,
601+ messageSpy,
602+ mockMessageReceived,
603+ webview
604+ } = await stubWorkspaceGettersWebview ( disposable )
605+
606+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
607+ const studio = ( experiments as any ) . studio
608+
609+ const mockIsConnected = stub ( studio , 'isConnected' ) . returns ( false )
598610
599611 const mockExpId = 'exp-e7a67'
600612
@@ -634,6 +646,15 @@ suite('Experiments Test Suite', () => {
634646 RegisteredCommands . SETUP_SHOW_STUDIO_CONNECT
635647 )
636648
649+ const experimentWithoutLink = experimentsModel
650+ . getRowData ( ) [ 1 ]
651+ . subRows ?. find ( ( { id } ) => id === mockExpId )
652+
653+ expect ( experimentWithoutLink ?. studioLinkType ) . not . to . equal (
654+ StudioLinkType . PUSHED
655+ )
656+
657+ mockIsConnected . restore ( )
637658 mockGetStudioAccessToken . resetBehavior ( )
638659
639660 const tokenFound = new Promise ( resolve =>
@@ -664,6 +685,25 @@ suite('Experiments Test Suite', () => {
664685 } )
665686 )
666687
688+ const dataUpdated = disposable . track (
689+ new EventEmitter < ExperimentsOutput > ( )
690+ )
691+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
692+ ; ( experiments as any ) . data . onDidUpdate = dataUpdated . event
693+
694+ let calls = 0
695+
696+ const remoteUpdated = new Promise ( resolve =>
697+ disposable . track (
698+ dataUpdated . event ( ( ) => {
699+ calls = calls + 1
700+ if ( calls === 2 ) {
701+ resolve ( undefined )
702+ }
703+ } )
704+ )
705+ )
706+
667707 mockMessageReceived . fire ( {
668708 payload : [ mockExpId ] ,
669709 type : MessageFromWebviewType . PUSH_EXPERIMENT
@@ -677,6 +717,28 @@ suite('Experiments Test Suite', () => {
677717 message :
678718 "Experiment major-lamb is up to date on Git remote 'origin'.\nView your experiments in [Studio](https://studio.iterative.ai/user/mattseddon/projects/vscode-dvc-demo-ynm6t3jxdx)"
679719 } )
720+
721+ messageSpy . restore ( )
722+ const mockShow = stub ( webview , 'show' )
723+
724+ const messageSent = new Promise ( resolve =>
725+ mockShow . callsFake ( ( ) => {
726+ resolve ( undefined )
727+ return Promise . resolve ( true )
728+ } )
729+ )
730+ dataUpdated . fire ( { live : [ ] , pushed : [ ] , baseUrl : '' } )
731+ dataUpdated . fire ( {
732+ lsRemoteOutput : `42b8736b08170529903cd203a1f40382a4b4a8cd refs/exps/a9/b32d14966b9be1396f2211d9eb743359708a07/test-branch
733+ 4fb124aebddb2adf1545030907687fa9a4c80e70 refs/exps/a9/53c3851f46955fa3e2b8f6e1c52999acc8c9ea77/${ mockExpId } `
734+ } )
735+ await Promise . all ( [ remoteUpdated , messageSent ] )
736+
737+ const experimentWithLink = experimentsModel
738+ . getRowData ( ) [ 1 ]
739+ . subRows ?. find ( ( { id } ) => id === mockExpId )
740+
741+ expect ( experimentWithLink ?. studioLinkType ) . to . equal ( StudioLinkType . PUSHED )
680742 } ) . timeout ( WEBVIEW_TEST_TIMEOUT )
681743
682744 it ( "should handle a message to copy an experiment's Studio link" , async ( ) => {
0 commit comments