Merge pull request #317 from raphinesse/improve-cli-telemetry-spec

cli.spec: telemetry-related improvements
diff --git a/spec/cli.spec.js b/spec/cli.spec.js
index 13294b5..6d0e48f 100644
--- a/spec/cli.spec.js
+++ b/spec/cli.spec.js
@@ -42,9 +42,10 @@
         spyOn(console, 'log');
 
         // Prevent accidentally turning telemetry on/off during testing
-        telemetry.turnOn = () => {};
-        telemetry.turnOff = () => {};
-        telemetry.track = () => {};
+        spyOn(telemetry, 'track');
+        spyOn(telemetry, 'turnOn');
+        spyOn(telemetry, 'turnOff');
+        spyOn(telemetry, 'showPrompt').and.returnValue(Promise.resolve());
     });
 
     describe('options', () => {
@@ -264,24 +265,26 @@
     });
 
     describe('telemetry', () => {
+        beforeEach(() => {
+            // Set a normal opted-in user as default
+            spyOn(telemetry, 'isCI').and.returnValue(false);
+            spyOn(telemetry, 'isOptedIn').and.returnValue(true);
+            spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(true);
+        });
+
         it("Test#023 : skips prompt when user runs 'cordova telemetry X'", () => {
-            let wasPromptShown = false;
-            spyOn(telemetry, 'showPrompt').and.callFake(() => {
-                wasPromptShown = true;
-            });
+            telemetry.hasUserOptedInOrOut.and.returnValue(false);
 
             return Promise.resolve()
                 .then(_ => cli(['node', 'cordova', 'telemetry', 'on']))
                 .then(_ => cli(['node', 'cordova', 'telemetry', 'off']))
                 .then(() => {
-                    expect(wasPromptShown).toBeFalsy();
+                    expect(telemetry.showPrompt).not.toHaveBeenCalled();
                 });
         });
 
         it("Test#024 : is NOT collected when user runs 'cordova telemetry on' while NOT opted-in", () => {
-            spyOn(telemetry, 'isOptedIn').and.returnValue(false);
-            spyOn(telemetry, 'isCI').and.returnValue(false);
-            spyOn(telemetry, 'track');
+            telemetry.isOptedIn.and.returnValue(false);
 
             return cli(['node', 'cordova', 'telemetry', 'on']).then(() => {
                 expect(telemetry.track).not.toHaveBeenCalled();
@@ -289,21 +292,13 @@
         });
 
         it("Test#025 : is collected when user runs 'cordova telemetry off' while opted-in", () => {
-            spyOn(telemetry, 'isOptedIn').and.returnValue(true);
-            spyOn(telemetry, 'isCI').and.returnValue(false);
-            spyOn(telemetry, 'track');
-
             return cli(['node', 'cordova', 'telemetry', 'off']).then(() => {
                 expect(telemetry.track).toHaveBeenCalledWith('telemetry', 'off', 'via-cordova-telemetry-cmd', 'successful');
             });
         });
 
         it('Test#026 : tracks platforms/plugins subcommands', () => {
-            spyOn(telemetry, 'isOptedIn').and.returnValue(true);
-            spyOn(telemetry, 'isCI').and.returnValue(false);
-            spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(true);
             spyOn(cordova, 'platform').and.returnValue(Promise.resolve());
-            spyOn(telemetry, 'track');
 
             return cli(['node', 'cordova', 'platform', 'add', 'ios']).then(() => {
                 expect(telemetry.track).toHaveBeenCalledWith('platform', 'add', 'successful');
@@ -312,26 +307,29 @@
 
         it('Test#027 : shows prompt if user neither opted in or out yet', () => {
             spyOn(cordova, 'prepare').and.returnValue(Promise.resolve());
-            spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(false);
-            spyOn(telemetry, 'isCI').and.returnValue(false);
-            spyOn(telemetry, 'isNoTelemetryFlag').and.returnValue(false);
-            spyOn(telemetry, 'showPrompt').and.returnValue(Promise.resolve(false));
+            telemetry.hasUserOptedInOrOut.and.returnValue(false);
 
             return cli(['node', 'cordova', 'prepare']).then(() => {
                 expect(telemetry.showPrompt).toHaveBeenCalled();
             });
         });
 
-        // note: we override telemetry timeout here so we don't need to wait 30 seconds
         it('Test#028 : opts-out if prompt times out AND it tracks opt-out', () => {
             // Remove any optOut settings that might have been saved
             // ... and force prompt to be shown
             telemetry.clear();
-            spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(false);
-            spyOn(telemetry, 'isCI').and.returnValue(false);
-            spyOn(telemetry, 'track');
 
-            telemetry.timeoutInSecs = 1;
+            // We override telemetry timeout here so we don't need to wait
+            // 30 seconds. 0s is impossible with the current implementation.
+            telemetry.timeoutInSecs = 0.01;
+
+            // Don't display the prompt
+            spyOn(process.stdout, 'write');
+
+            telemetry.isOptedIn.and.callThrough();
+            telemetry.showPrompt.and.callThrough();
+            telemetry.hasUserOptedInOrOut.and.returnValue(false);
+
             return cli(['node', 'cordova', '--version']).then(() => {
                 if (process.env.CI) {
                     expect(telemetry.isOptedIn()).toBeTruthy();
@@ -343,11 +341,7 @@
         });
 
         it("Test#029 : is NOT collected in CI environments and doesn't prompt", () => {
-            spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(true);
-            spyOn(telemetry, 'isOptedIn').and.returnValue(true);
-            spyOn(telemetry, 'isCI').and.returnValue(true);
-            spyOn(telemetry, 'showPrompt');
-            spyOn(telemetry, 'track');
+            telemetry.isCI.and.returnValue(true);
 
             return cli(['node', 'cordova', '--version']).then(() => {
                 expect(telemetry.showPrompt).not.toHaveBeenCalled();
@@ -356,11 +350,7 @@
         });
 
         it("Test#030 : is NOT collected when --no-telemetry flag found and doesn't prompt", () => {
-            spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(false);
-            spyOn(telemetry, 'isOptedIn').and.returnValue(true);
-            spyOn(telemetry, 'isCI').and.returnValue(false);
-            spyOn(telemetry, 'showPrompt');
-            spyOn(telemetry, 'track');
+            telemetry.hasUserOptedInOrOut.and.returnValue(false);
 
             return cli(['node', 'cordova', '--version', '--no-telemetry']).then(() => {
                 expect(telemetry.showPrompt).not.toHaveBeenCalled();
@@ -369,11 +359,8 @@
         });
 
         it('Test#031 : is NOT collected if user opted out', () => {
-            spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(true);
-            spyOn(telemetry, 'isOptedIn').and.returnValue(false);
-            spyOn(telemetry, 'isCI').and.returnValue(false);
-            spyOn(telemetry, 'showPrompt');
-            spyOn(telemetry, 'track');
+            telemetry.isOptedIn.and.returnValue(false);
+            telemetry.hasUserOptedInOrOut.and.returnValue(true);
 
             return cli(['node', 'cordova', '--version']).then(() => {
                 expect(telemetry.showPrompt).not.toHaveBeenCalled();
@@ -382,12 +369,6 @@
         });
 
         it('Test#032 : is collected if user opted in', () => {
-            spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(true);
-            spyOn(telemetry, 'isOptedIn').and.returnValue(true);
-            spyOn(telemetry, 'isCI').and.returnValue(false);
-            spyOn(telemetry, 'showPrompt');
-            spyOn(telemetry, 'track');
-
             return cli(['node', 'cordova', '--version']).then(() => {
                 expect(telemetry.showPrompt).not.toHaveBeenCalled();
                 expect(telemetry.track).toHaveBeenCalled();
@@ -395,12 +376,7 @@
         });
 
         it("Test#033 : track opt-out that happened via 'cordova telemetry off' even if user is NOT opted-in ", () => {
-            spyOn(telemetry, 'isCI').and.returnValue(false);
-            spyOn(telemetry, 'isOptedIn').and.returnValue(false); // same as calling `telemetry.turnOff();`
-            spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(true);
-            spyOn(telemetry, 'track');
-
-            expect(telemetry.isOptedIn()).toBeFalsy();
+            telemetry.isOptedIn.and.returnValue(false);
 
             return cli(['node', 'cordova', 'telemetry', 'off']).then(() => {
                 expect(telemetry.isOptedIn()).toBeFalsy();