summaryrefslogtreecommitdiffstats
path: root/toolkit/components/normandy/test/unit/test_Normandy.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /toolkit/components/normandy/test/unit/test_Normandy.js
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'toolkit/components/normandy/test/unit/test_Normandy.js')
-rw-r--r--toolkit/components/normandy/test/unit/test_Normandy.js92
1 files changed, 92 insertions, 0 deletions
diff --git a/toolkit/components/normandy/test/unit/test_Normandy.js b/toolkit/components/normandy/test/unit/test_Normandy.js
new file mode 100644
index 0000000000..53814734eb
--- /dev/null
+++ b/toolkit/components/normandy/test/unit/test_Normandy.js
@@ -0,0 +1,92 @@
+/* Any copyright is dedicated to the Public Domain.
+http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const { Normandy } = ChromeUtils.importESModule(
+ "resource://normandy/Normandy.sys.mjs"
+);
+const { NormandyMigrations } = ChromeUtils.importESModule(
+ "resource://normandy/NormandyMigrations.sys.mjs"
+);
+ChromeUtils.defineESModuleGetters(this, {
+ TestUtils: "resource://testing-common/TestUtils.sys.mjs",
+});
+
+/* import-globals-from utils.js */
+load("utils.js");
+
+NormandyTestUtils.init({ add_task });
+const { decorate_task } = NormandyTestUtils;
+
+// Normandy's initialization function should set the start preferences before
+// its first `await`.
+decorate_task(
+ NormandyTestUtils.withStub(Normandy, "finishInit"),
+ NormandyTestUtils.withStub(NormandyMigrations, "applyAll"),
+ NormandyTestUtils.withMockPreferences(),
+ async function test_normandy_init_applies_startup_prefs_synchronously({
+ mockPreferences,
+ }) {
+ const experimentPref = "test.experiment";
+ const rolloutPref = "test.rollout";
+ const experimentStartupPref = `app.normandy.startupExperimentPrefs.${experimentPref}`;
+ const rolloutStartupPref = `app.normandy.startupRolloutPrefs.${rolloutPref}`;
+
+ mockPreferences.preserve(experimentPref, "default");
+ mockPreferences.preserve(rolloutPref, "default");
+ mockPreferences.set(experimentStartupPref, "experiment");
+ mockPreferences.set(rolloutStartupPref, "rollout");
+
+ Assert.equal(
+ Services.prefs.getCharPref(experimentPref, "default"),
+ "default"
+ );
+ Assert.equal(Services.prefs.getCharPref(rolloutPref, "default"), "default");
+
+ let initPromise = Normandy.init({ runAsync: false });
+
+ // note: There are no awaits before these asserts, so only the part of
+ // Normandy's initialization before its first await can run.
+ Assert.equal(
+ Services.prefs.getCharPref(experimentPref, "default"),
+ "experiment"
+ );
+ Assert.equal(Services.prefs.getCharPref(rolloutPref, "default"), "rollout");
+
+ await initPromise;
+ await Normandy.uninit();
+ }
+);
+
+// Normandy's initialization function should register the observer for UI
+// startup before it's first await.
+decorate_task(
+ NormandyTestUtils.withStub(Normandy, "finishInit"),
+ NormandyTestUtils.withStub(NormandyMigrations, "applyAll"),
+ async function test_normandy_init_applies_startup_prefs_synchronously({
+ applyAllStub,
+ }) {
+ let originalDeferred = Normandy.uiAvailableNotificationObserved;
+ let mockUiAvailableDeferred = Promise.withResolvers();
+ Normandy.uiAvailableNotificationObserved = mockUiAvailableDeferred;
+
+ let applyAllDeferred = Promise.withResolvers();
+ applyAllStub.returns(applyAllStub);
+
+ let promiseResolvedCount = 0;
+ mockUiAvailableDeferred.promise.then(() => promiseResolvedCount++);
+
+ let initPromise = Normandy.init();
+
+ Assert.equal(promiseResolvedCount, 0);
+ Normandy.observe(null, "sessionstore-windows-restored");
+ await TestUtils.waitForCondition(() => promiseResolvedCount === 1);
+
+ applyAllDeferred.resolve();
+
+ await initPromise;
+ await Normandy.uninit();
+ Normandy.uiAvailableNotificationObserved = originalDeferred;
+ }
+);