diff --git a/spec/Schema.spec.js b/spec/Schema.spec.js index 551d974c6e..4a9fc2aa56 100644 --- a/spec/Schema.spec.js +++ b/spec/Schema.spec.js @@ -808,4 +808,62 @@ describe('SchemaController', () => { }); done(); }); + + it('yields a proper schema mismatch error (#2661)', done => { + let anObject = new Parse.Object('AnObject'); + let anotherObject = new Parse.Object('AnotherObject'); + let someObject = new Parse.Object('SomeObject'); + Parse.Object.saveAll([anObject, anotherObject, someObject]).then(() => { + anObject.set('pointer', anotherObject); + return anObject.save(); + }).then(() => { + anObject.set('pointer', someObject); + return anObject.save(); + }).then(() => { + fail('shoud not save correctly'); + done(); + }, (err) => { + expect(err instanceof Parse.Error).toBeTruthy(); + expect(err.message).toEqual('schema mismatch for AnObject.pointer; expected Pointer but got Pointer') + done(); + }); + }); + + it('yields a proper schema mismatch error bis (#2661)', done => { + let anObject = new Parse.Object('AnObject'); + let someObject = new Parse.Object('SomeObject'); + Parse.Object.saveAll([anObject, someObject]).then(() => { + anObject.set('number', 1); + return anObject.save(); + }).then(() => { + anObject.set('number', someObject); + return anObject.save(); + }).then(() => { + fail('shoud not save correctly'); + done(); + }, (err) => { + expect(err instanceof Parse.Error).toBeTruthy(); + expect(err.message).toEqual('schema mismatch for AnObject.number; expected Number but got Pointer') + done(); + }); + }); + + it('yields a proper schema mismatch error ter (#2661)', done => { + let anObject = new Parse.Object('AnObject'); + let someObject = new Parse.Object('SomeObject'); + Parse.Object.saveAll([anObject, someObject]).then(() => { + anObject.set('pointer', someObject); + return anObject.save(); + }).then(() => { + anObject.set('pointer', 1); + return anObject.save(); + }).then(() => { + fail('shoud not save correctly'); + done(); + }, (err) => { + expect(err instanceof Parse.Error).toBeTruthy(); + expect(err.message).toEqual('schema mismatch for AnObject.pointer; expected Pointer but got Number') + done(); + }); + }); }); diff --git a/src/Controllers/SchemaController.js b/src/Controllers/SchemaController.js index 6c0c0462bb..abbafc929f 100644 --- a/src/Controllers/SchemaController.js +++ b/src/Controllers/SchemaController.js @@ -298,6 +298,13 @@ const dbTypeMatchesObjectType = (dbType, objectType) => { return false; } +const typeToString = (type) => { + if (type.targetClass) { + return `${type.type}<${type.targetClass}>`; + } + return `${type.type || type}`; +} + // Stores the entire schema of the app in a weird hybrid format somewhere between // the mongo format and the Parse format. Soon, this will all be Parse format. export default class SchemaController { @@ -591,7 +598,7 @@ export default class SchemaController { if (!dbTypeMatchesObjectType(expectedType, type)) { throw new Parse.Error( Parse.Error.INCORRECT_TYPE, - `schema mismatch for ${className}.${fieldName}; expected ${expectedType.type || expectedType} but got ${type.type}` + `schema mismatch for ${className}.${fieldName}; expected ${typeToString(expectedType)} but got ${typeToString(type)}` ); } return this;