From e8e7f4ba6b3b25e75ca85871a8ad5d65e020c681 Mon Sep 17 00:00:00 2001 From: Jordan Date: Mon, 1 Feb 2016 00:40:01 -0800 Subject: [PATCH] fix untransform null objects --- spec/transform.spec.js | 83 ++++++++++++++++++++++++++++++++++-------- transform.js | 5 +++ 2 files changed, 72 insertions(+), 16 deletions(-) diff --git a/spec/transform.spec.js b/spec/transform.spec.js index 559d787b50..b404eec0bd 100644 --- a/spec/transform.spec.js +++ b/spec/transform.spec.js @@ -2,16 +2,18 @@ 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; } - } }; @@ -19,7 +21,7 @@ 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(); }); @@ -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(); @@ -41,21 +43,21 @@ 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(); }); @@ -63,7 +65,7 @@ describe('transformCreate', () => { 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(); }); @@ -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(); }); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); diff --git a/transform.js b/transform.js index 7e19ba7035..f7da102085 100644 --- a/transform.js +++ b/transform.js @@ -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) { @@ -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') {