diff options
Diffstat (limited to 'browser/components/reportbrokensite/test/browser/browser_reason_dropdown.js')
-rw-r--r-- | browser/components/reportbrokensite/test/browser/browser_reason_dropdown.js | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/browser/components/reportbrokensite/test/browser/browser_reason_dropdown.js b/browser/components/reportbrokensite/test/browser/browser_reason_dropdown.js new file mode 100644 index 0000000000..0f5545fcc4 --- /dev/null +++ b/browser/components/reportbrokensite/test/browser/browser_reason_dropdown.js @@ -0,0 +1,161 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +/* Tests to ensure that the reason dropdown is shown or hidden + * based on its pref, and that its optional and required modes affect + * the Send button and report appropriately. + */ + +"use strict"; + +add_common_setup(); + +requestLongerTimeout(2); + +async function clickSendAndCheckPing(rbs, expectedReason = null) { + const pingCheck = new Promise(resolve => { + GleanPings.brokenSiteReport.testBeforeNextSubmit(() => { + Assert.equal( + Glean.brokenSiteReport.breakageCategory.testGetValue(), + expectedReason + ); + resolve(); + }); + }); + await rbs.clickSend(); + return pingCheck; +} + +add_task(async function testReasonDropdown() { + ensureReportBrokenSitePreffedOn(); + + await BrowserTestUtils.withNewTab( + REPORTABLE_PAGE_URL, + async function (browser) { + ensureReasonDisabled(); + + let rbs = await AppMenu().openReportBrokenSite(); + await rbs.isReasonHidden(); + await rbs.isSendButtonEnabled(); + await clickSendAndCheckPing(rbs); + await rbs.clickOkay(); + + ensureReasonOptional(); + rbs = await AppMenu().openReportBrokenSite(); + await rbs.isReasonOptional(); + await rbs.isSendButtonEnabled(); + await clickSendAndCheckPing(rbs); + await rbs.clickOkay(); + + rbs = await AppMenu().openReportBrokenSite(); + await rbs.isReasonOptional(); + rbs.chooseReason("slow"); + await rbs.isSendButtonEnabled(); + await clickSendAndCheckPing(rbs, "slow"); + await rbs.clickOkay(); + + ensureReasonRequired(); + rbs = await AppMenu().openReportBrokenSite(); + await rbs.isReasonRequired(); + await rbs.isSendButtonEnabled(); + const selectPromise = BrowserTestUtils.waitForSelectPopupShown(window); + EventUtils.synthesizeMouseAtCenter(rbs.sendButton, {}, window); + await selectPromise; + rbs.chooseReason("media"); + await rbs.dismissDropdownPopup(); + await rbs.isSendButtonEnabled(); + await clickSendAndCheckPing(rbs, "media"); + await rbs.clickOkay(); + } + ); +}); + +async function getListItems(rbs) { + const items = Array.from(rbs.reasonInput.querySelectorAll("option")).map(i => + i.id.replace("report-broken-site-popup-reason-", "") + ); + Assert.equal(items[0], "choose", "First option is always 'choose'"); + return items.join(","); +} + +add_task(async function testReasonDropdownRandomized() { + ensureReportBrokenSitePreffedOn(); + ensureReasonOptional(); + + const USER_ID_PREF = "app.normandy.user_id"; + const RANDOMIZE_PREF = "ui.new-webcompat-reporter.reason-dropdown.randomized"; + + const origNormandyUserID = Services.prefs.getCharPref( + USER_ID_PREF, + undefined + ); + + await BrowserTestUtils.withNewTab( + REPORTABLE_PAGE_URL, + async function (browser) { + // confirm that the default order is initially used + Services.prefs.setBoolPref(RANDOMIZE_PREF, false); + const rbs = await AppMenu().openReportBrokenSite(); + const defaultOrder = [ + "choose", + "slow", + "media", + "content", + "account", + "adblockers", + "other", + ]; + Assert.deepEqual( + await getListItems(rbs), + defaultOrder, + "non-random order is correct" + ); + + // confirm that a random order happens per user + let randomOrder; + let isRandomized = false; + Services.prefs.setBoolPref(RANDOMIZE_PREF, true); + + // This becomes ClientEnvironment.randomizationId, which we can set to + // any value which results in a different order from the default ordering. + Services.prefs.setCharPref("app.normandy.user_id", "dummy"); + + // clicking cancel triggers a reset, which is when the randomization + // logic is called. so we must click cancel after pref-changes here. + rbs.clickCancel(); + await AppMenu().openReportBrokenSite(); + randomOrder = await getListItems(rbs); + Assert.ok( + randomOrder != defaultOrder, + "options are randomized with pref on" + ); + + // confirm that the order doesn't change per user + isRandomized = false; + for (let attempt = 0; attempt < 5; ++attempt) { + rbs.clickCancel(); + await AppMenu().openReportBrokenSite(); + const order = await getListItems(rbs); + + if (order != randomOrder) { + isRandomized = true; + break; + } + } + Assert.ok(!isRandomized, "options keep the same order per user"); + + // confirm that the order reverts to the default if pref flipped to false + Services.prefs.setBoolPref(RANDOMIZE_PREF, false); + rbs.clickCancel(); + await AppMenu().openReportBrokenSite(); + Assert.deepEqual( + defaultOrder, + await getListItems(rbs), + "reverts to non-random order correctly" + ); + rbs.clickCancel(); + } + ); + + Services.prefs.setCharPref(USER_ID_PREF, origNormandyUserID); +}); |