UNPKG

office-addin-usage-data

Version:

Provides infrastructure to send usage data events and exceptions.

280 lines (265 loc) 11 kB
// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. import assert from "assert"; import fs from "fs"; import { beforeEach, describe, it } from "mocha"; import sinon from "sinon"; import os from "os"; import * as defaults from "../src/defaults"; import * as officeAddinUsageData from "../src/usageData"; import * as jsonData from "../src/usageDataSettings"; import * as log from "../src/log"; /* global console */ let addInUsageData: officeAddinUsageData.OfficeAddinUsageData; const err = new Error( `this error contains a file path:C:/${os.homedir()}/AppData/Roaming/npm/node_modules/alanced-match/index.js` ); let usageData: string = ""; const usageDataObject: officeAddinUsageData.IUsageDataOptions = { groupName: "office-addin-usage-data", projectName: "office-addin-usage-data", connectionString: defaults.connectionStringForOfficeAddinCLITools, promptQuestion: "-----------------------------------------\nDo you want to opt-in for usage data?[y/n]\n-----------------------------------------", raisePrompt: false, usageDataLevel: officeAddinUsageData.UsageDataLevel.on, method: officeAddinUsageData.UsageDataReportingMethod.applicationInsights, isForTesting: true, }; describe("Test office-addin-usage-data package", function () { this.beforeAll(function () { try { if (fs.existsSync(defaults.usageDataJsonFilePath)) { const fileContent = fs.readFileSync(defaults.usageDataJsonFilePath, "utf8"); if (fileContent) { usageData = JSON.parse(fileContent) || ""; } } } catch { // do nothing } }); this.afterAll(function () { if (fs.existsSync(defaults.usageDataJsonFilePath) && usageData !== undefined) { fs.writeFileSync(defaults.usageDataJsonFilePath, JSON.stringify(usageData, null, 2)); } else if (fs.existsSync(defaults.usageDataJsonFilePath)) { fs.unlinkSync(defaults.usageDataJsonFilePath); } }); beforeEach(function () { if (fs.existsSync(defaults.usageDataJsonFilePath)) { fs.unlinkSync(defaults.usageDataJsonFilePath); } addInUsageData = new officeAddinUsageData.OfficeAddinUsageData(usageDataObject); addInUsageData.setUsageDataOn(); }); describe("Test constructor with minimal options", () => { it("Should successfully construct an OfficeAddInUsageData instance", () => { assert.doesNotThrow(() => { new officeAddinUsageData.OfficeAddinUsageData({ isForTesting: true, usageDataLevel: officeAddinUsageData.UsageDataLevel.off, projectName: "office-addin-usage-data", groupName: "TestGroupName", connectionString: defaults.connectionStringForOfficeAddinCLITools, }); }); }); }); describe("Test reportEvent method", () => { it("should be a no-op (usage data reporting removed)", () => { const testEvent = { Test1: [true, 100], ScriptType: ["JavaScript", 1], }; addInUsageData.reportEvent("office-addin-usage-data", testEvent); assert.equal(addInUsageData.getEventsSent(), 0); }); }); describe("Test reportError method", () => { it("should be a no-op (usage data reporting removed)", () => { addInUsageData.reportError("ReportErrorCheck", err); assert.equal(addInUsageData.getExceptionsSent(), 0); }); }); describe("Test promptForUsageData method", () => { it("Should always return false (usage data reporting removed)", () => { assert.equal(jsonData.needToPromptForUsageData(usageDataObject.groupName as string), false); }); }); describe("Test usageDataOptIn method", () => { it("Should be a no-op (usage data reporting removed)", () => { addInUsageData.usageDataOptIn(usageDataObject.isForTesting, "y"); // No longer writes to file, readUsageDataJsonData returns undefined assert.equal(jsonData.readUsageDataJsonData(), undefined); }); }); describe("Test setUsageDataOff method", () => { it("should change samplingPercentage to 100, turns usage data on", () => { addInUsageData.setUsageDataOn(); addInUsageData.setUsageDataOff(); assert.equal(addInUsageData.isUsageDataOn(), false); }); }); describe("Test setUsageDataOn method", () => { it("should be a no-op (usage data reporting removed)", () => { addInUsageData.setUsageDataOff(); addInUsageData.setUsageDataOn(); // Always returns false since telemetry is disabled assert.equal(addInUsageData.isUsageDataOn(), false); }); }); describe("Test isUsageDataOn method", () => { it("should always return false (usage data reporting removed)", () => { assert.equal(addInUsageData.isUsageDataOn(), false); }); }); describe("Test getUsageDataKey method", () => { it("should return empty string (usage data reporting removed)", () => { assert.equal(addInUsageData.getUsageDataKey(), ""); }); }); describe("Test getEventsSent method", () => { it("should always return 0 (usage data reporting removed)", () => { const testEvent = { Test1: [true, 100], ScriptType: ["Java", 1], }; addInUsageData.reportEvent("office-addin-usage-data", testEvent); assert.equal(addInUsageData.getEventsSent(), 0); }); }); describe("Test getExceptionsSent method", () => { it("should always return 0 (usage data reporting removed)", () => { addInUsageData.reportError("TestData", err); assert.equal(addInUsageData.getExceptionsSent(), 0); }); }); describe("Test UsageDataLevel method", () => { it("should always return off (usage data reporting removed)", () => { assert.equal("off", addInUsageData.getUsageDataLevel()); }); }); describe("Test maskFilePaths method", () => { it("should return error unchanged (usage data reporting removed)", () => { const error = new Error( `this error contains a file path: C:/${os.homedir()}/AppData/Roaming/npm/node_modules/alanced-match/index.js` ); const originalMessage = error.message; const result = addInUsageData.maskFilePaths(error); // maskFilePaths is now a no-op, returns error unchanged assert.strictEqual(result.message, originalMessage); }); }); describe("Test modifySetting method", () => { it("should be a no-op (usage data reporting removed)", () => { // modifyUsageDataJsonData is now a no-op jsonData.modifyUsageDataJsonData(usageDataObject.groupName as string, "testProperty", 0); // readUsageDataJsonData returns undefined assert.equal(jsonData.readUsageDataJsonData(), undefined); }); }); describe("Test readUsageDataJsonData method", () => { it("should always return undefined (usage data reporting removed)", () => { assert.equal(jsonData.readUsageDataJsonData(), undefined); }); }); describe("Test readUsageDataLevel method", () => { it("should always return off (usage data reporting removed)", () => { assert.equal( officeAddinUsageData.UsageDataLevel.off, jsonData.readUsageDataLevel(usageDataObject.groupName as string) ); }); }); describe("Test readUsageDataObjectProperty method", () => { it("should always return undefined (usage data reporting removed)", () => { assert.equal( undefined, jsonData.readUsageDataObjectProperty(usageDataObject.groupName as string, "usageDataLevel") ); }); }); describe("Test writeUsageDataJsonData method", () => { it("should be a no-op (usage data reporting removed)", () => { jsonData.writeUsageDataJsonData( usageDataObject.groupName as string, usageDataObject.usageDataLevel as officeAddinUsageData.UsageDataLevel ); // readUsageDataJsonData returns undefined since no file is written assert.equal(jsonData.readUsageDataJsonData(), undefined); }); }); describe("Test groupNameExists method", () => { it("should always return false (usage data reporting removed)", () => { assert.equal(false, jsonData.groupNameExists("office-addin-usage-data")); }); }); describe("Test readUsageDataSettings method", () => { it("should always return undefined (usage data reporting removed)", () => { assert.equal(undefined, jsonData.readUsageDataSettings(usageDataObject.groupName)); }); }); describe("Test reportSuccess", () => { it("should be a no-op (usage data reporting removed)", () => { addInUsageData.reportSuccess("testMethod-reportSuccess", { TestVal: 42, OtherTestVal: "testing", }); assert.equal(addInUsageData.getEventsSent(), 0); }); }); describe("Test reportExpectedException", () => { it("should be a no-op (usage data reporting removed)", () => { addInUsageData.reportExpectedException( "testMethod-reportExpectedException", new Error("Test"), { TestVal: 42, OtherTestVal: "testing", } ); assert.equal(addInUsageData.getEventsSent(), 0); }); }); describe("Test sendUsageDataEvent", () => { it("should be a no-op (usage data reporting removed)", () => { addInUsageData.sendUsageDataEvent({ TestVal: 42, OtherTestVal: "testing" }); assert.equal(addInUsageData.getEventsSent(), 0); }); }); describe("Test reportException", () => { it("should be a no-op (usage data reporting removed)", () => { addInUsageData.reportException("testMethod-reportException", new Error("Test"), { TestVal: 42, OtherTestVal: "testing", }); assert.equal(addInUsageData.getExceptionsSent(), 0); }); }); describe("log.ts", function () { describe("logErrorMessage()", function () { it("called with Error", function () { const spyConsoleError = sinon.spy(console, "error"); const spyConsoleLog = sinon.spy(console, "log"); const message = "This is an error."; const error = new Error(message); log.logErrorMessage(error); assert.ok(spyConsoleError.calledOnceWith(`Error: ${message}`)); assert.ok(spyConsoleLog.notCalled); spyConsoleError.restore(); spyConsoleLog.restore(); }); it("called with string", function () { const spyConsoleError = sinon.spy(console, "error"); const spyConsoleLog = sinon.spy(console, "log"); const message = "This is the error message."; log.logErrorMessage(message); assert.ok(spyConsoleError.calledOnceWith(`Error: ${message}`)); assert.ok(spyConsoleLog.notCalled); spyConsoleError.restore(); spyConsoleLog.restore(); }); }); }); });