From db996bf74d9778b62bbb8c835637de7ce52a5666 Mon Sep 17 00:00:00 2001 From: Florent Vilmart <364568+flovilmart@users.noreply.github.com> Date: Fri, 29 Jun 2018 10:30:13 -0400 Subject: [PATCH 1/2] improves test performance on mongodb --- spec/HTTPRequest.spec.js | 54 +++++++++++-------- spec/MongoStorageAdapter.spec.js | 2 +- spec/ParseHooks.spec.js | 16 ++++-- spec/ParseServer.spec.js | 17 ++++-- spec/PostgresStorageAdapter.spec.js | 2 +- spec/helper.js | 28 +++++++--- .../Storage/Mongo/MongoStorageAdapter.js | 5 ++ .../Postgres/PostgresStorageAdapter.js | 4 ++ src/Adapters/Storage/StorageAdapter.js | 1 + src/Controllers/DatabaseController.js | 2 +- 10 files changed, 90 insertions(+), 41 deletions(-) diff --git a/spec/HTTPRequest.spec.js b/spec/HTTPRequest.spec.js index 5ea67f2619..e867b9e993 100644 --- a/spec/HTTPRequest.spec.js +++ b/spec/HTTPRequest.spec.js @@ -8,35 +8,45 @@ const httpRequest = require("../src/cloud-code/httpRequest"), const port = 13371; const httpRequestServer = "http://localhost:" + port; -const app = express(); -app.use(bodyParser.json({ 'type': '*/*' })); -app.get("/hello", function(req, res){ - res.json({response: "OK"}); -}); - -app.get("/404", function(req, res){ - res.status(404); - res.send("NO"); -}); +function startServer(done) { + const app = express(); + app.use(bodyParser.json({ 'type': '*/*' })); + app.get("/hello", function(req, res){ + res.json({response: "OK"}); + }); -app.get("/301", function(req, res){ - res.status(301); - res.location("/hello"); - res.send(); -}); + app.get("/404", function(req, res){ + res.status(404); + res.send("NO"); + }); -app.post('/echo', function(req, res){ - res.json(req.body); -}); + app.get("/301", function(req, res){ + res.status(301); + res.location("/hello"); + res.send(); + }); -app.get('/qs', function(req, res){ - res.json(req.query); -}); + app.post('/echo', function(req, res){ + res.json(req.body); + }); -app.listen(13371); + app.get('/qs', function(req, res){ + res.json(req.query); + }); + return app.listen(13371, undefined, done); +} describe("httpRequest", () => { + let server; + beforeAll((done) => { + server = startServer(done); + }); + + afterAll((done) => { + server.close(done); + }); + it("should do /hello", (done) => { httpRequest({ url: httpRequestServer + "/hello" diff --git a/spec/MongoStorageAdapter.spec.js b/spec/MongoStorageAdapter.spec.js index b263f70dad..961568b9d3 100644 --- a/spec/MongoStorageAdapter.spec.js +++ b/spec/MongoStorageAdapter.spec.js @@ -9,7 +9,7 @@ const databaseURI = 'mongodb://localhost:27017/parseServerMongoAdapterTestDataba describe_only_db('mongo')('MongoStorageAdapter', () => { beforeEach(done => { new MongoStorageAdapter({ uri: databaseURI }) - .deleteAllClasses() + .dropDatabase() .then(done, fail); }); diff --git a/spec/ParseHooks.spec.js b/spec/ParseHooks.spec.js index 86dcd8e600..659ecca180 100644 --- a/spec/ParseHooks.spec.js +++ b/spec/ParseHooks.spec.js @@ -10,11 +10,19 @@ const port = 12345; const hookServerURL = "http://localhost:" + port; const AppCache = require('../src/cache').AppCache; -const app = express(); -app.use(bodyParser.json({ 'type': '*/*' })) -app.listen(12345); - describe('Hooks', () => { + let server; + let app; + beforeAll((done) => { + app = express(); + app.use(bodyParser.json({ 'type': '*/*' })) + server = app.listen(12345, undefined, done); + }); + + afterAll((done) => { + server.close(done); + }); + it("should have no hooks registered", (done) => { Parse.Hooks.getFunctions().then((res) => { expect(res.constructor).toBe(Array.prototype.constructor); diff --git a/spec/ParseServer.spec.js b/spec/ParseServer.spec.js index c5f945a238..9f85240996 100644 --- a/spec/ParseServer.spec.js +++ b/spec/ParseServer.spec.js @@ -7,13 +7,20 @@ import ParseServer from '../src/ParseServer'; describe('Server Url Checks', () => { - const app = express(); - app.get('/health', function(req, res){ - res.json({ - status: 'ok' + let server; + beforeAll((done) => { + const app = express(); + app.get('/health', function(req, res){ + res.json({ + status: 'ok' + }); }); + server = app.listen(13376, undefined, done); + }); + + afterAll((done) => { + server.close(done); }); - app.listen(13376); it('validate good server url', (done) => { Parse.serverURL = 'http://localhost:13376'; diff --git a/spec/PostgresStorageAdapter.spec.js b/spec/PostgresStorageAdapter.spec.js index 1ba24f6515..559368bf50 100644 --- a/spec/PostgresStorageAdapter.spec.js +++ b/spec/PostgresStorageAdapter.spec.js @@ -12,7 +12,7 @@ const dropTable = (client, className) => { describe_only_db('postgres')('PostgresStorageAdapter', () => { const adapter = new PostgresStorageAdapter({ uri: databaseURI }) beforeEach(() => { - return adapter.deleteAllClasses(); + return adapter.dropDatabase(); }); it('schemaUpgrade, upgrade the database schema when schema changes', done => { diff --git a/spec/helper.js b/spec/helper.js index d2914afd8d..9d84f8d4b2 100644 --- a/spec/helper.js +++ b/spec/helper.js @@ -411,17 +411,25 @@ global.jfail = function(err) { global.it_exclude_dbs = excluded => { if (excluded.indexOf(process.env.PARSE_SERVER_TEST_DB) >= 0) { - return xit; + return (name, suite) => { + return xit(`[${excluded}] ${name}`, suite); + }; } else { - return it; + return (name, suite) => { + return it(`[${excluded}] ${name}`, suite); + }; } } global.it_only_db = db => { if (process.env.PARSE_SERVER_TEST_DB === db) { - return it; + return (name, suite) => { + return it(`[${db}] ${name}`, suite); + }; } else { - return xit; + return (name, suite) => { + return xit(`[${db}] ${name}`, suite); + }; } }; @@ -435,11 +443,17 @@ global.fit_exclude_dbs = excluded => { global.describe_only_db = db => { if (process.env.PARSE_SERVER_TEST_DB == db) { - return describe; + return (name, suite) => { + return describe(`[${db}] ${name}`, suite); + }; } else if (!process.env.PARSE_SERVER_TEST_DB && db == 'mongo') { - return describe; + return (name, suite) => { + return describe(`[${db}] ${name}`, suite); + }; } else { - return () => {}; + return (name, suite) => { + return xdescribe(`[${db}] ${name}`, suite); + }; } } diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js index 0ec3ae5a82..b844f5eae1 100644 --- a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js +++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js @@ -320,6 +320,11 @@ export class MongoStorageAdapter implements StorageAdapter { .catch(err => this.handleError(err)); } + dropDatabase() { + if (!this.database) { return Promise.resolve(); } + return this.database.dropDatabase(); + } + // Remove the column and all the data. For Relations, the _Join collection is handled // specially, this function does not delete _Join columns. It should, however, indicate // that the relation fields does not exist anymore. In mongo, this means removing it from diff --git a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js index 2df5abb66d..332c178d1f 100644 --- a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js +++ b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js @@ -959,6 +959,10 @@ export class PostgresStorageAdapter implements StorageAdapter { }); } + dropDatabase() { + return this.deleteAllClasses(); + } + // Remove the column and all the data. For Relations, the _Join collection is handled // specially, this function does not delete _Join columns. It should, however, indicate // that the relation fields does not exist anymore. In mongo, this means removing it from diff --git a/src/Adapters/Storage/StorageAdapter.js b/src/Adapters/Storage/StorageAdapter.js index 95978fe064..0a786e3ea1 100644 --- a/src/Adapters/Storage/StorageAdapter.js +++ b/src/Adapters/Storage/StorageAdapter.js @@ -32,6 +32,7 @@ export interface StorageAdapter { addFieldIfNotExists(className: string, fieldName: string, type: any): Promise; deleteClass(className: string): Promise; deleteAllClasses(): Promise; + dropDatabase(): Promise; deleteFields(className: string, schema: SchemaType, fieldNames: Array): Promise; getAllClasses(): Promise; getClass(className: string): Promise; diff --git a/src/Controllers/DatabaseController.js b/src/Controllers/DatabaseController.js index f28d51d1b9..7de82a1053 100644 --- a/src/Controllers/DatabaseController.js +++ b/src/Controllers/DatabaseController.js @@ -658,7 +658,7 @@ class DatabaseController { deleteEverything() { this.schemaPromise = null; return Promise.all([ - this.adapter.deleteAllClasses(), + this.adapter.dropDatabase(), this.schemaCache.clear() ]); } From e87c0f08f8ced385e3cec3d20fdc826d0b53548c Mon Sep 17 00:00:00 2001 From: Florent Vilmart <364568+flovilmart@users.noreply.github.com> Date: Fri, 29 Jun 2018 15:52:59 -0400 Subject: [PATCH 2/2] Removes unused methdos --- src/Adapters/Storage/Mongo/MongoStorageAdapter.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js index b844f5eae1..68e59f66be 100644 --- a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js +++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js @@ -313,13 +313,6 @@ export class MongoStorageAdapter implements StorageAdapter { .catch(err => this.handleError(err)); } - // Delete all data known to this adapter. Used for testing. - deleteAllClasses() { - return storageAdapterAllCollections(this) - .then(collections => Promise.all(collections.map(collection => collection.drop()))) - .catch(err => this.handleError(err)); - } - dropDatabase() { if (!this.database) { return Promise.resolve(); } return this.database.dropDatabase();