summaryrefslogtreecommitdiffstats
path: root/toolkit/components/nimbus/test/browser/browser_experiment_evaluate_jexl.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/nimbus/test/browser/browser_experiment_evaluate_jexl.js')
-rw-r--r--toolkit/components/nimbus/test/browser/browser_experiment_evaluate_jexl.js104
1 files changed, 104 insertions, 0 deletions
diff --git a/toolkit/components/nimbus/test/browser/browser_experiment_evaluate_jexl.js b/toolkit/components/nimbus/test/browser/browser_experiment_evaluate_jexl.js
new file mode 100644
index 0000000000..50d83330a9
--- /dev/null
+++ b/toolkit/components/nimbus/test/browser/browser_experiment_evaluate_jexl.js
@@ -0,0 +1,104 @@
+"use strict";
+
+const { EnrollmentsContext, RemoteSettingsExperimentLoader } =
+ ChromeUtils.importESModule(
+ "resource://nimbus/lib/RemoteSettingsExperimentLoader.sys.mjs"
+ );
+const { ExperimentManager } = ChromeUtils.importESModule(
+ "resource://nimbus/lib/ExperimentManager.sys.mjs"
+);
+const { ExperimentFakes } = ChromeUtils.importESModule(
+ "resource://testing-common/NimbusTestUtils.sys.mjs"
+);
+
+add_setup(async function setup() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["messaging-system.log", "all"],
+ ["app.shield.optoutstudies.enabled", true],
+ ],
+ });
+
+ registerCleanupFunction(async () => {
+ await SpecialPowers.popPrefEnv();
+ });
+
+ CONTEXT = new EnrollmentsContext(RemoteSettingsExperimentLoader.manager);
+});
+
+let CONTEXT;
+
+const FAKE_CONTEXT = {
+ experiment: ExperimentFakes.recipe("fake-test-experiment"),
+ source: "browser_experiment_evaluate_jexl",
+};
+
+add_task(async function test_throws_if_no_experiment_in_context() {
+ await Assert.rejects(
+ CONTEXT.evaluateJexl("true", {
+ customThing: 1,
+ source: "test_throws_if_no_experiment_in_context",
+ }),
+ /Expected an .experiment/,
+ "should throw if experiment is not passed to the custom context"
+ );
+});
+
+add_task(async function test_evaluate_jexl() {
+ Assert.deepEqual(
+ await CONTEXT.evaluateJexl(`["hello"]`, FAKE_CONTEXT),
+ ["hello"],
+ "should return the evaluated result of a jexl expression"
+ );
+});
+
+add_task(async function test_evaluate_custom_context() {
+ const result = await CONTEXT.evaluateJexl("experiment.slug", FAKE_CONTEXT);
+ Assert.equal(
+ result,
+ "fake-test-experiment",
+ "should have the custom .experiment context"
+ );
+});
+
+add_task(async function test_evaluate_active_experiments_isFirstStartup() {
+ const result = await CONTEXT.evaluateJexl("isFirstStartup", FAKE_CONTEXT);
+ Assert.equal(
+ typeof result,
+ "boolean",
+ "should have a .isFirstStartup property from ExperimentManager "
+ );
+});
+
+add_task(async function test_evaluate_active_experiments_activeExperiments() {
+ // Add an experiment to active experiments
+ const slug = "foo" + Math.random();
+ // Init the store before we use it
+ await ExperimentManager.onStartup();
+
+ let recipe = ExperimentFakes.recipe(slug);
+ recipe.branches[0].slug = "mochitest-active-foo";
+ delete recipe.branches[1];
+
+ let { enrollmentPromise, doExperimentCleanup } =
+ ExperimentFakes.enrollmentHelper(recipe);
+
+ await enrollmentPromise;
+
+ Assert.equal(
+ await CONTEXT.evaluateJexl(`"${slug}" in activeExperiments`, FAKE_CONTEXT),
+ true,
+ "should find an active experiment"
+ );
+
+ Assert.equal(
+ await CONTEXT.evaluateJexl(
+ `"does-not-exist-fake" in activeExperiments`,
+ FAKE_CONTEXT
+ ),
+ false,
+ "should not find an experiment that doesn't exist"
+ );
+
+ await doExperimentCleanup();
+});