@@ -6,12 +6,20 @@ import * as path from 'path';
66import { resolve } from 'path' ;
77import sinon from 'sinon' ;
88import sinonChai from 'sinon-chai' ;
9-
9+ import { promisify } from 'util' ;
10+ import Sinon = require( 'sinon' ) ;
11+ import DataService = require( 'mongodb-data-service' ) ;
1012import Connection = require( 'mongodb-connection-model/lib/model' ) ;
13+
1114import { ConnectionTypes } from '../../../connectionController' ;
12- import DataService = require( 'mongodb-data-service' ) ;
15+ import {
16+ NewConnectionTelemetryEventProperties ,
17+ SegmentProperties ,
18+ TelemetryEventTypes
19+ } from '../../../telemetry/telemetryService' ;
1320import { DocumentSource } from '../../../utils/documentSource' ;
1421import { mdbTestExtension } from '../stubbableMdbExtension' ;
22+ const { version } = require ( '../../../../package.json' ) ;
1523
1624const expect = chai . expect ;
1725
@@ -20,8 +28,6 @@ chai.use(sinonChai);
2028config ( { path : resolve ( __dirname , '../../../../.env' ) } ) ;
2129
2230suite ( 'Telemetry Controller Test Suite' , ( ) => {
23- vscode . window . showInformationMessage ( 'Starting tests...' ) ;
24-
2531 const dataService = new DataService (
2632 new Connection ( {
2733 hostname : 'localhost' ,
@@ -31,11 +37,11 @@ suite('Telemetry Controller Test Suite', () => {
3137 const testTelemetryService =
3238 mdbTestExtension . testExtensionController . _telemetryService ;
3339
34- let mockTrackNewConnection : any ;
35- let mockTrackCommandRun : any ;
36- let mockTrackPlaygroundCodeExecuted : any ;
37- let mockTrackPlaygroundLoadedMethod : any ;
38- let mockTrack : any ;
40+ let mockTrackNewConnection : Sinon . SinonSpy ;
41+ let mockTrackCommandRun : Sinon . SinonSpy ;
42+ let mockTrackPlaygroundCodeExecuted : Sinon . SinonSpy ;
43+ let mockTrackPlaygroundLoadedMethod : Sinon . SinonSpy ;
44+ let mockTrack : Sinon . SinonSpy ;
3945
4046 beforeEach ( ( ) => {
4147 mockTrackNewConnection = sinon . fake . resolves ( true ) ;
@@ -44,11 +50,6 @@ suite('Telemetry Controller Test Suite', () => {
4450 mockTrackPlaygroundLoadedMethod = sinon . fake ( ) ;
4551 mockTrack = sinon . fake ( ) ;
4652
47- sinon . replace (
48- mdbTestExtension . testExtensionController . _telemetryService ,
49- 'trackNewConnection' ,
50- mockTrackNewConnection
51- ) ;
5253 sinon . replace (
5354 mdbTestExtension . testExtensionController . _telemetryService ,
5455 'trackCommandRun' ,
@@ -69,11 +70,11 @@ suite('Telemetry Controller Test Suite', () => {
6970 'executeAll' ,
7071 sinon . fake . resolves ( [ { type : 'TEST' , content : 'Result' } ] )
7172 ) ;
72- sinon . replace ( testTelemetryService , 'track' , mockTrack ) ;
7373 } ) ;
7474
7575 afterEach ( ( ) => {
7676 sinon . restore ( ) ;
77+ mdbTestExtension . testExtensionController . _connectionController . clearAllConnections ( ) ;
7778 } ) ;
7879
7980 test ( 'get segment key and user id' , ( ) => {
@@ -104,6 +105,12 @@ suite('Telemetry Controller Test Suite', () => {
104105 const mockConnectionController =
105106 mdbTestExtension . testExtensionController . _connectionController ;
106107
108+ sinon . replace (
109+ mdbTestExtension . testExtensionController . _telemetryService ,
110+ 'trackNewConnection' ,
111+ mockTrackNewConnection
112+ ) ;
113+
107114 mockConnectionController . sendTelemetry (
108115 dataService ,
109116 ConnectionTypes . CONNECTION_STRING
@@ -120,6 +127,12 @@ suite('Telemetry Controller Test Suite', () => {
120127 const mockConnectionController =
121128 mdbTestExtension . testExtensionController . _connectionController ;
122129
130+ sinon . replace (
131+ mdbTestExtension . testExtensionController . _telemetryService ,
132+ 'trackNewConnection' ,
133+ mockTrackNewConnection
134+ ) ;
135+
123136 mockConnectionController . sendTelemetry (
124137 dataService ,
125138 ConnectionTypes . CONNECTION_FORM
@@ -136,6 +149,12 @@ suite('Telemetry Controller Test Suite', () => {
136149 const mockConnectionController =
137150 mdbTestExtension . testExtensionController . _connectionController ;
138151
152+ sinon . replace (
153+ mdbTestExtension . testExtensionController . _telemetryService ,
154+ 'trackNewConnection' ,
155+ mockTrackNewConnection
156+ ) ;
157+
139158 mockConnectionController . sendTelemetry (
140159 dataService ,
141160 ConnectionTypes . CONNECTION_ID
@@ -151,6 +170,8 @@ suite('Telemetry Controller Test Suite', () => {
151170 test ( 'track document saved form a tree-view event' , ( ) => {
152171 const source = DocumentSource . DOCUMENT_SOURCE_TREEVIEW ;
153172
173+ sinon . replace ( testTelemetryService , 'track' , mockTrack ) ;
174+
154175 testTelemetryService . trackDocumentUpdated ( source , true ) ;
155176
156177 sinon . assert . calledWith (
@@ -203,11 +224,108 @@ suite('Telemetry Controller Test Suite', () => {
203224 } ) ;
204225
205226 test ( 'track playground saved event' , ( ) => {
227+ sinon . replace ( testTelemetryService , 'track' , mockTrack ) ;
228+
206229 testTelemetryService . trackPlaygroundSaved ( ) ;
207230
208231 sinon . assert . calledWith ( mockTrack ) ;
209232 } ) ;
210233
234+ test ( 'track adds extension version to event properties when there are no event properties' , ( ) => {
235+ sinon . replace (
236+ testTelemetryService ,
237+ '_isTelemetryFeatureEnabled' ,
238+ sinon . fake . returns ( true )
239+ ) ;
240+ const fakeSegmentTrack = sinon . fake . yields ( null ) ;
241+ sinon . replace (
242+ testTelemetryService ,
243+ '_segmentAnalytics' ,
244+ {
245+ track : fakeSegmentTrack
246+ } as any
247+ ) ;
248+
249+ testTelemetryService . track (
250+ TelemetryEventTypes . EXTENSION_LINK_CLICKED
251+ ) ;
252+
253+ const telemetryEvent : SegmentProperties = fakeSegmentTrack . firstCall . args [ 0 ] ;
254+
255+ expect ( telemetryEvent . properties ) . to . deep . equal ( {
256+ extension_version : version
257+ } ) ;
258+ expect ( telemetryEvent . event ) . to . equal ( 'Link Clicked' ) ;
259+ } ) ;
260+
261+ test ( 'track adds extension version to existing event properties' , ( ) => {
262+ sinon . replace (
263+ testTelemetryService ,
264+ '_isTelemetryFeatureEnabled' ,
265+ sinon . fake . returns ( true )
266+ ) ;
267+ const fakeSegmentTrack = sinon . fake . yields ( null ) ;
268+ sinon . replace (
269+ testTelemetryService ,
270+ '_segmentAnalytics' ,
271+ {
272+ track : fakeSegmentTrack
273+ } as any
274+ ) ;
275+
276+ testTelemetryService . track (
277+ TelemetryEventTypes . PLAYGROUND_LOADED ,
278+ {
279+ source : DocumentSource . DOCUMENT_SOURCE_PLAYGROUND
280+ }
281+ ) ;
282+
283+ const telemetryEvent : SegmentProperties = fakeSegmentTrack . firstCall . args [ 0 ] ;
284+
285+ expect ( telemetryEvent . properties ) . to . deep . equal ( {
286+ extension_version : version ,
287+ source : DocumentSource . DOCUMENT_SOURCE_PLAYGROUND
288+ } ) ;
289+ expect ( telemetryEvent . event ) . to . equal ( 'Playground Loaded' ) ;
290+ } ) ;
291+
292+ suite ( 'with active connection' , ( ) => {
293+ let dataServ ;
294+
295+ beforeEach ( async ( ) => {
296+ dataServ = new DataService (
297+ new Connection ( {
298+ hostname : 'localhost' ,
299+ port : 27018
300+ } )
301+ ) ;
302+ const runConnect = promisify ( dataServ . connect . bind ( dataServ ) ) ;
303+ await runConnect ( ) ;
304+ } ) ;
305+
306+ afterEach ( async ( ) => {
307+ const runDisconnect = promisify ( dataServ . disconnect . bind ( dataServ ) ) ;
308+ await runDisconnect ( ) ;
309+ } ) ;
310+
311+ test ( 'track new connection event fetches the connection instance information' , async ( ) => {
312+ sinon . replace ( testTelemetryService , 'track' , mockTrack ) ;
313+ await mdbTestExtension . testExtensionController . _telemetryService . trackNewConnection (
314+ dataServ ,
315+ ConnectionTypes . CONNECTION_STRING
316+ ) ;
317+
318+ expect ( mockTrack . firstCall . args [ 0 ] ) . to . equal ( 'New Connection' ) ;
319+ const instanceTelemetry : NewConnectionTelemetryEventProperties = mockTrack . firstCall . args [ 1 ] ;
320+ expect ( instanceTelemetry . is_localhost ) . to . equal ( true ) ;
321+ expect ( instanceTelemetry . is_atlas ) . to . equal ( false ) ;
322+ expect ( instanceTelemetry . is_used_connect_screen ) . to . equal ( false ) ;
323+ expect ( instanceTelemetry . is_used_command_palette ) . to . equal ( true ) ;
324+ expect ( instanceTelemetry . is_used_saved_connection ) . to . equal ( false ) ;
325+ expect ( instanceTelemetry . is_genuine ) . to . equal ( true ) ;
326+ } ) ;
327+ } ) ;
328+
211329 suite ( 'prepare playground result types' , ( ) => {
212330 test ( 'convert AggregationCursor shellApiType to aggregation telemetry type' , ( ) => {
213331 const res = {
0 commit comments