summaryrefslogtreecommitdiffstats
path: root/browser/components/pocket/test
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/pocket/test')
-rw-r--r--browser/components/pocket/test/.eslintrc.js5
-rw-r--r--browser/components/pocket/test/browser.ini11
-rw-r--r--browser/components/pocket/test/browser_pocket_context_menu_action.js45
-rw-r--r--browser/components/pocket/test/browser_pocket_library_menu_action.js56
-rw-r--r--browser/components/pocket/test/browser_pocket_page_action_menu.js46
-rw-r--r--browser/components/pocket/test/browser_pocket_panel.js24
-rw-r--r--browser/components/pocket/test/browser_pocket_ui_check.js110
-rw-r--r--browser/components/pocket/test/head.js77
-rw-r--r--browser/components/pocket/test/pocket_actions_test.html10
-rw-r--r--browser/components/pocket/test/test.html12
-rw-r--r--browser/components/pocket/test/unit/browser.ini6
-rw-r--r--browser/components/pocket/test/unit/browser_pocket_main.js82
-rw-r--r--browser/components/pocket/test/unit/browser_pocket_pktTelemetry.js56
-rw-r--r--browser/components/pocket/test/unit/head.js12
14 files changed, 552 insertions, 0 deletions
diff --git a/browser/components/pocket/test/.eslintrc.js b/browser/components/pocket/test/.eslintrc.js
new file mode 100644
index 0000000000..1779fd7f1c
--- /dev/null
+++ b/browser/components/pocket/test/.eslintrc.js
@@ -0,0 +1,5 @@
+"use strict";
+
+module.exports = {
+ extends: ["plugin:mozilla/browser-test"],
+};
diff --git a/browser/components/pocket/test/browser.ini b/browser/components/pocket/test/browser.ini
new file mode 100644
index 0000000000..ca553a1aa0
--- /dev/null
+++ b/browser/components/pocket/test/browser.ini
@@ -0,0 +1,11 @@
+[DEFAULT]
+support-files =
+ head.js
+ test.html
+ pocket_actions_test.html
+
+[browser_pocket_ui_check.js]
+[browser_pocket_context_menu_action.js]
+[browser_pocket_library_menu_action.js]
+[browser_pocket_panel.js]
+[browser_pocket_page_action_menu.js]
diff --git a/browser/components/pocket/test/browser_pocket_context_menu_action.js b/browser/components/pocket/test/browser_pocket_context_menu_action.js
new file mode 100644
index 0000000000..23b5e45463
--- /dev/null
+++ b/browser/components/pocket/test/browser_pocket_context_menu_action.js
@@ -0,0 +1,45 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+add_task(async function() {
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "https://example.com/browser/browser/components/pocket/test/test.html"
+ );
+
+ info("opening context menu");
+ let contextMenu = document.getElementById("contentAreaContextMenu");
+ let popupShown = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
+ let popupHidden = BrowserTestUtils.waitForEvent(contextMenu, "popuphidden");
+
+ await BrowserTestUtils.synthesizeMouseAtCenter(
+ "body",
+ {
+ type: "contextmenu",
+ button: 2,
+ },
+ tab.linkedBrowser
+ );
+ await popupShown;
+
+ info("opening pocket panel");
+ let contextPocket = contextMenu.querySelector("#context-pocket");
+ contextPocket.click();
+ checkElements(true, ["pageActionActivatedActionPanel"]);
+
+ info("closing pocket panel");
+ let pocketPanel = document.getElementById("pageActionActivatedActionPanel");
+ let pocketPanelHidden = BrowserTestUtils.waitForEvent(
+ pocketPanel,
+ "popuphidden"
+ );
+
+ pocketPanel.hidePopup();
+ await pocketPanelHidden;
+ checkElements(false, ["pageActionActivatedActionPanel"]);
+
+ contextMenu.hidePopup();
+ await popupHidden;
+ BrowserTestUtils.removeTab(tab);
+});
diff --git a/browser/components/pocket/test/browser_pocket_library_menu_action.js b/browser/components/pocket/test/browser_pocket_library_menu_action.js
new file mode 100644
index 0000000000..03599c414d
--- /dev/null
+++ b/browser/components/pocket/test/browser_pocket_library_menu_action.js
@@ -0,0 +1,56 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+add_task(async function test_setup() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ [
+ "extensions.pocket.site",
+ "example.com/browser/browser/components/pocket/test/pocket_actions_test.html",
+ ],
+ ],
+ });
+});
+
+add_task(async function() {
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "https://example.com/browser/browser/components/pocket/test/test.html"
+ );
+
+ let libraryButton = document.getElementById("library-button");
+
+ info("opening library menu");
+ libraryButton.click();
+ let libraryView = document.getElementById("appMenu-libraryView");
+ let libraryPromise = BrowserTestUtils.waitForEvent(libraryView, "ViewShown");
+ await libraryPromise;
+
+ let pocketLibraryButton = document.getElementById(
+ "appMenu-library-pocket-button"
+ );
+ ok(pocketLibraryButton, "library menu should have pocket button");
+ is(
+ pocketLibraryButton.disabled,
+ false,
+ "element appMenu-library-pocket-button is not disabled"
+ );
+
+ info("clicking on pocket library button");
+ let pocketPagePromise = BrowserTestUtils.waitForNewTab(
+ gBrowser,
+ "https://example.com/browser/browser/components/pocket/test/pocket_actions_test.html/firefox_learnmore?src=ff_library"
+ );
+ pocketLibraryButton.click();
+ await pocketPagePromise;
+
+ is(
+ gBrowser.currentURI.spec,
+ "https://example.com/browser/browser/components/pocket/test/pocket_actions_test.html/firefox_learnmore?src=ff_library",
+ "pocket button in library menu button opens correct page"
+ );
+
+ BrowserTestUtils.removeTab(tab);
+ BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
diff --git a/browser/components/pocket/test/browser_pocket_page_action_menu.js b/browser/components/pocket/test/browser_pocket_page_action_menu.js
new file mode 100644
index 0000000000..a4930f3013
--- /dev/null
+++ b/browser/components/pocket/test/browser_pocket_page_action_menu.js
@@ -0,0 +1,46 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+add_task(async function() {
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "https://example.com/browser/browser/components/pocket/test/test.html"
+ );
+
+ let pageActionContextMenu = document.getElementById("pageActionPanel");
+ let pageActionButton = document.getElementById("pageActionButton");
+ let pageActionShown = BrowserTestUtils.waitForEvent(
+ pageActionContextMenu,
+ "popupshown"
+ );
+ let pageActionHidden = BrowserTestUtils.waitForEvent(
+ pageActionContextMenu,
+ "popuphidden"
+ );
+
+ info("opening page action panel");
+ pageActionButton.click();
+ await pageActionShown;
+ checkElements(true, ["pageAction-panel-pocket"]);
+
+ let pocketButton = document.getElementById("pageAction-panel-pocket");
+ info("clicking on pageAction-panel-pocket");
+ pocketButton.click();
+ await pageActionHidden;
+
+ let pocketPanel = document.getElementById("pageActionActivatedActionPanel");
+ is(
+ pocketPanel.state,
+ "showing",
+ "panel pageActionActivatedActionPanel is showing"
+ );
+
+ let pocketPanelHidden = BrowserTestUtils.waitForEvent(
+ pocketPanel,
+ "popuphidden"
+ );
+ pocketPanel.hidePopup();
+ await pocketPanelHidden;
+ BrowserTestUtils.removeTab(tab);
+});
diff --git a/browser/components/pocket/test/browser_pocket_panel.js b/browser/components/pocket/test/browser_pocket_panel.js
new file mode 100644
index 0000000000..411ab94a88
--- /dev/null
+++ b/browser/components/pocket/test/browser_pocket_panel.js
@@ -0,0 +1,24 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+add_task(async function() {
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "https://example.com/browser/browser/components/pocket/test/test.html"
+ );
+
+ info("clicking on pocket button in url bar");
+ let pocketButton = document.getElementById("pocket-button");
+ pocketButton.click();
+
+ checkElements(true, ["pageActionActivatedActionPanel"]);
+ let pocketPanel = document.getElementById("pageActionActivatedActionPanel");
+ is(pocketPanel.state, "showing", "pocket panel is showing");
+
+ info("closing pocket panel");
+ pocketButton.click();
+ checkElements(false, ["pageActionActivatedActionPanel"]);
+
+ BrowserTestUtils.removeTab(tab);
+});
diff --git a/browser/components/pocket/test/browser_pocket_ui_check.js b/browser/components/pocket/test/browser_pocket_ui_check.js
new file mode 100644
index 0000000000..8610cd6070
--- /dev/null
+++ b/browser/components/pocket/test/browser_pocket_ui_check.js
@@ -0,0 +1,110 @@
+"use strict";
+
+add_task(async function test_setup() {
+ let clearValue = Services.prefs.prefHasUserValue("extensions.pocket.enabled");
+ let enabledOnStartup = Services.prefs.getBoolPref(
+ "extensions.pocket.enabled"
+ );
+ registerCleanupFunction(() => {
+ if (clearValue) {
+ Services.prefs.clearUserPref("extensions.pocket.enabled");
+ } else {
+ Services.prefs.setBoolPref("extensions.pocket.enabled", enabledOnStartup);
+ }
+ });
+});
+
+add_task(async function() {
+ await promisePocketEnabled();
+
+ let libraryButton = document.getElementById("library-button");
+ libraryButton.click();
+
+ let libraryView = document.getElementById("appMenu-libraryView");
+ let popupShown = BrowserTestUtils.waitForEvent(libraryView, "ViewShown");
+ await popupShown;
+
+ checkElementsShown(true, ["appMenu-library-pocket-button"]);
+
+ // Close the Library panel.
+ let popupHidden = BrowserTestUtils.waitForEvent(document, "popuphidden");
+ libraryView.closest("panel").hidePopup();
+
+ // check context menu exists
+ info("checking content context menu");
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "https://example.com/browser/browser/components/pocket/test/test.html"
+ );
+
+ let contextMenu = document.getElementById("contentAreaContextMenu");
+ popupShown = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
+ popupHidden = BrowserTestUtils.waitForEvent(contextMenu, "popuphidden");
+ await BrowserTestUtils.synthesizeMouseAtCenter(
+ "body",
+ {
+ type: "contextmenu",
+ button: 2,
+ },
+ tab.linkedBrowser
+ );
+ await popupShown;
+
+ checkElementsShown(true, ["pocket-button", "context-pocket"]);
+
+ contextMenu.hidePopup();
+ await popupHidden;
+ popupShown = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
+ popupHidden = BrowserTestUtils.waitForEvent(contextMenu, "popuphidden");
+ await BrowserTestUtils.synthesizeMouseAtCenter(
+ "a",
+ {
+ type: "contextmenu",
+ button: 2,
+ },
+ tab.linkedBrowser
+ );
+ await popupShown;
+
+ checkElementsShown(true, ["context-savelinktopocket"]);
+
+ contextMenu.hidePopup();
+ await popupHidden;
+ BrowserTestUtils.removeTab(tab);
+
+ await promisePocketDisabled();
+
+ checkElementsShown(false, [
+ "context-pocket",
+ "context-savelinktopocket",
+ "appMenu-library-pocket-button",
+ "pocket-button",
+ ]);
+
+ let newWin = await BrowserTestUtils.openNewBrowserWindow();
+ libraryButton = newWin.document.getElementById("library-button");
+ libraryButton.click();
+
+ libraryView = newWin.document.getElementById("appMenu-libraryView");
+ popupShown = BrowserTestUtils.waitForEvent(libraryView, "ViewShown");
+ await popupShown;
+
+ checkElementsShown(
+ false,
+ [
+ "context-pocket",
+ "context-savelinktopocket",
+ "appMenu-library-pocket-button",
+ "pocket-button",
+ ],
+ newWin
+ );
+
+ // Close the Library panel.
+ popupHidden = BrowserTestUtils.waitForEvent(newWin.document, "popuphidden");
+ libraryView.closest("panel").hidePopup();
+
+ await BrowserTestUtils.closeWindow(newWin);
+
+ await promisePocketReset();
+});
diff --git a/browser/components/pocket/test/head.js b/browser/components/pocket/test/head.js
new file mode 100644
index 0000000000..9d614b61b8
--- /dev/null
+++ b/browser/components/pocket/test/head.js
@@ -0,0 +1,77 @@
+// Currently Pocket is disabled in tests. We want these tests to work under
+// either case that Pocket is disabled or enabled on startup of the browser,
+// and that at the end we're reset to the correct state.
+let enabledOnStartup = false;
+
+// PocketEnabled/Disabled promises return true if it was already
+// Enabled/Disabled, and false if it need to Enable/Disable.
+function promisePocketEnabled() {
+ if (
+ Services.prefs.getPrefType("extensions.pocket.enabled") !=
+ Services.prefs.PREF_INVALID &&
+ Services.prefs.getBoolPref("extensions.pocket.enabled")
+ ) {
+ info("pocket was already enabled, assuming enabled by default for tests");
+ enabledOnStartup = true;
+ return Promise.resolve(true);
+ }
+ info("pocket is not enabled");
+ Services.prefs.setBoolPref("extensions.pocket.enabled", true);
+ return BrowserTestUtils.waitForCondition(() => {
+ return PageActions.actionForID("pocket");
+ });
+}
+
+function promisePocketDisabled() {
+ if (
+ Services.prefs.getPrefType("extensions.pocket.enabled") ==
+ Services.prefs.PREF_INVALID ||
+ !Services.prefs.getBoolPref("extensions.pocket.enabled")
+ ) {
+ info("pocket-button already disabled");
+ return Promise.resolve(true);
+ }
+ info("reset pocket enabled pref");
+ // testing/profiles/common/user.js uses user_pref to disable pocket, set
+ // back to false.
+ Services.prefs.setBoolPref("extensions.pocket.enabled", false);
+ return BrowserTestUtils.waitForCondition(() => {
+ return !PageActions.actionForID("pocket");
+ });
+}
+
+function promisePocketReset() {
+ if (enabledOnStartup) {
+ info("reset is enabling pocket addon");
+ return promisePocketEnabled();
+ }
+ info("reset is disabling pocket addon");
+ return promisePocketDisabled();
+}
+
+function checkElements(expectPresent, l, win = window) {
+ for (let id of l) {
+ let el =
+ win.document.getElementById(id) ||
+ win.gNavToolbox.palette.querySelector("#" + id);
+ is(
+ !!el && !el.hidden,
+ expectPresent,
+ "element " + id + (expectPresent ? " is" : " is not") + " present"
+ );
+ }
+}
+
+function checkElementsShown(expectPresent, l, win = window) {
+ for (let id of l) {
+ let el =
+ win.document.getElementById(id) ||
+ win.gNavToolbox.palette.querySelector("#" + id);
+ let elShown = window.getComputedStyle(el).display != "none";
+ is(
+ elShown,
+ expectPresent,
+ "element " + id + (expectPresent ? " is" : " is not") + " present"
+ );
+ }
+}
diff --git a/browser/components/pocket/test/pocket_actions_test.html b/browser/components/pocket/test/pocket_actions_test.html
new file mode 100644
index 0000000000..98aa4c60ea
--- /dev/null
+++ b/browser/components/pocket/test/pocket_actions_test.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="UTF-8">
+ <title>Pocket Test</title>
+</head>
+<body>
+<h1 id="pocket-actions-test">Pocket Actions Test</h1>
+</body>
+</html>
diff --git a/browser/components/pocket/test/test.html b/browser/components/pocket/test/test.html
new file mode 100644
index 0000000000..51207f2f97
--- /dev/null
+++ b/browser/components/pocket/test/test.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+ <title>Page Title</title>
+ <meta charset="utf-8" />
+</head>
+
+<body>
+ <a href="/">Test link</a>
+</body>
+</html>
diff --git a/browser/components/pocket/test/unit/browser.ini b/browser/components/pocket/test/unit/browser.ini
new file mode 100644
index 0000000000..9d1fd0583c
--- /dev/null
+++ b/browser/components/pocket/test/unit/browser.ini
@@ -0,0 +1,6 @@
+[DEFAULT]
+support-files =
+ head.js
+
+[browser_pocket_main.js]
+[browser_pocket_pktTelemetry.js]
diff --git a/browser/components/pocket/test/unit/browser_pocket_main.js b/browser/components/pocket/test/unit/browser_pocket_main.js
new file mode 100644
index 0000000000..c6955c09f7
--- /dev/null
+++ b/browser/components/pocket/test/unit/browser_pocket_main.js
@@ -0,0 +1,82 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+function test_runner(test) {
+ let testTask = async () => {
+ // Before each
+ pktUI.initPrefs();
+ const sandbox = sinon.createSandbox();
+ try {
+ await test({ sandbox });
+ } finally {
+ // After each
+ sandbox.restore();
+ }
+ };
+
+ // Copy the name of the test function to identify the test
+ Object.defineProperty(testTask, "name", { value: test.name });
+ add_task(testTask);
+}
+
+test_runner(async function test_main_getAndShowRecsForItem_on({ sandbox }) {
+ await SpecialPowers.pushPrefEnv({
+ set: [["extensions.pocket.onSaveRecs", true]],
+ });
+ pktUI.initPrefs();
+ const getRecsForItemStub = sandbox.stub(pktApi, "getRecsForItem");
+
+ pktUI.getAndShowRecsForItem(
+ {
+ resolved_id: "1234",
+ },
+ {
+ success() {},
+ }
+ );
+
+ Assert.ok(getRecsForItemStub.calledOnce);
+ Assert.equal(getRecsForItemStub.getCall(0).args[0], "1234");
+});
+
+test_runner(async function test_main_getAndShowRecsForItem_off({ sandbox }) {
+ await SpecialPowers.pushPrefEnv({
+ set: [["extensions.pocket.onSaveRecs", false]],
+ });
+ pktUI.initPrefs();
+ const getRecsForItemStub = sandbox.stub(pktApi, "getRecsForItem");
+
+ pktUI.getAndShowRecsForItem(
+ {
+ resolved_id: "1234",
+ },
+ {
+ success() {},
+ }
+ );
+
+ Assert.ok(getRecsForItemStub.notCalled);
+});
+
+test_runner(async function test_main_getAndShowRecsForItem_locale({ sandbox }) {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["extensions.pocket.onSaveRecs", true],
+ ["extensions.pocket.onSaveRecs.locales", "de"],
+ ],
+ });
+ pktUI.initPrefs();
+ const getRecsForItemStub = sandbox.stub(pktApi, "getRecsForItem");
+
+ pktUI.getAndShowRecsForItem(
+ {
+ resolved_id: "1234",
+ },
+ {
+ success() {},
+ }
+ );
+
+ Assert.ok(getRecsForItemStub.notCalled);
+});
diff --git a/browser/components/pocket/test/unit/browser_pocket_pktTelemetry.js b/browser/components/pocket/test/unit/browser_pocket_pktTelemetry.js
new file mode 100644
index 0000000000..5346f6c158
--- /dev/null
+++ b/browser/components/pocket/test/unit/browser_pocket_pktTelemetry.js
@@ -0,0 +1,56 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+ChromeUtils.defineModuleGetter(
+ this,
+ "pktTelemetry",
+ "chrome://pocket/content/pktTelemetry.jsm"
+);
+
+function test_runner(test) {
+ let testTask = async () => {
+ // Before each
+ const sandbox = sinon.createSandbox();
+ try {
+ await test({ sandbox });
+ } finally {
+ // After each
+ sandbox.restore();
+ }
+ };
+
+ // Copy the name of the test function to identify the test
+ Object.defineProperty(testTask, "name", { value: test.name });
+ add_task(testTask);
+}
+
+test_runner(async function test_createPingPayload({ sandbox }) {
+ const impressionId = "{7fd5a1ac-6089-4212-91a7-fcdec1d2f533}";
+ const creationDate = "18578";
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.newtabpage.activity-stream.impressionId", impressionId]],
+ });
+ sandbox.stub(pktTelemetry, "_profileCreationDate").returns(creationDate);
+ const result = pktTelemetry.createPingPayload({ test: "test" });
+
+ Assert.deepEqual(result, {
+ test: "test",
+ pocket_logged_in_status: false,
+ profile_creation_date: creationDate,
+ impression_id: impressionId,
+ });
+});
+
+test_runner(async function test_generateStructuredIngestionEndpoint({
+ sandbox,
+}) {
+ sandbox
+ .stub(pktTelemetry, "_generateUUID")
+ .returns("{7fd5a1ac-6089-4212-91a7-fcdec1d2f533}");
+ const endpoint = pktTelemetry._generateStructuredIngestionEndpoint();
+ Assert.equal(
+ endpoint,
+ "https://incoming.telemetry.mozilla.org/submit/activity-stream/pocket-button/1/7fd5a1ac-6089-4212-91a7-fcdec1d2f533"
+ );
+});
diff --git a/browser/components/pocket/test/unit/head.js b/browser/components/pocket/test/unit/head.js
new file mode 100644
index 0000000000..6fc5edb7bd
--- /dev/null
+++ b/browser/components/pocket/test/unit/head.js
@@ -0,0 +1,12 @@
+ChromeUtils.defineModuleGetter(
+ this,
+ "pktApi",
+ "chrome://pocket/content/pktApi.jsm"
+);
+XPCOMUtils.defineLazyScriptGetter(
+ this,
+ "pktUI",
+ "chrome://pocket/content/main.js"
+);
+
+const { sinon } = ChromeUtils.import("resource://testing-common/Sinon.jsm");