Skip to content

Commit

Permalink
fix: null value not persisted for properties of type JSON, Any, or Ob…
Browse files Browse the repository at this point in the history
…ject

Signed-off-by: Siim Sams <[email protected]>
  • Loading branch information
siimsams authored and dhmlau committed Jun 20, 2023
1 parent c905f02 commit ae3cf25
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 3 deletions.
8 changes: 5 additions & 3 deletions lib/dao.js
Original file line number Diff line number Diff line change
Expand Up @@ -179,10 +179,12 @@ DataAccessObject._forDB = function(data) {
const res = {};
for (const propName in data) {
const type = this.getPropertyType(propName);
if (type === 'JSON' || type === 'Any' || type === 'Object' || data[propName] instanceof Array) {
res[propName] = JSON.stringify(data[propName]);
const value = data[propName];
if (value !== null && (type === 'JSON' || type === 'Any' ||
type === 'Object' || value instanceof Array)) {
res[propName] = JSON.stringify(value);
} else {
res[propName] = data[propName];
res[propName] = value;
}
}
return res;
Expand Down
52 changes: 52 additions & 0 deletions test/loopback-dl.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1363,6 +1363,58 @@ describe('Model define with scopes configuration', function() {
});
});

describe('DataAccessObject._forDB', function() {
const ds = new DataSource('memory');
const dao = ds.DataAccessObject;

it('should return input data if dataSource is not relational', function() {
const inputData = {testKey: 'testValue'};
dao.getDataSource = () => ({isRelational: () => false});

const outputData = dao._forDB(inputData);

assert.deepEqual(outputData, inputData);
});

it('should return JSON stringified values for appropriate types', function() {
const inputData = {
key1: [1, 2, 3],
key2: {subKey: 'value'},
key3: 'nonJSONvalue',
};
dao.getDataSource = () => ({isRelational: () => true});
dao.getPropertyType = (propName) => (propName !== 'key3' ? 'JSON' : 'String');

const outputData = dao._forDB(inputData);

assert.deepEqual(outputData, {
key1: JSON.stringify([1, 2, 3]),
key2: JSON.stringify({subKey: 'value'}),
key3: 'nonJSONvalue',
});
});

it('should return original value for non JSON, non Array types', function() {
const inputData = {key1: 'string', key2: 123, key3: true};
dao.getDataSource = () => ({isRelational: () => true});
dao.getPropertyType = () => 'String';

const outputData = dao._forDB(inputData);

assert.deepEqual(outputData, inputData);
});

it('should not process null values', function() {
const inputData = {key1: 'value', key2: null};
dao.getDataSource = () => ({isRelational: () => true});
dao.getPropertyType = (propName) => 'JSON';

const outputData = dao._forDB(inputData);

assert.deepEqual(outputData, {key1: JSON.stringify('value'), key2: null});
});
});

describe('DataAccessObject', function() {
let ds, model, where, error, filter;

Expand Down

0 comments on commit ae3cf25

Please sign in to comment.