UNPKG

7.31 kBJavaScriptView Raw
1/*
2Kettle Data Source Test Utilities
3
4Copyright 2017-2018 OCAD University
5Copyright 2012-2015 Raising the Floor - International
6
7Licensed under the New BSD license. You may not use this file except in
8compliance with this License.
9
10You may obtain a copy of the License at
11https://github.com/fluid-project/kettle/blob/master/LICENSE.txt
12*/
13
14"use strict";
15
16var fluid = require("infusion"),
17 kettle = require("../../kettle.js"),
18 jqUnit = fluid.require("node-jqunit", require, "jqUnit"),
19 fs = require("fs");
20
21kettle.loadTestingSupport();
22
23fluid.registerNamespace("kettle.tests.dataSource");
24
25// empties a directory, used by the dataSource and multer tests when testing
26// file system writes / uploads
27// directoryPath: a path statement to a directory, resolved by fluid.module.resolvePath
28
29kettle.tests.dataSource.ensureDirectoryEmpty = function (directoryPath) {
30 var directory = fluid.module.resolvePath(directoryPath);
31 kettle.test.deleteFolderRecursive(directory);
32 fs.mkdirSync(directory);
33};
34
35// distribute down a standard error handler for any nested dataSource
36
37fluid.defaults("kettle.tests.dataSource.onErrorLink", {
38 distributeOptions: {
39 onError: {
40 record: {
41 namespace: "testEnvironment",
42 func: "{testEnvironment}.events.onError.fire",
43 args: "{arguments}.0"
44 },
45 target: "{that dataSource}.options.listeners.onError"
46 }
47 }
48});
49
50
51// General DataSource test grades
52
53fluid.defaults("kettle.tests.dataSourceTestCaseHolder", {
54 gradeNames: ["fluid.test.testCaseHolder"],
55 moduleSource: {
56 funcName: "kettle.tests.simpleDSModuleSource",
57 args: "{testEnvironment}.options"
58 }
59});
60
61kettle.tests.dataSource.defaultResponseFunc = function (shouldError, data) {
62 fluid.fail(shouldError ? "Got response rather than error from dataSource: " :
63 "Error in test configuration - should have overridden response function: ", data);
64};
65
66kettle.tests.dataSource.defaultErrorFunc = function (shouldError, data) {
67 fluid.fail(shouldError ? "Error in test configuration - should have overridden error function: " :
68 "Got error rather than response from dataSource: ", data);
69};
70
71// Base grade for each individual DataSource test fixture: Top-level component holding dataSource, test environment and standard events
72fluid.defaults("kettle.tests.simpleDataSourceTest", {
73 gradeNames: ["fluid.test.testEnvironment", "kettle.tests.dataSource.onErrorLink"],
74 mergePolicy: {
75 initSequence: "noexpand"
76 },
77 shouldError: false,
78 events: {
79 onResponse: null,
80 onError: null
81 },
82 components: {
83 // cf. kettle.test.serverEnvironment which calls this "tests"
84 testCaseHolder: {
85 type: "kettle.tests.dataSourceTestCaseHolder"
86 },
87 dataSource: {
88 type: "kettle.dataSource" // uninstantiable, must be overridden
89 }
90 },
91 invokers: { // one of these should be overridden, depending on whether "shouldError" is set
92 responseFunc: {
93 funcName: "kettle.tests.dataSource.defaultResponseFunc",
94 args: ["{that}.options.shouldError", "{arguments}.0"]
95 },
96 errorFunc: {
97 funcName: "kettle.tests.dataSource.defaultErrorFunc",
98 args: ["{that}.options.shouldError", "{arguments}.0"]
99 }
100 },
101 listeners: {
102 onResponse: "{that}.responseFunc",
103 onError: "{that}.errorFunc"
104 }
105});
106
107// Utility for binding returned promise value back to test environment's firers
108kettle.tests.dataSource.invokePromiseProducer = function (producerFunc, args, testEnvironment) {
109 var promise = producerFunc.apply(null, args);
110 promise.then(function (response) {
111 testEnvironment.events.onResponse.fire(response);
112 });
113};
114
115fluid.defaults("kettle.tests.promiseDataSourceTest", {
116 gradeNames: ["fluid.component"],
117 testPromiseAPI: true,
118 invokers: {
119 invokePromiseProducer: {
120 funcName: "kettle.tests.dataSource.invokePromiseProducer",
121 args: ["{arguments}.0", "{arguments}.1", "{testEnvironment}"]
122 }
123 }
124});
125
126// Accepts options for the overall testEnvironment and produces a 2-element sequence
127// operating the test. Configured as a func moduleSource in dataSourceTestCaseHolder and accepts {testEnvironment}.options
128// TODO: This terrible mess should be resolved with FLUID-5903
129kettle.tests.simpleDSModuleSource = function (options) {
130 var dataSourceMethod = options.dataSourceMethod || "get";
131 var dataSourceArgs = [options.directModel];
132 if (dataSourceMethod === "set") {
133 dataSourceArgs.push(options.dataSourceModel);
134 }
135 if (options.testPromiseAPI) {
136 var onErrorRecord = { // test this special feature of the DataSource API which allows bypass of the standard error handler per-request
137 onError: "{testEnvironment}.events.onError.fire"
138 };
139 dataSourceArgs.push(onErrorRecord);
140 } else {
141 dataSourceArgs.push("{testEnvironment}.events.onResponse.fire");
142 }
143
144 var dataSourceFunc = "{testEnvironment}.dataSource." + dataSourceMethod;
145 var sequence = fluid.makeArray(options.initSequence);
146 if (options.testPromiseAPI) {
147 sequence.push({
148 func: "{testEnvironment}.invokePromiseProducer",
149 args: [dataSourceFunc, dataSourceArgs]
150 });
151 } else {
152 sequence.push({
153 func: dataSourceFunc,
154 args: dataSourceArgs
155 });
156 }
157
158 sequence.push({
159 event: "{testEnvironment}.events." + (options.shouldError ? "onError" : "onResponse"),
160 listener: "fluid.identity",
161 priority: "last"
162 });
163 sequence.push.apply(sequence, fluid.makeArray(options.finalSequence));
164 var modules = [{
165 name: options.name + (options.testPromiseAPI ? " - via promise API" : ""),
166 tests: [{
167 expect: 1 + (options.expect || 0),
168 name: "Simple " + dataSourceMethod + " test",
169 sequence: sequence
170 }]
171 }];
172 return modules;
173};
174
175
176kettle.tests.dataSource.testEmptyResponse = function (data) {
177 jqUnit.assertEquals("Data response should be undefined", undefined, data);
178};
179
180kettle.tests.dataSource.testResponse = function (expected, data) {
181 jqUnit.assertDeepEq("Data response should hold correct value", expected, data);
182};
183
184kettle.tests.dataSource.testErrorResponse = function (expected, data) {
185 var cloned = kettle.cloneError(data);
186 jqUnit.assertDeepEq("Error response should hold correct value", expected, cloned);
187};
188
189kettle.tests.expectJSONDiagnostic = function (error) {
190 fluid.log("Received JSON diagnostic error " + JSON.stringify(error, null, 2));
191 jqUnit.assertTrue("Got message mentioning filename ", error.message.indexOf("invalidJSONFile") !== -1);
192 jqUnit.assertTrue("Got message mentioning line number of error ", error.message.indexOf("59") !== -1);
193};
194
195kettle.tests.expectJSON5Diagnostic = function (error) {
196 fluid.log("Received JSON5 diagnostic error " + JSON.stringify(error, null, 2));
197 jqUnit.assertTrue("Got message mentioning filename ", error.message.indexOf("invalidJSON5File") !== -1);
198 jqUnit.assertTrue("Got message mentioning line number of error ", error.message.indexOf("49") !== -1);
199};