From 96497c22058b2a5a084283e4a7a6b492d5849c3a Mon Sep 17 00:00:00 2001
From: Daniel <daniel-blyth@live.com.au>
Date: Wed, 2 Apr 2025 22:42:11 +1100
Subject: [PATCH 1/3] Update helper.js

---
 spec/helper.js | 1 -
 1 file changed, 1 deletion(-)

diff --git a/spec/helper.js b/spec/helper.js
index 9c31053421..8ad9b92a77 100644
--- a/spec/helper.js
+++ b/spec/helper.js
@@ -192,7 +192,6 @@ const reconfigureServer = async (changedConfiguration = {}) => {
   });
   cache.clear();
   parseServer = await ParseServer.startApp(newConfiguration);
-  Parse.CoreManager.setRESTController(RESTController);
   parseServer.expressApp.use('/1', err => {
     console.error(err);
     fail('should not call next');

From c322b905c6477decfe987b8ad0c66007ddf8c288 Mon Sep 17 00:00:00 2001
From: Daniel <daniel-blyth@live.com.au>
Date: Wed, 2 Apr 2025 23:01:48 +1100
Subject: [PATCH 2/3] Update helper.js

---
 spec/helper.js | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/spec/helper.js b/spec/helper.js
index 8ad9b92a77..18d2e5feb5 100644
--- a/spec/helper.js
+++ b/spec/helper.js
@@ -192,6 +192,9 @@ const reconfigureServer = async (changedConfiguration = {}) => {
   });
   cache.clear();
   parseServer = await ParseServer.startApp(newConfiguration);
+  if (!newConfiguration.directAccess) {
+    Parse.CoreManager.setRESTController(RESTController);
+  }
   parseServer.expressApp.use('/1', err => {
     console.error(err);
     fail('should not call next');

From 55087496bdd9f67d6d16d47ea2bba2a7faf64988 Mon Sep 17 00:00:00 2001
From: Daniel <daniel-blyth@live.com.au>
Date: Wed, 2 Apr 2025 23:14:18 +1100
Subject: [PATCH 3/3] fix tests

---
 spec/CloudCode.spec.js | 91 ++++++++++++++++++++----------------------
 spec/ParseFile.spec.js |  4 ++
 spec/UserPII.spec.js   |  2 +-
 3 files changed, 48 insertions(+), 49 deletions(-)

diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js
index 59ae534df2..84f337f4eb 100644
--- a/spec/CloudCode.spec.js
+++ b/spec/CloudCode.spec.js
@@ -2006,13 +2006,14 @@ describe('Cloud Code', () => {
 });
 
 describe('cloud functions', () => {
-  it('Should have request ip', done => {
+  it('Should have request ip', async () => {
+    await reconfigureServer({directAccess: false});
     Parse.Cloud.define('myFunction', req => {
       expect(req.ip).toBeDefined();
       return 'success';
     });
 
-    Parse.Cloud.run('myFunction', {}).then(() => done());
+    await Parse.Cloud.run('myFunction', {});
   });
 });
 
@@ -2027,14 +2028,15 @@ describe('beforeSave hooks', () => {
     myObject.save().then(() => done());
   });
 
-  it('should have request ip', done => {
+  it('should have request ip', async () => {
+    await reconfigureServer({directAccess: false});
     Parse.Cloud.beforeSave('MyObject', req => {
       expect(req.ip).toBeDefined();
     });
 
     const MyObject = Parse.Object.extend('MyObject');
     const myObject = new MyObject();
-    myObject.save().then(() => done());
+    await myObject.save()
   });
 
   it('should respect custom object ids (#6733)', async () => {
@@ -2082,14 +2084,15 @@ describe('afterSave hooks', () => {
     myObject.save().then(() => done());
   });
 
-  it('should have request ip', done => {
+  it('should have request ip', async () => {
+    await reconfigureServer({directAccess: false});
     Parse.Cloud.afterSave('MyObject', req => {
       expect(req.ip).toBeDefined();
     });
 
     const MyObject = Parse.Object.extend('MyObject');
     const myObject = new MyObject();
-    myObject.save().then(() => done());
+    await myObject.save();
   });
 
   it('should unset in afterSave', async () => {
@@ -2137,17 +2140,16 @@ describe('beforeDelete hooks', () => {
       .then(() => done());
   });
 
-  it('should have request ip', done => {
+  it('should have request ip', async () => {
+    await reconfigureServer({directAccess: false});
     Parse.Cloud.beforeDelete('MyObject', req => {
       expect(req.ip).toBeDefined();
     });
 
     const MyObject = Parse.Object.extend('MyObject');
     const myObject = new MyObject();
-    myObject
-      .save()
-      .then(myObj => myObj.destroy())
-      .then(() => done());
+    await myObject.save()
+    await myObject.destroy();
   });
 });
 
@@ -2165,17 +2167,17 @@ describe('afterDelete hooks', () => {
       .then(() => done());
   });
 
-  it('should have request ip', done => {
+  it('should have request ip', async () => {
+    await reconfigureServer({directAccess: false});
     Parse.Cloud.afterDelete('MyObject', req => {
       expect(req.ip).toBeDefined();
     });
 
     const MyObject = Parse.Object.extend('MyObject');
     const myObject = new MyObject();
-    myObject
-      .save()
-      .then(myObj => myObj.destroy())
-      .then(() => done());
+    await myObject.save();
+    await myObject.destroy();
+
   });
 });
 
@@ -2467,21 +2469,19 @@ describe('beforeFind hooks', () => {
       .then(() => done());
   });
 
-  it('should have request ip', done => {
+  it('should have request ip', async () => {
+    await reconfigureServer({directAccess: false});
     Parse.Cloud.beforeFind('MyObject', req => {
       expect(req.ip).toBeDefined();
     });
 
     const MyObject = Parse.Object.extend('MyObject');
     const myObject = new MyObject();
-    myObject
-      .save()
-      .then(myObj => {
-        const query = new Parse.Query('MyObject');
-        query.equalTo('objectId', myObj.id);
-        return Promise.all([query.get(myObj.id), query.first(), query.find()]);
-      })
-      .then(() => done());
+    await myObject.save()
+      
+    const query = new Parse.Query('MyObject');
+    query.equalTo('objectId', myObject.id);
+    await Promise.all([query.get(myObject.id), query.first(), query.find()]);
   });
 
   it('should run beforeFind on pointers and array of pointers from an object', async () => {
@@ -2850,22 +2850,19 @@ describe('afterFind hooks', () => {
       .then(() => done());
   });
 
-  it('should have request ip', done => {
+  it('should have request ip', async () => {
+    await reconfigureServer({directAccess: false});
     Parse.Cloud.afterFind('MyObject', req => {
       expect(req.ip).toBeDefined();
     });
 
     const MyObject = Parse.Object.extend('MyObject');
     const myObject = new MyObject();
-    myObject
-      .save()
-      .then(myObj => {
-        const query = new Parse.Query('MyObject');
-        query.equalTo('objectId', myObj.id);
-        return Promise.all([query.get(myObj.id), query.first(), query.find()]);
-      })
-      .then(() => done())
-      .catch(done.fail);
+    await myObject.save()
+      
+    const query = new Parse.Query('MyObject');
+    query.equalTo('objectId', myObject.id);
+    await Promise.all([query.get(myObject.id), query.first(), query.find()]);
   });
 
   it('should validate triggers correctly', () => {
@@ -3224,7 +3221,8 @@ describe('beforeLogin hook', () => {
     done();
   });
 
-  it('should be able to block login if an error is thrown', async done => {
+  it('should be able to block login if an error is thrown', async () => {
+    await reconfigureServer({directAccess: false});
     let hit = 0;
     Parse.Cloud.beforeLogin(req => {
       hit++;
@@ -3243,10 +3241,10 @@ describe('beforeLogin hook', () => {
       expect(e.message).toBe('banned account');
     }
     expect(hit).toBe(1);
-    done();
   });
 
-  it('should be able to block login if an error is thrown even if the user has a attached file', async done => {
+  it('should be able to block login if an error is thrown even if the user has a attached file', async () => {
+    await reconfigureServer({directAccess: false});
     let hit = 0;
     Parse.Cloud.beforeLogin(req => {
       hit++;
@@ -3268,7 +3266,6 @@ describe('beforeLogin hook', () => {
       expect(e.message).toBe('banned account');
     }
     expect(hit).toBe(1);
-    done();
   });
 
   it('should not run beforeLogin with incorrect credentials', async done => {
@@ -3301,7 +3298,7 @@ describe('beforeLogin hook', () => {
     done();
   });
 
-  it('should trigger afterLogout hook on logout', async done => {
+  it('should trigger afterLogout hook on logout', async () => {
     let userId;
     Parse.Cloud.afterLogout(req => {
       expect(req.object.className).toEqual('_Session');
@@ -3311,10 +3308,9 @@ describe('beforeLogin hook', () => {
       userId = user.id;
     });
 
-    const user = await Parse.User.signUp('user', 'pass');
+    const user = await Parse.User.signUp('user', 'pass', null, {installationId: 'test'});
     await Parse.User.logOut();
     expect(user.id).toBe(userId);
-    done();
   });
 
   it('does not crash server when throwing in afterLogin hook', async () => {
@@ -3333,6 +3329,7 @@ describe('beforeLogin hook', () => {
   });
 
   it('does not crash server when throwing in afterLogout hook', async () => {
+    await reconfigureServer({directAccess: false});
     const error = new Parse.Error(2000, 'afterLogout error');
     const trigger = {
       afterLogout() {
@@ -3347,7 +3344,7 @@ describe('beforeLogin hook', () => {
     expect(response).toEqual(error);
   });
 
-  it_id('5656d6d7-65ef-43d1-8ca6-6942ae3614d5')(it)('should have expected data in request in beforeLogin', async done => {
+  it_id('5656d6d7-65ef-43d1-8ca6-6942ae3614d5')(it)('should have expected data in request in beforeLogin', async () => {
     Parse.Cloud.beforeLogin(req => {
       expect(req.object).toBeDefined();
       expect(req.user).toBeUndefined();
@@ -3358,8 +3355,7 @@ describe('beforeLogin hook', () => {
     });
 
     await Parse.User.signUp('tupac', 'shakur');
-    await Parse.User.logIn('tupac', 'shakur');
-    done();
+    await Parse.User.logIn('tupac', 'shakur', {installationId: 'test'});
   });
 
   it('afterFind should not be triggered when saving an object', async () => {
@@ -3464,7 +3460,7 @@ describe('afterLogin hook', () => {
     done();
   });
 
-  it_id('e86155c4-62e1-4c6e-ab4a-9ac6c87c60f2')(it)('should have expected data in request in afterLogin', async done => {
+  it_id('e86155c4-62e1-4c6e-ab4a-9ac6c87c60f2')(it)('should have expected data in request in afterLogin', async () => {
     Parse.Cloud.afterLogin(req => {
       expect(req.object).toBeDefined();
       expect(req.user).toBeDefined();
@@ -3475,8 +3471,7 @@ describe('afterLogin hook', () => {
     });
 
     await Parse.User.signUp('testuser', 'p@ssword');
-    await Parse.User.logIn('testuser', 'p@ssword');
-    done();
+    await Parse.User.logIn('testuser', 'p@ssword', {installationId: 'test'});
   });
 
   it('context options should override _context object property when saving a new object', async () => {
diff --git a/spec/ParseFile.spec.js b/spec/ParseFile.spec.js
index 6be506be8d..5e74e6d010 100644
--- a/spec/ParseFile.spec.js
+++ b/spec/ParseFile.spec.js
@@ -1131,6 +1131,7 @@ describe('Parse.File testing', () => {
 
     it('rejects all file uploads', async () => {
       await reconfigureServer({
+        directAccess:false,
         fileUpload: {
           enableForPublic: false,
           enableForAnonymousUser: false,
@@ -1176,6 +1177,7 @@ describe('Parse.File testing', () => {
 
     it('allows file upload only for public', async () => {
       await reconfigureServer({
+        directAccess:false,
         fileUpload: {
           enableForPublic: true,
           enableForAnonymousUser: false,
@@ -1201,6 +1203,7 @@ describe('Parse.File testing', () => {
 
     it('allows file upload only for anonymous user', async () => {
       await reconfigureServer({
+        directAccess:false,
         fileUpload: {
           enableForPublic: false,
           enableForAnonymousUser: true,
@@ -1226,6 +1229,7 @@ describe('Parse.File testing', () => {
 
     it('allows file upload only for authenticated user', async () => {
       await reconfigureServer({
+        directAccess:false,
         fileUpload: {
           enableForPublic: false,
           enableForAnonymousUser: false,
diff --git a/spec/UserPII.spec.js b/spec/UserPII.spec.js
index a94e3ca469..44722fcd2e 100644
--- a/spec/UserPII.spec.js
+++ b/spec/UserPII.spec.js
@@ -13,7 +13,7 @@ describe('Personally Identifiable Information', () => {
   let user;
 
   beforeEach(async done => {
-    await reconfigureServer();
+    await reconfigureServer({directAccess: false});
     user = await Parse.User.signUp('tester', 'abc');
     user = await Parse.User.logIn(user.get('username'), 'abc');
     const acl = new Parse.ACL();