diff --git a/integration/test/ParseSchemaTest.js b/integration/test/ParseSchemaTest.js index 076e0bf7c..382aa3832 100644 --- a/integration/test/ParseSchemaTest.js +++ b/integration/test/ParseSchemaTest.js @@ -2,6 +2,28 @@ const assert = require('assert'); const clear = require('./clear'); const Parse = require('../../node'); +const emptyCLPS = { + find: {}, + count: {}, + get: {}, + create: {}, + update: {}, + delete: {}, + addField: {}, + protectedFields: {}, +}; + +const defaultCLPS = { + find: { '*': true }, + count: { '*': true }, + get: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: { '*': true }, + addField: { '*': true }, + protectedFields: { '*': [] }, +}; + describe('Schema', () => { beforeAll(() => { Parse.initialize('integration'); @@ -82,6 +104,74 @@ describe('Schema', () => { }); }); + it('save class level permissions', async () => { + const clp = { + get: { requiresAuthentication: true }, + find: {}, + count: {}, + create: { '*': true }, + update: { requiresAuthentication: true }, + delete: {}, + addField: {}, + protectedFields: {} + }; + const testSchema = new Parse.Schema('SchemaTest'); + testSchema.setCLP(clp); + const schema = await testSchema.save(); + assert.deepEqual(schema.classLevelPermissions, clp); + }); + + it('update class level permissions', async () => { + const clp = { + get: { requiresAuthentication: true }, + find: {}, + count: {}, + create: { '*': true }, + update: { requiresAuthentication: true }, + delete: {}, + addField: {}, + protectedFields: {} + }; + const testSchema = new Parse.Schema('SchemaTest'); + let schema = await testSchema.save(); + assert.deepEqual(schema.classLevelPermissions, defaultCLPS); + + testSchema.setCLP(1234); + schema = await testSchema.update(); + assert.deepEqual(schema.classLevelPermissions, emptyCLPS); + + testSchema.setCLP(clp); + schema = await testSchema.update(); + assert.deepEqual(schema.classLevelPermissions, clp); + + testSchema.setCLP({}); + schema = await testSchema.update(); + assert.deepEqual(schema.classLevelPermissions, emptyCLPS); + }); + + it('update class level permissions multiple', async () => { + const clp = { + get: { requiresAuthentication: true }, + find: {}, + count: {}, + create: { '*': true }, + update: { requiresAuthentication: true }, + delete: {}, + addField: {}, + protectedFields: {} + }; + const testSchema = new Parse.Schema('SchemaTest'); + testSchema.setCLP(clp); + let schema = await testSchema.save(); + assert.deepEqual(schema.classLevelPermissions, clp); + + schema = await testSchema.update(); + assert.deepEqual(schema.classLevelPermissions, clp); + + schema = await testSchema.update(); + assert.deepEqual(schema.classLevelPermissions, clp); + }); + it('update', (done) => { const testSchema = new Parse.Schema('SchemaTest'); testSchema.addString('name'); diff --git a/src/ParseSchema.js b/src/ParseSchema.js index 9272972ee..f1155e666 100644 --- a/src/ParseSchema.js +++ b/src/ParseSchema.js @@ -30,6 +30,7 @@ class ParseSchema { className: string; _fields: { [key: string]: mixed }; _indexes: { [key: string]: mixed }; + _clp: { [key: string]: mixed }; /** * @param {String} className Parse Class string. @@ -97,6 +98,7 @@ class ParseSchema { className: this.className, fields: this._fields, indexes: this._indexes, + classLevelPermissions: this._clp, }; return controller.create(this.className, params); @@ -116,6 +118,7 @@ class ParseSchema { className: this.className, fields: this._fields, indexes: this._indexes, + classLevelPermissions: this._clp, }; this._fields = {}; @@ -161,6 +164,18 @@ class ParseSchema { } } + /** + * Sets Class Level Permissions when creating / updating a Schema. + * EXERCISE CAUTION, running this may override CLP for this schema and cannot be reversed + * + * @param {Object} clp Class Level Permissions + * @return {Parse.Schema} Returns the schema, so you can chain this call. + */ + setCLP(clp: { [key: string]: mixed }) { + this._clp = clp; + return this; + } + /** * Adding a Field to Create / Update a Schema * diff --git a/src/__tests__/ParseSchema-test.js b/src/__tests__/ParseSchema-test.js index 1da8c216b..8f553b5f3 100644 --- a/src/__tests__/ParseSchema-test.js +++ b/src/__tests__/ParseSchema-test.js @@ -77,6 +77,28 @@ describe('ParseSchema', () => { done(); }); + it('can set schema class level permissions', (done) => { + const schema = new ParseSchema('SchemaTest'); + expect(schema._clp).toBeUndefined(); + schema.setCLP(undefined); + expect(schema._clp).toBeUndefined(); + schema.setCLP({}); + expect(schema._clp).toEqual({}); + const clp = { + get: { requiresAuthentication: true }, + find: {}, + count: {}, + create: { '*': true }, + update: { requiresAuthentication: true }, + delete: {}, + addField: {}, + protectedFields: {} + }; + schema.setCLP(clp); + expect(schema._clp).toEqual(clp); + done(); + }); + it('cannot add field with null name', (done) => { try { const schema = new ParseSchema('SchemaTest');