Skip to content

Commit d1ce93f

Browse files
committed
PDCL-6370 Add getComponent method to utils sent to rule components and data elements.
1 parent 7053709 commit d1ce93f

File tree

5 files changed

+102
-19
lines changed

5 files changed

+102
-19
lines changed

src/__tests__/createGetDataElementValue.test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,4 +260,30 @@ describe('function returned by createGetDataElementValue', () => {
260260
);
261261
});
262262
});
263+
264+
test('provides access to getComponent method when it calls the data element module ', () => {
265+
const moduleProvider = {
266+
getModuleExports:
267+
() =>
268+
({ utils: { getComponent } }) =>
269+
getComponent()
270+
};
271+
272+
const getDataElementValue = createGetDataElementValue(
273+
{
274+
settings: {},
275+
id: 'DE123',
276+
name: 'data element name'
277+
},
278+
{ moduleProvider }
279+
);
280+
281+
return getDataElementValue('testDataElement', defaultContext).then(
282+
(dataElementValue) =>
283+
expect(dataElementValue).toEqual({
284+
id: 'DE123',
285+
name: 'data element name'
286+
})
287+
);
288+
});
263289
});

src/createGetDataElementValue.js

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,29 @@ OF ANY KIND, either express or implied. See the License for the specific languag
99
governing permissions and limitations under the License.
1010
*/
1111

12-
const cleanText = require('./cleanText');
12+
const cleanTextFn = require('./cleanText');
1313

1414
const enhanceErrorMessage = (dataElementName, e) => {
1515
e.message = `Failed to execute module for data element "${dataElementName}". ${e.message}`;
1616
};
1717

1818
module.exports =
19-
(moduleProvider, getDataElementDefinition) => (name, context) => {
19+
(moduleProvider, getDataElementDefinition) => (dataElementName, context) => {
2020
const { dataElementCallStack = [], arcAndUtils } = context;
2121
const { utils } = arcAndUtils;
2222

23-
const dataDef = getDataElementDefinition(name);
23+
const dataDef = getDataElementDefinition(dataElementName);
24+
2425
if (!dataDef) {
2526
return Promise.reject(
26-
new Error(`Data element definition for "${name}" was not found.`)
27+
new Error(
28+
`Data element definition for "${dataElementName}" was not found.`
29+
)
2730
);
2831
}
2932

30-
if (dataElementCallStack.includes(name)) {
31-
dataElementCallStack.push(name);
33+
if (dataElementCallStack.includes(dataElementName)) {
34+
dataElementCallStack.push(dataElementName);
3235

3336
return Promise.reject(
3437
new Error(
@@ -38,35 +41,48 @@ module.exports =
3841
)
3942
);
4043
}
41-
dataElementCallStack.push(name);
44+
dataElementCallStack.push(dataElementName);
4245

43-
const moduleExports = moduleProvider.getModuleExports(dataDef.modulePath);
46+
const {
47+
modulePath,
48+
getSettings,
49+
id,
50+
name,
51+
defaultValue,
52+
cleanText,
53+
forceLowerCase
54+
} = dataDef;
4455

45-
const valuePromise = dataDef.getSettings(context).then((settings) => {
56+
const moduleExports = moduleProvider.getModuleExports(modulePath);
57+
const valuePromise = getSettings(context).then((settings) => {
4658
try {
4759
return moduleExports({
4860
...arcAndUtils,
49-
utils: { ...utils, getSettings: () => settings }
61+
utils: {
62+
...utils,
63+
getSettings: () => settings,
64+
getComponent: () => ({ id, name })
65+
}
5066
});
5167
} catch (e) {
52-
enhanceErrorMessage(name, e);
68+
enhanceErrorMessage(dataElementName, e);
5369
throw e;
5470
}
5571
});
5672

5773
return valuePromise.then((resolvedValue) => {
5874
let value = resolvedValue;
5975

60-
if (value == null && dataDef.defaultValue != null) {
61-
value = dataDef.defaultValue;
76+
if (value == null && defaultValue != null) {
77+
value = defaultValue;
6278
}
6379

6480
if (typeof value === 'string') {
65-
if (dataDef.cleanText) {
66-
value = cleanText(value);
81+
if (cleanText) {
82+
value = cleanTextFn(value);
6783
}
6884

69-
if (dataDef.forceLowerCase) {
85+
if (forceLowerCase) {
7086
value = value.toLowerCase();
7187
}
7288
}

src/executeRules.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,16 @@ module.exports = (
3434
const freezedInitialCallData = JSON.stringify(callData);
3535

3636
rules.forEach((rule) => {
37+
const { id, name } = rule;
38+
3739
const logger = isDebugEnabled
3840
? createNewLogger({ ruleId: rule.id })
3941
: fakeLogger;
4042

4143
const fetch = getRuleFetchFn(globalFetch, headersForSubrequests, logger);
4244

4345
const utils = {
44-
getRule: () => rule,
46+
getRule: () => ({ id, name }),
4547
getBuildInfo: () => buildInfo,
4648
logger,
4749
fetch

src/rules/__tests__/executeDelegateModule.test.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,24 @@ const executeDelegateModule = require('../executeDelegateModule');
1313

1414
describe('executeDelegateModule', () => {
1515
test('executes the delegate module and adds the module output to the context', () => {
16+
const delegateConfig = {
17+
getSettings: () => Promise.resolve(),
18+
moduleExports: () => 'result'
19+
};
20+
21+
return executeDelegateModule({
22+
arcAndUtils: { arc: { someValue: 1 }, utils: {} },
23+
delegateConfig
24+
}).then((context) => {
25+
expect(context).toStrictEqual({
26+
moduleOutput: 'result',
27+
delegateConfig,
28+
arcAndUtils: { arc: { someValue: 1 }, utils: {} }
29+
});
30+
});
31+
});
32+
33+
test('sends getSettings method when the delegate module is executed', () => {
1634
const delegateConfig = {
1735
getSettings: (context) =>
1836
Promise.resolve({
@@ -32,4 +50,24 @@ describe('executeDelegateModule', () => {
3250
});
3351
});
3452
});
53+
54+
test('sends getComponent method when the delegate module is executed', () => {
55+
const delegateConfig = {
56+
id: 'RC123',
57+
name: 'Delegate name',
58+
getSettings: () => Promise.resolve(1),
59+
moduleExports: ({ utils: { getComponent } }) => getComponent()
60+
};
61+
62+
return executeDelegateModule({
63+
arcAndUtils: {},
64+
delegateConfig
65+
}).then((context) => {
66+
expect(context).toStrictEqual({
67+
moduleOutput: { id: 'RC123', name: 'Delegate name' },
68+
delegateConfig,
69+
arcAndUtils: {}
70+
});
71+
});
72+
});
3573
});

src/rules/executeDelegateModule.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@ governing permissions and limitations under the License.
1212
module.exports = (context) => {
1313
const { arcAndUtils, delegateConfig } = context;
1414
const { utils } = arcAndUtils;
15-
const { getSettings, moduleExports } = delegateConfig;
15+
const { getSettings, moduleExports, id, name } = delegateConfig;
1616

1717
return getSettings(context)
1818
.then((settings) =>
1919
moduleExports({
2020
...arcAndUtils,
2121
utils: {
2222
...utils,
23-
getSettings: () => settings
23+
getSettings: () => settings,
24+
getComponent: () => ({ id, name })
2425
}
2526
})
2627
)

0 commit comments

Comments
 (0)