Skip to content

Commit 0542f86

Browse files
committed
Test case to ensure dashboard.parse.com won't break (#1636)
* Test case to ensure dashboard.parse.com won't break * Adds volatile classes concept for _PushStatus * Fixes test
1 parent 957b592 commit 0542f86

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed

spec/helper.js

+23-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ var facebook = require('../src/authDataManager/facebook');
99
var ParseServer = require('../src/index').ParseServer;
1010
var path = require('path');
1111
var TestUtils = require('../src/index').TestUtils;
12+
var MongoStorageAdapter = require('../src/Adapters/Storage/Mongo/MongoStorageAdapter');
1213

1314
var databaseURI = process.env.DATABASE_URI;
1415
var cloudMain = process.env.CLOUD_CODE_MAIN || './spec/cloud/main.js';
@@ -87,8 +88,29 @@ beforeEach(function(done) {
8788
return TestUtils.destroyAllDataPermanently().then(done, fail);
8889
});
8990

91+
var mongoAdapter = new MongoStorageAdapter({
92+
collectionPrefix: defaultConfiguration.collectionPrefix,
93+
uri: databaseURI,
94+
})
95+
9096
afterEach(function(done) {
91-
Parse.User.logOut().then(() => {
97+
mongoAdapter.getAllSchemas()
98+
.then(allSchemas => {
99+
allSchemas.forEach((schema) => {
100+
var className = schema.className;
101+
expect(className).toEqual({ asymmetricMatch: className => {
102+
if (!className.startsWith('_')) {
103+
return true;
104+
} else {
105+
// Other system classes will break Parse.com, so make sure that we don't save anything to _SCHEMA that will
106+
// break it.
107+
return ['_User', '_Installation', '_Role', '_Session', '_Product'].includes(className);
108+
}
109+
}});
110+
});
111+
})
112+
.then(() => Parse.User.logOut())
113+
.then(() => {
92114
return TestUtils.destroyAllDataPermanently();
93115
}).then(() => {
94116
done();

src/Controllers/DatabaseController.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ DatabaseController.prototype.create = function(className, object, { acl } = {})
345345
return (isMaster ? Promise.resolve() : schemaController.validatePermission(className, aclGroup, 'create'))
346346
.then(() => this.handleRelationUpdates(className, null, object))
347347
.then(() => schemaController.enforceClassExists(className))
348-
.then(() => schemaController.getOneSchema(className))
348+
.then(() => schemaController.getOneSchema(className, true))
349349
.then(schema => this.adapter.createObject(className, object, schemaController, schema))
350350
.then(result => sanitizeDatabaseResult(originalObject, result.ops[0]));
351351
})

src/Controllers/SchemaController.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ const requiredColumns = Object.freeze({
9393

9494
const systemClasses = Object.freeze(['_User', '_Installation', '_Role', '_Session', '_Product', '_PushStatus']);
9595

96+
const volatileClasses = Object.freeze(['_PushStatus']);
97+
9698
// 10 alpha numberic chars + uppercase
9799
const userIdRegex = /^[a-zA-Z0-9]{10}$/;
98100
// Anything that start with role
@@ -251,6 +253,15 @@ class SchemaController {
251253
this.data[schema.className] = schema.fields;
252254
this.perms[schema.className] = schema.classLevelPermissions;
253255
});
256+
257+
// Inject the in-memory classes
258+
volatileClasses.forEach(className => {
259+
this.data[className] = injectDefaultSchema({
260+
className,
261+
fields: {},
262+
classLevelPermissions: {}
263+
});
264+
});
254265
});
255266
}
256267

@@ -259,7 +270,10 @@ class SchemaController {
259270
.then(allSchemas => allSchemas.map(injectDefaultSchema));
260271
}
261272

262-
getOneSchema(className) {
273+
getOneSchema(className, allowVolatileClasses = false) {
274+
if (allowVolatileClasses && volatileClasses.indexOf(className) > -1) {
275+
return Promise.resolve(this.data[className]);
276+
}
263277
return this._dbAdapter.getOneSchema(className)
264278
.then(injectDefaultSchema);
265279
}

0 commit comments

Comments
 (0)