gecko-dev/toolkit/components/messaging-system/test/unit/test_ExperimentStore.js

119 lines
3.2 KiB
JavaScript

"use strict";
const { ExperimentFakes } = ChromeUtils.import(
"resource://testing-common/MSTestUtils.jsm"
);
add_task(async function test_getExperimentForGroup() {
const store = ExperimentFakes.store();
const experiment = ExperimentFakes.experiment("foo", {
branch: { slug: "variant", groups: ["green"] },
});
await store.init();
store.addExperiment(ExperimentFakes.experiment("bar"));
store.addExperiment(experiment);
Assert.equal(
store.getExperimentForGroup("green"),
experiment,
"should return a matching experiment for the given group"
);
});
add_task(async function test_hasExperimentForGroups() {
const store = ExperimentFakes.store();
await store.init();
store.addExperiment(
ExperimentFakes.experiment("foo", {
branch: { slug: "variant", groups: ["green"] },
})
);
store.addExperiment(
ExperimentFakes.experiment("foo2", {
branch: { slug: "variant", groups: ["yellow", "orange"] },
})
);
store.addExperiment(
ExperimentFakes.experiment("bar_expired", {
active: false,
branch: { slug: "variant", groups: ["purple"] },
})
);
Assert.equal(
store.hasExperimentForGroups([]),
false,
"should return false if the input is an empty array"
);
Assert.equal(
store.hasExperimentForGroups(["green", "blue"]),
true,
"should return true if there is an experiment with any of the given groups"
);
Assert.equal(
store.hasExperimentForGroups(["black", "yellow"]),
true,
"should return true if there is one of an experiment's multiple groups matches any of the given groups"
);
Assert.equal(
store.hasExperimentForGroups(["purple"]),
false,
"should return false if there is a non-active experiment with the given groups"
);
Assert.equal(
store.hasExperimentForGroups(["blue", "red"]),
false,
"should return false if none of the experiments have the given groups"
);
});
add_task(async function test_getAll_getAllActive() {
const store = ExperimentFakes.store();
await store.init();
["foo", "bar", "baz"].forEach(slug =>
store.addExperiment(ExperimentFakes.experiment(slug, { active: false }))
);
store.addExperiment(ExperimentFakes.experiment("qux", { active: true }));
Assert.deepEqual(
store.getAll().map(e => e.slug),
["foo", "bar", "baz", "qux"],
".getAll() should return all experiments"
);
Assert.deepEqual(
store.getAllActive().map(e => e.slug),
["qux"],
".getAllActive() should return all experiments that are active"
);
});
add_task(async function test_addExperiment() {
const store = ExperimentFakes.store();
const exp = ExperimentFakes.experiment("foo");
await store.init();
store.addExperiment(exp);
Assert.equal(store.get("foo"), exp, "should save experiment by slug");
});
add_task(async function test_updateExperiment() {
const experiment = Object.freeze(
ExperimentFakes.experiment("foo", { value: true, active: true })
);
const store = ExperimentFakes.store();
await store.init();
store.addExperiment(experiment);
store.updateExperiment("foo", { active: false });
const actual = store.get("foo");
Assert.equal(actual.active, false, "should change updated props");
Assert.equal(actual.value, true, "should not update other props");
});