Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cli.spec: telemetry-related improvements #317

Merged
merged 4 commits into from
Sep 5, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 31 additions & 55 deletions spec/cli.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,10 @@ describe('cordova cli', () => {
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', () => {
Expand Down Expand Up @@ -264,46 +265,40 @@ describe('cordova cli', () => {
});

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();
});
});

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');
Expand All @@ -312,26 +307,29 @@ describe('cordova cli', () => {

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();
Expand All @@ -343,11 +341,7 @@ describe('cordova cli', () => {
});

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();
Expand All @@ -356,11 +350,7 @@ describe('cordova cli', () => {
});

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();
Expand All @@ -369,11 +359,8 @@ describe('cordova cli', () => {
});

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();
Expand All @@ -382,25 +369,14 @@ describe('cordova cli', () => {
});

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();
});
});

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();
Expand Down