Skip to content

Fix untransform null objects #121

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 1, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 67 additions & 16 deletions spec/transform.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,26 @@

var transform = require('../transform');

var dummyConfig = {
schema: {
var dummySchema = {
data: {},
getExpectedType: function(className, key) {
if (key == 'userPointer') {
return '*_User';
} else if (key == 'picture') {
return 'file';
} else if (key == 'location') {
return 'geopoint';
}
return;
}
}
};


describe('transformCreate', () => {

it('a basic number', (done) => {
var input = {five: 5};
var output = transform.transformCreate(dummyConfig, null, input);
var output = transform.transformCreate(dummySchema, null, input);
jequal(input, output);
done();
});
Expand All @@ -29,7 +31,7 @@ describe('transformCreate', () => {
createdAt: "2015-10-06T21:24:50.332Z",
updatedAt: "2015-10-06T21:24:50.332Z"
};
var output = transform.transformCreate(dummyConfig, null, input);
var output = transform.transformCreate(dummySchema, null, input);
expect(output._created_at instanceof Date).toBe(true);
expect(output._updated_at instanceof Date).toBe(true);
done();
Expand All @@ -41,29 +43,29 @@ describe('transformCreate', () => {
objectId: 'myId',
className: 'Blah',
};
var out = transform.transformCreate(dummyConfig, null, {pointers: [pointer]});
var out = transform.transformCreate(dummySchema, null, {pointers: [pointer]});
jequal([pointer], out.pointers);
done();
});

it('a delete op', (done) => {
var input = {deleteMe: {__op: 'Delete'}};
var output = transform.transformCreate(dummyConfig, null, input);
var output = transform.transformCreate(dummySchema, null, input);
jequal(output, {});
done();
});

it('basic ACL', (done) => {
var input = {ACL: {'0123': {'read': true, 'write': true}}};
var output = transform.transformCreate(dummyConfig, null, input);
var output = transform.transformCreate(dummySchema, null, input);
// This just checks that it doesn't crash, but it should check format.
done();
});
});

describe('transformWhere', () => {
it('objectId', (done) => {
var out = transform.transformWhere(dummyConfig, null, {objectId: 'foo'});
var out = transform.transformWhere(dummySchema, null, {objectId: 'foo'});
expect(out._id).toEqual('foo');
done();
});
Expand All @@ -72,7 +74,7 @@ describe('transformWhere', () => {
var input = {
objectId: {'$in': ['one', 'two', 'three']},
};
var output = transform.transformWhere(dummyConfig, null, input);
var output = transform.transformWhere(dummySchema, null, input);
jequal(input.objectId, output._id);
done();
});
Expand All @@ -81,17 +83,66 @@ describe('transformWhere', () => {
describe('untransformObject', () => {
it('built-in timestamps', (done) => {
var input = {createdAt: new Date(), updatedAt: new Date()};
var output = transform.untransformObject(dummyConfig, null, input);
var output = transform.untransformObject(dummySchema, null, input);
expect(typeof output.createdAt).toEqual('string');
expect(typeof output.updatedAt).toEqual('string');
done();
});

it('pointer', (done) => {
var input = {_p_userPointer: '_User$123'};
var output = transform.untransformObject(dummySchema, null, input);
expect(typeof output.userPointer).toEqual('object');
expect(output.userPointer).toEqual(
{__type: 'Pointer', className: '_User', objectId: '123'}
);
done();
});

it('null pointer', (done) => {
var input = {_p_userPointer: null};
var output = transform.untransformObject(dummySchema, null, input);
expect(output.userPointer).toBeUndefined();
done();
});

it('file', (done) => {
var input = {picture: 'pic.jpg'};
var output = transform.untransformObject(dummySchema, null, input);
expect(typeof output.picture).toEqual('object');
expect(output.picture).toEqual({__type: 'File', name: 'pic.jpg'});
done();
});

it('null file', (done) => {
var input = {picture: null};
var output = transform.untransformObject(dummySchema, null, input);
expect(output.picture).toBeUndefined();
done();
});

it('geopoint', (done) => {
var input = {location: [180, -180]};
var output = transform.untransformObject(dummySchema, null, input);
expect(typeof output.location).toEqual('object');
expect(output.location).toEqual(
{__type: 'GeoPoint', longitude: 180, latitude: -180}
);
done();
});

it('null geopoint', (done) => {
var input = {location: null};
var output = transform.untransformObject(dummySchema, null, input);
expect(output.location).toBeUndefined();
done();
});
});

describe('transformKey', () => {
it('throws out _password', (done) => {
try {
transform.transformKey(dummyConfig, '_User', '_password');
transform.transformKey(dummySchema, '_User', '_password');
fail('should have thrown');
} catch (e) {
done();
Expand All @@ -105,7 +156,7 @@ describe('transform schema key changes', () => {
var input = {
somePointer: {__type: 'Pointer', className: 'Micro', objectId: 'oft'}
};
var output = transform.transformCreate(dummyConfig, null, input);
var output = transform.transformCreate(dummySchema, null, input);
expect(typeof output._p_somePointer).toEqual('string');
expect(output._p_somePointer).toEqual('Micro$oft');
done();
Expand All @@ -115,7 +166,7 @@ describe('transform schema key changes', () => {
var input = {
userPointer: {__type: 'Pointer', className: '_User', objectId: 'qwerty'}
};
var output = transform.transformCreate(dummyConfig, null, input);
var output = transform.transformCreate(dummySchema, null, input);
expect(typeof output._p_userPointer).toEqual('string');
expect(output._p_userPointer).toEqual('_User$qwerty');
done();
Expand All @@ -128,7 +179,7 @@ describe('transform schema key changes', () => {
"Kevin": { "write": true }
}
};
var output = transform.transformCreate(dummyConfig, null, input);
var output = transform.transformCreate(dummySchema, null, input);
expect(typeof output._rperm).toEqual('object');
expect(typeof output._wperm).toEqual('object');
expect(output.ACL).toBeUndefined();
Expand All @@ -142,7 +193,7 @@ describe('transform schema key changes', () => {
_rperm: ["*"],
_wperm: ["Kevin"]
};
var output = transform.untransformObject(dummyConfig, null, input);
var output = transform.untransformObject(dummySchema, null, input);
expect(typeof output.ACL).toEqual('object');
expect(output._rperm).toBeUndefined();
expect(output._wperm).toBeUndefined();
Expand Down
5 changes: 5 additions & 0 deletions transform.js
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,9 @@ function untransformObject(schema, className, mongoObject) {
console.log('Found a pointer in a non-pointer column, dropping it.', className, key);
break;
}
if (mongoObject[key] === null) {
break;
}
var objData = mongoObject[key].split('$');
var newClass = (expected ? expected.substring(1) : objData[0]);
if (objData[0] !== newClass) {
Expand All @@ -689,6 +692,8 @@ function untransformObject(schema, className, mongoObject) {
break;
} else if (key[0] == '_' && key != '__type') {
throw ('bad key in untransform: ' + key);
} else if (mongoObject[key] === null) {
break;
} else {
var expected = schema.getExpectedType(className, key);
if (expected == 'file') {
Expand Down