diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000..a15ba0c2fa Binary files /dev/null and b/.DS_Store differ diff --git a/spec/ParseObject.spec.js b/spec/ParseObject.spec.js index 5d8996559b..21920ae68f 100644 --- a/spec/ParseObject.spec.js +++ b/spec/ParseObject.spec.js @@ -336,6 +336,34 @@ describe('Parse.Object testing', () => { item.save({ "foo^bar": "baz" }).then(fail, done); }); + it("invalid __type", function(done) { + var item = new Parse.Object("Item"); + var types = ['Pointer', 'File', 'Date', 'GeoPoint', 'Bytes']; + var Error = Parse.Error; + var tests = types.map(type => { + var test = new Parse.Object("Item"); + test.set('foo', { + __type: type + }); + return test; + }); + var next = function(index) { + if (index < tests.length) { + tests[index].save().then(fail, error => { + expect(error.code).toEqual(Parse.Error.INCORRECT_TYPE); + next(index + 1); + }); + } else { + done(); + } + } + item.save({ + "foo": { + __type: "IvalidName" + } + }).then(fail, err => next(0)); + }); + it("simple field deletion", function(done) { var simple = new Parse.Object("SimpleObject"); simple.save({ diff --git a/src/Schema.js b/src/Schema.js index 63dc6f376e..612e68e216 100644 --- a/src/Schema.js +++ b/src/Schema.js @@ -626,7 +626,7 @@ Schema.prototype.validateRequiredColumns = function(className, object, query) { if (!columns || columns.length == 0) { return Promise.resolve(this); } - + var missingColumns = columns.filter(function(column){ if (query && query.objectId) { if (object[column] && typeof object[column] === "object") { @@ -636,15 +636,15 @@ Schema.prototype.validateRequiredColumns = function(className, object, query) { // Not trying to do anything there return false; } - return !object[column] + return !object[column] }); - + if (missingColumns.length > 0) { throw new Parse.Error( Parse.Error.INCORRECT_TYPE, missingColumns[0]+' is required.'); } - + return Promise.resolve(this); } @@ -731,19 +731,44 @@ function getObjectType(obj) { if (obj instanceof Array) { return 'array'; } - if (obj.__type === 'Pointer' && obj.className) { - return '*' + obj.className; - } - if (obj.__type === 'File' && obj.name) { - return 'file'; - } - if (obj.__type === 'Date' && obj.iso) { - return 'date'; - } - if (obj.__type == 'GeoPoint' && - obj.latitude != null && - obj.longitude != null) { - return 'geopoint'; + if (obj.__type){ + switch(obj.__type) { + case 'Pointer' : + if(obj.className) { + return '*' + obj.className; + } else { + throw new Parse.Error(Parse.Error.INCORRECT_TYPE, "This is not a valid "+obj.__type); + } + break; + case 'File' : + if(obj.name) { + return 'file'; + } else { + throw new Parse.Error(Parse.Error.INCORRECT_TYPE, "This is not a valid "+obj.__type); + } + break; + case 'Date' : + if(obj.iso) { + return 'date'; + } else { + throw new Parse.Error(Parse.Error.INCORRECT_TYPE, "This is not a valid "+obj.__type); + } + break; + case 'GeoPoint' : + if(obj.latitude != null && obj.longitude != null) { + return 'geopoint'; + } else { + throw new Parse.Error(Parse.Error.INCORRECT_TYPE, "This is not a valid "+obj.__type); + } + break; + case 'Bytes' : + if(!obj.base64) { + throw new Parse.Error(Parse.Error.INCORRECT_TYPE, "This is not a valid "+obj.__type); + } + break; + default : + throw new Parse.Error(Parse.Error.INCORRECT_TYPE, 'invalid type: ' + obj.__type); + } } if (obj['$ne']) { return getObjectType(obj['$ne']);