diff options
Diffstat (limited to 'browser/components/pocket/test')
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"); |