summaryrefslogtreecommitdiffstats
path: root/browser/components/newtab/test/browser/browser_multistage_spotlight_telemetry.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/newtab/test/browser/browser_multistage_spotlight_telemetry.js')
-rw-r--r--browser/components/newtab/test/browser/browser_multistage_spotlight_telemetry.js145
1 files changed, 145 insertions, 0 deletions
diff --git a/browser/components/newtab/test/browser/browser_multistage_spotlight_telemetry.js b/browser/components/newtab/test/browser/browser_multistage_spotlight_telemetry.js
new file mode 100644
index 0000000000..c9c4baad83
--- /dev/null
+++ b/browser/components/newtab/test/browser/browser_multistage_spotlight_telemetry.js
@@ -0,0 +1,145 @@
+"use strict";
+
+const { Spotlight } = ChromeUtils.import(
+ "resource://activity-stream/lib/Spotlight.jsm"
+);
+const { PanelTestProvider } = ChromeUtils.importESModule(
+ "resource://activity-stream/lib/PanelTestProvider.sys.mjs"
+);
+const { BrowserWindowTracker } = ChromeUtils.import(
+ "resource:///modules/BrowserWindowTracker.jsm"
+);
+
+const { AboutWelcomeTelemetry } = ChromeUtils.import(
+ "resource://activity-stream/aboutwelcome/lib/AboutWelcomeTelemetry.jsm"
+);
+
+async function waitForClick(selector, win) {
+ await TestUtils.waitForCondition(() => win.document.querySelector(selector));
+ win.document.querySelector(selector).click();
+}
+
+function waitForDialog(callback = win => win.close()) {
+ return BrowserTestUtils.promiseAlertDialog(
+ null,
+ "chrome://browser/content/spotlight.html",
+ { callback, isSubDialog: true }
+ );
+}
+
+function showAndWaitForDialog(dialogOptions, callback) {
+ const promise = waitForDialog(callback);
+ Spotlight.showSpotlightDialog(
+ dialogOptions.browser,
+ dialogOptions.message,
+ dialogOptions.dispatchStub
+ );
+ return promise;
+}
+
+add_task(async function send_spotlight_as_page_in_telemetry() {
+ let message = (await PanelTestProvider.getMessages()).find(
+ m => m.id === "MULTISTAGE_SPOTLIGHT_MESSAGE"
+ );
+ let dispatchStub = sinon.stub();
+ let browser = BrowserWindowTracker.getTopWindow().gBrowser.selectedBrowser;
+ let sandbox = sinon.createSandbox();
+
+ await showAndWaitForDialog({ message, browser, dispatchStub }, async win => {
+ let stub = sandbox.stub(win, "AWSendEventTelemetry");
+ await waitForClick("button.secondary", win);
+ Assert.equal(
+ stub.lastCall.args[0].event_context.page,
+ "spotlight",
+ "The value of event context page should be set to 'spotlight' in event telemetry"
+ );
+ win.close();
+ });
+
+ sandbox.restore();
+});
+
+add_task(async function send_dismiss_event_telemetry() {
+ // Have to turn on AS telemetry for anything to be recorded.
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.newtabpage.activity-stream.telemetry", true]],
+ });
+ registerCleanupFunction(async () => {
+ await SpecialPowers.popPrefEnv();
+ });
+
+ const messageId = "MULTISTAGE_SPOTLIGHT_MESSAGE";
+ let message = (await PanelTestProvider.getMessages()).find(
+ m => m.id === messageId
+ );
+ let browser = BrowserWindowTracker.getTopWindow().gBrowser.selectedBrowser;
+ let sandbox = sinon.createSandbox();
+ sandbox
+ .stub(AboutWelcomeTelemetry.prototype, "pingCentre")
+ .value({ sendStructuredIngestionPing: () => {} });
+ let spy = sandbox.spy(AboutWelcomeTelemetry.prototype, "sendTelemetry");
+ // send without a dispatch function so that default is used
+ let pingSubmitted = false;
+ await showAndWaitForDialog({ message, browser }, async win => {
+ await waitForClick("button.dismiss-button", win);
+ await win.close();
+ // To catch the `DISMISS` and not any of the earlier events
+ // triggering "messaging-system" pings, we must position this synchronously
+ // _after_ the window closes but before `showAndWaitForDialog`'s callback
+ // completes.
+ // Too early and we'll catch an earlier event like `CLICK`.
+ // Too late and we'll not catch any event at all.
+ GleanPings.messagingSystem.testBeforeNextSubmit(() => {
+ pingSubmitted = true;
+
+ Assert.equal(
+ messageId,
+ Glean.messagingSystem.messageId.testGetValue(),
+ "Glean was given the correct message_id"
+ );
+ Assert.equal(
+ "DISMISS",
+ Glean.messagingSystem.event.testGetValue(),
+ "Glean was given the correct event"
+ );
+ });
+ });
+
+ Assert.equal(
+ spy.lastCall.args[0].message_id,
+ messageId,
+ "A dismiss event is called with the correct message id"
+ );
+
+ Assert.equal(
+ spy.lastCall.args[0].event,
+ "DISMISS",
+ "A dismiss event is called with a top level event field with value 'DISMISS'"
+ );
+
+ Assert.ok(pingSubmitted, "The Glean ping was submitted.");
+
+ sandbox.restore();
+});
+
+add_task(
+ async function do_not_send_impression_telemetry_from_default_dispatch() {
+ // Don't send impression telemetry from the Spotlight default dispatch function
+ let message = (await PanelTestProvider.getMessages()).find(
+ m => m.id === "MULTISTAGE_SPOTLIGHT_MESSAGE"
+ );
+ let browser = BrowserWindowTracker.getTopWindow().gBrowser.selectedBrowser;
+ let sandbox = sinon.createSandbox();
+ let stub = sandbox.stub(AboutWelcomeTelemetry.prototype, "sendTelemetry");
+ // send without a dispatch function so that default is used
+ await showAndWaitForDialog({ message, browser });
+
+ Assert.equal(
+ stub.calledOn(),
+ false,
+ "No extra impression event was sent for multistage Spotlight"
+ );
+
+ sandbox.restore();
+ }
+);