From 1c48da8f6a7fc8c70145a6dfb5b210f305c8aa7d Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sat, 8 Mar 2025 09:30:22 -0600 Subject: [PATCH 1/7] test: Investigate integration test timeout --- integration/test/ParseEventuallyQueueTest.js | 6 ++-- integration/test/ParseServerTest.js | 4 +-- integration/test/clear.js | 12 ------- integration/test/helper.js | 34 +++++++++++--------- 4 files changed, 24 insertions(+), 32 deletions(-) delete mode 100644 integration/test/clear.js diff --git a/integration/test/ParseEventuallyQueueTest.js b/integration/test/ParseEventuallyQueueTest.js index e05ffe182..84f581460 100644 --- a/integration/test/ParseEventuallyQueueTest.js +++ b/integration/test/ParseEventuallyQueueTest.js @@ -194,7 +194,7 @@ describe('Parse EventuallyQueue', () => { const parseServer = await reconfigureServer(); const object = new TestObject({ hash: 'saveSecret' }); await parseServer.handleShutdown(); - await new Promise(resolve => parseServer.server.close(resolve)); + // await new Promise(resolve => parseServer.server.close(resolve)); await object.saveEventually(); const length = await Parse.EventuallyQueue.length(); @@ -226,7 +226,7 @@ describe('Parse EventuallyQueue', () => { const object = new TestObject({ hash: 'saveSecret' }); object.setACL(acl); await parseServer.handleShutdown(); - await new Promise(resolve => parseServer.server.close(resolve)); + // await new Promise(resolve => parseServer.server.close(resolve)); await object.saveEventually(); const length = await Parse.EventuallyQueue.length(); @@ -252,7 +252,7 @@ describe('Parse EventuallyQueue', () => { const object = new TestObject({ hash: 'deleteSecret' }); await object.save(); await parseServer.handleShutdown(); - await new Promise(resolve => parseServer.server.close(resolve)); + // await new Promise(resolve => parseServer.server.close(resolve)); await object.destroyEventually(); const length = await Parse.EventuallyQueue.length(); diff --git a/integration/test/ParseServerTest.js b/integration/test/ParseServerTest.js index 1ae23a7b4..de9c794b6 100644 --- a/integration/test/ParseServerTest.js +++ b/integration/test/ParseServerTest.js @@ -7,7 +7,7 @@ describe('ParseServer', () => { const parseServer = await reconfigureServer({ serverURL: 'www.google.com' }); assert.strictEqual(parseServer.config.serverURL, 'www.google.com'); await parseServer.handleShutdown(); - await new Promise(resolve => parseServer.server.close(resolve)); + // await new Promise(resolve => parseServer.server.close(resolve)); await reconfigureServer(); }); @@ -15,7 +15,7 @@ describe('ParseServer', () => { const parseServer = await reconfigureServer(); const object = new TestObject({ foo: 'bar' }); await parseServer.handleShutdown(); - await new Promise(resolve => parseServer.server.close(resolve)); + // await new Promise(resolve => parseServer.server.close(resolve)); await expectAsync(object.save()).toBeRejectedWithError( 'XMLHttpRequest failed: "Unable to connect to the Parse API"' ); diff --git a/integration/test/clear.js b/integration/test/clear.js deleted file mode 100644 index 2ae35ef2a..000000000 --- a/integration/test/clear.js +++ /dev/null @@ -1,12 +0,0 @@ -const Parse = require('../../node'); - -/** - * Destroys all data in the database - * Calls /clear route in integration/test/server.js - * - * @param {boolean} fast set to true if it's ok to just drop objects and not indexes. - * @returns {Promise} A promise that is resolved when database is deleted. - */ -module.exports = function (fast = true) { - return Parse._ajax('GET', `http://localhost:1337/clear/${fast}`, ''); -}; diff --git a/integration/test/helper.js b/integration/test/helper.js index 7f766e361..9c4f73559 100644 --- a/integration/test/helper.js +++ b/integration/test/helper.js @@ -7,7 +7,7 @@ const ParseServer = require('parse-server').default; const CustomAuth = require('./CustomAuth'); const { TestUtils } = require('parse-server'); const Parse = require('../../node'); -const fs = require('fs'); +const fs = require('fs').promises; const path = require('path'); const dns = require('dns'); const MockEmailAdapterWithOptions = require('./support/MockEmailAdapterWithOptions'); @@ -21,6 +21,7 @@ const port = 1337; const mountPath = '/parse'; const serverURL = 'http://localhost:1337/parse'; let didChangeConfiguration = false; +const distFiles = {}; /* To generate the auth data below, the Twitter app "GitHub CI Test App" has @@ -97,7 +98,7 @@ let parseServer; const reconfigureServer = async (changedConfiguration = {}) => { if (parseServer) { await parseServer.handleShutdown(); - await new Promise(resolve => parseServer.server.close(resolve)); + // await new Promise(resolve => parseServer.server.close(resolve)); parseServer = undefined; return reconfigureServer(changedConfiguration); } @@ -113,8 +114,7 @@ const reconfigureServer = async (changedConfiguration = {}) => { return reconfigureServer(newConfiguration); } const app = parseServer.expressApp; - for (const fileName of ['parse.js', 'parse.min.js']) { - const file = fs.readFileSync(path.resolve(__dirname, `./../../dist/${fileName}`)).toString(); + for (const [fileName, file] of Object.entries(distFiles)) { app.get(`/${fileName}`, (_req, res) => { res.send(` @@ -132,12 +132,6 @@ const reconfigureServer = async (changedConfiguration = {}) => { `); }); } - app.get('/clear/:fast', (req, res) => { - const { fast } = req.params; - TestUtils.destroyAllDataPermanently(fast).then(() => { - res.send('{}'); - }); - }); parseServer.server.on('connection', connection => { const key = `${connection.remoteAddress}:${connection.remotePort}`; openConnections[key] = connection; @@ -157,6 +151,12 @@ global.TestObject = Parse.Object.extend('TestObject'); global.reconfigureServer = reconfigureServer; beforeAll(async () => { + const promise = ['parse.js', 'parse.min.js'].map(fileName => { + return fs.readFile(path.resolve(__dirname, `./../../dist/${fileName}`), 'utf8').then(file => { + distFiles[fileName] = file; + }); + }); + await Promise.all(promise); await reconfigureServer(); Parse.initialize('integration'); Parse.CoreManager.set('SERVER_URL', serverURL); @@ -164,11 +164,15 @@ beforeAll(async () => { }); afterEach(async () => { - await Parse.User.logOut(); - Parse.Storage._clear(); - await TestUtils.destroyAllDataPermanently(true); - if (didChangeConfiguration) { - await reconfigureServer(); + try { + await Parse.User.logOut(); + Parse.Storage._clear(); + await TestUtils.destroyAllDataPermanently(true); + if (didChangeConfiguration) { + await reconfigureServer(); + } + } catch (error) { + console.error('Error in afterEach', error); } }); From fb3cf69f7f24027071ca0193a307d42c2f455a57 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sat, 8 Mar 2025 09:58:02 -0600 Subject: [PATCH 2/7] remove close --- integration/test/ParseEventuallyQueueTest.js | 3 --- integration/test/ParseServerTest.js | 2 -- integration/test/helper.js | 15 +++++---------- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/integration/test/ParseEventuallyQueueTest.js b/integration/test/ParseEventuallyQueueTest.js index 84f581460..e358ebfde 100644 --- a/integration/test/ParseEventuallyQueueTest.js +++ b/integration/test/ParseEventuallyQueueTest.js @@ -194,7 +194,6 @@ describe('Parse EventuallyQueue', () => { const parseServer = await reconfigureServer(); const object = new TestObject({ hash: 'saveSecret' }); await parseServer.handleShutdown(); - // await new Promise(resolve => parseServer.server.close(resolve)); await object.saveEventually(); const length = await Parse.EventuallyQueue.length(); @@ -226,7 +225,6 @@ describe('Parse EventuallyQueue', () => { const object = new TestObject({ hash: 'saveSecret' }); object.setACL(acl); await parseServer.handleShutdown(); - // await new Promise(resolve => parseServer.server.close(resolve)); await object.saveEventually(); const length = await Parse.EventuallyQueue.length(); @@ -252,7 +250,6 @@ describe('Parse EventuallyQueue', () => { const object = new TestObject({ hash: 'deleteSecret' }); await object.save(); await parseServer.handleShutdown(); - // await new Promise(resolve => parseServer.server.close(resolve)); await object.destroyEventually(); const length = await Parse.EventuallyQueue.length(); diff --git a/integration/test/ParseServerTest.js b/integration/test/ParseServerTest.js index de9c794b6..0a4618da5 100644 --- a/integration/test/ParseServerTest.js +++ b/integration/test/ParseServerTest.js @@ -7,7 +7,6 @@ describe('ParseServer', () => { const parseServer = await reconfigureServer({ serverURL: 'www.google.com' }); assert.strictEqual(parseServer.config.serverURL, 'www.google.com'); await parseServer.handleShutdown(); - // await new Promise(resolve => parseServer.server.close(resolve)); await reconfigureServer(); }); @@ -15,7 +14,6 @@ describe('ParseServer', () => { const parseServer = await reconfigureServer(); const object = new TestObject({ foo: 'bar' }); await parseServer.handleShutdown(); - // await new Promise(resolve => parseServer.server.close(resolve)); await expectAsync(object.save()).toBeRejectedWithError( 'XMLHttpRequest failed: "Unable to connect to the Parse API"' ); diff --git a/integration/test/helper.js b/integration/test/helper.js index 9c4f73559..81fe0bbae 100644 --- a/integration/test/helper.js +++ b/integration/test/helper.js @@ -98,7 +98,6 @@ let parseServer; const reconfigureServer = async (changedConfiguration = {}) => { if (parseServer) { await parseServer.handleShutdown(); - // await new Promise(resolve => parseServer.server.close(resolve)); parseServer = undefined; return reconfigureServer(changedConfiguration); } @@ -164,15 +163,11 @@ beforeAll(async () => { }); afterEach(async () => { - try { - await Parse.User.logOut(); - Parse.Storage._clear(); - await TestUtils.destroyAllDataPermanently(true); - if (didChangeConfiguration) { - await reconfigureServer(); - } - } catch (error) { - console.error('Error in afterEach', error); + await Parse.User.logOut(); + Parse.Storage._clear(); + await TestUtils.destroyAllDataPermanently(true); + if (didChangeConfiguration) { + await reconfigureServer(); } }); From 67001f713b01837459b863ca760e6c2488450f78 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sat, 8 Mar 2025 10:25:09 -0600 Subject: [PATCH 3/7] improve tests --- integration/test/ParseServerTest.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/integration/test/ParseServerTest.js b/integration/test/ParseServerTest.js index 0a4618da5..c13c123c7 100644 --- a/integration/test/ParseServerTest.js +++ b/integration/test/ParseServerTest.js @@ -1,24 +1,28 @@ 'use strict'; -const assert = require('assert'); - describe('ParseServer', () => { it('can reconfigure server', async () => { - const parseServer = await reconfigureServer({ serverURL: 'www.google.com' }); - assert.strictEqual(parseServer.config.serverURL, 'www.google.com'); + let parseServer = await reconfigureServer({ serverURL: 'www.google.com' }); + expect(parseServer.config.serverURL).toBe('www.google.com'); await parseServer.handleShutdown(); - await reconfigureServer(); + parseServer = await reconfigureServer(); + expect(parseServer.config.serverURL).toBe('http://localhost:1337/parse'); }); it('can shutdown', async () => { + let close = 0; const parseServer = await reconfigureServer(); + parseServer.server.on('close', () => { + close += 1; + }); const object = new TestObject({ foo: 'bar' }); await parseServer.handleShutdown(); + expect(close).toBe(1); await expectAsync(object.save()).toBeRejectedWithError( 'XMLHttpRequest failed: "Unable to connect to the Parse API"' ); await reconfigureServer({}); await object.save(); - assert(object.id); + expect(object.id).toBeDefined(); }); }); From 1951be853bb9493575a1473ff89594571f026c46 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sat, 8 Mar 2025 11:19:15 -0600 Subject: [PATCH 4/7] set request attempt limit --- integration/test/helper.js | 1 + 1 file changed, 1 insertion(+) diff --git a/integration/test/helper.js b/integration/test/helper.js index 81fe0bbae..9c80f0d2e 100644 --- a/integration/test/helper.js +++ b/integration/test/helper.js @@ -160,6 +160,7 @@ beforeAll(async () => { Parse.initialize('integration'); Parse.CoreManager.set('SERVER_URL', serverURL); Parse.CoreManager.set('MASTER_KEY', 'notsosecret'); + Parse.CoreManager.set('REQUEST_ATTEMPT_LIMIT', 1); }); afterEach(async () => { From 9c90200af938c18ba56f5bc6869ee280a8d10fdf Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sat, 8 Mar 2025 11:35:06 -0600 Subject: [PATCH 5/7] check if error after tests --- integration/test/helper.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/integration/test/helper.js b/integration/test/helper.js index 9c80f0d2e..7c96c99cb 100644 --- a/integration/test/helper.js +++ b/integration/test/helper.js @@ -164,11 +164,15 @@ beforeAll(async () => { }); afterEach(async () => { - await Parse.User.logOut(); - Parse.Storage._clear(); - await TestUtils.destroyAllDataPermanently(true); - if (didChangeConfiguration) { - await reconfigureServer(); + try { + await Parse.User.logOut(); + Parse.Storage._clear(); + await TestUtils.destroyAllDataPermanently(true); + if (didChangeConfiguration) { + await reconfigureServer(); + } + } catch (e) { + console.error('Failed to tear down the server', e); } }); From fb0dbf783245589fcfe3d741cdc925fb69c00e94 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sat, 8 Mar 2025 12:24:34 -0600 Subject: [PATCH 6/7] set timeout to 5000 --- integration/test/helper.js | 2 +- jasmine.json | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/integration/test/helper.js b/integration/test/helper.js index 7c96c99cb..037e5bf3a 100644 --- a/integration/test/helper.js +++ b/integration/test/helper.js @@ -1,4 +1,4 @@ -jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000; +jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000; const { SpecReporter } = require('jasmine-spec-reporter'); jasmine.getEnv().addReporter(new SpecReporter()); diff --git a/jasmine.json b/jasmine.json index 9590307f3..032337cde 100644 --- a/jasmine.json +++ b/jasmine.json @@ -6,6 +6,5 @@ "spec_files": [ "*Test.js" ], - "random": true, - "timeout": 20000 + "random": true } From 6fe81ad59c71f073f6d1c2c4622bb69d0591c47a Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sat, 8 Mar 2025 12:53:49 -0600 Subject: [PATCH 7/7] Update ParseDistTest.js --- integration/test/ParseDistTest.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/integration/test/ParseDistTest.js b/integration/test/ParseDistTest.js index 625131bb5..0e2072b7c 100644 --- a/integration/test/ParseDistTest.js +++ b/integration/test/ParseDistTest.js @@ -6,6 +6,7 @@ let page = null; for (const fileName of ['parse.js', 'parse.min.js']) { describe(`Parse Dist Test ${fileName}`, () => { beforeEach(async () => { + console.log('beforeEach', fileName); browser = await puppeteer.launch({ args: ['--disable-web-security', '--incognito', '--no-sandbox'], }); @@ -16,6 +17,9 @@ for (const fileName of ['parse.js', 'parse.min.js']) { }); afterEach(async () => { + console.log('afterEach', fileName); + console.log('page', typeof page); + console.log('browser', typeof browser); await page.close(); await browser.close(); });