Skip to content

Commit

Permalink
Added support for data elements to reference other data elements.
Browse files Browse the repository at this point in the history
  • Loading branch information
Aaronius committed Mar 17, 2018
1 parent 23a8f58 commit c5fbf32
Show file tree
Hide file tree
Showing 6 changed files with 204 additions and 37 deletions.
169 changes: 136 additions & 33 deletions src/__tests__/createGetDataElementValue.test.js
Expand Up @@ -16,14 +16,18 @@ var injectCreateGetDataElementValue = require('inject-loader!../createGetDataEle

describe('function returned by createGetDataElementValue', function() {
var logger;
var replaceTokens;
var getInjectedCreateGetDataElementValue = function(mocks) {
mocks = mocks || {};
mocks['./logger'] = logger;
return injectCreateGetDataElementValue(mocks);
};

beforeEach(function() {
logger = jasmine.createSpyObj('logger', ['log', 'error']);;
logger = jasmine.createSpyObj('logger', ['log', 'error']);
replaceTokens = function(settings) {
return settings;
};
});

it('returns a data element value using data element settings', function() {
Expand All @@ -43,8 +47,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue =
createGetDataElementValue(moduleProvider, getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBe('bar');
Expand Down Expand Up @@ -73,8 +81,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue =
createGetDataElementValue(moduleProvider, getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
getDataElementValue('testDataElement');

expect(dataElementSafe.setValue).toHaveBeenCalledWith('testDataElement', 'visitor', 'bar');
Expand All @@ -100,8 +112,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue =
createGetDataElementValue(moduleProvider, getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBe('cleaned:bar');
Expand All @@ -126,8 +142,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue =
createGetDataElementValue(moduleProvider, getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBe('cleaned:bar');
Expand All @@ -151,8 +171,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = true;
var getDataElementValue =
createGetDataElementValue(moduleProvider, getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBe('');
Expand All @@ -164,8 +188,12 @@ describe('function returned by createGetDataElementValue', function() {
var moduleProvider = {};
var getDataElementDefinition = function() {};
var undefinedVarsReturnEmpty = false;
var getDataElementValue =
createGetDataElementValue(moduleProvider, getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBe(null);
Expand All @@ -192,8 +220,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue =
createGetDataElementValue(moduleProvider, getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBe('cachedValue');
Expand Down Expand Up @@ -222,8 +254,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue = createGetDataElementValue(moduleProvider,
getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBe('cachedValue');
Expand All @@ -245,8 +281,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue = createGetDataElementValue(moduleProvider,
getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBe('defaultValue');
Expand All @@ -268,8 +308,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue = createGetDataElementValue(moduleProvider,
getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBe('');
Expand All @@ -293,8 +337,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue = createGetDataElementValue(moduleProvider,
getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toEqual(dataElementValue);
Expand All @@ -319,8 +367,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue = createGetDataElementValue(moduleProvider,
getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBe('bar');
Expand All @@ -343,13 +395,52 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue = createGetDataElementValue(moduleProvider,
getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBe('bar');
});

it('replaces tokens in settings object', function() {
var createGetDataElementValue = getInjectedCreateGetDataElementValue();
var moduleProvider = {
getModuleExports: function() {
return function(settings) {
return settings.foo;
};
}
};
var getDataElementDefinition = function() {
return {
settings: {
foo: '%bar%'
}
};
};

var replaceTokens = function() {
return {
foo: 'valueOfBar'
};
};

var undefinedVarsReturnEmpty = false;
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBe('valueOfBar');
});

describe('error handling', function() {
it('logs an error when retrieving data element module exports fails', function() {
var createGetDataElementValue = getInjectedCreateGetDataElementValue();
Expand All @@ -365,8 +456,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue = createGetDataElementValue(moduleProvider,
getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBeUndefined();
Expand All @@ -392,8 +487,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue = createGetDataElementValue(moduleProvider,
getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBeUndefined();
Expand All @@ -417,8 +516,12 @@ describe('function returned by createGetDataElementValue', function() {
};
};
var undefinedVarsReturnEmpty = false;
var getDataElementValue = createGetDataElementValue(moduleProvider,
getDataElementDefinition, undefinedVarsReturnEmpty);
var getDataElementValue = createGetDataElementValue(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
);
var value = getDataElementValue('testDataElement');

expect(value).toBeUndefined();
Expand Down
33 changes: 32 additions & 1 deletion src/__tests__/createReplaceTokens.test.js
Expand Up @@ -11,17 +11,23 @@
****************************************************************************************/

'use strict';
var createReplaceTokens = require('../createReplaceTokens');
var injectCreateReplaceTokens = require('inject-loader!../createReplaceTokens');

describe('function returned by replaceTokens', function() {
var isVar;
var getVar;
var undefinedVarsReturnEmpty;
var logger;
var createReplaceTokens;

beforeEach(function() {
logger = jasmine.createSpyObj('logger', ['error']);
isVar = function() { return true; };
getVar = function() { return null; };
undefinedVarsReturnEmpty = false;
createReplaceTokens = injectCreateReplaceTokens({
'./logger': logger
});
});

it('replaces nested tokens', function() {
Expand Down Expand Up @@ -101,4 +107,29 @@ describe('function returned by replaceTokens', function() {
var fn = function() {};
expect(replaceTokens(fn)).toBe(fn);
});

it('handles recursive data element references', function() {
var replaceTokens;

var de1Settings = {
foo: '%de2%'
};

var de2Settings = {
foo: '%de1%'
};

getVar = function(variableName) {
var result = replaceTokens(variableName === 'de1' ? de1Settings : de2Settings);
return result.foo;
};

replaceTokens = createReplaceTokens(isVar, getVar, undefinedVarsReturnEmpty);

expect(replaceTokens(de1Settings)).toEqual({
foo: '%de1%'
});
expect(logger.error).toHaveBeenCalledWith('Data element circular reference detected: ' +
'de2 -> de1 -> de2 -> de1 -> de2 -> de1 -> de2 -> de1 -> de2 -> de1 -> de2');
});
});
1 change: 1 addition & 0 deletions src/__tests__/index.test.js
Expand Up @@ -96,6 +96,7 @@ describe('index', function() {
expect(createGetDataElementValue).toHaveBeenCalledWith(
moduleProvider,
jasmine.any(Function),
jasmine.any(Function),
true
);
});
Expand Down
3 changes: 2 additions & 1 deletion src/createGetDataElementValue.js
Expand Up @@ -26,6 +26,7 @@ var isDataElementValuePresent = function(value) {
module.exports = function(
moduleProvider,
getDataElementDefinition,
replaceTokens,
undefinedVarsReturnEmpty
) {
return function(name) {
Expand Down Expand Up @@ -53,7 +54,7 @@ module.exports = function(
var value;

try {
value = moduleExports(dataDef.settings);
value = moduleExports(replaceTokens(dataDef.settings));
} catch (e) {
logger.error(getErrorMessage(dataDef, name, e.message, e.stack));
return;
Expand Down

0 comments on commit c5fbf32

Please sign in to comment.