gpii-universal
Version:
Cross platform, core components of the GPII personalization infrastructure.
349 lines (333 loc) • 13.1 kB
JavaScript
/* eslint-env node */
"use strict";
var fluid = require("infusion");
var gpii = fluid.registerNamespace("gpii");
var jqUnit = require("node-jqunit");
// Add the ability to require JSON5 files.
require("json5/lib/register");
// Require universal so that we can resolve paths to it and any sub-modules.
fluid.require("%gpii-universal");
// We reuse the fairly lightweight caseholder from gpii-json-schema to avoid having to perform our own mixing of
// sequenceGrades into each test sequence.
fluid.require("%gpii-json-schema/tests/js/node/lib/fixtures.js");
fluid.loadTestingSupport();
fluid.registerNamespace("gpii.tests.universal.solutionsRegistry.kettle.caseHolder");
gpii.tests.universal.solutionsRegistry.kettle.caseHolder.examineResponse = function (body, shouldBeValid) {
if (shouldBeValid) {
jqUnit.assertEquals("The response body should be correct.", "Payload accepted.", body.message);
}
else {
jqUnit.assertEquals("The data should be flagged as invalid.", body.isValid, false);
jqUnit.assertTrue("There should be at least one validation error", body.errors && body.errors.length > 0);
}
};
fluid.defaults("gpii.tests.universal.solutionsRegistry.kettle.caseHolder", {
gradeNames: ["gpii.test.schema.caseHolder"],
validPayloadPath: "%gpii-universal/testData/preferences/jaws.json5",
inputs: {
validSettings: "@expand:fluid.require({that}.options.validPayloadPath)",
shallowlyInvalidSettings: {},
deeplyInvalidSettings: {
"flat": {
"name": "JAWS",
"contexts": {
"gpii-default": {
"name": "Default preferences",
"preferences": {
"http://registry.gpii.net/applications/com.freedomscientific.jaws": {
"Braille.AttributeRotationDelay": "nonsense"
}
}
}
}
}
},
validPrefs: {
"contexts": {
"gpii-default": {
"name": "Default preferences",
"preferences": {
"http://registry.gpii.net/applications/com.freedomscientific.jaws": {
"Braille.AttributeRotationDelay": 450
}
}
}
}
},
shallowlyInvalidPrefs: {},
deeplyInvalidPrefs: {
"contexts": {
"gpii-default": {
"name": "Default preferences",
"preferences": {
"http://registry.gpii.net/applications/com.freedomscientific.jaws": {
"Braille.AttributeRotationDelay": "nonsense"
}
}
}
}
},
// Test "intra-application" transforms, see https://issues.gpii.net/browse/GPII-4323
intraApplicationPrefs: {
"contexts": {
"gpii-default": {
"name": "Default preferences",
"preferences": {
"http://registry.gpii.net/applications/com.microsoft.windows.desktopBackground": {
"Image": "%SystemRoot%\\Web\\Wallpaper\\Windows\\img0.jpg"
}
}
}
}
}
},
rawModules: [{
name: "Filtered settings middleware tests.",
tests: [
{
name: "Testing a valid settings payload.",
type: "test",
sequence: [
{
func: "{validSettingsRequest}.send",
args: ["{that}.options.inputs.validSettings"]
},
{
listener: "gpii.tests.universal.solutionsRegistry.kettle.caseHolder.examineResponse",
event: "{validSettingsRequest}.events.onComplete",
args: ["@expand:JSON.parse({arguments}.0)", true]
}
]
},
{
name: "Testing a shallowly invalid settings payload.",
type: "test",
sequence: [
{
func: "{shallowlyInvalidSettingsRequest}.send",
args: ["{that}.options.inputs.shallowlyInvalidSettings "]
},
{
listener: "gpii.tests.universal.solutionsRegistry.kettle.caseHolder.examineResponse",
event: "{shallowlyInvalidSettingsRequest}.events.onComplete",
args: ["@expand:JSON.parse({arguments}.0)", false]
}
]
},
{
name: "Testing a deeply invalid settings payload.",
type: "test",
sequence: [
{
func: "{deeplyInvalidSettingsRequest}.send",
args: ["{that}.options.inputs.deeplyInvalidSettings "]
},
{
listener: "gpii.tests.universal.solutionsRegistry.kettle.caseHolder.examineResponse",
event: "{deeplyInvalidSettingsRequest}.events.onComplete",
args: ["@expand:JSON.parse({arguments}.0)", false]
}
]
},
{
name: "Testing a valid preferences payload.",
type: "test",
sequence: [
{
func: "{validPrefsRequest}.send",
args: ["{that}.options.inputs.validPrefs"]
},
{
listener: "gpii.tests.universal.solutionsRegistry.kettle.caseHolder.examineResponse",
event: "{validPrefsRequest}.events.onComplete",
args: ["@expand:JSON.parse({arguments}.0)", true]
}
]
},
{
name: "Testing a shallowly invalid preferences payload.",
type: "test",
sequence: [
{
func: "{shallowlyInvalidPrefsRequest}.send",
args: ["{that}.options.inputs.shallowlyInvalidPrefs"]
},
{
listener: "gpii.tests.universal.solutionsRegistry.kettle.caseHolder.examineResponse",
event: "{shallowlyInvalidPrefsRequest}.events.onComplete",
args: ["@expand:JSON.parse({arguments}.0)", false]
}
]
},
{
name: "Testing a deeply invalid preferences payload.",
type: "test",
sequence: [
{
func: "{deeplyInvalidPrefsRequest}.send",
args: ["{that}.options.inputs.deeplyInvalidPrefs"]
},
{
listener: "gpii.tests.universal.solutionsRegistry.kettle.caseHolder.examineResponse",
event: "{deeplyInvalidPrefsRequest}.events.onComplete",
args: ["@expand:JSON.parse({arguments}.0)", false]
}
]
},
{
name: "Testing support for transforming preferences.",
type: "test",
sequence: [
{
func: "{intraApplicationPrefsRequest}.send",
args: ["{that}.options.inputs.intraApplicationPrefs"]
},
{
listener: "gpii.tests.universal.solutionsRegistry.kettle.caseHolder.examineResponse",
event: "{intraApplicationPrefsRequest}.events.onComplete",
args: ["@expand:JSON.parse({arguments}.0)", true]
}
]
}
]
}],
components: {
validPrefsRequest: {
type: "gpii.tests.universal.solutionsRegistry.request",
options: {
method: "POST",
path: "/gatedPreferences"
}
},
shallowlyInvalidPrefsRequest: {
type: "gpii.tests.universal.solutionsRegistry.request",
options: {
method: "POST",
path: "/gatedPreferences"
}
},
deeplyInvalidPrefsRequest: {
type: "gpii.tests.universal.solutionsRegistry.request",
options: {
method: "POST",
path: "/gatedPreferences"
}
},
validSettingsRequest: {
type: "gpii.tests.universal.solutionsRegistry.request",
options: {
method: "POST",
path: "/gatedSettings"
}
},
deeplyInvalidSettingsRequest: {
type: "gpii.tests.universal.solutionsRegistry.request",
options: {
method: "POST",
path: "/gatedSettings"
}
},
shallowlyInvalidSettingsRequest: {
type: "gpii.tests.universal.solutionsRegistry.request",
options: {
method: "POST",
path: "/gatedSettings"
}
},
intraApplicationPrefsRequest: {
type: "gpii.tests.universal.solutionsRegistry.request",
options: {
method: "POST",
path: "/gatedPreferences"
}
}
}
});
// A wrapper for `kettle.request.http` designed for use with the `testEnvironment` below.
fluid.defaults("gpii.tests.universal.solutionsRegistry.request", {
gradeNames: ["kettle.test.request.http"],
port: "{testEnvironment}.options.port",
path: {
expander: {
funcName: "fluid.stringTemplate",
args: ["http://localhost:%port/%endpoint", { port: "{testEnvironment}.options.port", endpoint: "{that}.options.endpoint"}]
}
}
});
// A mix-in grade to ensure a "success" response is sent if the payload is valid.
fluid.defaults("gpii.tests.universal.solutionsRegistry.handlers.base", {
gradeNames: ["fluid.component"],
invokers: {
handleRequest: {
func: "{that}.events.onSuccess.fire",
args: [{ message: "Payload accepted." }]
}
}
});
// handler with settings validation.
fluid.defaults("gpii.tests.universal.solutionsRegistry.handlers.settings", {
gradeNames: ["gpii.universal.solutionsRegistry.requestHandlers.settings", "gpii.tests.universal.solutionsRegistry.handlers.base"]
});
// handler with settings validation.
fluid.defaults("gpii.tests.universal.solutionsRegistry.handlers.preferences", {
gradeNames: ["gpii.universal.solutionsRegistry.requestHandlers.preferences", "gpii.tests.universal.solutionsRegistry.handlers.base"]
});
fluid.defaults("gpii.tests.universal.solutionsRegistry.kettle.app", {
gradeNames: ["kettle.app"],
components: {
preferencesValidator: {
type: "gpii.universal.solutionsRegistry.validators.preferences"
},
settingsValidator: {
type: "gpii.universal.solutionsRegistry.validators.settings"
}
},
requestHandlers: {
gatedPreferences: {
type: "gpii.tests.universal.solutionsRegistry.handlers.preferences",
route: "/gatedPreferences",
method: "post"
},
gatedSettings: {
type: "gpii.tests.universal.solutionsRegistry.handlers.settings",
route: "/gatedSettings",
method: "post"
}
}
});
fluid.defaults("gpii.tests.universal.solutionsRegistry.testEnvironment", {
gradeNames: ["fluid.test.testEnvironment"],
port: 7734,
events: {
constructFixtures: null,
onKettleReady: null,
onFixturesConstructed: {
events: {
onKettleReady: "onKettleReady"
}
}
},
components: {
kettle: {
createOnEvent: "constructFixtures",
type: "kettle.server",
options: {
port: "{testEnvironment}.options.port",
listeners: {
"onListen.notifyEnvironment": {
func: "{testEnvironment}.events.onKettleReady.fire"
}
},
components: {
app: {
type: "gpii.tests.universal.solutionsRegistry.kettle.app"
}
}
}
},
caseHolder: {
type: "gpii.tests.universal.solutionsRegistry.kettle.caseHolder"
}
}
});
fluid.test.runTests("gpii.tests.universal.solutionsRegistry.testEnvironment");