summaryrefslogtreecommitdiffstats
path: root/browser/components/shopping/tests/browser/browser_shopping_survey.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/shopping/tests/browser/browser_shopping_survey.js')
-rw-r--r--browser/components/shopping/tests/browser/browser_shopping_survey.js337
1 files changed, 337 insertions, 0 deletions
diff --git a/browser/components/shopping/tests/browser/browser_shopping_survey.js b/browser/components/shopping/tests/browser/browser_shopping_survey.js
new file mode 100644
index 0000000000..aebe6e9dcf
--- /dev/null
+++ b/browser/components/shopping/tests/browser/browser_shopping_survey.js
@@ -0,0 +1,337 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const currentTime = Date.now() / 1000;
+const time25HrsAgo = currentTime - 25 * 60 * 60;
+const time1HrAgo = currentTime - 1 * 60 * 60;
+
+add_task(async function test_setup() {
+ await BrowserTestUtils.withNewTab(
+ {
+ url: "about:shoppingsidebar",
+ gBrowser,
+ },
+ async browser => {
+ await SpecialPowers.spawn(browser, [], async () => {
+ let childActor = content.windowGlobalChild.getExistingActor(
+ "AboutWelcomeShopping"
+ );
+ childActor.resetChildStates();
+ });
+ }
+ );
+});
+
+/**
+ * Test to check survey renders when show survey conditions are met
+ */
+add_task(async function test_showSurvey_Enabled() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.shopping.experience2023.optedIn", 1],
+ ["browser.shopping.experience2023.survey.enabled", true],
+ ["browser.shopping.experience2023.survey.hasSeen", false],
+ ["browser.shopping.experience2023.survey.pdpVisits", 5],
+ ["browser.shopping.experience2023.survey.optedInTime", time25HrsAgo],
+ ],
+ });
+ await BrowserTestUtils.withNewTab(
+ {
+ url: "about:shoppingsidebar",
+ gBrowser,
+ },
+ async browser => {
+ await SpecialPowers.spawn(
+ browser,
+ [MOCK_ANALYZED_PRODUCT_RESPONSE],
+ async mockData => {
+ const { TestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/TestUtils.sys.mjs"
+ );
+ let surveyPrefChanged = TestUtils.waitForPrefChange(
+ "browser.shopping.experience2023.survey.hasSeen"
+ );
+ let shoppingContainer =
+ content.document.querySelector(
+ "shopping-container"
+ ).wrappedJSObject;
+ shoppingContainer.data = Cu.cloneInto(mockData, content);
+
+ // Manually send data update event, as it isn't set due to the lack of mock APIs.
+ // TODO: Support for the mocks will be added in Bug 1853474.
+ let mockObj = {
+ data: mockData,
+ productUrl: "https://example.com/product/1234",
+ };
+ let evt = new content.CustomEvent("Update", {
+ bubbles: true,
+ detail: Cu.cloneInto(mockObj, content),
+ });
+ content.document.dispatchEvent(evt);
+
+ await shoppingContainer.updateComplete;
+ await surveyPrefChanged;
+
+ let childActor = content.windowGlobalChild.getExistingActor(
+ "AboutWelcomeShopping"
+ );
+
+ ok(childActor.surveyEnabled, "Survey is Enabled");
+
+ let surveyScreen = await ContentTaskUtils.waitForCondition(
+ () =>
+ content.document.querySelector(
+ "shopping-container .screen.SHOPPING_MICROSURVEY_SCREEN_1"
+ ),
+ "survey-screen"
+ );
+
+ ok(surveyScreen, "Survey screen is rendered");
+
+ ok(
+ childActor.showMicroSurvey,
+ "Show Survey targeting conditions met"
+ );
+ Assert.strictEqual(
+ content.document
+ .getElementById("steps")
+ .getAttribute("data-l10n-id"),
+ "shopping-onboarding-welcome-steps-indicator-label",
+ "Steps indicator has appropriate fluent ID"
+ );
+ ok(
+ !content.document.getElementById("multi-stage-message-root").hidden,
+ "Survey Message container is shown"
+ );
+ ok(
+ content.document.querySelector(".dismiss-button"),
+ "Dismiss button is shown"
+ );
+
+ let survey_seen_status = Services.prefs.getBoolPref(
+ "browser.shopping.experience2023.survey.hasSeen",
+ false
+ );
+ ok(survey_seen_status, "Survey pref state is updated");
+ childActor.resetChildStates();
+ }
+ );
+ }
+ );
+ await SpecialPowers.popPrefEnv();
+});
+
+/**
+ * Test to check survey is hidden when survey enabled pref is false
+ */
+add_task(async function test_showSurvey_Disabled() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.shopping.experience2023.optedIn", 1],
+ ["browser.shopping.experience2023.survey.enabled", false],
+ ["browser.shopping.experience2023.survey.hasSeen", false],
+ ["browser.shopping.experience2023.survey.pdpVisits", 5],
+ ["browser.shopping.experience2023.survey.optedInTime", time25HrsAgo],
+ ],
+ });
+ await BrowserTestUtils.withNewTab(
+ {
+ url: "about:shoppingsidebar",
+ gBrowser,
+ },
+ async browser => {
+ await SpecialPowers.spawn(
+ browser,
+ [MOCK_ANALYZED_PRODUCT_RESPONSE],
+ async mockData => {
+ let shoppingContainer =
+ content.document.querySelector(
+ "shopping-container"
+ ).wrappedJSObject;
+ shoppingContainer.data = Cu.cloneInto(mockData, content);
+
+ // Manually send data update event, as it isn't set due to the lack of mock APIs.
+ // TODO: Support for the mocks will be added in Bug 1853474.
+ let mockObj = {
+ data: mockData,
+ productUrl: "https://example.com/product/1234",
+ };
+ let evt = new content.CustomEvent("Update", {
+ bubbles: true,
+ detail: Cu.cloneInto(mockObj, content),
+ });
+ content.document.dispatchEvent(evt);
+
+ await shoppingContainer.updateComplete;
+
+ let childActor = content.windowGlobalChild.getExistingActor(
+ "AboutWelcomeShopping"
+ );
+
+ ok(!childActor.surveyEnabled, "Survey is disabled");
+
+ let surveyScreen = content.document.querySelector(
+ "shopping-container .screen.SHOPPING_MICROSURVEY_SCREEN_1"
+ );
+
+ ok(!surveyScreen, "Survey screen is not rendered");
+ ok(
+ !childActor.showMicroSurvey,
+ "Show Survey targeting conditions are not met"
+ );
+ ok(
+ content.document.getElementById("multi-stage-message-root").hidden,
+ "Survey Message container is hidden"
+ );
+
+ childActor.resetChildStates();
+ }
+ );
+ }
+ );
+ await SpecialPowers.popPrefEnv();
+});
+
+/**
+ * Test to check survey display logic respects 24 hours after Opt-in rule
+ */
+add_task(async function test_24_hr_since_optin_rule() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.shopping.experience2023.optedIn", 1],
+ ["browser.shopping.experience2023.survey.enabled", true],
+ ["browser.shopping.experience2023.survey.hasSeen", false],
+ ["browser.shopping.experience2023.survey.pdpVisits", 5],
+ ["browser.shopping.experience2023.survey.optedInTime", time1HrAgo],
+ ],
+ });
+ await BrowserTestUtils.withNewTab(
+ {
+ url: "about:shoppingsidebar",
+ gBrowser,
+ },
+ async browser => {
+ await SpecialPowers.spawn(
+ browser,
+ [MOCK_ANALYZED_PRODUCT_RESPONSE],
+ async mockData => {
+ let shoppingContainer =
+ content.document.querySelector(
+ "shopping-container"
+ ).wrappedJSObject;
+ shoppingContainer.data = Cu.cloneInto(mockData, content);
+ await shoppingContainer.updateComplete;
+
+ let childActor = content.windowGlobalChild.getExistingActor(
+ "AboutWelcomeShopping"
+ );
+
+ let surveyScreen = content.document.querySelector(
+ "shopping-container .screen.SHOPPING_MICROSURVEY_SCREEN_1"
+ );
+
+ ok(!surveyScreen, "Survey screen is not rendered");
+ ok(
+ !childActor.showMicroSurvey,
+ "Show Survey 24 hours after opt in conditions are not met"
+ );
+ ok(
+ content.document.getElementById("multi-stage-message-root").hidden,
+ "Survey Message container is hidden"
+ );
+
+ childActor.resetChildStates();
+ }
+ );
+ }
+ );
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function test_confirmation_screen() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.shopping.experience2023.optedIn", 1],
+ ["browser.shopping.experience2023.survey.enabled", true],
+ ["browser.shopping.experience2023.survey.hasSeen", false],
+ ["browser.shopping.experience2023.survey.pdpVisits", 5],
+ ["browser.shopping.experience2023.survey.optedInTime", time25HrsAgo],
+ ],
+ });
+ await BrowserTestUtils.withNewTab(
+ {
+ url: "about:shoppingsidebar",
+ gBrowser,
+ },
+ async browser => {
+ await SpecialPowers.spawn(
+ browser,
+ [MOCK_ANALYZED_PRODUCT_RESPONSE],
+ async mockData => {
+ async function clickVisibleElement(selector) {
+ await ContentTaskUtils.waitForCondition(
+ () => content.document.querySelector(selector),
+ `waiting for selector ${selector}`,
+ 200, // interval
+ 100 // maxTries
+ );
+ content.document.querySelector(selector).click();
+ }
+
+ let shoppingContainer =
+ content.document.querySelector(
+ "shopping-container"
+ ).wrappedJSObject;
+ shoppingContainer.data = Cu.cloneInto(mockData, content);
+
+ // Manually send data update event, as it isn't set due to the lack of mock APIs.
+ // TODO: Support for the mocks will be added in Bug 1853474.
+ let mockObj = {
+ data: mockData,
+ productUrl: "https://example.com/product/1234",
+ };
+ let evt = new content.CustomEvent("Update", {
+ bubbles: true,
+ detail: Cu.cloneInto(mockObj, content),
+ });
+ content.document.dispatchEvent(evt);
+
+ await shoppingContainer.updateComplete;
+
+ let surveyScreen1 = await ContentTaskUtils.waitForCondition(
+ () =>
+ content.document.querySelector(
+ "shopping-container .screen.SHOPPING_MICROSURVEY_SCREEN_1"
+ ),
+ "survey-screen"
+ );
+
+ ok(surveyScreen1, "Survey screen 1 is rendered");
+ clickVisibleElement("#radio-1");
+ clickVisibleElement("button.primary");
+
+ let surveyScreen2 = await ContentTaskUtils.waitForCondition(
+ () =>
+ content.document.querySelector(
+ "shopping-container .screen.SHOPPING_MICROSURVEY_SCREEN_2"
+ ),
+ "survey-screen"
+ );
+ ok(surveyScreen2, "Survey screen 2 is rendered");
+ clickVisibleElement("#radio-1");
+ clickVisibleElement("button.primary");
+
+ let confirmationScreen = await ContentTaskUtils.waitForCondition(
+ () => content.document.querySelector("shopping-message-bar"),
+ "survey-screen"
+ );
+
+ ok(confirmationScreen, "Survey confirmation screen is rendered");
+ }
+ );
+ }
+ );
+ await SpecialPowers.popPrefEnv();
+});