New: Validate Cloud Validators (#7154)

* new: validate cloud validators

* add otherKey

* Update CHANGELOG.md

* Update CloudCode.Validator.spec.js

* Update CloudCode.Validator.spec.js

* new: validate cloud validators

* add otherKey

* Update CHANGELOG.md

* Update CloudCode.Validator.spec.js

* Update CloudCode.Validator.spec.js

* Update Parse.Cloud.js

* Update CHANGELOG.md

* Change to throw error

Co-authored-by: Antonio Davi Macedo Coelho de Castro <adavimacedo@gmail.com>
This commit is contained in:
dblythy
2021-03-02 10:52:21 +11:00
committed by GitHub
parent cd78f895d5
commit 3833868709
3 changed files with 244 additions and 24 deletions

View File

@@ -92,9 +92,7 @@ describe('cloud validator', () => {
},
async () => {
await new Promise(resolve => {
setTimeout(() => {
resolve();
}, 1000);
setTimeout(resolve, 1000);
});
throw 'async error';
}
@@ -132,7 +130,7 @@ describe('cloud validator', () => {
await Parse.Cloud.run('myFunction');
});
it('require user on cloud functions', done => {
it('require user on cloud functions', async done => {
Parse.Cloud.define(
'hello1',
() => {
@@ -142,16 +140,14 @@ describe('cloud validator', () => {
requireUser: true,
}
);
Parse.Cloud.run('hello1', {})
.then(() => {
fail('function should have failed.');
})
.catch(error => {
expect(error.code).toEqual(Parse.Error.VALIDATION_ERROR);
expect(error.message).toEqual('Validation failed. Please login to continue.');
done();
});
try {
await Parse.Cloud.run('hello1', {});
fail('function should have failed.');
} catch (error) {
expect(error.code).toEqual(Parse.Error.VALIDATION_ERROR);
expect(error.message).toEqual('Validation failed. Please login to continue.');
done();
}
});
it('require master on cloud functions', done => {
@@ -605,16 +601,10 @@ describe('cloud validator', () => {
expect(obj.get('foo')).toBe('bar');
const query = new Parse.Query('beforeFind');
try {
const first = await query.first({ useMasterKey: true });
expect(first).toBeDefined();
expect(first.id).toBe(obj.id);
done();
} catch (e) {
console.log(e);
console.log(e.code);
throw e;
}
const first = await query.first({ useMasterKey: true });
expect(first).toBeDefined();
expect(first.id).toBe(obj.id);
done();
});
it('basic beforeDelete skipWithMasterKey', async function (done) {
@@ -1429,6 +1419,156 @@ describe('cloud validator', () => {
}
});
it('does not log on valid config', () => {
Parse.Cloud.define('myFunction', () => {}, {
requireUser: true,
requireMaster: true,
validateMasterKey: false,
skipWithMasterKey: true,
requireUserKeys: {
Acc: {
constant: true,
options: ['A', 'B'],
required: true,
default: 'f',
error: 'a',
type: String,
},
},
fields: {
Acc: {
constant: true,
options: ['A', 'B'],
required: true,
default: 'f',
error: 'a',
type: String,
},
},
});
});
it('Logs on invalid config', () => {
const fields = [
{
field: 'requiredUser',
value: true,
error: 'requiredUser is not a supported parameter for Cloud Function validations.',
},
{
field: 'requireUser',
value: [],
error:
'Invalid type for Cloud Function validation key requireUser. Expected boolean, actual array',
},
{
field: 'requireMaster',
value: [],
error:
'Invalid type for Cloud Function validation key requireMaster. Expected boolean, actual array',
},
{
field: 'validateMasterKey',
value: [],
error:
'Invalid type for Cloud Function validation key validateMasterKey. Expected boolean, actual array',
},
{
field: 'skipWithMasterKey',
value: [],
error:
'Invalid type for Cloud Function validation key skipWithMasterKey. Expected boolean, actual array',
},
{
field: 'requireAllUserRoles',
value: true,
error:
'Invalid type for Cloud Function validation key requireAllUserRoles. Expected array|function, actual boolean',
},
{
field: 'requireAnyUserRoles',
value: true,
error:
'Invalid type for Cloud Function validation key requireAnyUserRoles. Expected array|function, actual boolean',
},
{
field: 'fields',
value: true,
error:
'Invalid type for Cloud Function validation key fields. Expected array|object, actual boolean',
},
{
field: 'requireUserKeys',
value: true,
error:
'Invalid type for Cloud Function validation key requireUserKeys. Expected array|object, actual boolean',
},
];
for (const field of fields) {
try {
Parse.Cloud.define('myFunction', () => {}, {
[field.field]: field.value,
});
fail(`Expected error registering invalid Cloud Function validation ${field.field}.`);
} catch (e) {
expect(e).toBe(field.error);
}
}
});
it('Logs on invalid config', () => {
const fields = [
{
field: 'otherKey',
value: true,
error: 'otherKey is not a supported parameter for Cloud Function validations.',
},
{
field: 'constant',
value: [],
error:
'Invalid type for Cloud Function validation key constant. Expected boolean, actual array',
},
{
field: 'required',
value: [],
error:
'Invalid type for Cloud Function validation key required. Expected boolean, actual array',
},
{
field: 'error',
value: [],
error:
'Invalid type for Cloud Function validation key error. Expected string, actual array',
},
];
for (const field of fields) {
try {
Parse.Cloud.define('myFunction', () => {}, {
fields: {
name: {
[field.field]: field.value,
},
},
});
fail(`Expected error registering invalid Cloud Function validation ${field.field}.`);
} catch (e) {
expect(e).toBe(field.error);
}
try {
Parse.Cloud.define('myFunction', () => {}, {
requireUserKeys: {
name: {
[field.field]: field.value,
},
},
});
fail(`Expected error registering invalid Cloud Function validation ${field.field}.`);
} catch (e) {
expect(e).toBe(field.error);
}
}
});
it('set params options function async', async () => {
Parse.Cloud.define(
'hello',