gecko-dev/browser/components/newtab/test/xpcshell/test_PanelTestProvider.js
Barret Rennie dcd9fb02ee Bug 1775187 - Refactor out localizableText and localizedText from FxMS schemas r=nalexander,dmose
Several kinds of FxMS messages support a common pattern of taking either a
string or an object containing a string ID, allowing for both raw strings and
translated string IDs to be used in messages. This patch refactors that pattern
out into a common definition (localizedText and localizableText) in a common
schema which other schemas can then reference.

Our schema bundling script has been updated to bundle these definitions from
the common schema as top-level definitions (and subsequently rewrite the
references from FxMSCOmmon.schema.json to the generated schema) because Nimbus
and Experimenter only support a single schema file per feature.

To ensure compatability with Experimenter, all our in-tree messages have been
extracted into a test corpus that is validated with the Experimenter JSON
Schema validator. A future patch in this series will clean this up so we don't
need to have separate copies of messages in the tree.

We are now also validating all messages from the CFRMessageProvider with our
in-tree JSON Schema validator that Nimbus uses. The OnboardingMessageProvider
and PanelTestProvider tests have also been updated so that all three are using
the same testing infrastructure.

Differential Revision: https://phabricator.services.mozilla.com/D150704
2022-07-21 00:47:44 +00:00

83 lines
2.3 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
const { PanelTestProvider } = ChromeUtils.import(
"resource://activity-stream/lib/PanelTestProvider.jsm"
);
const MESSAGE_VALIDATORS = {};
let EXPERIMENT_VALIDATOR;
add_setup(async function setup() {
const validators = await makeValidators();
EXPERIMENT_VALIDATOR = validators.experimentValidator;
Object.assign(MESSAGE_VALIDATORS, validators.messageValidators);
});
add_task(async function test_PanelTestProvider() {
const messages = await PanelTestProvider.getMessages();
const EXPECTED_MESSAGE_COUNTS = {
cfr_doorhanger: 2,
milestone_message: 0,
update_action: 1,
whatsnew_panel_message: 7,
spotlight: 5,
pb_newtab: 2,
toast_notification: 1,
};
const EXPECTED_TOTAL_MESSAGE_COUNT = Object.values(
EXPECTED_MESSAGE_COUNTS
).reduce((a, b) => a + b, 0);
Assert.strictEqual(
messages.length,
EXPECTED_TOTAL_MESSAGE_COUNT,
"PanelTestProvider should have the correct number of messages"
);
const messageCounts = Object.assign(
{},
...Object.keys(EXPECTED_MESSAGE_COUNTS).map(key => ({ [key]: 0 }))
);
for (const message of messages) {
const validator = MESSAGE_VALIDATORS[message.template];
Assert.ok(
typeof validator !== "undefined",
typeof validator !== "undefined"
? `Schema validator found for ${message.template}`
: `No schema validator found for template ${message.template}. Please update this test to add one.`
);
assertValidates(
validator,
message,
`Message ${message.id} validates as ${message.template} template`
);
assertValidates(
EXPERIMENT_VALIDATOR,
message,
`Message ${message.id} validates as MessagingExperiment`
);
messageCounts[message.template]++;
}
for (const [template, count] of Object.entries(messageCounts)) {
Assert.equal(
count,
EXPECTED_MESSAGE_COUNTS[template],
`Expected ${EXPECTED_MESSAGE_COUNTS[template]} ${template} messages`
);
}
});
add_task(async function test_emptyMessage() {
info(
"Testing blank FxMS messages validate with the Messaging Experiment schema"
);
assertValidates(EXPERIMENT_VALIDATOR, {}, "Empty message should validate");
});