diff --git a/spec/Schema.spec.js b/spec/Schema.spec.js index 636311a6..d6310ec8 100644 --- a/spec/Schema.spec.js +++ b/spec/Schema.spec.js @@ -1,4 +1,3 @@ -// These tests check that the Schema operates correctly. var Config = require('../src/Config'); var Schema = require('../src/Schema'); var dd = require('deep-diff'); @@ -406,4 +405,60 @@ describe('Schema', () => { done(); }); }); + + it('can check if a class exists', done => { + config.database.loadSchema() + .then(schema => { + return schema.addClassIfNotExists('NewClass', {}) + .then(() => { + console.log(Object.getPrototypeOf(schema)); + schema.hasClass('NewClass') + .then(hasClass => { + expect(hasClass).toEqual(true); + done(); + }) + .catch(fail); + + schema.hasClass('NonexistantClass') + .then(hasClass => { + expect(hasClass).toEqual(false); + done(); + }) + .catch(fail); + }) + .catch(error => { + fail('Couldn\'t create class'); + fail(error); + }); + }) + .catch(error => fail('Couldn\'t load schema')); + }); + + it('refuses to delete fields from invalid class names', done => { + config.database.loadSchema() + .then(schema => schema.deleteField('fieldName', 'invalid class name')) + .catch(error => { + expect(error.code).toEqual(Parse.Error.INVALID_CLASS_NAME); + done(); + }); + }); + + it('refuses to delete invalid fields', done => { + config.database.loadSchema() + .then(schema => schema.deleteField('invalid field name', 'ValidClassName')) + .catch(error => { + expect(error.code).toEqual(Parse.Error.INVALID_KEY_NAME); + done(); + }); + }); + + it('refuses to delete the default fields', done => { + config.database.loadSchema() + .then(schema => schema.deleteField('installationId', '_Installation')) + .catch(error => { + expect(error.code).toEqual(136); + expect(error.error).toEqual('field installationId cannot be changed'); + done(); + }); + }); }); diff --git a/src/Schema.js b/src/Schema.js index 3656507a..9477bd39 100644 --- a/src/Schema.js +++ b/src/Schema.js @@ -409,6 +409,38 @@ Schema.prototype.validateField = function(className, key, type, freeze) { }); }; +// Delete a field, and remove that data from all objects. This is intended +// to remove unused fields, if other writers are writing objects that include +// this field, the field may reappear. Returns a Promise that resolves with +// no object on success, or rejects with { code, error } on failure. +Schema.prototype.deleteField = function(fieldName, className) { + if (!classNameIsValid(className)) { + return Promise.reject({ + code: Parse.Error.INVALID_CLASS_NAME, + error: invalidClassNameMessage(className), + }); + } + + if (!fieldNameIsValid(fieldName)) { + return Promise.reject({ + code: Parse.Error.INVALID_KEY_NAME, + error: 'invalid field name: ' + fieldName, + }); + } + + //Don't allow deleting the default fields. + if (!fieldNameIsValidForClass(fieldName, className)) { + return Promise.reject({ + code: 136, + error: 'field ' + fieldName + ' cannot be changed', + }); + } + + return this.reload() + .then(schema => { + }); +} + // Given a schema promise, construct another schema promise that // validates this field once the schema loads. function thenValidateField(schemaPromise, className, key, type) {