From ff25ae254d485ee242eca02a96a5fe021005e0a6 Mon Sep 17 00:00:00 2001 From: Florent Vilmart <364568+flovilmart@users.noreply.github.com> Date: Sun, 5 Aug 2018 13:58:07 -0400 Subject: [PATCH] Update parse SDK to 2.0.0 (#4925) * WIP: Integrate JS SDK v2 - Removes backbone style callbacks - Use Promise instead of Parse.Promise * Fixes ParseObject and ParseRelation * Updates Parse.Query with promises * Alls tests should pass * Ensure a fresh user is used for each test * Use REST implementation to avoid side effects for username/email duplicates * Uses js sdk v2 --- package-lock.json | 46 +- package.json | 2 +- spec/.eslintrc.json | 2 - spec/AuthenticationAdapters.spec.js | 90 +- spec/CloudCode.spec.js | 136 +- spec/FilesController.spec.js | 7 +- spec/ParseACL.spec.js | 1856 +++++++++------------ spec/ParseAPI.spec.js | 178 +- spec/ParseFile.spec.js | 177 +- spec/ParseGeoPoint.spec.js | 383 ++--- spec/ParseHooks.spec.js | 25 +- spec/ParseLiveQueryServer.spec.js | 18 +- spec/ParseObject.spec.js | 1127 ++++++------- spec/ParseQuery.spec.js | 1392 +++++++--------- spec/ParseRelation.spec.js | 246 ++- spec/ParseRole.spec.js | 6 +- spec/ParseServerRESTController.spec.js | 4 +- spec/ParseUser.spec.js | 1886 +++++++++------------- spec/PurchaseValidation.spec.js | 6 +- spec/Schema.spec.js | 2 +- spec/SessionTokenCache.spec.js | 2 +- spec/UserPII.spec.js | 25 +- spec/ValidationAndPasswordsReset.spec.js | 222 +-- spec/WinstonLoggerAdapter.spec.js | 2 +- spec/helper.js | 56 +- spec/index.spec.js | 2 +- src/LiveQuery/ParseLiveQueryServer.js | 32 +- src/LiveQuery/SessionTokenCache.js | 10 +- src/ParseServerRESTController.js | 16 +- src/cloud-code/httpRequest.js | 44 +- 30 files changed, 3217 insertions(+), 4783 deletions(-) diff --git a/package-lock.json b/package-lock.json index 455b7427..76bfb3d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -212,6 +212,28 @@ "apn": "^3.0.0-alpha1", "npmlog": "^4.0.2", "parse": "^1.9.2" + }, + "dependencies": { + "parse": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/parse/-/parse-1.11.1.tgz", + "integrity": "sha1-VY5TnULZ+4khDggiCdbzsD1frtU=", + "requires": { + "babel-runtime": "^6.11.6", + "ws": "^3.3.1", + "xmlhttprequest": "^1.7.0" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } } }, "@parse/s3-files-adapter": { @@ -9859,25 +9881,13 @@ "integrity": "sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc=" }, "parse": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/parse/-/parse-1.11.1.tgz", - "integrity": "sha1-VY5TnULZ+4khDggiCdbzsD1frtU=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-2.0.0.tgz", + "integrity": "sha512-YOpOkMXaJZfpzoSS+Jn3XxvdwS3lHlWk4GNi4Hawt2PoyZHT1/gSG4odKadfkvF05TyBtuY7AMzKruvtK/RfVw==", "requires": { - "babel-runtime": "^6.11.6", - "ws": "^3.3.1", - "xmlhttprequest": "^1.7.0" - }, - "dependencies": { - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - } + "babel-runtime": "6.26.0", + "ws": "6.0.0", + "xmlhttprequest": "1.8.0" } }, "parse-glob": { diff --git a/package.json b/package.json index b36ebe0e..55fb895c 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "lru-cache": "4.1.2", "mime": "2.3.1", "mongodb": "3.1.1", - "parse": "1.11.1", + "parse": "2.0.0", "pg-promise": "8.4.5", "redis": "2.8.0", "request": "2.85.0", diff --git a/spec/.eslintrc.json b/spec/.eslintrc.json index b7266986..0814f305 100644 --- a/spec/.eslintrc.json +++ b/spec/.eslintrc.json @@ -20,9 +20,7 @@ "describe_only": true, "on_db": true, "defaultConfiguration": true, - "expectSuccess": true, "range": true, - "expectError": true, "jequal": true, "create": true, "arrayContains": true diff --git a/spec/AuthenticationAdapters.spec.js b/spec/AuthenticationAdapters.spec.js index f7d1d645..73154e4a 100644 --- a/spec/AuthenticationAdapters.spec.js +++ b/spec/AuthenticationAdapters.spec.js @@ -120,7 +120,7 @@ describe('AuthenticationProviders', function() { } expect(res.get("installationId")).toEqual('yolo'); done(); - }).fail(() => { + }).catch(() => { fail('should not fail fetching the session'); done(); }) @@ -163,67 +163,43 @@ describe('AuthenticationProviders', function() { }).catch(done.fail); }); - it("unlink and link with custom provider", (done) => { + it("unlink and link with custom provider", async () => { const provider = getMockMyOauthProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("myoauth", { - success: function(model) { - ok(model instanceof Parse.User, "Model should be a Parse.User"); - strictEqual(Parse.User.current(), model); - ok(model.extended(), "Should have used the subclass."); - strictEqual(provider.authData.id, provider.synchronizedUserId); - strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); - strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); - ok(model._isLinked("myoauth"), "User should be linked to myoauth"); + const model = await Parse.User._logInWith("myoauth"); + ok(model instanceof Parse.User, "Model should be a Parse.User"); + strictEqual(Parse.User.current(), model); + ok(model.extended(), "Should have used the subclass."); + strictEqual(provider.authData.id, provider.synchronizedUserId); + strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); + strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); + ok(model._isLinked("myoauth"), "User should be linked to myoauth"); - model._unlinkFrom("myoauth", { - success: function(model) { + await model._unlinkFrom("myoauth"); + ok(!model._isLinked("myoauth"), + "User should not be linked to myoauth"); + ok(!provider.synchronizedUserId, "User id should be cleared"); + ok(!provider.synchronizedAuthToken, "Auth token should be cleared"); + ok(!provider.synchronizedExpiration, + "Expiration should be cleared"); + // make sure the auth data is properly deleted + const config = Config.get(Parse.applicationId); + const res = await config.database.adapter.find('_User', { + fields: Object.assign({}, defaultColumns._Default, defaultColumns._Installation), + }, { objectId: model.id }, {}) + expect(res.length).toBe(1); + expect(res[0]._auth_data_myoauth).toBeUndefined(); + expect(res[0]._auth_data_myoauth).not.toBeNull(); - ok(!model._isLinked("myoauth"), - "User should not be linked to myoauth"); - ok(!provider.synchronizedUserId, "User id should be cleared"); - ok(!provider.synchronizedAuthToken, "Auth token should be cleared"); - ok(!provider.synchronizedExpiration, - "Expiration should be cleared"); - // make sure the auth data is properly deleted - const config = Config.get(Parse.applicationId); - config.database.adapter.find('_User', { - fields: Object.assign({}, defaultColumns._Default, defaultColumns._Installation), - }, { objectId: model.id }, {}) - .then(res => { - expect(res.length).toBe(1); - expect(res[0]._auth_data_myoauth).toBeUndefined(); - expect(res[0]._auth_data_myoauth).not.toBeNull(); + await model._linkWith("myoauth"); - model._linkWith("myoauth", { - success: function(model) { - ok(provider.synchronizedUserId, "User id should have a value"); - ok(provider.synchronizedAuthToken, - "Auth token should have a value"); - ok(provider.synchronizedExpiration, - "Expiration should have a value"); - ok(model._isLinked("myoauth"), - "User should be linked to myoauth"); - done(); - }, - error: function() { - ok(false, "linking again should succeed"); - done(); - } - }); - }); - }, - error: function() { - ok(false, "unlinking should succeed"); - done(); - } - }); - }, - error: function() { - ok(false, "linking should have worked"); - done(); - } - }); + ok(provider.synchronizedUserId, "User id should have a value"); + ok(provider.synchronizedAuthToken, + "Auth token should have a value"); + ok(provider.synchronizedExpiration, + "Expiration should have a value"); + ok(model._isLinked("myoauth"), + "User should be linked to myoauth"); }); function validateValidator(validator) { diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js index 978aa9c3..4d52bbe3 100644 --- a/spec/CloudCode.spec.js +++ b/spec/CloudCode.spec.js @@ -7,17 +7,17 @@ describe('Cloud Code', () => { it('can load absolute cloud code file', done => { reconfigureServer({ cloud: __dirname + '/cloud/cloudCodeRelativeFile.js' }) .then(() => { - Parse.Cloud.run('cloudCodeInFile', {}, result => { + Parse.Cloud.run('cloudCodeInFile', {}).then(result => { expect(result).toEqual('It is possible to define cloud code in a file.'); done(); }); - }) + }); }); it('can load relative cloud code file', done => { reconfigureServer({ cloud: './spec/cloud/cloudCodeAbsoluteFile.js' }) .then(() => { - Parse.Cloud.run('cloudCodeInFile', {}, result => { + Parse.Cloud.run('cloudCodeInFile', {}).then(result => { expect(result).toEqual('It is possible to define cloud code in a file.'); done(); }); @@ -29,7 +29,7 @@ describe('Cloud Code', () => { res.success('Hello world!'); }); - Parse.Cloud.run('hello', {}, result => { + Parse.Cloud.run('hello', {}).then(result => { expect(result).toEqual('Hello world!'); done(); }); @@ -183,15 +183,14 @@ describe('Cloud Code', () => { const obj = req.object; if(!obj.existed()) { - const promise = new Parse.Promise(); - setTimeout(function(){ - obj.set('proof', obj.id); - obj.save().then(function(){ - promise.resolve(); - }); - }, 1000); - - return promise; + return new Promise((resolve) => { + setTimeout(function(){ + obj.set('proof', obj.id); + obj.save().then(function(){ + resolve(); + }); + }, 1000); + }); } }); @@ -218,15 +217,14 @@ describe('Cloud Code', () => { const obj = req.object; if(!obj.existed()) { - const promise = new Parse.Promise(); - setTimeout(function(){ - obj.set('proof', obj.id); - obj.save().then(function(){ - promise.resolve(); - }); - }, 1000); - - return promise; + return new Promise((resolve) => { + setTimeout(function(){ + obj.set('proof', obj.id); + obj.save().then(function(){ + resolve(); + }); + }, 1000); + }); } }); @@ -247,12 +245,11 @@ describe('Cloud Code', () => { it('test afterSave rejecting promise', function(done) { Parse.Cloud.afterSave('AfterSaveTest2', function() { - const promise = new Parse.Promise(); - setTimeout(function(){ - promise.reject("THIS SHOULD BE IGNORED"); - }, 1000); - - return promise; + return new Promise((resolve, reject) => { + setTimeout(function(){ + reject("THIS SHOULD BE IGNORED"); + }, 1000); + }); }); const obj = new Parse.Object('AfterSaveTest2'); @@ -266,18 +263,15 @@ describe('Cloud Code', () => { it('test afterDelete returning promise, object is deleted when destroy resolves', function(done) { Parse.Cloud.afterDelete('AfterDeleteTest2', function(req) { - const promise = new Parse.Promise(); - - setTimeout(function(){ - const obj = new Parse.Object('AfterDeleteTestProof'); - obj.set('proof', req.object.id); - obj.save().then(function(){ - promise.resolve(); - }); - - }, 1000); - - return promise; + return new Promise((resolve) => { + setTimeout(function(){ + const obj = new Parse.Object('AfterDeleteTestProof'); + obj.set('proof', req.object.id); + obj.save().then(function(){ + resolve(); + }); + }, 1000); + }); }); const errorHandler = function(error) { @@ -302,18 +296,15 @@ describe('Cloud Code', () => { it('test afterDelete ignoring promise, object is not yet deleted', function(done) { Parse.Cloud.afterDelete('AfterDeleteTest2', function(req) { - const promise = new Parse.Promise(); - - setTimeout(function(){ - const obj = new Parse.Object('AfterDeleteTestProof'); - obj.set('proof', req.object.id); - obj.save().then(function(){ - promise.resolve(); - }); - - }, 1000); - - return promise; + return new Promise((resolve) => { + setTimeout(function(){ + const obj = new Parse.Object('AfterDeleteTestProof'); + obj.set('proof', req.object.id); + obj.save().then(function(){ + resolve(); + }); + }, 1000); + }); }); const errorHandler = function(error) { @@ -666,7 +657,7 @@ describe('Cloud Code', () => { }); }); - it('test save triggers get user', function(done) { + it('test save triggers get user', async (done) => { Parse.Cloud.beforeSave('SaveTriggerUser', function(req, res) { if (req.user && req.user.id) { res.success(); @@ -685,16 +676,13 @@ describe('Cloud Code', () => { user.set("password", "asdf"); user.set("email", "asdf@example.com"); user.set("username", "zxcv"); - user.signUp(null, { - success: function() { - const obj = new Parse.Object('SaveTriggerUser'); - obj.save().then(function() { - done(); - }, function(error) { - fail(error); - done(); - }); - } + await user.signUp(); + const obj = new Parse.Object('SaveTriggerUser'); + obj.save().then(function() { + done(); + }, function(error) { + fail(error); + done(); }); }); @@ -821,7 +809,7 @@ describe('Cloud Code', () => { 'X-Parse-Session-Token': session2, } })) - .then(() => Parse.Promise.all([cacheAdapter.get('test:user:' + session1), cacheAdapter.get('test:user:' + session2)])) + .then(() => Promise.all([cacheAdapter.get('test:user:' + session1), cacheAdapter.get('test:user:' + session2)])) .then(cachedVals => { expect(cachedVals[0].objectId).toEqual(user.id); expect(cachedVals[1].objectId).toEqual(user.id); @@ -1006,7 +994,7 @@ describe('Cloud Code', () => { expect(objectAgain.get('remove')).toBeUndefined(); expect(object.get('remove')).toBeUndefined(); done(); - }).fail((err) => { + }).catch((err) => { jfail(err); done(); }); @@ -1031,7 +1019,7 @@ describe('Cloud Code', () => { // Originally it would throw as it would be a non-relation expect(() => { objectAgain.relation('testsRelation') }).not.toThrow(); done(); - }).fail((err) => { + }).catch((err) => { jfail(err); done(); }) @@ -1669,14 +1657,14 @@ describe('afterFind hooks', () => { it('should also work with promise',(done) => { Parse.Cloud.afterFind('MyObject', (req) => { - const promise = new Parse.Promise(); - setTimeout(function(){ - for(let i = 0 ; i < req.objects.length ; i++){ - req.objects[i].set("secretField","###"); - } - promise.resolve(req.objects); - }, 1000); - return promise; + return new Promise((resolve) => { + setTimeout(function(){ + for(let i = 0 ; i < req.objects.length ; i++){ + req.objects[i].set("secretField","###"); + } + resolve(req.objects); + }, 1000); + }); }); const obj = new Parse.Object('MyObject'); obj.set('secretField', 'SSID'); diff --git a/spec/FilesController.spec.js b/spec/FilesController.spec.js index 21432793..dd88399a 100644 --- a/spec/FilesController.spec.js +++ b/spec/FilesController.spec.js @@ -6,7 +6,7 @@ const FilesController = require('../lib/Controllers/FilesController').default; const mockAdapter = { createFile: () => { - return Parse.Promise.reject(new Error('it failed')); + return Promise.reject(new Error('it failed')); }, deleteFile: () => { }, getFileData: () => { }, @@ -46,9 +46,10 @@ describe("FilesController", () => { .then(() => new Parse.File("yolo.txt", [1, 2, 3], "text/plain").save()) .then( () => done.fail('should not succeed'), - () => setImmediate(() => Parse.Promise.as('done')) + () => setImmediate(() => Promise.resolve('done')) ) - .then(() => logController.getLogs({ from: Date.now() - 500, size: 1000 })) + .then(() => new Promise(resolve => setTimeout(resolve, 200))) + .then(() => logController.getLogs({ from: Date.now() - 1000, size: 1000 })) .then((logs) => { // we get two logs here: 1. the source of the failure to save the file // and 2 the message that will be sent back to the client. diff --git a/spec/ParseACL.spec.js b/spec/ParseACL.spec.js index 3069bd12..24c4d6a8 100644 --- a/spec/ParseACL.spec.js +++ b/spec/ParseACL.spec.js @@ -15,721 +15,516 @@ describe('Parse.ACL', () => { }), "setACL should have returned false."); }); - it("refresh object with acl", (done) => { + it("refresh object with acl", async (done) => { // Create an object owned by Alice. const user = new Parse.User(); user.set("username", "alice"); user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - // Refreshing the object should succeed. - object.fetch({ - success: function() { - done(); - } - }); - } - }); - } + await user.signUp(null); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + await object.fetch(); + done(); + }); + + it("acl an object owned by one user and public get", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp(); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + await Parse.User.logOut(); + const query = new Parse.Query(TestObject); + try { + await query.get(object.id); + done.fail('Should not have retrieved the object.'); + } catch(error) { + equal(error.code, Parse.Error.OBJECT_NOT_FOUND); + done(); + } + }); + + it("acl an object owned by one user and public find", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp(); + + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save() + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + // Start making requests by the public, which should all fail. + await Parse.User.logOut() + // Find + const query = new Parse.Query(TestObject); + const results = await query.find(); + equal(results.length, 0); + done(); + }); + + it("acl an object owned by one user and public update", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp(); + + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + // Start making requests by the public, which should all fail. + await Parse.User.logOut() + // Update + object.set("foo", "bar"); + try { + await object.save() + done.fail('Should not have been able to update the object.'); + } catch(err) { + equal(err.code, Parse.Error.OBJECT_NOT_FOUND); + done(); + } + }); + + it("acl an object owned by one user and public delete", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp() + + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + // Start making requests by the public, which should all fail. + await Parse.User.logOut() + try { + await object.destroy() + done.fail('destroy should fail'); + } catch(error) { + expect(error.code).toEqual(Parse.Error.OBJECT_NOT_FOUND); + done(); + } + }); + + it("acl an object owned by one user and logged in get", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp() + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + await Parse.User.logOut(); + await Parse.User.logIn("alice", "wonderland"); + // Get + const query = new Parse.Query(TestObject); + const result = await query.get(object.id); + ok(result); + equal(result.id, object.id); + equal(result.getACL().getReadAccess(user), true); + equal(result.getACL().getWriteAccess(user), true); + equal(result.getACL().getPublicReadAccess(), false); + equal(result.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + done(); + }); + + it("acl an object owned by one user and logged in find", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp(); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + await Parse.User.logOut() + await Parse.User.logIn("alice", "wonderland"); + // Find + const query = new Parse.Query(TestObject); + const results = await query.find(); + equal(results.length, 1); + const result = results[0]; + ok(result); + if (!result) { + return fail(); + } + equal(result.id, object.id); + equal(result.getACL().getReadAccess(user), true); + equal(result.getACL().getWriteAccess(user), true); + equal(result.getACL().getPublicReadAccess(), false); + equal(result.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + done(); + }); + + it("acl an object owned by one user and logged in update", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp(); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + await Parse.User.logOut(); + await Parse.User.logIn("alice", "wonderland"); + // Update + object.set("foo", "bar"); + await object.save(); + done(); + }); + + it("acl an object owned by one user and logged in delete", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp(); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save() + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + await Parse.User.logOut() + await Parse.User.logIn("alice", "wonderland"); + // Delete + await object.destroy(); + done(); + }); + + it("acl making an object publicly readable and public get", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp(); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + // Now make it public. + object.getACL().setPublicReadAccess(true); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), true); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + await Parse.User.logOut() + // Get + const query = new Parse.Query(TestObject); + const result = await query.get(object.id); + ok(result); + equal(result.id, object.id); + done(); + }); + + it("acl making an object publicly readable and public find", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp(); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + // Now make it public. + object.getACL().setPublicReadAccess(true); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), true); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + await Parse.User.logOut() + // Find + const query = new Parse.Query(TestObject); + const results = await query.find(); + equal(results.length, 1); + const result = results[0]; + ok(result); + equal(result.id, object.id); + done(); + }); + + it("acl making an object publicly readable and public update", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp(); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + // Now make it public. + object.getACL().setPublicReadAccess(true); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), true); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + await Parse.User.logOut() + object.set("foo", "bar"); + object.save().then(() => { + fail('the save should fail'); + }, error => { + expect(error.code).toEqual(Parse.Error.OBJECT_NOT_FOUND); + done(); }); }); - it("acl an object owned by one user and public get", (done) => { + it("acl making an object publicly readable and public delete", async (done) => { // Create an object owned by Alice. const user = new Parse.User(); user.set("username", "alice"); user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - // Start making requests by the public, which should all fail. - Parse.User.logOut() - .then(() => { - // Get - const query = new Parse.Query(TestObject); - query.get(object.id, { - success: function() { - fail('Should not have retrieved the object.'); - done(); - }, - error: function(model, error) { - equal(error.code, Parse.Error.OBJECT_NOT_FOUND); - done(); - } - }); - }); - } - }); - } + await user.signUp(); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + // Now make it public. + object.getACL().setPublicReadAccess(true); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), true); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + Parse.User.logOut() + .then(() => object.destroy()) + .then(() => { + fail('expected failure'); + }, error => { + expect(error.code).toEqual(Parse.Error.OBJECT_NOT_FOUND); + done(); + }); + }); + + it("acl making an object publicly writable and public get", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp(); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + // Now make it public. + object.getACL().setPublicWriteAccess(true); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), true); + ok(object.get("ACL")); + + await Parse.User.logOut() + // Get + const query = new Parse.Query(TestObject); + query.get(object.id) + .then(done.fail) + .catch((error) => { + equal(error.code, Parse.Error.OBJECT_NOT_FOUND); + done(); + }); + }); + + it("acl making an object publicly writable and public find", async (done) => { + // Create an object owned by Alice. + const user = new Parse.User(); + user.set("username", "alice"); + user.set("password", "wonderland"); + await user.signUp(); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); + + // Now make it public. + object.getACL().setPublicWriteAccess(true); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), true); + ok(object.get("ACL")); + + await Parse.User.logOut() + // Find + const query = new Parse.Query(TestObject); + query.find().then(function(results) { + equal(results.length, 0); + done(); }); }); - it("acl an object owned by one user and public find", (done) => { + it("acl making an object publicly writable and public update", async (done) => { // Create an object owned by Alice. const user = new Parse.User(); user.set("username", "alice"); user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); + await user.signUp(); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); - // Start making requests by the public, which should all fail. - Parse.User.logOut() - .then(() => { - // Find - const query = new Parse.Query(TestObject); - query.find({ - success: function(results) { - equal(results.length, 0); - done(); - } - }); - }); + // Now make it public. + object.getACL().setPublicWriteAccess(true); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), true); + ok(object.get("ACL")); - } - }); - } - }); + Parse.User.logOut() + .then(() => { + // Update + object.set("foo", "bar"); + object.save().then(done); + }); }); - it("acl an object owned by one user and public update", (done) => { + it("acl making an object publicly writable and public delete", async (done) => { // Create an object owned by Alice. const user = new Parse.User(); user.set("username", "alice"); user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); + await user.signUp(); + const object = new TestObject(); + const acl = new Parse.ACL(user); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + ok(object.get("ACL")); - // Start making requests by the public, which should all fail. - Parse.User.logOut() - .then(() => { - // Update - object.set("foo", "bar"); - object.save(null, { - success: function() { - fail('Should not have been able to update the object.'); - done(); - }, error: function(model, err) { - equal(err.code, Parse.Error.OBJECT_NOT_FOUND); - done(); - } - }); - }); - } - }); - } - }); - }); + // Now make it public. + object.getACL().setPublicWriteAccess(true); + await object.save(); + equal(object.getACL().getReadAccess(user), true); + equal(object.getACL().getWriteAccess(user), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), true); + ok(object.get("ACL")); - it("acl an object owned by one user and public delete", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - // Start making requests by the public, which should all fail. - Parse.User.logOut() - .then(() => object.destroy()) - .then(() => { - fail('destroy should fail'); - done(); - }, error => { - expect(error.code).toEqual(Parse.Error.OBJECT_NOT_FOUND); - done(); - }); - } - }); - } - }); - }); - - it("acl an object owned by one user and logged in get", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - Parse.User.logOut() - .then(() => { - Parse.User.logIn("alice", "wonderland", { - success: function() { - // Get - const query = new Parse.Query(TestObject); - query.get(object.id, { - success: function(result) { - ok(result); - equal(result.id, object.id); - equal(result.getACL().getReadAccess(user), true); - equal(result.getACL().getWriteAccess(user), true); - equal(result.getACL().getPublicReadAccess(), false); - equal(result.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - done(); - } - }); - } - }); - }); - } - }); - } - }); - }); - - it("acl an object owned by one user and logged in find", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - Parse.User.logOut() - .then(() => { - Parse.User.logIn("alice", "wonderland", { - success: function() { - // Find - const query = new Parse.Query(TestObject); - query.find({ - success: function(results) { - equal(results.length, 1); - const result = results[0]; - ok(result); - if (!result) { - return fail(); - } - equal(result.id, object.id); - equal(result.getACL().getReadAccess(user), true); - equal(result.getACL().getWriteAccess(user), true); - equal(result.getACL().getPublicReadAccess(), false); - equal(result.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - done(); - } - }); - } - }); - }); - } - }); - } - }); - }); - - it("acl an object owned by one user and logged in update", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - Parse.User.logOut() - .then(() => { - Parse.User.logIn("alice", "wonderland", { - success: function() { - // Update - object.set("foo", "bar"); - object.save(null, { - success: function() { - done(); - } - }); - } - }); - }); - } - }); - } - }); - }); - - it("acl an object owned by one user and logged in delete", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - Parse.User.logOut() - .then(() => { - Parse.User.logIn("alice", "wonderland", { - success: function() { - // Delete - object.destroy({ - success: function() { - done(); - } - }); - } - }); - }); - } - }); - } - }); - }); - - it("acl making an object publicly readable and public get", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - // Now make it public. - object.getACL().setPublicReadAccess(true); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), true); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - Parse.User.logOut() - .then(() => { - // Get - const query = new Parse.Query(TestObject); - query.get(object.id, { - success: function(result) { - ok(result); - equal(result.id, object.id); - done(); - } - }); - }); - } - }); - } - }); - } - }); - }); - - it("acl making an object publicly readable and public find", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - // Now make it public. - object.getACL().setPublicReadAccess(true); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), true); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - Parse.User.logOut() - .then(() => { - // Find - const query = new Parse.Query(TestObject); - query.find({ - success: function(results) { - equal(results.length, 1); - const result = results[0]; - ok(result); - equal(result.id, object.id); - done(); - } - }); - }); - } - }); - } - }); - } - }); - }); - - it("acl making an object publicly readable and public update", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - // Now make it public. - object.getACL().setPublicReadAccess(true); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), true); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - Parse.User.logOut() - .then(() => { - // Update - object.set("foo", "bar"); - object.save().then(() => { - fail('the save should fail'); - }, error => { - expect(error.code).toEqual(Parse.Error.OBJECT_NOT_FOUND); - done(); - }); - }); - } - }); - } - }); - } - }); - }); - - it("acl making an object publicly readable and public delete", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - // Now make it public. - object.getACL().setPublicReadAccess(true); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), true); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - Parse.User.logOut() - .then(() => object.destroy()) - .then(() => { - fail('expected failure'); - }, error => { - expect(error.code).toEqual(Parse.Error.OBJECT_NOT_FOUND); - done(); - }); - } - }); - } - }); - } - }); - }); - - it("acl making an object publicly writable and public get", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - // Now make it public. - object.getACL().setPublicWriteAccess(true); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), true); - ok(object.get("ACL")); - - Parse.User.logOut() - .then(() => { - // Get - const query = new Parse.Query(TestObject); - query.get(object.id, { - error: function(model, error) { - equal(error.code, Parse.Error.OBJECT_NOT_FOUND); - done(); - } - }); - }); - } - }); - } - }); - } - }); - }); - - it("acl making an object publicly writable and public find", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - // Now make it public. - object.getACL().setPublicWriteAccess(true); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), true); - ok(object.get("ACL")); - - Parse.User.logOut() - .then(() => { - // Find - const query = new Parse.Query(TestObject); - query.find({ - success: function(results) { - equal(results.length, 0); - done(); - } - }); - }); - } - }); - } - }); - } - }); - }); - - it("acl making an object publicly writable and public update", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - // Now make it public. - object.getACL().setPublicWriteAccess(true); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), true); - ok(object.get("ACL")); - - Parse.User.logOut() - .then(() => { - // Update - object.set("foo", "bar"); - object.save(null, { - success: function() { - done(); - } - }); - }); - } - }); - } - }); - } - }); - }); - - it("acl making an object publicly writable and public delete", (done) => { - // Create an object owned by Alice. - const user = new Parse.User(); - user.set("username", "alice"); - user.set("password", "wonderland"); - user.signUp(null, { - success: function() { - const object = new TestObject(); - const acl = new Parse.ACL(user); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - ok(object.get("ACL")); - - // Now make it public. - object.getACL().setPublicWriteAccess(true); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(user), true); - equal(object.getACL().getWriteAccess(user), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), true); - ok(object.get("ACL")); - - Parse.User.logOut() - .then(() => { - // Delete - object.destroy({ - success: function() { - done(); - } - }); - }); - } - }); - } - }); - } - }); + Parse.User.logOut() + .then(() => { + // Delete + object.destroy().then(done); + }); }); it("acl making an object privately writable (#3194)", (done) => { @@ -764,460 +559,305 @@ describe('Parse.ACL', () => { }); }); - it("acl sharing with another user and get", (done) => { + it("acl sharing with another user and get", async (done) => { // Sign in as Bob. - Parse.User.signUp("bob", "pass", null, { - success: function(bob) { - Parse.User.logOut() - .then(() => { - // Sign in as Alice. - Parse.User.signUp("alice", "wonderland", null, { - success: function(alice) { - // Create an object shared by Bob and Alice. - const object = new TestObject(); - const acl = new Parse.ACL(alice); - acl.setWriteAccess(bob, true); - acl.setReadAccess(bob, true); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(alice), true); - equal(object.getACL().getWriteAccess(alice), true); - equal(object.getACL().getReadAccess(bob), true); - equal(object.getACL().getWriteAccess(bob), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); + const bob = await Parse.User.signUp("bob", "pass"); + await Parse.User.logOut() - // Sign in as Bob again. - Parse.User.logIn("bob", "pass", { - success: function() { - const query = new Parse.Query(TestObject); - query.get(object.id, { - success: function(result) { - ok(result); - equal(result.id, object.id); - done(); - } - }); - } - }); - } - }); - } - }); - }); - } + const alice = await Parse.User.signUp("alice", "wonderland"); + // Create an object shared by Bob and Alice. + const object = new TestObject(); + const acl = new Parse.ACL(alice); + acl.setWriteAccess(bob, true); + acl.setReadAccess(bob, true); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(alice), true); + equal(object.getACL().getWriteAccess(alice), true); + equal(object.getACL().getReadAccess(bob), true); + equal(object.getACL().getWriteAccess(bob), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + + // Sign in as Bob again. + await Parse.User.logIn("bob", "pass"); + const query = new Parse.Query(TestObject); + query.get(object.id).then((result) => { + ok(result); + equal(result.id, object.id); + done(); }); }); - it("acl sharing with another user and find", (done) => { + it("acl sharing with another user and find", async (done) => { // Sign in as Bob. - Parse.User.signUp("bob", "pass", null, { - success: function(bob) { - Parse.User.logOut() - .then(() => { - // Sign in as Alice. - Parse.User.signUp("alice", "wonderland", null, { - success: function(alice) { - // Create an object shared by Bob and Alice. - const object = new TestObject(); - const acl = new Parse.ACL(alice); - acl.setWriteAccess(bob, true); - acl.setReadAccess(bob, true); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(alice), true); - equal(object.getACL().getWriteAccess(alice), true); - equal(object.getACL().getReadAccess(bob), true); - equal(object.getACL().getWriteAccess(bob), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); + const bob = await Parse.User.signUp("bob", "pass"); + await Parse.User.logOut() + // Sign in as Alice. + const alice = await Parse.User.signUp("alice", "wonderland"); + // Create an object shared by Bob and Alice. + const object = new TestObject(); + const acl = new Parse.ACL(alice); + acl.setWriteAccess(bob, true); + acl.setReadAccess(bob, true); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(alice), true); + equal(object.getACL().getWriteAccess(alice), true); + equal(object.getACL().getReadAccess(bob), true); + equal(object.getACL().getWriteAccess(bob), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); - // Sign in as Bob again. - Parse.User.logIn("bob", "pass", { - success: function() { - const query = new Parse.Query(TestObject); - query.find({ - success: function(results) { - equal(results.length, 1); - const result = results[0]; - ok(result); - if (!result) { - fail("should have result"); - } else { - equal(result.id, object.id); - } - done(); - } - }); - } - }); - } - }); - } - }); - }); + // Sign in as Bob again. + await Parse.User.logIn("bob", "pass"); + const query = new Parse.Query(TestObject); + query.find().then((results) => { + equal(results.length, 1); + const result = results[0]; + ok(result); + if (!result) { + fail("should have result"); + } else { + equal(result.id, object.id); } + done(); }); }); - it("acl sharing with another user and update", (done) => { + it("acl sharing with another user and update", async (done) => { // Sign in as Bob. - Parse.User.signUp("bob", "pass", null, { - success: function(bob) { - Parse.User.logOut() - .then(() => { - // Sign in as Alice. - Parse.User.signUp("alice", "wonderland", null, { - success: function(alice) { - // Create an object shared by Bob and Alice. - const object = new TestObject(); - const acl = new Parse.ACL(alice); - acl.setWriteAccess(bob, true); - acl.setReadAccess(bob, true); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(alice), true); - equal(object.getACL().getWriteAccess(alice), true); - equal(object.getACL().getReadAccess(bob), true); - equal(object.getACL().getWriteAccess(bob), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); + const bob = await Parse.User.signUp("bob", "pass"); + await Parse.User.logOut() + // Sign in as Alice. + const alice = await Parse.User.signUp("alice", "wonderland"); + // Create an object shared by Bob and Alice. + const object = new TestObject(); + const acl = new Parse.ACL(alice); + acl.setWriteAccess(bob, true); + acl.setReadAccess(bob, true); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(alice), true); + equal(object.getACL().getWriteAccess(alice), true); + equal(object.getACL().getReadAccess(bob), true); + equal(object.getACL().getWriteAccess(bob), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); - // Sign in as Bob again. - Parse.User.logIn("bob", "pass", { - success: function() { - object.set("foo", "bar"); - object.save(null, { - success: function() { - done(); - } - }); - } - }); - } - }); - } - }); - }); - } + // Sign in as Bob again. + await Parse.User.logIn("bob", "pass"); + object.set("foo", "bar"); + object.save().then(done); + }); + + it("acl sharing with another user and delete", async (done) => { + // Sign in as Bob. + const bob = await Parse.User.signUp("bob", "pass"); + await Parse.User.logOut(); + // Sign in as Alice. + const alice = await Parse.User.signUp("alice", "wonderland"); + // Create an object shared by Bob and Alice. + const object = new TestObject(); + const acl = new Parse.ACL(alice); + acl.setWriteAccess(bob, true); + acl.setReadAccess(bob, true); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(alice), true); + equal(object.getACL().getWriteAccess(alice), true); + equal(object.getACL().getReadAccess(bob), true); + equal(object.getACL().getWriteAccess(bob), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + + // Sign in as Bob again. + await Parse.User.logIn("bob", "pass"); + object.set("foo", "bar"); + object.destroy().then(done); + }); + + it("acl sharing with another user and public get", async (done) => { + const bob = await Parse.User.signUp("bob", "pass"); + await Parse.User.logOut(); + // Sign in as Alice. + const alice = await Parse.User.signUp("alice", "wonderland"); + // Create an object shared by Bob and Alice. + const object = new TestObject(); + const acl = new Parse.ACL(alice); + acl.setWriteAccess(bob, true); + acl.setReadAccess(bob, true); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(alice), true); + equal(object.getACL().getWriteAccess(alice), true); + equal(object.getACL().getReadAccess(bob), true); + equal(object.getACL().getWriteAccess(bob), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + // Start making requests by the public. + await Parse.User.logOut() + const query = new Parse.Query(TestObject); + query.get(object.id).then((result) => { + fail(result); + }, (error) => { + expect(error.code).toEqual(Parse.Error.OBJECT_NOT_FOUND); + done(); }); }); - it("acl sharing with another user and delete", (done) => { - // Sign in as Bob. - Parse.User.signUp("bob", "pass", null, { - success: function(bob) { - Parse.User.logOut() - .then(() => { - // Sign in as Alice. - Parse.User.signUp("alice", "wonderland", null, { - success: function(alice) { - // Create an object shared by Bob and Alice. - const object = new TestObject(); - const acl = new Parse.ACL(alice); - acl.setWriteAccess(bob, true); - acl.setReadAccess(bob, true); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(alice), true); - equal(object.getACL().getWriteAccess(alice), true); - equal(object.getACL().getReadAccess(bob), true); - equal(object.getACL().getWriteAccess(bob), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); + it("acl sharing with another user and public find", async (done) => { + const bob = await Parse.User.signUp("bob", "pass"); + await Parse.User.logOut(); + // Sign in as Alice. + const alice = await Parse.User.signUp("alice", "wonderland"); + // Create an object shared by Bob and Alice. + const object = new TestObject(); + const acl = new Parse.ACL(alice); + acl.setWriteAccess(bob, true); + acl.setReadAccess(bob, true); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(alice), true); + equal(object.getACL().getWriteAccess(alice), true); + equal(object.getACL().getReadAccess(bob), true); + equal(object.getACL().getWriteAccess(bob), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); - // Sign in as Bob again. - Parse.User.logIn("bob", "pass", { - success: function() { - object.set("foo", "bar"); - object.destroy({ - success: function() { - done(); - } - }); - } - }); - } - }); - } - }); - }); - } - }); - }); - - it("acl sharing with another user and public get", (done) => { - // Sign in as Bob. - Parse.User.signUp("bob", "pass", null, { - success: function(bob) { - Parse.User.logOut() - .then(() => { - // Sign in as Alice. - Parse.User.signUp("alice", "wonderland", null, { - success: function(alice) { - // Create an object shared by Bob and Alice. - const object = new TestObject(); - const acl = new Parse.ACL(alice); - acl.setWriteAccess(bob, true); - acl.setReadAccess(bob, true); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(alice), true); - equal(object.getACL().getWriteAccess(alice), true); - equal(object.getACL().getReadAccess(bob), true); - equal(object.getACL().getWriteAccess(bob), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - - // Start making requests by the public. - Parse.User.logOut() - .then(() => { - const query = new Parse.Query(TestObject); - query.get(object.id).then((result) => { - fail(result); - }, (error) => { - expect(error.code).toEqual(Parse.Error.OBJECT_NOT_FOUND); - done(); - }); - }); - } - }); - } - }); - }); - } - }); - }); - - it("acl sharing with another user and public find", (done) => { - // Sign in as Bob. - Parse.User.signUp("bob", "pass", null, { - success: function(bob) { - Parse.User.logOut() - .then(() => { - // Sign in as Alice. - Parse.User.signUp("alice", "wonderland", null, { - success: function(alice) { - // Create an object shared by Bob and Alice. - const object = new TestObject(); - const acl = new Parse.ACL(alice); - acl.setWriteAccess(bob, true); - acl.setReadAccess(bob, true); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(alice), true); - equal(object.getACL().getWriteAccess(alice), true); - equal(object.getACL().getReadAccess(bob), true); - equal(object.getACL().getWriteAccess(bob), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - - // Start making requests by the public. - Parse.User.logOut() - .then(() => { - const query = new Parse.Query(TestObject); - query.find({ - success: function(results) { - equal(results.length, 0); - done(); - } - }); - }); - } - }); - } - }); - }); - } - }); - }); - - it("acl sharing with another user and public update", (done) => { - // Sign in as Bob. - Parse.User.signUp("bob", "pass", null, { - success: function(bob) { - Parse.User.logOut() - .then(() => { - // Sign in as Alice. - Parse.User.signUp("alice", "wonderland", null, { - success: function(alice) { - // Create an object shared by Bob and Alice. - const object = new TestObject(); - const acl = new Parse.ACL(alice); - acl.setWriteAccess(bob, true); - acl.setReadAccess(bob, true); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(alice), true); - equal(object.getACL().getWriteAccess(alice), true); - equal(object.getACL().getReadAccess(bob), true); - equal(object.getACL().getWriteAccess(bob), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - - // Start making requests by the public. - Parse.User.logOut() - .then(() => { - object.set("foo", "bar"); - object.save().then(() => { - fail('expected failure'); - }, (error) => { - expect(error.code).toEqual(Parse.Error.OBJECT_NOT_FOUND); - done(); - }); - }); - } - }); - } - }); - }); - } - }); - }); - - it("acl sharing with another user and public delete", (done) => { - // Sign in as Bob. - Parse.User.signUp("bob", "pass", null, { - success: function(bob) { - Parse.User.logOut() - .then(() => { - // Sign in as Alice. - Parse.User.signUp("alice", "wonderland", null, { - success: function(alice) { - // Create an object shared by Bob and Alice. - const object = new TestObject(); - const acl = new Parse.ACL(alice); - acl.setWriteAccess(bob, true); - acl.setReadAccess(bob, true); - object.setACL(acl); - object.save(null, { - success: function() { - equal(object.getACL().getReadAccess(alice), true); - equal(object.getACL().getWriteAccess(alice), true); - equal(object.getACL().getReadAccess(bob), true); - equal(object.getACL().getWriteAccess(bob), true); - equal(object.getACL().getPublicReadAccess(), false); - equal(object.getACL().getPublicWriteAccess(), false); - - // Start making requests by the public. - Parse.User.logOut() - .then(() => object.destroy()) - .then(() => { - fail('expected failure'); - }, (error) => { - expect(error.code).toEqual(Parse.Error.OBJECT_NOT_FOUND); - done(); - }); - } - }); - } - }); - }); - } - }); - }); - - it("acl saveAll with permissions", (done) => { - Parse.User.signUp("alice", "wonderland", null, { - success: function(alice) { - const acl = new Parse.ACL(alice); - - const object1 = new TestObject(); - const object2 = new TestObject(); - object1.setACL(acl); - object2.setACL(acl); - Parse.Object.saveAll([object1, object2], { - success: function() { - equal(object1.getACL().getReadAccess(alice), true); - equal(object1.getACL().getWriteAccess(alice), true); - equal(object1.getACL().getPublicReadAccess(), false); - equal(object1.getACL().getPublicWriteAccess(), false); - equal(object2.getACL().getReadAccess(alice), true); - equal(object2.getACL().getWriteAccess(alice), true); - equal(object2.getACL().getPublicReadAccess(), false); - equal(object2.getACL().getPublicWriteAccess(), false); - - // Save all the objects after updating them. - object1.set("foo", "bar"); - object2.set("foo", "bar"); - Parse.Object.saveAll([object1, object2], { - success: function() { - const query = new Parse.Query(TestObject); - query.equalTo("foo", "bar"); - query.find({ - success: function(results) { - equal(results.length, 2); - done(); - } - }); - } - }); - } + // Start making requests by the public. + Parse.User.logOut() + .then(() => { + const query = new Parse.Query(TestObject); + query.find().then(function(results) { + equal(results.length, 0); + done(); }); - } + }); + }); + + it("acl sharing with another user and public update", async (done) => { + // Sign in as Bob. + const bob = await Parse.User.signUp("bob", "pass"); + await Parse.User.logOut(); + // Sign in as Alice. + const alice = await Parse.User.signUp("alice", "wonderland"); + // Create an object shared by Bob and Alice. + const object = new TestObject(); + const acl = new Parse.ACL(alice); + acl.setWriteAccess(bob, true); + acl.setReadAccess(bob, true); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(alice), true); + equal(object.getACL().getWriteAccess(alice), true); + equal(object.getACL().getReadAccess(bob), true); + equal(object.getACL().getWriteAccess(bob), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + + // Start making requests by the public. + Parse.User.logOut() + .then(() => { + object.set("foo", "bar"); + object.save().then(() => { + fail('expected failure'); + }, (error) => { + expect(error.code).toEqual(Parse.Error.OBJECT_NOT_FOUND); + done(); + }); + }); + }); + + it("acl sharing with another user and public delete", async (done) => { + // Sign in as Bob. + const bob = await Parse.User.signUp("bob", "pass"); + await Parse.User.logOut(); + // Sign in as Alice. + const alice = await Parse.User.signUp("alice", "wonderland"); + // Create an object shared by Bob and Alice. + const object = new TestObject(); + const acl = new Parse.ACL(alice); + acl.setWriteAccess(bob, true); + acl.setReadAccess(bob, true); + object.setACL(acl); + await object.save(); + equal(object.getACL().getReadAccess(alice), true); + equal(object.getACL().getWriteAccess(alice), true); + equal(object.getACL().getReadAccess(bob), true); + equal(object.getACL().getWriteAccess(bob), true); + equal(object.getACL().getPublicReadAccess(), false); + equal(object.getACL().getPublicWriteAccess(), false); + + // Start making requests by the public. + Parse.User.logOut() + .then(() => object.destroy()) + .then(() => { + fail('expected failure'); + }, (error) => { + expect(error.code).toEqual(Parse.Error.OBJECT_NOT_FOUND); + done(); + }); + }); + + it("acl saveAll with permissions", async (done) => { + const alice = await Parse.User.signUp("alice", "wonderland"); + const acl = new Parse.ACL(alice); + const object1 = new TestObject(); + const object2 = new TestObject(); + object1.setACL(acl); + object2.setACL(acl); + await Parse.Object.saveAll([object1, object2]); + equal(object1.getACL().getReadAccess(alice), true); + equal(object1.getACL().getWriteAccess(alice), true); + equal(object1.getACL().getPublicReadAccess(), false); + equal(object1.getACL().getPublicWriteAccess(), false); + equal(object2.getACL().getReadAccess(alice), true); + equal(object2.getACL().getWriteAccess(alice), true); + equal(object2.getACL().getPublicReadAccess(), false); + equal(object2.getACL().getPublicWriteAccess(), false); + + // Save all the objects after updating them. + object1.set("foo", "bar"); + object2.set("foo", "bar"); + await Parse.Object.saveAll([object1, object2]); + const query = new Parse.Query(TestObject); + query.equalTo("foo", "bar"); + query.find().then(function(results) { + equal(results.length, 2); + done(); }); }); - it("empty acl works", (done) => { - Parse.User.signUp("tdurden", "mayhem", { + it("empty acl works", async (done) => { + await Parse.User.signUp("tdurden", "mayhem", { ACL: new Parse.ACL(), foo: "bar" - }, { - success: function() { - Parse.User.logOut() - .then(() => { - Parse.User.logIn("tdurden", "mayhem", { - success: function(user) { - equal(user.get("foo"), "bar"); - done(); - }, - error: function(user, error) { - ok(null, "Error " + error.id + ": " + error.message); - done(); - } - }); - }); - }, - error: function(user, error) { - ok(null, "Error " + error.id + ": " + error.message); - done(); - } }); + + await Parse.User.logOut() + const user = await Parse.User.logIn("tdurden", "mayhem"); + equal(user.get("foo"), "bar"); + done(); }); - it("query for included object with ACL works", (done) => { + it("query for included object with ACL works", async (done) => { const obj1 = new Parse.Object("TestClass1"); const obj2 = new Parse.Object("TestClass2"); const acl = new Parse.ACL(); acl.setPublicReadAccess(true); obj2.set("ACL", acl); obj1.set("other", obj2); - obj1.save(null, expectSuccess({ - success: function() { - obj2._clearServerData(); - const query = new Parse.Query("TestClass1"); - query.first(expectSuccess({ - success: function(obj1Again) { - ok(!obj1Again.get("other").get("ACL")); + await obj1.save(); + obj2._clearServerData(); + const query = new Parse.Query("TestClass1"); + const obj1Again = await query.first(); + ok(!obj1Again.get("other").get("ACL")); - query.include("other"); - query.first(expectSuccess({ - success: function(obj1AgainWithInclude) { - ok(obj1AgainWithInclude.get("other").get("ACL")); - done(); - } - })); - } - })); - } - })); + query.include("other"); + const obj1AgainWithInclude = await query.first(); + ok(obj1AgainWithInclude.get("other").get("ACL")); + done(); }); it('restricted ACL does not have public access', (done) => { diff --git a/spec/ParseAPI.spec.js b/spec/ParseAPI.spec.js index 5d3861fe..94be6a4d 100644 --- a/spec/ParseAPI.spec.js +++ b/spec/ParseAPI.spec.js @@ -10,6 +10,12 @@ const SchemaController = require('../lib/Controllers/SchemaController'); const TestUtils = require('../lib/TestUtils'); const userSchema = SchemaController.convertSchemaToAdapterSchema({ className: '_User', fields: Object.assign({}, SchemaController.defaultColumns._Default, SchemaController.defaultColumns._User) }); +const headers = { + 'Content-Type': 'application/json', + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest', + 'X-Parse-Installation-Id': 'yolo' +} describe_only_db('mongo')('miscellaneous', () => { it('test rest_create_app', function(done) { @@ -29,7 +35,7 @@ describe_only_db('mongo')('miscellaneous', () => { expect(results.length).toEqual(1); expect(results[0]['foo']).toEqual('bar'); done(); - }).fail(error => { + }).catch(error => { fail(JSON.stringify(error)); done(); }) @@ -44,113 +50,108 @@ describe('miscellaneous', function() { expect(typeof obj.id).toBe('string'); expect(typeof obj.createdAt.toGMTString()).toBe('string'); done(); - }, error => { - fail(JSON.stringify(error)); - done(); - }); + }, done.fail); }); it('get a TestObject', function(done) { - create({ 'bloop' : 'blarg' }, function(obj) { + create({ 'bloop' : 'blarg' }, async function(obj) { const t2 = new TestObject({ objectId: obj.id }); - t2.fetch({ - success: function(obj2) { - expect(obj2.get('bloop')).toEqual('blarg'); - expect(obj2.id).toBeTruthy(); - expect(obj2.id).toEqual(obj.id); - done(); - }, - error: error => { - fail(JSON.stringify(error)); - done(); - } - }); + const obj2 = await t2.fetch(); + expect(obj2.get('bloop')).toEqual('blarg'); + expect(obj2.id).toBeTruthy(); + expect(obj2.id).toEqual(obj.id); + done(); }); }); it('create a valid parse user', function(done) { - createTestUser(function(data) { + createTestUser().then(function(data) { expect(data.id).not.toBeUndefined(); expect(data.getSessionToken()).not.toBeUndefined(); expect(data.get('password')).toBeUndefined(); done(); - }, error => { - fail(JSON.stringify(error)); - done(); - }); + }, done.fail); }); - it('fail to create a duplicate username', done => { - let numCreated = 0; - let numFailed = 0; - const p1 = createTestUser(); - p1.then(() => { - numCreated++; - expect(numCreated).toEqual(1); - }) - .catch(error => { - numFailed++; - expect(numFailed).toEqual(1); - expect(error.code).toEqual(Parse.Error.USERNAME_TAKEN); - }); - const p2 = createTestUser(); - p2.then(() => { - numCreated++; - expect(numCreated).toEqual(1); - }) - .catch(error => { - numFailed++; - expect(numFailed).toEqual(1); - expect(error.code).toEqual(Parse.Error.USERNAME_TAKEN); - }); - Parse.Promise.when([p1, p2]) - .then(() => { - fail('one of the users should not have been created'); - done(); - }) - .catch(done); - }); - - it('ensure that email is uniquely indexed', done => { + it('fail to create a duplicate username', async () => { let numFailed = 0; let numCreated = 0; - const user1 = new Parse.User(); - user1.setPassword('asdf'); - user1.setUsername('u1'); - user1.setEmail('dupe@dupe.dupe'); - const p1 = user1.signUp(); - p1.then(() => { + const p1 = rp.post(Parse.serverURL + '/users', { + json: { + password: 'asdf', + username: 'u1', + email: 'dupe@dupe.dupe' + }, + headers + }).then(() => { numCreated++; expect(numCreated).toEqual(1); - }, error => { + }, ({ error }) => { + numFailed++; + expect(error.code).toEqual(Parse.Error.USERNAME_TAKEN); + }); + + const p2 = rp.post(Parse.serverURL + '/users', { + json: { + password: 'otherpassword', + username: 'u1', + email: 'email@other.email' + }, + headers + }).then(() => { + numCreated++; + }, ({ error }) => { + numFailed++; + expect(error.code).toEqual(Parse.Error.USERNAME_TAKEN); + }); + + await Promise.all([p1, p2]) + expect(numFailed).toEqual(1); + expect(numCreated).toBe(1); + }); + + it('ensure that email is uniquely indexed', async () => { + let numFailed = 0; + let numCreated = 0; + const p1 = rp.post(Parse.serverURL + '/users', { + json: { + password: 'asdf', + username: 'u1', + email: 'dupe@dupe.dupe' + }, + headers + }).then(() => { + numCreated++; + expect(numCreated).toEqual(1); + }, ({ error }) => { numFailed++; - expect(numFailed).toEqual(1); expect(error.code).toEqual(Parse.Error.EMAIL_TAKEN); }); - const user2 = new Parse.User(); - user2.setPassword('asdf'); - user2.setUsername('u2'); - user2.setEmail('dupe@dupe.dupe'); - const p2 = user2.signUp(); - p2.then(() => { + const p2 = rp.post(Parse.serverURL + '/users', { + json: { + password: 'asdf', + username: 'u2', + email: 'dupe@dupe.dupe' + }, + headers + }).then(() => { numCreated++; expect(numCreated).toEqual(1); - }, error => { + }, ({ error }) => { numFailed++; - expect(numFailed).toEqual(1); expect(error.code).toEqual(Parse.Error.EMAIL_TAKEN); }); - Parse.Promise.when([p1, p2]) - .then(() => { - fail('one of the users should not have been created'); - done(); - }) - .catch(done); + await Promise.all([p1, p2]) + expect(numFailed).toEqual(1); + expect(numCreated).toBe(1); }); - it('ensure that if people already have duplicate users, they can still sign up new users', done => { + it('ensure that if people already have duplicate users, they can still sign up new users', async done => { + try { + await Parse.User.logOut(); + } catch(e) { /* ignore */ } const config = Config.get('test'); // Remove existing data to clear out unique index TestUtils.destroyAllDataPermanently() @@ -237,20 +238,15 @@ describe('miscellaneous', function() { }); it('succeed in logging in', function(done) { - createTestUser(function(u) { + createTestUser().then(async function(u) { expect(typeof u.id).toEqual('string'); - Parse.User.logIn('test', 'moon-y', { - success: function(user) { - expect(typeof user.id).toEqual('string'); - expect(user.get('password')).toBeUndefined(); - expect(user.getSessionToken()).not.toBeUndefined(); - Parse.User.logOut().then(done); - }, error: error => { - fail(JSON.stringify(error)); - done(); - } - }); + const user = await Parse.User.logIn('test', 'moon-y'); + expect(typeof user.id).toEqual('string'); + expect(user.get('password')).toBeUndefined(); + expect(user.getSessionToken()).not.toBeUndefined(); + await Parse.User.logOut(); + done(); }, fail); }); @@ -856,7 +852,7 @@ describe('miscellaneous', function() { } done(); }); - }).fail(() => { + }).catch(() => { fail('Should not fail'); done(); }) diff --git a/spec/ParseFile.spec.js b/spec/ParseFile.spec.js index d5f7d38c..4c03417b 100644 --- a/spec/ParseFile.spec.js +++ b/spec/ParseFile.spec.js @@ -204,98 +204,62 @@ describe('Parse.File testing', () => { }); }); - it("save file", done => { + it("save file", async () => { const file = new Parse.File("hello.txt", data, "text/plain"); ok(!file.url()); - file.save(expectSuccess({ - success: function(result) { - strictEqual(result, file); - ok(file.name()); - ok(file.url()); - notEqual(file.name(), "hello.txt"); - done(); - } - }, done)); + const result = await file.save(); + strictEqual(result, file); + ok(file.name()); + ok(file.url()); + notEqual(file.name(), "hello.txt"); }); - it("save file in object", done => { + it("save file in object", async done => { const file = new Parse.File("hello.txt", data, "text/plain"); ok(!file.url()); - file.save(expectSuccess({ - success: function(result) { - strictEqual(result, file); - ok(file.name()); - ok(file.url()); - notEqual(file.name(), "hello.txt"); + const result = await file.save(); + strictEqual(result, file); + ok(file.name()); + ok(file.url()); + notEqual(file.name(), "hello.txt"); - const object = new Parse.Object("TestObject"); - object.save({ - file: file - }, expectSuccess({ - success: function(object) { - (new Parse.Query("TestObject")).get(object.id, expectSuccess({ - success: function(objectAgain) { - ok(objectAgain.get("file") instanceof Parse.File); - done(); - } - })); - } - }, done)); - } - }, done)); + const object = new Parse.Object("TestObject"); + await object.save({ file: file }); + const objectAgain = await (new Parse.Query("TestObject")).get(object.id); + ok(objectAgain.get("file") instanceof Parse.File); + done(); }); - it("save file in object with escaped characters in filename", done => { + it("save file in object with escaped characters in filename", async () => { const file = new Parse.File("hello . txt", data, "text/plain"); ok(!file.url()); - file.save(expectSuccess({ - success: function(result) { - strictEqual(result, file); - ok(file.name()); - ok(file.url()); - notEqual(file.name(), "hello . txt"); + const result = await file.save(); + strictEqual(result, file); + ok(file.name()); + ok(file.url()); + notEqual(file.name(), "hello . txt"); - const object = new Parse.Object("TestObject"); - object.save({ - file: file - }, expectSuccess({ - success: function(object) { - (new Parse.Query("TestObject")).get(object.id, expectSuccess({ - success: function(objectAgain) { - ok(objectAgain.get("file") instanceof Parse.File); - - done(); - } - })); - } - }, done)); - } - }, done)); + const object = new Parse.Object("TestObject"); + await object.save({ file }); + const objectAgain = await (new Parse.Query("TestObject")).get(object.id); + ok(objectAgain.get("file") instanceof Parse.File); }); - it("autosave file in object", done => { + it("autosave file in object", async done => { let file = new Parse.File("hello.txt", data, "text/plain"); ok(!file.url()); const object = new Parse.Object("TestObject"); - object.save({ - file: file - }, expectSuccess({ - success: function(object) { - (new Parse.Query("TestObject")).get(object.id, expectSuccess({ - success: function(objectAgain) { - file = objectAgain.get("file"); - ok(file instanceof Parse.File); - ok(file.name()); - ok(file.url()); - notEqual(file.name(), "hello.txt"); - done(); - } - }, done)); - } - }, done)); + await object.save({ file }); + const objectAgain = await (new Parse.Query("TestObject")).get(object.id); + file = objectAgain.get("file"); + ok(file instanceof Parse.File); + ok(file.name()); + ok(file.url()); + notEqual(file.name(), "hello.txt"); + done(); }); - it("autosave file in object in object", done => { + it("autosave file in object in object", async done => { let file = new Parse.File("hello.txt", data, "text/plain"); ok(!file.url()); @@ -305,44 +269,31 @@ describe('Parse.File testing', () => { const parent = new Parse.Object("Parent"); parent.set("child", child); - parent.save(expectSuccess({ - success: function(parent) { - const query = new Parse.Query("Parent"); - query.include("child"); - query.get(parent.id, expectSuccess({ - success: function(parentAgain) { - const childAgain = parentAgain.get("child"); - file = childAgain.get("file"); - ok(file instanceof Parse.File); - ok(file.name()); - ok(file.url()); - notEqual(file.name(), "hello.txt"); - done(); - } - }, done)); - } - }, done)); + await parent.save(); + const query = new Parse.Query("Parent"); + query.include("child"); + const parentAgain = await query.get(parent.id); + const childAgain = parentAgain.get("child"); + file = childAgain.get("file"); + ok(file instanceof Parse.File); + ok(file.name()); + ok(file.url()); + notEqual(file.name(), "hello.txt"); + done(); }); - it("saving an already saved file", done => { + it("saving an already saved file", async () => { const file = new Parse.File("hello.txt", data, "text/plain"); ok(!file.url()); - file.save(expectSuccess({ - success: function(result) { - strictEqual(result, file); - ok(file.name()); - ok(file.url()); - notEqual(file.name(), "hello.txt"); - const previousName = file.name(); + const result = await file.save(); + strictEqual(result, file); + ok(file.name()); + ok(file.url()); + notEqual(file.name(), "hello.txt"); + const previousName = file.name(); - file.save(expectSuccess({ - success: function() { - equal(file.name(), previousName); - done(); - } - }, done)); - } - }, done)); + await file.save(); + equal(file.name(), previousName); }); it("two saves at the same time", done => { @@ -354,7 +305,7 @@ describe('Parse.File testing', () => { const firstSave = file.save().then(function() { firstName = file.name(); }); const secondSave = file.save().then(function() { secondName = file.name(); }); - Parse.Promise.when(firstSave, secondSave).then(function() { + Promise.all([firstSave, secondSave]).then(function() { equal(firstName, secondName); done(); }, function(error) { @@ -363,18 +314,14 @@ describe('Parse.File testing', () => { }); }); - it("file toJSON testing", done => { + it("file toJSON testing", async () => { const file = new Parse.File("hello.txt", data, "text/plain"); ok(!file.url()); const object = new Parse.Object("TestObject"); - object.save({ + await object.save({ file: file - }, expectSuccess({ - success: function() { - ok(object.toJSON().file.url); - done(); - } - }, done)); + }); + ok(object.toJSON().file.url); }); it("content-type used with no extension", done => { diff --git a/spec/ParseGeoPoint.spec.js b/spec/ParseGeoPoint.spec.js index ec6ec792..20b49dfa 100644 --- a/spec/ParseGeoPoint.spec.js +++ b/spec/ParseGeoPoint.spec.js @@ -6,26 +6,18 @@ const TestObject = Parse.Object.extend('TestObject'); describe('Parse.GeoPoint testing', () => { - it('geo point roundtrip', (done) => { + it('geo point roundtrip', async () => { const point = new Parse.GeoPoint(44.0, -11.0); const obj = new TestObject(); obj.set('location', point); obj.set('name', 'Ferndale'); - obj.save(null, { - success: function() { - const query = new Parse.Query(TestObject); - query.find({ - success: function(results) { - equal(results.length, 1); - const pointAgain = results[0].get('location'); - ok(pointAgain); - equal(pointAgain.latitude, 44.0); - equal(pointAgain.longitude, -11.0); - done(); - } - }); - } - }); + await obj.save(); + const results = await new Parse.Query(TestObject).find(); + equal(results.length, 1); + const pointAgain = results[0].get('location'); + ok(pointAgain); + equal(pointAgain.latitude, 44.0); + equal(pointAgain.longitude, -11.0); }); it('update geopoint', (done) => { @@ -47,25 +39,22 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('has the correct __type field in the json response', done => { + it('has the correct __type field in the json response', async (done) => { const point = new Parse.GeoPoint(44.0, -11.0); const obj = new TestObject(); obj.set('location', point); obj.set('name', 'Zhoul') - obj.save(null, { - success: (obj) => { - Parse.Cloud.httpRequest({ - url: 'http://localhost:8378/1/classes/TestObject/' + obj.id, - headers: { - 'X-Parse-Application-Id': 'test', - 'X-Parse-Master-Key': 'test' - } - }).then(response => { - equal(response.data.location.__type, 'GeoPoint'); - done(); - }) + await obj.save(); + Parse.Cloud.httpRequest({ + url: 'http://localhost:8378/1/classes/TestObject/' + obj.id, + headers: { + 'X-Parse-Application-Id': 'test', + 'X-Parse-Master-Key': 'test' } - }) + }).then(response => { + equal(response.data.location.__type, 'GeoPoint'); + done(); + }); }); it('creating geo point exception two fields', (done) => { @@ -82,24 +71,21 @@ describe('Parse.GeoPoint testing', () => { }); // TODO: This should also have support in postgres, or higher level database agnostic support. - it_exclude_dbs(['postgres'])('updating geo point exception two fields', (done) => { + it_exclude_dbs(['postgres'])('updating geo point exception two fields', async (done) => { const point = new Parse.GeoPoint(20, 20); const obj = new TestObject(); obj.set('locationOne', point); - obj.save(null, { - success: (obj) => { - obj.set('locationTwo', point); - obj.save().then(() => { - fail('expected error'); - }, (err) => { - equal(err.code, Parse.Error.INCORRECT_TYPE); - done(); - }) - } + await obj.save(); + obj.set('locationTwo', point); + obj.save().then(() => { + fail('expected error'); + }, (err) => { + equal(err.code, Parse.Error.INCORRECT_TYPE); + done(); }); }); - it('geo line', (done) => { + it('geo line', async (done) => { const line = []; for (let i = 0; i < 10; ++i) { const obj = new TestObject(); @@ -109,22 +95,16 @@ describe('Parse.GeoPoint testing', () => { obj.set('seq', i); line.push(obj); } - Parse.Object.saveAll(line, { - success: function() { - const query = new Parse.Query(TestObject); - const point = new Parse.GeoPoint(24, 19); - query.equalTo('construct', 'line'); - query.withinMiles('location', point, 10000); - query.find({ - success: function(results) { - equal(results.length, 10); - equal(results[0].get('seq'), 9); - equal(results[3].get('seq'), 6); - done(); - } - }); - } - }); + await Parse.Object.saveAll(line); + const query = new Parse.Query(TestObject); + const point = new Parse.GeoPoint(24, 19); + query.equalTo('construct', 'line'); + query.withinMiles('location', point, 10000); + const results = await query.find() + equal(results.length, 10); + equal(results[0].get('seq'), 9); + equal(results[3].get('seq'), 6); + done(); }); it('geo max distance large', (done) => { @@ -150,7 +130,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo max distance medium', (done) => { + it('geo max distance medium', async () => { const objects = []; [0, 1, 2].map(function(i) { const obj = new TestObject(); @@ -159,22 +139,17 @@ describe('Parse.GeoPoint testing', () => { obj.set('index', i); objects.push(obj); }); - Parse.Object.saveAll(objects, function() { - const query = new Parse.Query(TestObject); - const point = new Parse.GeoPoint(1.0, -1.0); - query.withinRadians('location', point, 3.14 * 0.5); - query.find({ - success: function(results) { - equal(results.length, 2); - equal(results[0].get('index'), 0); - equal(results[1].get('index'), 1); - done(); - } - }); - }); + await Parse.Object.saveAll(objects) + const query = new Parse.Query(TestObject); + const point = new Parse.GeoPoint(1.0, -1.0); + query.withinRadians('location', point, 3.14 * 0.5); + const results = await query.find(); + equal(results.length, 2); + equal(results[0].get('index'), 0); + equal(results[1].get('index'), 1); }); - it('geo max distance small', (done) => { + it('geo max distance small', async () => { const objects = []; [0, 1, 2].map(function(i) { const obj = new TestObject(); @@ -183,21 +158,16 @@ describe('Parse.GeoPoint testing', () => { obj.set('index', i); objects.push(obj); }); - Parse.Object.saveAll(objects, function() { - const query = new Parse.Query(TestObject); - const point = new Parse.GeoPoint(1.0, -1.0); - query.withinRadians('location', point, 3.14 * 0.25); - query.find({ - success: function(results) { - equal(results.length, 1); - equal(results[0].get('index'), 0); - done(); - } - }); - }); + await Parse.Object.saveAll(objects); + const query = new Parse.Query(TestObject); + const point = new Parse.GeoPoint(1.0, -1.0); + query.withinRadians('location', point, 3.14 * 0.25); + const results = await query.find(); + equal(results.length, 1); + equal(results[0].get('index'), 0); }); - const makeSomeGeoPoints = function(callback) { + const makeSomeGeoPoints = function() { const sacramento = new TestObject(); sacramento.set('location', new Parse.GeoPoint(38.52, -121.50)); sacramento.set('name', 'Sacramento'); @@ -210,142 +180,97 @@ describe('Parse.GeoPoint testing', () => { sf.set('location', new Parse.GeoPoint(37.75, -122.68)); sf.set('name', 'San Francisco'); - Parse.Object.saveAll([sacramento, sf, honolulu], callback); + return Parse.Object.saveAll([sacramento, sf, honolulu]); }; - it('geo max distance in km everywhere', (done) => { - makeSomeGeoPoints(function() { - const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); - const query = new Parse.Query(TestObject); - // Honolulu is 4300 km away from SFO on a sphere ;) - query.withinKilometers('location', sfo, 4800.0); - query.find({ - success: function(results) { - equal(results.length, 3); - done(); - } - }); - }); + it('geo max distance in km everywhere', async (done) => { + await makeSomeGeoPoints(); + const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); + const query = new Parse.Query(TestObject); + // Honolulu is 4300 km away from SFO on a sphere ;) + query.withinKilometers('location', sfo, 4800.0); + const results = await query.find(); + equal(results.length, 3); + done(); }); - it('geo max distance in km california', (done) => { - makeSomeGeoPoints(function() { - const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); - const query = new Parse.Query(TestObject); - query.withinKilometers('location', sfo, 3700.0); - query.find({ - success: function(results) { - equal(results.length, 2); - equal(results[0].get('name'), 'San Francisco'); - equal(results[1].get('name'), 'Sacramento'); - done(); - } - }); - }); + it('geo max distance in km california', async () => { + await makeSomeGeoPoints(); + const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); + const query = new Parse.Query(TestObject); + query.withinKilometers('location', sfo, 3700.0); + const results = await query.find(); + equal(results.length, 2); + equal(results[0].get('name'), 'San Francisco'); + equal(results[1].get('name'), 'Sacramento'); }); - it('geo max distance in km bay area', (done) => { - makeSomeGeoPoints(function() { - const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); - const query = new Parse.Query(TestObject); - query.withinKilometers('location', sfo, 100.0); - query.find({ - success: function(results) { - equal(results.length, 1); - equal(results[0].get('name'), 'San Francisco'); - done(); - } - }); - }); + it('geo max distance in km bay area', async () => { + await makeSomeGeoPoints(); + const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); + const query = new Parse.Query(TestObject); + query.withinKilometers('location', sfo, 100.0); + const results = await query.find(); + equal(results.length, 1); + equal(results[0].get('name'), 'San Francisco'); }); - it('geo max distance in km mid peninsula', (done) => { - makeSomeGeoPoints(function() { - const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); - const query = new Parse.Query(TestObject); - query.withinKilometers('location', sfo, 10.0); - query.find({ - success: function(results) { - equal(results.length, 0); - done(); - } - }); - }); + it('geo max distance in km mid peninsula', async () => { + await makeSomeGeoPoints(); + const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); + const query = new Parse.Query(TestObject); + query.withinKilometers('location', sfo, 10.0); + const results = await query.find(); + equal(results.length, 0); }); - it('geo max distance in miles everywhere', (done) => { - makeSomeGeoPoints(function() { - const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); - const query = new Parse.Query(TestObject); - query.withinMiles('location', sfo, 2600.0); - query.find({ - success: function(results) { - equal(results.length, 3); - done(); - } - }); - }); + it('geo max distance in miles everywhere', async () => { + await makeSomeGeoPoints(); + const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); + const query = new Parse.Query(TestObject); + query.withinMiles('location', sfo, 2600.0); + const results = await query.find(); + equal(results.length, 3); }); - it('geo max distance in miles california', (done) => { - makeSomeGeoPoints(function() { - const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); - const query = new Parse.Query(TestObject); - query.withinMiles('location', sfo, 2200.0); - query.find({ - success: function(results) { - equal(results.length, 2); - equal(results[0].get('name'), 'San Francisco'); - equal(results[1].get('name'), 'Sacramento'); - done(); - } - }); - }); + it('geo max distance in miles california', async () => { + await makeSomeGeoPoints(); + const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); + const query = new Parse.Query(TestObject); + query.withinMiles('location', sfo, 2200.0); + const results = await query.find(); + equal(results.length, 2); + equal(results[0].get('name'), 'San Francisco'); + equal(results[1].get('name'), 'Sacramento'); }); - it('geo max distance in miles bay area', (done) => { - makeSomeGeoPoints(function() { - const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); - const query = new Parse.Query(TestObject); - // 100km is 62 miles... - query.withinMiles('location', sfo, 62.0); - query.find({ - success: function(results) { - equal(results.length, 1); - equal(results[0].get('name'), 'San Francisco'); - done(); - } - }); - }); + it('geo max distance in miles bay area', async () => { + await makeSomeGeoPoints(); + const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); + const query = new Parse.Query(TestObject); + query.withinMiles('location', sfo, 62.0); + const results = await query.find(); + equal(results.length, 1); + equal(results[0].get('name'), 'San Francisco'); }); - it('geo max distance in miles mid peninsula', (done) => { - makeSomeGeoPoints(function() { - const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); - const query = new Parse.Query(TestObject); - query.withinMiles('location', sfo, 10.0); - query.find({ - success: function(results) { - equal(results.length, 0); - done(); - } - }); - }); + it('geo max distance in miles mid peninsula', async () => { + await makeSomeGeoPoints(); + const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); + const query = new Parse.Query(TestObject); + query.withinMiles('location', sfo, 10.0); + const results = await query.find(); + equal(results.length, 0); }); - it('returns nearest location', (done) => { - makeSomeGeoPoints(function() { - const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); - const query = new Parse.Query(TestObject); - query.near('location', sfo); - query.find({ - success: function(results) { - equal(results[0].get('name'), 'San Francisco'); - equal(results[1].get('name'), 'Sacramento'); - done(); - } - }); - }); + it('returns nearest location', async () => { + await makeSomeGeoPoints(); + const sfo = new Parse.GeoPoint(37.6189722, -122.3748889); + const query = new Parse.Query(TestObject); + query.near('location', sfo); + const results = await query.find(); + equal(results[0].get('name'), 'San Francisco'); + equal(results[1].get('name'), 'Sacramento'); }); it('works with geobox queries', (done) => { @@ -367,47 +292,33 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('supports a sub-object with a geo point', done => { + it('supports a sub-object with a geo point', async () => { const point = new Parse.GeoPoint(44.0, -11.0); const obj = new TestObject(); obj.set('subobject', { location: point }); - obj.save(null, { - success: function() { - const query = new Parse.Query(TestObject); - query.find({ - success: function(results) { - equal(results.length, 1); - const pointAgain = results[0].get('subobject')['location']; - ok(pointAgain); - equal(pointAgain.latitude, 44.0); - equal(pointAgain.longitude, -11.0); - done(); - } - }); - } - }); + await obj.save(); + const query = new Parse.Query(TestObject); + const results = await query.find(); + equal(results.length, 1); + const pointAgain = results[0].get('subobject')['location']; + ok(pointAgain); + equal(pointAgain.latitude, 44.0); + equal(pointAgain.longitude, -11.0); }); - it('supports array of geo points', done => { + it('supports array of geo points', async () => { const point1 = new Parse.GeoPoint(44.0, -11.0); const point2 = new Parse.GeoPoint(22.0, -55.0); const obj = new TestObject(); obj.set('locations', [ point1, point2 ]); - obj.save(null, { - success: function() { - const query = new Parse.Query(TestObject); - query.find({ - success: function(results) { - equal(results.length, 1); - const locations = results[0].get('locations'); - expect(locations.length).toEqual(2); - expect(locations[0]).toEqual(point1); - expect(locations[1]).toEqual(point2); - done(); - } - }); - } - }); + await obj.save(); + const query = new Parse.Query(TestObject); + const results = await query.find(); + equal(results.length, 1); + const locations = results[0].get('locations'); + expect(locations.length).toEqual(2); + expect(locations[0]).toEqual(point1); + expect(locations[1]).toEqual(point2); }); it('equalTo geopoint', (done) => { diff --git a/spec/ParseHooks.spec.js b/spec/ParseHooks.spec.js index 5b890039..b8c941eb 100644 --- a/spec/ParseHooks.spec.js +++ b/spec/ParseHooks.spec.js @@ -287,7 +287,7 @@ describe('Hooks', () => { promises.push(Parse.Hooks.createFunction("AFunction" + i, "http://url.com/function" + i)); } - Parse.Promise.when(promises).then(function(){ + Promise.all(promises).then(function(){ for (let i = 0; i < 5; i++) { // Delete everything from memory, as the server just started triggers.removeTrigger("beforeSave", "MyClass" + i, Parse.applicationId); @@ -441,7 +441,7 @@ describe('Hooks', () => { }).then(function(res) { expect(res.get("hello")).toEqual("world"); done(); - }).fail((err) => { + }).catch((err) => { jfail(err); fail("Should not fail creating a function"); done(); @@ -462,7 +462,7 @@ describe('Hooks', () => { }).then(function(res) { expect(res.get("hello")).toEqual("world"); done(); - }).fail((err) => { + }).catch((err) => { fail(`Should not fail: ${JSON.stringify(err)}`); done(); }); @@ -485,19 +485,18 @@ describe('Hooks', () => { const obj = new Parse.Object("SomeRandomObject"); return obj.save(); }).then(function() { - const promise = new Parse.Promise(); - // Wait a bit here as it's an after save - setTimeout(() => { - expect(triggerCount).toBe(1); - new Parse.Query("AnotherObject") - .get(newObjectId) - .then((r) => promise.resolve(r)); - }, 500); - return promise; + return new Promise((resolve) => { + setTimeout(() => { + expect(triggerCount).toBe(1); + new Parse.Query("AnotherObject") + .get(newObjectId) + .then((r) => resolve(r)); + }, 500); + }); }).then(function(res){ expect(res.get("foo")).toEqual("bar"); done(); - }).fail((err) => { + }).catch((err) => { jfail(err); fail("Should not fail creating a function"); done(); diff --git a/spec/ParseLiveQueryServer.spec.js b/spec/ParseLiveQueryServer.spec.js index 6defef45..de318ecf 100644 --- a/spec/ParseLiveQueryServer.spec.js +++ b/spec/ParseLiveQueryServer.spec.js @@ -61,12 +61,12 @@ describe('ParseLiveQueryServer', function() { const mockSessionTokenCache = function(){ this.getUserId = function(sessionToken){ if (typeof sessionToken === 'undefined') { - return Parse.Promise.as(undefined); + return Promise.resolve(undefined); } if (sessionToken === null) { - return Parse.Promise.error(); + return Promise.reject(); } - return Parse.Promise.as(testUserId); + return Promise.resolve(testUserId); }; }; jasmine.mockLibrary('../lib/LiveQuery/SessionTokenCache', 'SessionTokenCache', mockSessionTokenCache); @@ -575,7 +575,7 @@ describe('ParseLiveQueryServer', function() { return true; }; parseLiveQueryServer._matchesACL = function() { - return Parse.Promise.as(true); + return Promise.resolve(true); }; parseLiveQueryServer._onAfterDelete(message); @@ -610,7 +610,7 @@ describe('ParseLiveQueryServer', function() { return false; }; parseLiveQueryServer._matchesACL = function() { - return Parse.Promise.as(true) + return Promise.resolve(true) }; // Trigger onAfterSave parseLiveQueryServer._onAfterSave(message); @@ -648,7 +648,7 @@ describe('ParseLiveQueryServer', function() { return counter % 2 === 0; }; parseLiveQueryServer._matchesACL = function() { - return Parse.Promise.as(true) + return Promise.resolve(true) }; parseLiveQueryServer._onAfterSave(message); @@ -681,7 +681,7 @@ describe('ParseLiveQueryServer', function() { return true; }; parseLiveQueryServer._matchesACL = function() { - return Parse.Promise.as(true) + return Promise.resolve(true) }; parseLiveQueryServer._onAfterSave(message); @@ -718,7 +718,7 @@ describe('ParseLiveQueryServer', function() { return counter % 2 !== 0; }; parseLiveQueryServer._matchesACL = function() { - return Parse.Promise.as(true) + return Promise.resolve(true) }; parseLiveQueryServer._onAfterSave(message); @@ -751,7 +751,7 @@ describe('ParseLiveQueryServer', function() { return true; }; parseLiveQueryServer._matchesACL = function() { - return Parse.Promise.as(true) + return Promise.resolve(true) }; parseLiveQueryServer._onAfterSave(message); diff --git a/spec/ParseObject.spec.js b/spec/ParseObject.spec.js index 954d21a6..ac16be0e 100644 --- a/spec/ParseObject.spec.js +++ b/spec/ParseObject.spec.js @@ -25,11 +25,9 @@ describe('Parse.Object testing', () => { create({ "test" : "test" }, function(model) { const t2 = new TestObject({ objectId: model.id }); t2.set("test", "changed"); - t2.save(null, { - success: function(model) { - equal(model.get("test"), "changed", "Update should have succeeded"); - done(); - } + t2.save().then(function(model) { + equal(model.get("test"), "changed", "Update should have succeeded"); + done(); }); }); }); @@ -37,15 +35,12 @@ describe('Parse.Object testing', () => { it("save without null", function(done) { const object = new TestObject(); object.set("favoritePony", "Rainbow Dash"); - object.save({ - success: function(objectAgain) { - equal(objectAgain, object); - done(); - }, - error: function(objectAgain, error) { - ok(null, "Error " + error.code + ": " + error.message); - done(); - } + object.save().then(function(objectAgain) { + equal(objectAgain, object); + done(); + }, function(objectAgain, error) { + ok(null, "Error " + error.code + ": " + error.message); + done(); }); }); @@ -74,13 +69,11 @@ describe('Parse.Object testing', () => { it("get", function(done) { create({ "test" : "test" }, function(model) { const t2 = new TestObject({ objectId: model.id }); - t2.fetch({ - success: function(model2) { - equal(model2.get("test"), "test", "Update should have succeeded"); - ok(model2.id); - equal(model2.id, model.id, "Ids should match"); - done(); - } + t2.fetch().then(function(model2) { + equal(model2.get("test"), "test", "Update should have succeeded"); + ok(model2.id); + equal(model2.id, model.id, "Ids should match"); + done(); }); }); }); @@ -88,32 +81,24 @@ describe('Parse.Object testing', () => { it("delete", function(done) { const t = new TestObject(); t.set("test", "test"); - t.save(null, { - success: function() { - t.destroy({ - success: function() { - const t2 = new TestObject({ objectId: t.id }); - t2.fetch().then(fail, done); - } - }); - } + t.save().then(function() { + t.destroy().then(function() { + const t2 = new TestObject({ objectId: t.id }); + t2.fetch().then(fail, done); + }); }); }); it("find", function(done) { const t = new TestObject(); t.set("foo", "bar"); - t.save(null, { - success: function() { - const query = new Parse.Query(TestObject); - query.equalTo("foo", "bar"); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - } - }); - } + t.save().then(function() { + const query = new Parse.Query(TestObject); + query.equalTo("foo", "bar"); + query.find().then(function(results) { + equal(results.length, 1); + done(); + }); }); }); @@ -123,35 +108,27 @@ describe('Parse.Object testing', () => { const container = new Container(); container.set("item", item); - Parse.Object.saveAll([item, container], { - success: function() { - const query = new Parse.Query(Container); - query.find({ - success: function(results) { - equal(results.length, 1); - const containerAgain = results[0]; - const itemAgain = containerAgain.get("item"); - itemAgain.fetch({ - success: function() { - equal(itemAgain.get("property"), "x"); - done(); - } - }); - } + Parse.Object.saveAll([item, container]).then(function() { + const query = new Parse.Query(Container); + query.find().then(function(results) { + equal(results.length, 1); + const containerAgain = results[0]; + const itemAgain = containerAgain.get("item"); + itemAgain.fetch().then(function() { + equal(itemAgain.get("property"), "x"); + done(); }); - } + }); }); }); it("save adds no data keys (other than createdAt and updatedAt)", function(done) { const object = new TestObject(); - object.save(null, { - success: function() { - const keys = Object.keys(object.attributes).sort(); - equal(keys.length, 2); - done(); - } + object.save().then(function() { + const keys = Object.keys(object.attributes).sort(); + equal(keys.length, 2); + done(); }); }); @@ -161,130 +138,101 @@ describe('Parse.Object testing', () => { const container = new Container(); container.set("item", item); - container.save(null, { - success: function() { - const query = new Parse.Query(Container); - query.find({ - success: function(results) { - equal(results.length, 1); - const containerAgain = results[0]; - const itemAgain = containerAgain.get("item"); - itemAgain.fetch({ - success: function() { - equal(itemAgain.get("property"), "x"); - done(); - } - }); - } + container.save().then(function() { + const query = new Parse.Query(Container); + query.find().then(function(results) { + equal(results.length, 1); + const containerAgain = results[0]; + const itemAgain = containerAgain.get("item"); + itemAgain.fetch().then(function() { + equal(itemAgain.get("property"), "x"); + done(); }); - } + }); }); }); it("fetch", function(done) { const item = new Item({ foo: "bar" }); - item.save(null, { - success: function() { - const itemAgain = new Item(); - itemAgain.id = item.id; - itemAgain.fetch({ - success: function() { - itemAgain.save({ foo: "baz" }, { - success: function() { - item.fetch({ - success: function() { - equal(item.get("foo"), itemAgain.get("foo")); - done(); - } - }); - } - }); - } + item.save().then(function() { + const itemAgain = new Item(); + itemAgain.id = item.id; + itemAgain.fetch().then(function() { + itemAgain.save({ foo: "baz" }).then(function() { + item.fetch().then(function() { + equal(item.get("foo"), itemAgain.get("foo")); + done(); + }); }); - } + }); }); }); it("createdAt doesn't change", function(done) { const object = new TestObject({ foo: "bar" }); - object.save(null, { - success: function() { - const objectAgain = new TestObject(); - objectAgain.id = object.id; - objectAgain.fetch({ - success: function() { - equal(object.createdAt.getTime(), objectAgain.createdAt.getTime()); - done(); - } - }); - } + object.save().then(function() { + const objectAgain = new TestObject(); + objectAgain.id = object.id; + objectAgain.fetch().then(function() { + equal(object.createdAt.getTime(), objectAgain.createdAt.getTime()); + done(); + }); }); }); it("createdAt and updatedAt exposed", function(done) { const object = new TestObject({ foo: "bar" }); - object.save(null, { - success: function() { - notEqual(object.updatedAt, undefined); - notEqual(object.createdAt, undefined); - done(); - } + object.save().then(function() { + notEqual(object.updatedAt, undefined); + notEqual(object.createdAt, undefined); + done(); }); }); it("updatedAt gets updated", function(done) { const object = new TestObject({ foo: "bar" }); - object.save(null, { - success: function() { - ok(object.updatedAt, "initial save should cause updatedAt to exist"); - const firstUpdatedAt = object.updatedAt; - object.save({ foo: "baz" }, { - success: function() { - ok(object.updatedAt, "two saves should cause updatedAt to exist"); - notEqual(firstUpdatedAt, object.updatedAt); - done(); - } - }); - } + object.save().then(function() { + ok(object.updatedAt, "initial save should cause updatedAt to exist"); + const firstUpdatedAt = object.updatedAt; + object.save({ foo: "baz" }).then(function() { + ok(object.updatedAt, "two saves should cause updatedAt to exist"); + notEqual(firstUpdatedAt, object.updatedAt); + done(); + }); }); }); it("createdAt is reasonable", function(done) { const startTime = new Date(); const object = new TestObject({ foo: "bar" }); - object.save(null, { - success: function() { - const endTime = new Date(); - const startDiff = Math.abs(startTime.getTime() - - object.createdAt.getTime()); - ok(startDiff < 5000); + object.save().then(function() { + const endTime = new Date(); + const startDiff = Math.abs(startTime.getTime() - + object.createdAt.getTime()); + ok(startDiff < 5000); - const endDiff = Math.abs(endTime.getTime() - - object.createdAt.getTime()); - ok(endDiff < 5000); + const endDiff = Math.abs(endTime.getTime() - + object.createdAt.getTime()); + ok(endDiff < 5000); - done(); - } + done(); }); }); it_exclude_dbs(['postgres'])("can set null", function(done) { const obj = new Parse.Object("TestObject"); obj.set("foo", null); - obj.save(null, { - success: function(obj) { - on_db('mongo', () => { - equal(obj.get("foo"), null); - }); - on_db('postgres', () => { - fail('should not succeed'); - }); - done(); - }, - error: function() { - fail('should not fail'); - done(); - } + obj.save().then(function(obj) { + on_db('mongo', () => { + equal(obj.get("foo"), null); + }); + on_db('postgres', () => { + fail('should not succeed'); + }); + done(); + }, function() { + fail('should not fail'); + done(); }); }); @@ -292,24 +240,21 @@ describe('Parse.Object testing', () => { const obj = new Parse.Object("TestObject"); obj.set("yes", true); obj.set("no", false); - obj.save(null, { - success: function(obj) { - equal(obj.get("yes"), true); - equal(obj.get("no"), false); - done(); - }, - error: function(obj, error) { - ok(false, error.message); - done(); - } + obj.save().then(function(obj) { + equal(obj.get("yes"), true); + equal(obj.get("no"), false); + done(); + }, function(obj, error) { + ok(false, error.message); + done(); }); }); - it('cannot set invalid date', function(done) { + it('cannot set invalid date', async function(done) { const obj = new Parse.Object('TestObject'); obj.set('when', new Date(Date.parse(null))); try { - obj.save(); + await obj.save(); } catch (e) { ok(true); done(); @@ -321,17 +266,14 @@ describe('Parse.Object testing', () => { it("invalid class name", function(done) { const item = new Parse.Object("Foo^bar"); - item.save(null, { - success: function() { - ok(false, "The name should have been invalid."); - done(); - }, - error: function() { - // Because the class name is invalid, the router will not be able to route - // it, so it will actually return a -1 error code. - // equal(error.code, Parse.Error.INVALID_CLASS_NAME); - done(); - } + item.save().then(function() { + ok(false, "The name should have been invalid."); + done(); + }, function() { + // Because the class name is invalid, the router will not be able to route + // it, so it will actually return a -1 error code. + // equal(error.code, Parse.Error.INVALID_CLASS_NAME); + done(); }); }); @@ -373,40 +315,31 @@ describe('Parse.Object testing', () => { const simple = new Parse.Object("SimpleObject"); simple.save({ foo: "bar" - }, { - success: function(simple) { - simple.unset("foo"); + }).then(function(simple) { + simple.unset("foo"); + ok(!simple.has("foo"), "foo should have been unset."); + ok(simple.dirty("foo"), "foo should be dirty."); + ok(simple.dirty(), "the whole object should be dirty."); + simple.save().then(function(simple) { ok(!simple.has("foo"), "foo should have been unset."); - ok(simple.dirty("foo"), "foo should be dirty."); - ok(simple.dirty(), "the whole object should be dirty."); - simple.save(null, { - success: function(simple) { - ok(!simple.has("foo"), "foo should have been unset."); - ok(!simple.dirty("foo"), "the whole object was just saved."); - ok(!simple.dirty(), "the whole object was just saved."); + ok(!simple.dirty("foo"), "the whole object was just saved."); + ok(!simple.dirty(), "the whole object was just saved."); - const query = new Parse.Query("SimpleObject"); - query.get(simple.id, { - success: function(simpleAgain) { - ok(!simpleAgain.has("foo"), "foo should have been removed."); - done(); - }, - error: function(simpleAgain, error) { - ok(false, "Error " + error.code + ": " + error.message); - done(); - } - }); - }, - error: function(simple, error) { - ok(false, "Error " + error.code + ": " + error.message); - done(); - } + const query = new Parse.Query("SimpleObject"); + query.get(simple.id).then(function(simpleAgain) { + ok(!simpleAgain.has("foo"), "foo should have been removed."); + done(); + }, function(simpleAgain, error) { + ok(false, "Error " + error.code + ": " + error.message); + done(); }); - }, - error: function(simple, error) { + }, function(simple, error) { ok(false, "Error " + error.code + ": " + error.message); done(); - } + }); + }, function(simple, error) { + ok(false, "Error " + error.code + ": " + error.message); + done(); }); }); @@ -418,28 +351,22 @@ describe('Parse.Object testing', () => { ok(!simple.has("foo"), "foo should have been unset."); ok(simple.dirty("foo"), "foo should be dirty."); ok(simple.dirty(), "the whole object should be dirty."); - simple.save(null, { - success: function(simple) { - ok(!simple.has("foo"), "foo should have been unset."); - ok(!simple.dirty("foo"), "the whole object was just saved."); - ok(!simple.dirty(), "the whole object was just saved."); + simple.save().then(function(simple) { + ok(!simple.has("foo"), "foo should have been unset."); + ok(!simple.dirty("foo"), "the whole object was just saved."); + ok(!simple.dirty(), "the whole object was just saved."); - const query = new Parse.Query("SimpleObject"); - query.get(simple.id, { - success: function(simpleAgain) { - ok(!simpleAgain.has("foo"), "foo should have been removed."); - done(); - }, - error: function(simpleAgain, error) { - ok(false, "Error " + error.code + ": " + error.message); - done(); - } - }); - }, - error: function(simple, error) { + const query = new Parse.Query("SimpleObject"); + query.get(simple.id).then(function(simpleAgain) { + ok(!simpleAgain.has("foo"), "foo should have been removed."); + done(); + }, function(simpleAgain, error) { ok(false, "Error " + error.code + ": " + error.message); done(); - } + }); + }, function(simple, error) { + ok(false, "Error " + error.code + ": " + error.message); + done(); }); }); @@ -448,40 +375,31 @@ describe('Parse.Object testing', () => { const child = new Parse.Object("Child"); simple.save({ child: child - }, { - success: function(simple) { - simple.unset("child"); + }).then(function(simple) { + simple.unset("child"); + ok(!simple.has("child"), "child should have been unset."); + ok(simple.dirty("child"), "child should be dirty."); + ok(simple.dirty(), "the whole object should be dirty."); + simple.save().then(function(simple) { ok(!simple.has("child"), "child should have been unset."); - ok(simple.dirty("child"), "child should be dirty."); - ok(simple.dirty(), "the whole object should be dirty."); - simple.save(null, { - success: function(simple) { - ok(!simple.has("child"), "child should have been unset."); - ok(!simple.dirty("child"), "the whole object was just saved."); - ok(!simple.dirty(), "the whole object was just saved."); + ok(!simple.dirty("child"), "the whole object was just saved."); + ok(!simple.dirty(), "the whole object was just saved."); - const query = new Parse.Query("SimpleObject"); - query.get(simple.id, { - success: function(simpleAgain) { - ok(!simpleAgain.has("child"), "child should have been removed."); - done(); - }, - error: function(simpleAgain, error) { - ok(false, "Error " + error.code + ": " + error.message); - done(); - } - }); - }, - error: function(simple, error) { - ok(false, "Error " + error.code + ": " + error.message); - done(); - } + const query = new Parse.Query("SimpleObject"); + query.get(simple.id).then(function(simpleAgain) { + ok(!simpleAgain.has("child"), "child should have been removed."); + done(); + }, function(simpleAgain, error) { + ok(false, "Error " + error.code + ": " + error.message); + done(); }); - }, - error: function(simple, error) { + }, function(simple, error) { ok(false, "Error " + error.code + ": " + error.message); done(); - } + }); + }, function(simple, error) { + ok(false, "Error " + error.code + ": " + error.message); + done(); }); }); @@ -489,67 +407,40 @@ describe('Parse.Object testing', () => { const simpleObject = new Parse.Object("SimpleObject"); simpleObject.set("foo", "bar"); simpleObject.unset("foo"); - simpleObject.save(null, { - success: function(simpleObject) { - simpleObject.set("foo", "baz"); - simpleObject.save(null, { - success: function(simpleObject) { - const query = new Parse.Query("SimpleObject"); - query.get(simpleObject.id, { - success: function(simpleObjectAgain) { - equal(simpleObjectAgain.get("foo"), "baz"); - done(); - }, - error: function(simpleObject, error) { - ok(false, "Error " + error.code + ": " + error.message); - done(); - } - }); - }, - error: function(simpleObject, error) { - ok(false, "Error " + error.code + ": " + error.message); - done(); - } - }); - }, - error: function(simpleObject, error) { - ok(false, "Error " + error.code + ": " + error.message); - done(); - } - }); + simpleObject.save().then(function(simpleObject) { + simpleObject.set("foo", "baz"); + simpleObject.save().then(function(simpleObject) { + const query = new Parse.Query("SimpleObject"); + query.get(simpleObject.id).then(function(simpleObjectAgain) { + equal(simpleObjectAgain.get("foo"), "baz"); + done(); + }, done.fail); + }, done.fail); + }, done.fail); }); it("setting after deleting", function(done) { const simpleObject = new Parse.Object("SimpleObject"); simpleObject.set("foo", "bar"); - simpleObject.save(null, { - success: function(simpleObject) { - simpleObject.unset("foo"); - simpleObject.set("foo", "baz"); - simpleObject.save(null, { - success: function(simpleObject) { - const query = new Parse.Query("SimpleObject"); - query.get(simpleObject.id, { - success: function(simpleObjectAgain) { - equal(simpleObjectAgain.get("foo"), "baz"); - done(); - }, - error: function(simpleObject, error) { - ok(false, "Error " + error.code + ": " + error.message); - done(); - } - }); - }, - error: function(simpleObject, error) { - ok(false, "Error " + error.code + ": " + error.message); - done(); - } + simpleObject.save().then(function(simpleObject) { + simpleObject.unset("foo"); + simpleObject.set("foo", "baz"); + simpleObject.save().then(function(simpleObject) { + const query = new Parse.Query("SimpleObject"); + query.get(simpleObject.id).then(function(simpleObjectAgain) { + equal(simpleObjectAgain.get("foo"), "baz"); + done(); + }, function(error) { + ok(false, "Error " + error.code + ": " + error.message); + done(); }); - }, - error: function(simpleObject, error) { + }, function(error) { ok(false, "Error " + error.code + ": " + error.message); done(); - } + }); + }, function(error) { + ok(false, "Error " + error.code + ": " + error.message); + done(); }); }); @@ -557,28 +448,22 @@ describe('Parse.Object testing', () => { const simple = new Parse.Object("SimpleObject"); simple.save({ foo: 5 - }, { - success: function(simple) { - simple.increment("foo"); + }).then(function(simple) { + simple.increment("foo"); + equal(simple.get("foo"), 6); + ok(simple.dirty("foo"), "foo should be dirty."); + ok(simple.dirty(), "the whole object should be dirty."); + simple.save().then(function(simple) { equal(simple.get("foo"), 6); - ok(simple.dirty("foo"), "foo should be dirty."); - ok(simple.dirty(), "the whole object should be dirty."); - simple.save(null, { - success: function(simple) { - equal(simple.get("foo"), 6); - ok(!simple.dirty("foo"), "the whole object was just saved."); - ok(!simple.dirty(), "the whole object was just saved."); + ok(!simple.dirty("foo"), "the whole object was just saved."); + ok(!simple.dirty(), "the whole object was just saved."); - const query = new Parse.Query("SimpleObject"); - query.get(simple.id, { - success: function(simpleAgain) { - equal(simpleAgain.get("foo"), 6); - done(); - } - }); - } + const query = new Parse.Query("SimpleObject"); + query.get(simple.id).then(function(simpleAgain) { + equal(simpleAgain.get("foo"), 6); + done(); }); - } + }); }); }); @@ -672,24 +557,21 @@ describe('Parse.Object testing', () => { const object = new Parse.Object("TestObject"); object.set("cat", "good"); object.set("dog", "bad"); - object.save({ - success: function(object) { - ok(!object.dirty()); - ok(!object.dirty("cat")); - ok(!object.dirty("dog")); + object.save().then(function(object) { + ok(!object.dirty()); + ok(!object.dirty("cat")); + ok(!object.dirty("dog")); - object.set("dog", "okay"); + object.set("dog", "okay"); - ok(object.dirty()); - ok(!object.dirty("cat")); - ok(object.dirty("dog")); + ok(object.dirty()); + ok(!object.dirty("cat")); + ok(object.dirty("dog")); - done(); - }, - error: function() { - ok(false, "This should have saved."); - done(); - } + done(); + }, function() { + ok(false, "This should have saved."); + done(); }); }); @@ -733,8 +615,8 @@ describe('Parse.Object testing', () => { }); it("length attribute", function(done) { - Parse.User.signUp("bob", "password", null, { - success: function(user) { + Parse.User.signUp("bob", "password") + .then(function(user) { const TestObject = Parse.Object.extend("TestObject"); const obj = new TestObject({ length: 5, @@ -743,74 +625,45 @@ describe('Parse.Object testing', () => { equal(obj.get("length"), 5); ok(obj.get("ACL") instanceof Parse.ACL); - obj.save(null, { - success: function(obj) { + obj.save().then(function(obj) { + equal(obj.get("length"), 5); + ok(obj.get("ACL") instanceof Parse.ACL); + + const query = new Parse.Query(TestObject); + query.get(obj.id).then(function(obj) { equal(obj.get("length"), 5); ok(obj.get("ACL") instanceof Parse.ACL); const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(obj) { - equal(obj.get("length"), 5); - ok(obj.get("ACL") instanceof Parse.ACL); + query.find().then(function(results) { + obj = results[0]; + equal(obj.get("length"), 5); + ok(obj.get("ACL") instanceof Parse.ACL); - const query = new Parse.Query(TestObject); - query.find({ - success: function(results) { - obj = results[0]; - equal(obj.get("length"), 5); - ok(obj.get("ACL") instanceof Parse.ACL); - - done(); - }, - error: function(error) { - ok(false, error.code + ": " + error.message); - done(); - } - }); - }, - error: function(obj, error) { - ok(false, error.code + ": " + error.message); - done(); - } + done(); }); - }, - error: function(obj, error) { - ok(false, error.code + ": " + error.message); - done(); - } + }); }); - }, - error: function(user, error) { - ok(false, error.code + ": " + error.message); - done(); - } - }); + }); }); it("old attribute unset then unset", function(done) { const TestObject = Parse.Object.extend("TestObject"); const obj = new TestObject(); obj.set("x", 3); - obj.save({ - success: function() { - obj.unset("x"); - obj.unset("x"); - obj.save({ - success: function() { - equal(obj.has("x"), false); - equal(obj.get("x"), undefined); - const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.has("x"), false); - equal(objAgain.get("x"), undefined); - done(); - } - }); - } + obj.save().then(function() { + obj.unset("x"); + obj.unset("x"); + obj.save().then(function() { + equal(obj.has("x"), false); + equal(obj.get("x"), undefined); + const query = new Parse.Query(TestObject); + query.get(obj.id).then(function(objAgain) { + equal(objAgain.has("x"), false); + equal(objAgain.get("x"), undefined); + done(); }); - } + }); }); }); @@ -820,19 +673,15 @@ describe('Parse.Object testing', () => { obj.set("x", 5); obj.unset("x"); obj.unset("x"); - obj.save({ - success: function() { - equal(obj.has("x"), false); - equal(obj.get("x"), undefined); - const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.has("x"), false); - equal(objAgain.get("x"), undefined); - done(); - } - }); - } + obj.save().then(function() { + equal(obj.has("x"), false); + equal(obj.get("x"), undefined); + const query = new Parse.Query(TestObject); + query.get(obj.id).then(function(objAgain) { + equal(objAgain.has("x"), false); + equal(objAgain.get("x"), undefined); + done(); + }); }); }); @@ -841,19 +690,15 @@ describe('Parse.Object testing', () => { const obj = new TestObject(); obj.unset("x"); obj.unset("x"); - obj.save({ - success: function() { - equal(obj.has("x"), false); - equal(obj.get("x"), undefined); - const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.has("x"), false); - equal(objAgain.get("x"), undefined); - done(); - } - }); - } + obj.save().then(function() { + equal(obj.has("x"), false); + equal(obj.get("x"), undefined); + const query = new Parse.Query(TestObject); + query.get(obj.id).then(function(objAgain) { + equal(objAgain.has("x"), false); + equal(objAgain.get("x"), undefined); + done(); + }); }); }); @@ -861,25 +706,19 @@ describe('Parse.Object testing', () => { const TestObject = Parse.Object.extend("TestObject"); const obj = new TestObject(); obj.set("x", 3); - obj.save({ - success: function() { - obj.unset("x"); - obj.clear(); - obj.save({ - success: function() { - equal(obj.has("x"), false); - equal(obj.get("x"), undefined); - const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.has("x"), false); - equal(objAgain.get("x"), undefined); - done(); - } - }); - } + obj.save().then(function() { + obj.unset("x"); + obj.clear(); + obj.save().then(function() { + equal(obj.has("x"), false); + equal(obj.get("x"), undefined); + const query = new Parse.Query(TestObject); + query.get(obj.id).then(function(objAgain) { + equal(objAgain.has("x"), false); + equal(objAgain.get("x"), undefined); + done(); }); - } + }); }); }); @@ -889,19 +728,15 @@ describe('Parse.Object testing', () => { obj.set("x", 5); obj.unset("x"); obj.clear(); - obj.save({ - success: function() { - equal(obj.has("x"), false); - equal(obj.get("x"), undefined); - const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.has("x"), false); - equal(objAgain.get("x"), undefined); - done(); - } - }); - } + obj.save().then(function() { + equal(obj.has("x"), false); + equal(obj.get("x"), undefined); + const query = new Parse.Query(TestObject); + query.get(obj.id).then(function(objAgain) { + equal(objAgain.has("x"), false); + equal(objAgain.get("x"), undefined); + done(); + }); }); }); @@ -910,19 +745,15 @@ describe('Parse.Object testing', () => { const obj = new TestObject(); obj.unset("x"); obj.clear(); - obj.save({ - success: function() { - equal(obj.has("x"), false); - equal(obj.get("x"), undefined); - const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.has("x"), false); - equal(objAgain.get("x"), undefined); - done(); - } - }); - } + obj.save().then(function() { + equal(obj.has("x"), false); + equal(obj.get("x"), undefined); + const query = new Parse.Query(TestObject); + query.get(obj.id).then(function(objAgain) { + equal(objAgain.has("x"), false); + equal(objAgain.get("x"), undefined); + done(); + }); }); }); @@ -930,25 +761,19 @@ describe('Parse.Object testing', () => { const TestObject = Parse.Object.extend("TestObject"); const obj = new TestObject(); obj.set("x", 3); - obj.save({ - success: function() { - obj.clear(); - obj.unset("x"); - obj.save({ - success: function() { - equal(obj.has("x"), false); - equal(obj.get("x"), undefined); - const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.has("x"), false); - equal(objAgain.get("x"), undefined); - done(); - } - }); - } + obj.save().then(function() { + obj.clear(); + obj.unset("x"); + obj.save().then(function() { + equal(obj.has("x"), false); + equal(obj.get("x"), undefined); + const query = new Parse.Query(TestObject); + query.get(obj.id).then(function(objAgain) { + equal(objAgain.has("x"), false); + equal(objAgain.get("x"), undefined); + done(); }); - } + }); }); }); @@ -958,19 +783,15 @@ describe('Parse.Object testing', () => { obj.set("x", 5); obj.clear(); obj.unset("x"); - obj.save({ - success: function() { - equal(obj.has("x"), false); - equal(obj.get("x"), undefined); - const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.has("x"), false); - equal(objAgain.get("x"), undefined); - done(); - } - }); - } + obj.save().then(function() { + equal(obj.has("x"), false); + equal(obj.get("x"), undefined); + const query = new Parse.Query(TestObject); + query.get(obj.id,).then(function(objAgain) { + equal(objAgain.has("x"), false); + equal(objAgain.get("x"), undefined); + done(); + }); }); }); @@ -979,19 +800,15 @@ describe('Parse.Object testing', () => { const obj = new TestObject(); obj.clear(); obj.unset("x"); - obj.save({ - success: function() { - equal(obj.has("x"), false); - equal(obj.get("x"), undefined); - const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.has("x"), false); - equal(objAgain.get("x"), undefined); - done(); - } - }); - } + obj.save().then(function() { + equal(obj.has("x"), false); + equal(obj.get("x"), undefined); + const query = new Parse.Query(TestObject); + query.get(obj.id).then(function(objAgain) { + equal(objAgain.has("x"), false); + equal(objAgain.get("x"), undefined); + done(); + }); }); }); @@ -999,25 +816,19 @@ describe('Parse.Object testing', () => { const TestObject = Parse.Object.extend("TestObject"); const obj = new TestObject(); obj.set("x", 3); - obj.save({ - success: function() { - obj.clear(); - obj.clear(); - obj.save({ - success: function() { - equal(obj.has("x"), false); - equal(obj.get("x"), undefined); - const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.has("x"), false); - equal(objAgain.get("x"), undefined); - done(); - } - }); - } + obj.save().then(function() { + obj.clear(); + obj.clear(); + obj.save().then(function() { + equal(obj.has("x"), false); + equal(obj.get("x"), undefined); + const query = new Parse.Query(TestObject); + query.get(obj.id).then(function(objAgain) { + equal(objAgain.has("x"), false); + equal(objAgain.get("x"), undefined); + done(); }); - } + }); }); }); @@ -1027,19 +838,15 @@ describe('Parse.Object testing', () => { obj.set("x", 5); obj.clear(); obj.clear(); - obj.save({ - success: function() { - equal(obj.has("x"), false); - equal(obj.get("x"), undefined); - const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.has("x"), false); - equal(objAgain.get("x"), undefined); - done(); - } - }); - } + obj.save().then(function() { + equal(obj.has("x"), false); + equal(obj.get("x"), undefined); + const query = new Parse.Query(TestObject); + query.get(obj.id).then(function(objAgain) { + equal(objAgain.has("x"), false); + equal(objAgain.get("x"), undefined); + done(); + }); }); }); @@ -1048,19 +855,15 @@ describe('Parse.Object testing', () => { const obj = new TestObject(); obj.clear(); obj.clear(); - obj.save({ - success: function() { - equal(obj.has("x"), false); - equal(obj.get("x"), undefined); - const query = new Parse.Query(TestObject); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.has("x"), false); - equal(objAgain.get("x"), undefined); - done(); - } - }); - } + obj.save().then(function() { + equal(obj.has("x"), false); + equal(obj.get("x"), undefined); + const query = new Parse.Query(TestObject); + query.get(obj.id).then(function(objAgain) { + equal(objAgain.has("x"), false); + equal(objAgain.get("x"), undefined); + done(); + }); }); }); @@ -1076,24 +879,16 @@ describe('Parse.Object testing', () => { child2.set('name', 'cersei'); parent.set('children', [child1, child2]); - parent.save(null, { - success: function() { - const query = new Parse.Query(Child); - query.ascending('name'); - query.find({ - success: function(results) { - equal(results.length, 2); - equal(results[0].get('name'), 'cersei'); - equal(results[1].get('name'), 'jamie'); - done(); - } - }); - }, - error: function(error) { - fail(error); + parent.save().then(function() { + const query = new Parse.Query(Child); + query.ascending('name'); + query.find().then(function(results) { + equal(results.length, 2); + equal(results[0].get('name'), 'cersei'); + equal(results[1].get('name'), 'jamie'); done(); - } - }); + }); + }, done.fail); }); it("two saves at the same time", function(done) { @@ -1108,20 +903,16 @@ describe('Parse.Object testing', () => { } const query = new Parse.Query("TestObject"); - query.find({ - success: function(results) { - equal(results.length, 1); - equal(results[0].get("cat"), "meow"); - equal(results[0].get("dog"), "bark"); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + equal(results[0].get("cat"), "meow"); + equal(results[0].get("dog"), "bark"); + done(); }); }; - const options = { success: success, error: fail }; - - object.save({ cat: "meow" }, options); - object.save({ dog: "bark" }, options); + object.save({ cat: "meow" }).then(success, fail); + object.save({ dog: "bark" }).then(success, fail); }); // The schema-checking parts of this are working. @@ -1157,24 +948,20 @@ describe('Parse.Object testing', () => { it("is not dirty after save", function(done) { const obj = new Parse.Object("TestObject"); - obj.save(expectSuccess({ - success: function() { - obj.set({ "content": "x" }); - obj.fetch(expectSuccess({ - success: function(){ - equal(false, obj.dirty("content")); - done(); - } - })); - } - })); + obj.save().then(function() { + obj.set({ "content": "x" }); + obj.fetch().then(function(){ + equal(false, obj.dirty("content")); + done(); + }); + }); }); it("add with an object", function(done) { const child = new Parse.Object("Person"); const parent = new Parse.Object("Person"); - Parse.Promise.as().then(function() { + Promise.resolve().then(function() { return child.save(); }).then(function() { @@ -1209,22 +996,18 @@ describe('Parse.Object testing', () => { it("remove object from array", function(done) { const obj = new TestObject(); - obj.save(null, expectSuccess({ - success: function() { - const container = new TestObject(); - container.add("array", obj); - equal(container.get("array").length, 1); - container.save(null, expectSuccess({ - success: function() { - const objAgain = new TestObject(); - objAgain.id = obj.id; - container.remove("array", objAgain); - equal(container.get("array").length, 0); - done(); - } - })); - } - })); + obj.save().then(function() { + const container = new TestObject(); + container.add("array", obj); + equal(container.get("array").length, 1); + container.save(null).then(function() { + const objAgain = new TestObject(); + objAgain.id = obj.id; + container.remove("array", objAgain); + equal(container.get("array").length, 0); + done(); + }); + }); }); it("async methods", function(done) { @@ -1296,17 +1079,17 @@ describe('Parse.Object testing', () => { ok(!obj.dirty(), "The object should not be dirty"); ok(obj.get('aDate')); - }).always(function() { + }).finally(function() { restController.request = r; done(); }); }); - it("beforeSave doesn't make object dirty with existing field", function(done) { + xit("beforeSave doesn't make object dirty with existing field", function(done) { const restController = Parse.CoreManager.getRESTController(); const r = restController.request; restController.request = function() { - return r.apply(this, arguments).then(function(result) { + return r.apply(restController, arguments).then(function(result) { result.aDate = {"__type":"Date", "iso":"2014-06-24T06:06:06.452Z"}; return result; }); @@ -1321,15 +1104,14 @@ describe('Parse.Object testing', () => { promise.then(function() { ok(obj.dirty(), "The object should be dirty"); equal(now, obj.get('aDate')); - - }).always(function() { + }).finally(function() { restController.request = r; done(); }); }); it("bytes work", function(done) { - Parse.Promise.as().then(function() { + Promise.resolve().then(function() { const obj = new TestObject(); obj.set("bytes", { __type: "Bytes", base64: "ZnJveW8=" }); return obj.save(); @@ -1351,19 +1133,18 @@ describe('Parse.Object testing', () => { }); it("destroyAll no objects", function(done) { - Parse.Object.destroyAll([], function(success, error) { - ok(success && !error, "Should be able to destroy no objects"); + Parse.Object.destroyAll([]).then(function(success) { + ok(success, "Should be able to destroy no objects"); done(); - }); + }).catch(done.fail); }); it("destroyAll new objects only", function(done) { - const objects = [new TestObject(), new TestObject()]; - Parse.Object.destroyAll(objects, function(success, error) { - ok(success && !error, "Should be able to destroy only new objects"); + Parse.Object.destroyAll(objects).then(function(success) { + ok(success, "Should be able to destroy only new objects"); done(); - }); + }).catch(done.fail); }); it("fetchAll", function(done) { @@ -1407,10 +1188,10 @@ describe('Parse.Object testing', () => { }); it("fetchAll no objects", function(done) { - Parse.Object.fetchAll([], function(success, error) { - ok(success && !error, "Should be able to fetchAll no objects"); + Parse.Object.fetchAll([]).then(function(success) { + ok(Array.isArray(success), "Should be able to fetchAll no objects"); done(); - }); + }).catch(done.fail); }); it("fetchAll updates dates", function(done) { @@ -1433,7 +1214,7 @@ describe('Parse.Object testing', () => { }); }); - it("fetchAll backbone-style callbacks", function(done) { + xit("fetchAll backbone-style callbacks", function(done) { const numItems = 11; const container = new Container(); const items = []; @@ -1462,20 +1243,18 @@ describe('Parse.Object testing', () => { }); return Parse.Object.saveAll(itemsAgain); }).then(function() { - return Parse.Object.fetchAll(items, { - success: function(fetchedItemsAgain) { + return Parse.Object.fetchAll(items) + .then(function(fetchedItemsAgain) { equal(fetchedItemsAgain.length, numItems, "Number of items fetched should not change"); fetchedItemsAgain.forEach(function(item, i) { equal(item.get("x"), i * 2); }); done(); - }, - error: function() { + }, function() { ok(false, "Failed to fetchAll"); done(); - } - }); + }); }); }); @@ -1490,16 +1269,20 @@ describe('Parse.Object testing', () => { const subContainerAgain = containerAgain.get("subcontainer"); const itemAgain = containerAgain.get("item"); const multiClassArray = [subContainerAgain, itemAgain]; - return Parse.Object.fetchAll( - multiClassArray, - expectError(Parse.Error.INVALID_CLASS_NAME, done)); + return Parse.Object.fetchAll(multiClassArray) + .catch(e => { + expect(e.code).toBe(Parse.Error.INVALID_CLASS_NAME); + done(); + }); }); }); - it("fetchAll error on unsaved object", function(done) { + it("fetchAll error on unsaved object", async function(done) { const unsavedObjectArray = [new TestObject()]; - Parse.Object.fetchAll(unsavedObjectArray, - expectError(Parse.Error.MISSING_OBJECT_ID, done)); + await Parse.Object.fetchAll(unsavedObjectArray).catch(e => { + expect(e.code).toBe(Parse.Error.MISSING_OBJECT_ID); + done(); + }); }); it("fetchAll error on deleted object", function(done) { @@ -1518,9 +1301,10 @@ describe('Parse.Object testing', () => { }).then(function(deletedObject) { const nonExistentObject = new Item({ objectId: deletedObject.id }); const nonExistentObjectArray = [nonExistentObject, items[1]]; - return Parse.Object.fetchAll( - nonExistentObjectArray, - expectError(Parse.Error.OBJECT_NOT_FOUND, done)); + return Parse.Object.fetchAll(nonExistentObjectArray).catch(e => { + expect(e.code).toBe(Parse.Error.OBJECT_NOT_FOUND); + done(); + }); }); }); @@ -1596,7 +1380,7 @@ describe('Parse.Object testing', () => { }); }); - it("fetchAllIfNeeded backbone-style callbacks", function(done) { + xit("fetchAllIfNeeded backbone-style callbacks", function(done) { const numItems = 11; const container = new Container(); const items = []; @@ -1624,36 +1408,35 @@ describe('Parse.Object testing', () => { return Parse.Object.saveAll(itemsAgain); }).then(function() { const items = container.get("items"); - return Parse.Object.fetchAllIfNeeded(items, { - success: function(fetchedItems) { + return Parse.Object.fetchAllIfNeeded(items) + .then(function(fetchedItems) { equal(fetchedItems.length, numItems, "Number of items should not change"); fetchedItems.forEach(function(item, j) { equal(item.get("x"), j); }); done(); - }, - - error: function() { + }, function() { ok(false, "Failed to fetchAll"); done(); - } - }); + }); }); }); it("fetchAllIfNeeded no objects", function(done) { - Parse.Object.fetchAllIfNeeded([], function(success, error) { - ok(success && !error, "Should be able to fetchAll no objects"); + Parse.Object.fetchAllIfNeeded([]).then(function(success) { + ok(Array.isArray(success), "Should be able to fetchAll no objects"); done(); - }); + }).catch(done.fail); }); - it("fetchAllIfNeeded unsaved object", function(done) { + it("fetchAllIfNeeded unsaved object", async function(done) { const unsavedObjectArray = [new TestObject()]; - Parse.Object.fetchAllIfNeeded( - unsavedObjectArray, - expectError(Parse.Error.MISSING_OBJECT_ID, done)); + await Parse.Object.fetchAllIfNeeded(unsavedObjectArray) + .catch(e => { + expect(e.code).toBe(Parse.Error.MISSING_OBJECT_ID); + done(); + }); }); it("fetchAllIfNeeded error on multiple classes", function(done) { @@ -1668,8 +1451,11 @@ describe('Parse.Object testing', () => { const itemAgain = containerAgain.get("item"); const multiClassArray = [subContainerAgain, itemAgain]; return Parse.Object.fetchAllIfNeeded( - multiClassArray, - expectError(Parse.Error.INVALID_CLASS_NAME, done)); + multiClassArray) + .catch(e => { + expect(e.code).toBe(Parse.Error.INVALID_CLASS_NAME); + done(); + }); }); }); @@ -1697,23 +1483,18 @@ describe('Parse.Object testing', () => { const user = new User2(); user.set("name", "Me"); - user.save({height: 181}, expectSuccess({ - success: function(user) { + user.save({height: 181}).then(function(user) { + equal(user.get("name"), "Me"); + equal(user.get("height"), 181); + + const query = new Parse.Query(User2); + query.get(user.id).then(function(user) { + equal(user.className, "User"); equal(user.get("name"), "Me"); equal(user.get("height"), 181); - - const query = new Parse.Query(User2); - query.get(user.id, expectSuccess({ - success: function(user) { - equal(user.className, "User"); - equal(user.get("name"), "Me"); - equal(user.get("height"), 181); - - done(); - } - })); - } - })); + done(); + }); + }); }); it("create without data", function(done) { @@ -1853,7 +1634,7 @@ describe('Parse.Object testing', () => { expect(foo["_0"]).toEqual("underscore_zero"); expect(foo["_more"]["_nested"]).toEqual("key"); done(); - }).fail(err => { + }).catch(err => { jfail(err); fail("should not fail"); done(); diff --git a/spec/ParseQuery.spec.js b/spec/ParseQuery.spec.js index ef4a1990..3a0660aa 100644 --- a/spec/ParseQuery.spec.js +++ b/spec/ParseQuery.spec.js @@ -22,15 +22,13 @@ describe('Parse.Query testing', () => { it("basic query", function(done) { const baz = new TestObject({ foo: 'baz' }); const qux = new TestObject({ foo: 'qux' }); - Parse.Object.saveAll([baz, qux], function() { + Parse.Object.saveAll([baz, qux]).then(function() { const query = new Parse.Query(TestObject); query.equalTo('foo', 'baz'); - query.find({ - success: function(results) { - equal(results.length, 1); - equal(results[0].get('foo'), 'baz'); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + equal(results[0].get('foo'), 'baz'); + done(); }); }); }); @@ -39,24 +37,18 @@ describe('Parse.Query testing', () => { const baz = new TestObject({ foo: null }); const qux = new TestObject({ foo: 'qux' }); const qux2 = new TestObject({ }); - Parse.Object.saveAll([baz, qux, qux2], function() { + Parse.Object.saveAll([baz, qux, qux2]).then(function() { const query = new Parse.Query(TestObject); query.equalTo('foo', null); - query.find({ - success: function(results) { - equal(results.length, 2); - qux.set('foo', null); - qux.save({ - success: function () { - query.find({ - success: function (results) { - equal(results.length, 3); - done(); - } - }); - } + query.find().then(function(results) { + equal(results.length, 2); + qux.set('foo', null); + qux.save().then(function () { + query.find().then(function (results) { + equal(results.length, 3); + done(); }); - } + }); }); }); }); @@ -65,26 +57,18 @@ describe('Parse.Query testing', () => { const baz = new TestObject({ foo: null }); const qux = new TestObject({ foo: 'qux' }); const qux2 = new TestObject({ }); - Parse.Object.saveAll([baz, qux, qux2], function() { + Parse.Object.saveAll([baz, qux, qux2]).then(function() { const query = new Parse.Query(TestObject); query.notEqualTo('foo', null); - query.find({ - success: function(results) { - equal(results.length, 1); - qux.set('foo', null); - qux.save({ - success: function () { - query.find({ - success: function (results) { - equal(results.length, 0); - done(); - } - }); - }, - error: function (error) { console.log(error); } + query.find().then(function(results) { + equal(results.length, 1); + qux.set('foo', null); + qux.save().then(function () { + query.find().then(function (results) { + equal(results.length, 0); + done(); }); - }, - error: function (error) { console.log(error); } + }); }); }); }); @@ -239,14 +223,12 @@ describe('Parse.Query testing', () => { it("query with limit", function(done) { const baz = new TestObject({ foo: 'baz' }); const qux = new TestObject({ foo: 'qux' }); - Parse.Object.saveAll([baz, qux], function() { + Parse.Object.saveAll([baz, qux]).then(function() { const query = new Parse.Query(TestObject); query.limit(1); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + done(); }); }); }); @@ -255,14 +237,12 @@ describe('Parse.Query testing', () => { const baz = new TestObject({ foo: 'baz' }); const qux = new TestObject({ foo: 'qux' }); reconfigureServer({ maxLimit: 1 }) - Parse.Object.saveAll([baz, qux], function() { + Parse.Object.saveAll([baz, qux]).then(function() { const query = new Parse.Query(TestObject); query.limit(1); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + done(); }); }); }); @@ -271,14 +251,12 @@ describe('Parse.Query testing', () => { const baz = new TestObject({ foo: 'baz' }); const qux = new TestObject({ foo: 'qux' }); reconfigureServer({ maxLimit: 1 }) - Parse.Object.saveAll([baz, qux], function() { + Parse.Object.saveAll([baz, qux]).then(function() { const query = new Parse.Query(TestObject); query.limit(2); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + done(); }); }); }); @@ -293,7 +271,7 @@ describe('Parse.Query testing', () => { messageList.push(message); } - Parse.Object.saveAll(messageList, function() { + Parse.Object.saveAll(messageList).then(function() { equal(messageList.length, 4); const inList = []; @@ -302,15 +280,12 @@ describe('Parse.Query testing', () => { const query = new Parse.Query(TestObject); query.containedIn('prior', inList); - query.find({ - success: function(results) { - equal(results.length, 2); - done(); - }, - error: function(e) { - jfail(e); - done(); - } + query.find().then(function(results) { + equal(results.length, 2); + done(); + }, function(e) { + jfail(e); + done(); }); }, (e) => { jfail(e); @@ -374,18 +349,15 @@ describe('Parse.Query testing', () => { objectsList.push(new NumberSet({ "numbers" : [1, 2, 3, 4, 5] })); objectsList.push(new NumberSet({ "numbers" : [1, 3, 4, 5] })); - Parse.Object.saveAll(objectsList, function() { + Parse.Object.saveAll(objectsList).then(function() { const query = new Parse.Query(NumberSet); query.containsAll("numbers", [1, 2, 3]); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - }, - error: function(err) { - jfail(err); - done(); - }, + query.find().then(function(results) { + equal(results.length, 1); + done(); + }, function(err) { + jfail(err); + done(); }); }).catch((err) => { jfail(err); @@ -400,14 +372,12 @@ describe('Parse.Query testing', () => { objectsList.push(new StringSet({ "strings" : ["a", "b", "c", "d", "e"] })); objectsList.push(new StringSet({ "strings" : ["a", "c", "d", "e"] })); - Parse.Object.saveAll(objectsList, function() { + Parse.Object.saveAll(objectsList).then(function() { const query = new Parse.Query(StringSet); query.containsAll("strings", ["a", "b", "c"]); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + done(); }); }).catch((err) => { jfail(err); @@ -454,19 +424,16 @@ describe('Parse.Query testing', () => { "dates" : makeDates(["2013-02-01", "2013-02-03", "2013-02-04"]) })); - Parse.Object.saveAll(objectsList, function() { + Parse.Object.saveAll(objectsList).then(function() { const query = new Parse.Query(DateSet); query.containsAll("dates", makeDates( ["2013-02-01", "2013-02-02", "2013-02-03"])); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - }, - error: function(e) { - jfail(e); - done(); - }, + query.find().then(function(results) { + equal(results.length, 1); + done(); + },function(e) { + jfail(e); + done(); }); }); }); @@ -480,7 +447,7 @@ describe('Parse.Query testing', () => { messageList.push(new TestObject({ 'i' : i })); } - Parse.Object.saveAll(messageList, function() { + Parse.Object.saveAll(messageList).then(function() { equal(messageList.length, 4); const messageSetList = []; @@ -492,18 +459,16 @@ describe('Parse.Query testing', () => { someList.push(messageList[3]); messageSetList.push(new MessageSet({ 'messages' : someList })); - Parse.Object.saveAll(messageSetList, function() { + Parse.Object.saveAll(messageSetList).then(function() { const inList = []; inList.push(messageList[0]); inList.push(messageList[2]); const query = new Parse.Query(MessageSet); query.containsAll('messages', inList); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + done(); }); }); }); @@ -865,15 +830,13 @@ describe('Parse.Query testing', () => { const makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; - Parse.Object.saveAll([0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + Parse.Object.saveAll([0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function() { const query = new Parse.Query(BoxedNumber); query.equalTo('number', 3); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + done(); }); }); }); @@ -882,16 +845,14 @@ describe('Parse.Query testing', () => { const makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; - Parse.Object.saveAll([0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + Parse.Object.saveAll([0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function() { const query = new Parse.Query(BoxedNumber); query.equalTo('number', undefined); - query.find(expectSuccess({ - success: function(results) { - equal(results.length, 0); - done(); - } - })); + query.find().then(function(results) { + equal(results.length, 0); + done(); + }); }); }); @@ -899,15 +860,13 @@ describe('Parse.Query testing', () => { const makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; - Parse.Object.saveAll([0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + Parse.Object.saveAll([0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function() { const query = new Parse.Query(BoxedNumber); query.lessThan('number', 7); - query.find({ - success: function(results) { - equal(results.length, 7); - done(); - } + query.find().then(function(results) { + equal(results.length, 7); + done(); }); }); }); @@ -917,15 +876,13 @@ describe('Parse.Query testing', () => { return new BoxedNumber({ number: i }); }; Parse.Object.saveAll( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function() { const query = new Parse.Query(BoxedNumber); query.lessThanOrEqualTo('number', 7); - query.find({ - success: function(results) { - equal(results.length, 8); - done(); - } + query.find().then(function(results) { + equal(results.length, 8); + done(); }); }); }); @@ -967,15 +924,13 @@ describe('Parse.Query testing', () => { return new BoxedNumber({ number: i }); }; Parse.Object.saveAll( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function() { const query = new Parse.Query(BoxedNumber); query.greaterThan('number', 7); - query.find({ - success: function(results) { - equal(results.length, 2); - done(); - } + query.find().then(function(results) { + equal(results.length, 2); + done(); }); }); }); @@ -985,15 +940,13 @@ describe('Parse.Query testing', () => { return new BoxedNumber({ number: i }); }; Parse.Object.saveAll( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function() { const query = new Parse.Query(BoxedNumber); query.greaterThanOrEqualTo('number', 7); - query.find({ - success: function(results) { - equal(results.length, 3); - done(); - } + query.find().then(function(results) { + equal(results.length, 3); + done(); }); }); }); @@ -1035,16 +988,14 @@ describe('Parse.Query testing', () => { return new BoxedNumber({ number: i }); }; Parse.Object.saveAll( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function() { const query = new Parse.Query(BoxedNumber); query.lessThanOrEqualTo('number', 7); query.greaterThanOrEqualTo('number', 7); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + done(); }); }); }); @@ -1054,16 +1005,14 @@ describe('Parse.Query testing', () => { return new BoxedNumber({ number: i }); }; Parse.Object.saveAll( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function() { const query = new Parse.Query(BoxedNumber); query.lessThan('number', 9); query.greaterThan('number', 3); - query.find({ - success: function(results) { - equal(results.length, 5); - done(); - } + query.find().then(function(results) { + equal(results.length, 5); + done(); }); }); }); @@ -1073,15 +1022,13 @@ describe('Parse.Query testing', () => { return new BoxedNumber({ number: i }); }; Parse.Object.saveAll( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function() { const query = new Parse.Query(BoxedNumber); query.notEqualTo('number', 5); - query.find({ - success: function(results) { - equal(results.length, 9); - done(); - } + query.find().then(function(results) { + equal(results.length, 9); + done(); }); }); }); @@ -1186,15 +1133,13 @@ describe('Parse.Query testing', () => { return new BoxedNumber({ number: i }); }; Parse.Object.saveAll( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function() { const query = new Parse.Query(BoxedNumber); query.containedIn('number', [3,5,7,9,11]); - query.find({ - success: function(results) { - equal(results.length, 4); - done(); - } + query.find().then(function(results) { + equal(results.length, 4); + done(); }); }); }); @@ -1238,15 +1183,13 @@ describe('Parse.Query testing', () => { return new BoxedNumber({ number: i }); }; Parse.Object.saveAll( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function() { const query = new Parse.Query(BoxedNumber); query.notContainedIn('number', [3,5,7,9,11]); - query.find({ - success: function(results) { - equal(results.length, 6); - done(); - } + query.find().then(function(results) { + equal(results.length, 6); + done(); }); }); }); @@ -1257,24 +1200,22 @@ describe('Parse.Query testing', () => { return new BoxedNumber({ number: i }); }; Parse.Object.saveAll( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function(list) { const query = new Parse.Query(BoxedNumber); query.containedIn('objectId', [list[2].id, list[3].id, list[0].id, "NONSENSE"]); query.ascending('number'); - query.find({ - success: function(results) { - if (results.length != 3) { - fail('expected 3 results'); - } else { - equal(results[0].get('number'), 0); - equal(results[1].get('number'), 2); - equal(results[2].get('number'), 3); - } - done(); + query.find().then(function(results) { + if (results.length != 3) { + fail('expected 3 results'); + } else { + equal(results[0].get('number'), 0); + equal(results[1].get('number'), 2); + equal(results[2].get('number'), 3); } + done(); }); }); }); @@ -1284,20 +1225,18 @@ describe('Parse.Query testing', () => { return new BoxedNumber({ number: i }); }; Parse.Object.saveAll( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function(list) { const query = new Parse.Query(BoxedNumber); query.equalTo('objectId', list[4].id); - query.find({ - success: function(results) { - if (results.length != 1) { - fail('expected 1 result') - done(); - } else { - equal(results[0].get('number'), 4); - } + query.find().then(function(results) { + if (results.length != 1) { + fail('expected 1 result') done(); + } else { + equal(results[0].get('number'), 4); } + done(); }); }); }); @@ -1307,107 +1246,94 @@ describe('Parse.Query testing', () => { return new BoxedNumber({ number: i }); }; Parse.Object.saveAll( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)).then( function() { const query = new Parse.Query(BoxedNumber); query.equalTo('number', 17); - query.find(expectSuccess({ - success: function(results) { - equal(results.length, 0); - done(); - } - })); + query.find().then(function(results) { + equal(results.length, 0); + done(); + }); }); }); it("find with error", function(done) { const query = new Parse.Query(BoxedNumber); query.equalTo('$foo', 'bar'); - query.find(expectError(Parse.Error.INVALID_KEY_NAME, done)); + query.find() + .then(done.fail) + .catch(error => expect(error.code).toBe(Parse.Error.INVALID_KEY_NAME)) + .finally(done); }); it("get", function(done) { - Parse.Object.saveAll([new TestObject({foo: 'bar'})], function(items) { + Parse.Object.saveAll([new TestObject({foo: 'bar'})]).then(function(items) { ok(items[0]); const objectId = items[0].id; const query = new Parse.Query(TestObject); - query.get(objectId, { - success: function(result) { - ok(result); - equal(result.id, objectId); - equal(result.get('foo'), 'bar'); - ok(result.createdAt instanceof Date); - ok(result.updatedAt instanceof Date); - done(); - } + query.get(objectId).then(function(result) { + ok(result); + equal(result.id, objectId); + equal(result.get('foo'), 'bar'); + ok(result.createdAt instanceof Date); + ok(result.updatedAt instanceof Date); + done(); }); }); }); it("get undefined", function(done) { - Parse.Object.saveAll([new TestObject({foo: 'bar'})], function(items) { + Parse.Object.saveAll([new TestObject({foo: 'bar'})]).then(function(items) { ok(items[0]); const query = new Parse.Query(TestObject); - query.get(undefined, { - success: fail, - error: done, - }); + query.get(undefined).then(fail, done); }); }); it("get error", function(done) { - Parse.Object.saveAll([new TestObject({foo: 'bar'})], function(items) { + Parse.Object.saveAll([new TestObject({foo: 'bar'})]).then(function(items) { ok(items[0]); const query = new Parse.Query(TestObject); - query.get("InvalidObjectID", { - success: function() { - ok(false, "The get should have failed."); - done(); - }, - error: function(object, error) { - equal(error.code, Parse.Error.OBJECT_NOT_FOUND); - done(); - } + query.get("InvalidObjectID").then(function() { + ok(false, "The get should have failed."); + done(); + }, function(error) { + equal(error.code, Parse.Error.OBJECT_NOT_FOUND); + done(); }); }); }); it("first", function(done) { - Parse.Object.saveAll([new TestObject({foo: 'bar'})], function() { + Parse.Object.saveAll([new TestObject({foo: 'bar'})]).then(function() { const query = new Parse.Query(TestObject); query.equalTo('foo', 'bar'); - query.first({ - success: function(result) { - equal(result.get('foo'), 'bar'); - done(); - } + query.first().then(function(result) { + equal(result.get('foo'), 'bar'); + done(); }); }); }); it("first no result", function(done) { - Parse.Object.saveAll([new TestObject({foo: 'bar'})], function() { + Parse.Object.saveAll([new TestObject({foo: 'bar'})]).then(function() { const query = new Parse.Query(TestObject); query.equalTo('foo', 'baz'); - query.first({ - success: function(result) { - equal(result, undefined); - done(); - } + query.first().then(function(result) { + equal(result, undefined); + done(); }); }); }); it("first with two results", function(done) { Parse.Object.saveAll([new TestObject({foo: 'bar'}), - new TestObject({foo: 'bar'})], function() { + new TestObject({foo: 'bar'})]).then(function() { const query = new Parse.Query(TestObject); query.equalTo('foo', 'bar'); - query.first({ - success: function(result) { - equal(result.get('foo'), 'bar'); - done(); - } + query.first().then(function(result) { + equal(result.get('foo'), 'bar'); + done(); }); }); }); @@ -1415,7 +1341,10 @@ describe('Parse.Query testing', () => { it("first with error", function(done) { const query = new Parse.Query(BoxedNumber); query.equalTo('$foo', 'bar'); - query.first(expectError(Parse.Error.INVALID_KEY_NAME, done)); + query.first() + .then(done.fail) + .catch(e => expect(e.code).toBe(Parse.Error.INVALID_KEY_NAME)) + .finally(done); }); const Container = Parse.Object.extend({ @@ -1427,57 +1356,45 @@ describe('Parse.Query testing', () => { const item2 = new TestObject(); const container1 = new Container({item: item1}); const container2 = new Container({item: item2}); - Parse.Object.saveAll([item1, item2, container1, container2], function() { + Parse.Object.saveAll([item1, item2, container1, container2]).then(function() { const query = new Parse.Query(Container); query.notEqualTo('item', item1); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + done(); }); }); }); it("skip", function(done) { - Parse.Object.saveAll([new TestObject(), new TestObject()], function() { + Parse.Object.saveAll([new TestObject(), new TestObject()]).then(function() { const query = new Parse.Query(TestObject); query.skip(1); - query.find({ - success: function(results) { - equal(results.length, 1); - query.skip(3); - query.find({ - success: function(results) { - equal(results.length, 0); - done(); - } - }); - } + query.find().then(function(results) { + equal(results.length, 1); + query.skip(3); + query.find().then(function(results) { + equal(results.length, 0); + done(); + }); }); }); }); it("skip doesn't affect count", function(done) { - Parse.Object.saveAll([new TestObject(), new TestObject()], function() { + Parse.Object.saveAll([new TestObject(), new TestObject()]).then(function() { const query = new Parse.Query(TestObject); - query.count({ - success: function(count) { + query.count().then(function(count) { + equal(count, 2); + query.skip(1); + query.count().then(function(count) { equal(count, 2); - query.skip(1); - query.count({ - success: function(count) { - equal(count, 2); - query.skip(3); - query.count({ - success: function(count) { - equal(count, 2); - done(); - } - }); - } + query.skip(3); + query.count().then(function(count) { + equal(count, 2); + done(); }); - } + }); }); }); }); @@ -1487,15 +1404,13 @@ describe('Parse.Query testing', () => { return new BoxedNumber({ number: i }); }; Parse.Object.saveAll( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber), - function() { + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(makeBoxedNumber)) + .then(function() { const query = new Parse.Query(BoxedNumber); query.greaterThan("number", 1); - query.count({ - success: function(count) { - equal(count, 8); - done(); - } + query.count().then(function(count) { + equal(count, 8); + done(); }); }); }); @@ -1504,18 +1419,16 @@ describe('Parse.Query testing', () => { const makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; - Parse.Object.saveAll([3, 1, 2].map(makeBoxedNumber), function() { + Parse.Object.saveAll([3, 1, 2].map(makeBoxedNumber)).then(function() { const query = new Parse.Query(BoxedNumber); query.ascending("number"); - query.find(expectSuccess({ - success: function(results) { - equal(results.length, 3); - equal(results[0].get("number"), 1); - equal(results[1].get("number"), 2); - equal(results[2].get("number"), 3); - done(); - } - })); + query.find().then(function(results) { + equal(results.length, 3); + equal(results[0].get("number"), 1); + equal(results[1].get("number"), 2); + equal(results[2].get("number"), 3); + done(); + }); }); }); @@ -1526,15 +1439,13 @@ describe('Parse.Query testing', () => { Parse.Object.saveAll([3, 1, 2].map(makeBoxedNumber)).then(function() { const query = new Parse.Query(BoxedNumber); query.descending("number"); - query.find(expectSuccess({ - success: function(results) { - equal(results.length, 3); - equal(results[0].get("number"), 3); - equal(results[1].get("number"), 2); - equal(results[2].get("number"), 1); - done(); - } - })); + query.find().then(function(results) { + equal(results.length, 3); + equal(results[0].get("number"), 3); + equal(results[1].get("number"), 2); + equal(results[2].get("number"), 1); + done(); + }); }); }); @@ -1632,20 +1543,18 @@ describe('Parse.Query testing', () => { function() { const query = new Parse.Query(BoxedNumber); query.ascending("number").addDescending("string"); - query.find(expectSuccess({ - success: function(results) { - equal(results.length, 4); - equal(results[0].get("number"), 1); - equal(results[0].get("string"), "b"); - equal(results[1].get("number"), 2); - equal(results[1].get("string"), "d"); - equal(results[2].get("number"), 3); - equal(results[2].get("string"), "c"); - equal(results[3].get("number"), 3); - equal(results[3].get("string"), "a"); - done(); - } - })); + query.find().then(function(results) { + equal(results.length, 4); + equal(results[0].get("number"), 1); + equal(results[0].get("string"), "b"); + equal(results[1].get("number"), 2); + equal(results[1].get("string"), "d"); + equal(results[2].get("number"), 3); + equal(results[2].get("string"), "c"); + equal(results[3].get("number"), 3); + equal(results[3].get("string"), "a"); + done(); + }); }); }); @@ -1687,20 +1596,18 @@ describe('Parse.Query testing', () => { function() { const query = new Parse.Query(BoxedNumber); query.descending("number,string"); - query.find(expectSuccess({ - success: function(results) { - equal(results.length, 4); - equal(results[0].get("number"), 3); - equal(results[0].get("string"), "c"); - equal(results[1].get("number"), 3); - equal(results[1].get("string"), "a"); - equal(results[2].get("number"), 2); - equal(results[2].get("string"), "d"); - equal(results[3].get("number"), 1); - equal(results[3].get("string"), "b"); - done(); - } - })); + query.find().then(function(results) { + equal(results.length, 4); + equal(results[0].get("number"), 3); + equal(results[0].get("string"), "c"); + equal(results[1].get("number"), 3); + equal(results[1].get("string"), "a"); + equal(results[2].get("number"), 2); + equal(results[2].get("string"), "d"); + equal(results[3].get("number"), 1); + equal(results[3].get("string"), "b"); + done(); + }); }); }); @@ -1713,20 +1620,18 @@ describe('Parse.Query testing', () => { function () { const query = new Parse.Query(BoxedNumber); query.descending("number, string"); - query.find(expectSuccess({ - success: function (results) { - equal(results.length, 4); - equal(results[0].get("number"), 3); - equal(results[0].get("string"), "c"); - equal(results[1].get("number"), 3); - equal(results[1].get("string"), "a"); - equal(results[2].get("number"), 2); - equal(results[2].get("string"), "d"); - equal(results[3].get("number"), 1); - equal(results[3].get("string"), "b"); - done(); - } - })); + query.find().then(function (results) { + equal(results.length, 4); + equal(results[0].get("number"), 3); + equal(results[0].get("string"), "c"); + equal(results[1].get("number"), 3); + equal(results[1].get("string"), "a"); + equal(results[2].get("number"), 2); + equal(results[2].get("string"), "d"); + equal(results[3].get("number"), 1); + equal(results[3].get("string"), "b"); + done(); + }); }, (err) => { jfail(err); @@ -1743,20 +1648,18 @@ describe('Parse.Query testing', () => { function() { const query = new Parse.Query(BoxedNumber); query.descending(["number", "string"]); - query.find(expectSuccess({ - success: function(results) { - equal(results.length, 4); - equal(results[0].get("number"), 3); - equal(results[0].get("string"), "c"); - equal(results[1].get("number"), 3); - equal(results[1].get("string"), "a"); - equal(results[2].get("number"), 2); - equal(results[2].get("string"), "d"); - equal(results[3].get("number"), 1); - equal(results[3].get("string"), "b"); - done(); - } - })); + query.find().then(function(results) { + equal(results.length, 4); + equal(results[0].get("number"), 3); + equal(results[0].get("string"), "c"); + equal(results[1].get("number"), 3); + equal(results[1].get("string"), "a"); + equal(results[2].get("number"), 2); + equal(results[2].get("string"), "d"); + equal(results[3].get("number"), 1); + equal(results[3].get("string"), "b"); + done(); + }); }); }); @@ -1769,20 +1672,18 @@ describe('Parse.Query testing', () => { function() { const query = new Parse.Query(BoxedNumber); query.descending("number", "string"); - query.find(expectSuccess({ - success: function(results) { - equal(results.length, 4); - equal(results[0].get("number"), 3); - equal(results[0].get("string"), "c"); - equal(results[1].get("number"), 3); - equal(results[1].get("string"), "a"); - equal(results[2].get("number"), 2); - equal(results[2].get("string"), "d"); - equal(results[3].get("number"), 1); - equal(results[3].get("string"), "b"); - done(); - } - })); + query.find().then(function(results) { + equal(results.length, 4); + equal(results[0].get("number"), 3); + equal(results[0].get("string"), "c"); + equal(results[1].get("number"), 3); + equal(results[1].get("string"), "a"); + equal(results[2].get("number"), 2); + equal(results[2].get("string"), "d"); + equal(results[3].get("number"), 1); + equal(results[3].get("string"), "b"); + done(); + }); }); }); @@ -1790,10 +1691,13 @@ describe('Parse.Query testing', () => { const makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; - Parse.Object.saveAll([3, 1, 2].map(makeBoxedNumber), function() { + Parse.Object.saveAll([3, 1, 2].map(makeBoxedNumber)).then(function() { const query = new Parse.Query(BoxedNumber); query.ascending("_password"); - query.find(expectError(Parse.Error.INVALID_KEY_NAME, done)); + query.find() + .then(done.fail) + .catch(e => expect(e.code).toBe(Parse.Error.INVALID_KEY_NAME)) + .finally(done); }); }); @@ -1809,19 +1713,13 @@ describe('Parse.Query testing', () => { }).then(function() { const query = new Parse.Query(BoxedNumber); query.ascending("_created_at"); - query.find({ - success: function(results) { - equal(results.length, 3); - equal(results[0].get("number"), 3); - equal(results[1].get("number"), 1); - equal(results[2].get("number"), 2); - done(); - }, - error: function(e) { - jfail(e); - done(); - }, - }); + query.find().then(function(results) { + equal(results.length, 3); + equal(results[0].get("number"), 3); + equal(results[1].get("number"), 1); + equal(results[2].get("number"), 2); + done(); + }, done.fail); }); }); @@ -1837,14 +1735,12 @@ describe('Parse.Query testing', () => { }).then(function() { const query = new Parse.Query(BoxedNumber); query.descending("createdAt"); - query.find({ - success: function(results) { - equal(results.length, 3); - equal(results[0].get("number"), 2); - equal(results[1].get("number"), 1); - equal(results[2].get("number"), 3); - done(); - } + query.find().then(function(results) { + equal(results.length, 3); + equal(results[0].get("number"), 2); + equal(results[1].get("number"), 1); + equal(results[2].get("number"), 3); + done(); }); }); }); @@ -1860,20 +1756,16 @@ describe('Parse.Query testing', () => { return numbers[2].save(); }).then(function() { numbers[1].set("number", 4); - numbers[1].save(null, { - success: function() { - const query = new Parse.Query(BoxedNumber); - query.ascending("_updated_at"); - query.find({ - success: function(results) { - equal(results.length, 3); - equal(results[0].get("number"), 3); - equal(results[1].get("number"), 2); - equal(results[2].get("number"), 4); - done(); - } - }); - } + numbers[1].save().then(function() { + const query = new Parse.Query(BoxedNumber); + query.ascending("_updated_at"); + query.find().then(function(results) { + equal(results.length, 3); + equal(results[0].get("number"), 3); + equal(results[1].get("number"), 2); + equal(results[2].get("number"), 4); + done(); + }); }); }); }); @@ -1887,20 +1779,16 @@ describe('Parse.Query testing', () => { return numbers[2].save(); }).then(function() { numbers[1].set("number", 4); - numbers[1].save(null, { - success: function() { - const query = new Parse.Query(BoxedNumber); - query.descending("_updated_at"); - query.find({ - success: function(results) { - equal(results.length, 3); - equal(results[0].get("number"), 4); - equal(results[1].get("number"), 2); - equal(results[2].get("number"), 3); - done(); - } - }); - } + numbers[1].save().then(function() { + const query = new Parse.Query(BoxedNumber); + query.descending("_updated_at"); + query.find().then(function(results) { + equal(results.length, 3); + equal(results[0].get("number"), 4); + equal(results[1].get("number"), 2); + equal(results[2].get("number"), 3); + done(); + }); }); }); }); @@ -1933,12 +1821,10 @@ describe('Parse.Query testing', () => { makeThreeTimeObjects().then(function(list) { const query = new Parse.Query(TestObject); query.equalTo("time", list[1].get("time")); - query.find({ - success: function(results) { - equal(results.length, 1); - equal(results[0].get("name"), "item2"); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + equal(results[0].get("name"), "item2"); + done(); }); }); }); @@ -1947,11 +1833,9 @@ describe('Parse.Query testing', () => { makeThreeTimeObjects().then(function(list) { const query = new Parse.Query(TestObject); query.lessThan("time", list[2].get("time")); - query.find({ - success: function(results) { - equal(results.length, 2); - done(); - } + query.find().then(function(results) { + equal(results.length, 2); + done(); }); }); }); @@ -1961,11 +1845,9 @@ describe('Parse.Query testing', () => { makeThreeTimeObjects().then(function(list) { const query = new Parse.Query(TestObject); query.greaterThanOrEqualTo("createdAt", list[0].createdAt); - query.find({ - success: function(results) { - equal(results.length, 3); - done(); - } + query.find().then(function(results) { + equal(results.length, 3); + done(); }); }); }); @@ -1975,14 +1857,12 @@ describe('Parse.Query testing', () => { thing1.set("myString", "football"); const thing2 = new TestObject(); thing2.set("myString", "soccer"); - Parse.Object.saveAll([thing1, thing2], function() { + Parse.Object.saveAll([thing1, thing2]).then(function() { const query = new Parse.Query(TestObject); query.matches("myString", "^fo*\\wb[^o]l+$"); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + done(); }); }); }); @@ -1992,14 +1872,12 @@ describe('Parse.Query testing', () => { thing1.set("myString", "football"); const thing2 = new TestObject(); thing2.set("myString", "soccer"); - Parse.Object.saveAll([thing1, thing2], function() { + Parse.Object.saveAll([thing1, thing2]).then(function() { const query = new Parse.Query(TestObject); query.matches("myString", /^fo*\wb[^o]l+$/); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + done(); }); }); }); @@ -2007,27 +1885,26 @@ describe('Parse.Query testing', () => { it("case insensitive regex success", function(done) { const thing = new TestObject(); thing.set("myString", "football"); - Parse.Object.saveAll([thing], function() { + Parse.Object.saveAll([thing]).then(function() { const query = new Parse.Query(TestObject); query.matches("myString", "FootBall", "i"); - query.find({ - success: function() { - done(); - } - }); + query.find().then(done); }); }); it("regexes with invalid options fail", function(done) { const query = new Parse.Query(TestObject); query.matches("myString", "FootBall", "some invalid option"); - query.find(expectError(Parse.Error.INVALID_QUERY, done)); + query.find() + .then(done.fail) + .catch(e => expect(e.code).toBe(Parse.Error.INVALID_QUERY)) + .finally(done); }); it("Use a regex that requires all modifiers", function(done) { const thing = new TestObject(); thing.set("myString", "PArSe\nCom"); - Parse.Object.saveAll([thing], function() { + Parse.Object.saveAll([thing]).then(function() { const query = new Parse.Query(TestObject); query.matches( "myString", @@ -2035,15 +1912,12 @@ describe('Parse.Query testing', () => { "insensitively\n.com # Second fragment. This can be separated by any " + "character, including newline", "mixs"); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - }, - error: function(err) { - jfail(err); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + done(); + }, function(err) { + jfail(err); + done(); }); }); }); @@ -2051,14 +1925,12 @@ describe('Parse.Query testing', () => { it("Regular expression constructor includes modifiers inline", function(done) { const thing = new TestObject(); thing.set("myString", "\n\nbuffer\n\nparse.COM"); - Parse.Object.saveAll([thing], function() { + Parse.Object.saveAll([thing]).then(function() { const query = new Parse.Query(TestObject); query.matches("myString", /parse\.com/mi); - query.find({ - success: function(results) { - equal(results.length, 1); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + done(); }); }); }); @@ -2070,14 +1942,12 @@ describe('Parse.Query testing', () => { Parse.Object.saveAll([new TestObject({myString: "zax" + someAscii + "qub"}), new TestObject({myString: "start" + someAscii}), new TestObject({myString: someAscii + "end"}), - new TestObject({myString: someAscii})], function() { + new TestObject({myString: someAscii})]).then(function() { const query = new Parse.Query(TestObject); query.contains("myString", someAscii); - query.find({ - success: function(results) { - equal(results.length, 4); - done(); - } + query.find().then(function(results) { + equal(results.length, 4); + done(); }); }); }); @@ -2103,14 +1973,12 @@ describe('Parse.Query testing', () => { Parse.Object.saveAll([new TestObject({myString: "zax" + someAscii + "qub"}), new TestObject({myString: "start" + someAscii}), new TestObject({myString: someAscii + "end"}), - new TestObject({myString: someAscii})], function() { + new TestObject({myString: someAscii})]).then(function() { const query = new Parse.Query(TestObject); query.startsWith("myString", someAscii); - query.find({ - success: function(results) { - equal(results.length, 2); - done(); - } + query.find().then(function(results) { + equal(results.length, 2); + done(); }); }); }); @@ -2119,14 +1987,12 @@ describe('Parse.Query testing', () => { Parse.Object.saveAll([new TestObject({myString: "zax" + someAscii + "qub"}), new TestObject({myString: "start" + someAscii}), new TestObject({myString: someAscii + "end"}), - new TestObject({myString: someAscii})], function() { + new TestObject({myString: someAscii})]).then(function() { const query = new Parse.Query(TestObject); query.endsWith("myString", someAscii); - query.find({ - success: function(results) { - equal(results.length, 2); - done(); - } + query.find().then(function(results) { + equal(results.length, 2); + done(); }); }); }); @@ -2142,17 +2008,15 @@ describe('Parse.Query testing', () => { } objects.push(item); } - Parse.Object.saveAll(objects, function() { + Parse.Object.saveAll(objects).then(function() { const query = new Parse.Query(TestObject); query.exists("x"); - query.find({ - success: function(results) { - equal(results.length, 5); - for (const result of results) { - ok(result.get("x")); - } - done(); + query.find().then(function(results) { + equal(results.length, 5); + for (const result of results) { + ok(result.get("x")); } + done(); }); }); }); @@ -2168,17 +2032,15 @@ describe('Parse.Query testing', () => { } objects.push(item); } - Parse.Object.saveAll(objects, function() { + Parse.Object.saveAll(objects).then(function() { const query = new Parse.Query(TestObject); query.doesNotExist("x"); - query.find({ - success: function(results) { - equal(results.length, 4); - for (const result of results) { - ok(result.get("y")); - } - done(); + query.find().then(function(results) { + equal(results.length, 4); + for (const result of results) { + ok(result.get("y")); } + done(); }); }); }); @@ -2200,14 +2062,12 @@ describe('Parse.Query testing', () => { Parse.Object.saveAll(objects).then(function() { const query = new Parse.Query(Container); query.exists("x"); - query.find({ - success: function(results) { - equal(results.length, 5); - for (const result of results) { - ok(result.get("x")); - } - done(); + query.find().then(function(results) { + equal(results.length, 5); + for (const result of results) { + ok(result.get("x")); } + done(); }); }); }); @@ -2226,17 +2086,15 @@ describe('Parse.Query testing', () => { } objects.push(container); } - Parse.Object.saveAll(objects, function() { + Parse.Object.saveAll(objects).then(function() { const query = new Parse.Query(Container); query.doesNotExist("x"); - query.find({ - success: function(results) { - equal(results.length, 4); - for (const result of results) { - ok(result.get("y")); - } - done(); + query.find().then(function(results) { + equal(results.length, 4); + for (const result of results) { + ok(result.get("y")); } + done(); }); }); }); @@ -2246,21 +2104,19 @@ describe('Parse.Query testing', () => { const parent = new Container(); child.set("foo", "bar"); parent.set("child", child); - Parse.Object.saveAll([child, parent], function() { + Parse.Object.saveAll([child, parent]).then(function() { child._clearServerData(); const query = new Parse.Query(Container); - query.find({ - success: function(results) { - equal(results.length, 1); - const parentAgain = results[0]; - const goodURL = Parse.serverURL; - Parse.serverURL = "YAAAAAAAAARRRRRGGGGGGGGG"; - const childAgain = parentAgain.get("child"); - ok(childAgain); - equal(childAgain.get("foo"), undefined); - Parse.serverURL = goodURL; - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + const parentAgain = results[0]; + const goodURL = Parse.serverURL; + Parse.serverURL = "YAAAAAAAAARRRRRGGGGGGGGG"; + const childAgain = parentAgain.get("child"); + ok(childAgain); + equal(childAgain.get("foo"), undefined); + Parse.serverURL = goodURL; + done(); }); }); }); @@ -2270,21 +2126,19 @@ describe('Parse.Query testing', () => { const parent = new Container(); child.set("foo", "bar"); parent.set("child", child); - Parse.Object.saveAll([child, parent], function() { + Parse.Object.saveAll([child, parent]).then(function() { const query = new Parse.Query(Container); query.include("child"); - query.find({ - success: function(results) { - equal(results.length, 1); - const parentAgain = results[0]; - const goodURL = Parse.serverURL; - Parse.serverURL = "YAAAAAAAAARRRRRGGGGGGGGG"; - const childAgain = parentAgain.get("child"); - ok(childAgain); - equal(childAgain.get("foo"), "bar"); - Parse.serverURL = goodURL; - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + const parentAgain = results[0]; + const goodURL = Parse.serverURL; + Parse.serverURL = "YAAAAAAAAARRRRRGGGGGGGGG"; + const childAgain = parentAgain.get("child"); + ok(childAgain); + equal(childAgain.get("foo"), "bar"); + Parse.serverURL = goodURL; + done(); }); }); }); @@ -2294,21 +2148,19 @@ describe('Parse.Query testing', () => { const parent = new Container(); child.set("foo", "bar"); parent.set("child", child); - Parse.Object.saveAll([child, parent], function() { + Parse.Object.saveAll([child, parent]).then(function() { const query = new Parse.Query(Container); query.include(["child"]); - query.find({ - success: function(results) { - equal(results.length, 1); - const parentAgain = results[0]; - const goodURL = Parse.serverURL; - Parse.serverURL = "YAAAAAAAAARRRRRGGGGGGGGG"; - const childAgain = parentAgain.get("child"); - ok(childAgain); - equal(childAgain.get("foo"), "bar"); - Parse.serverURL = goodURL; - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + const parentAgain = results[0]; + const goodURL = Parse.serverURL; + Parse.serverURL = "YAAAAAAAAARRRRRGGGGGGGGG"; + const childAgain = parentAgain.get("child"); + ok(childAgain); + equal(childAgain.get("foo"), "bar"); + Parse.serverURL = goodURL; + done(); }); }); }); @@ -2331,18 +2183,16 @@ describe('Parse.Query testing', () => { objects.push(grandparent); } - Parse.Object.saveAll(objects, function() { + Parse.Object.saveAll(objects).then(function() { const query = new Parse.Query(Grandparent); query.include(["parent.child"]); - query.find({ - success: function(results) { - equal(results.length, 5); - for (const object of results) { - equal(object.get("z"), object.get("parent").get("y")); - equal(object.get("z"), object.get("parent").get("child").get("x")); - } - done(); + query.find().then(function(results) { + equal(results.length, 5); + for (const object of results) { + equal(object.get("z"), object.get("parent").get("y")); + equal(object.get("z"), object.get("parent").get("child").get("x")); } + done(); }); }); }); @@ -2355,21 +2205,19 @@ describe('Parse.Query testing', () => { child.set("foo", "bar"); parent.set("child", child); - Parse.Object.saveAll([child, parent], function() { + Parse.Object.saveAll([child, parent]).then(function() { const query = new Parse.Query(Parent); query.include("child"); - query.find({ - success: function(results) { - equal(results.length, 1); - const parentAgain = results[0]; - const childAgain = parentAgain.get("child"); - equal(childAgain.id, child.id); - equal(parentAgain.id, parent.id); - equal(childAgain.get("foo"), "bar"); - equal(false, parentAgain.dirty()); - equal(false, childAgain.dirty()); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + const parentAgain = results[0]; + const childAgain = parentAgain.get("child"); + equal(childAgain.id, child.id); + equal(parentAgain.id, parent.id); + equal(childAgain.get("foo"), "bar"); + equal(false, parentAgain.dirty()); + equal(false, childAgain.dirty()); + done(); }); }); }); @@ -2534,7 +2382,7 @@ describe('Parse.Query testing', () => { const parent = new ParentObject(); const child = new ChildObject(); parent.set("child", child); - Parse.Object.saveAll([child, parent], function() { + Parse.Object.saveAll([child, parent]).then(function() { // Add a bar() method to ChildObject. ChildObject = Parse.Object.extend("ChildObject", { bar: function() { @@ -2544,15 +2392,13 @@ describe('Parse.Query testing', () => { const query = new Parse.Query(ParentObject); query.include("child"); - query.find({ - success: function(results) { - equal(results.length, 1); - const parentAgain = results[0]; - const childAgain = parentAgain.get("child"); - equal(childAgain.foo(), "foo"); - equal(childAgain.bar(), "bar"); - done(); - } + query.find().then(function(results) { + equal(results.length, 1); + const parentAgain = results[0]; + const childAgain = parentAgain.get("child"); + equal(childAgain.foo(), "foo"); + equal(childAgain.bar(), "bar"); + done(); }); }); }); @@ -2568,30 +2414,26 @@ describe('Parse.Query testing', () => { x: 10 + i })); } - Parse.Object.saveAll(objects, function() { + Parse.Object.saveAll(objects).then(function() { const subQuery = new Parse.Query(ChildObject); subQuery.greaterThan("x", 5); const query = new Parse.Query(ParentObject); query.matchesQuery("child", subQuery); - query.find({ - success: function(results) { - equal(results.length, 4); - for (const object of results) { - ok(object.get("x") > 15); - } - const query = new Parse.Query(ParentObject); - query.doesNotMatchQuery("child", subQuery); - query.find({ - success: function (results) { - equal(results.length, 6); - for (const object of results) { - ok(object.get("x") >= 10); - ok(object.get("x") <= 15); - done(); - } - } - }); + query.find().then(function(results) { + equal(results.length, 4); + for (const object of results) { + ok(object.get("x") > 15); } + const query = new Parse.Query(ParentObject); + query.doesNotMatchQuery("child", subQuery); + query.find().then(function (results) { + equal(results.length, 6); + for (const object of results) { + ok(object.get("x") >= 10); + ok(object.get("x") <= 15); + done(); + } + }); }); }); }); @@ -2607,18 +2449,16 @@ describe('Parse.Query testing', () => { new PersonObject({ name: "Billy", hometown: "Detroit" }) ]; - Parse.Object.saveAll(objects, function() { + Parse.Object.saveAll(objects).then(function() { const query = new Parse.Query(RestaurantObject); query.greaterThan("ratings", 4); const mainQuery = new Parse.Query(PersonObject); mainQuery.matchesKeyInQuery("hometown", "location", query); - mainQuery.find(expectSuccess({ - success: function(results) { - equal(results.length, 1); - equal(results[0].get('name'), 'Bob'); - done(); - } - })); + mainQuery.find().then(function(results) { + equal(results.length, 1); + equal(results[0].get('name'), 'Bob'); + done(); + }); }); }); @@ -2719,18 +2559,16 @@ describe('Parse.Query testing', () => { new PersonObject({ name: "Billy", hometown: "Djibouti" }) ]; - Parse.Object.saveAll(objects, function() { + Parse.Object.saveAll(objects).then(function() { const query = new Parse.Query(RestaurantObject); query.greaterThan("ratings", 4); const mainQuery = new Parse.Query(PersonObject); mainQuery.doesNotMatchKeyInQuery("hometown", "location", query); - mainQuery.find(expectSuccess({ - success: function(results) { - equal(results.length, 1); - equal(results[0].get('name'), 'Tom'); - done(); - } - })); + mainQuery.find().then(function(results) { + equal(results.length, 1); + equal(results[0].get('name'), 'Tom'); + done(); + }); }); }); @@ -2745,7 +2583,7 @@ describe('Parse.Query testing', () => { new PersonObject({ name: "Billy", hometown: "Ouagadougou" }) ]; - Parse.Object.saveAll(objects, function() { + Parse.Object.saveAll(objects).then(function() { const query = new Parse.Query(RestaurantObject); const mainQuery = new Parse.Query(PersonObject); mainQuery.doesNotMatchKeyInQuery("hometown", "location", query); @@ -2804,7 +2642,7 @@ describe('Parse.Query testing', () => { new PersonObject({ name: "Tom", hometown: "Ouagadougou" }), ]; - Parse.Object.saveAll(objects, function() { + Parse.Object.saveAll(objects).then(function() { const query = new Parse.Query(RestaurantObject); query.greaterThan("ratings", 6); const query2 = new Parse.Query(RestaurantObject); @@ -2815,13 +2653,11 @@ describe('Parse.Query testing', () => { subQuery2.matchesKeyInQuery("hometown", "location", query2); const mainQuery = new Parse.Query(PersonObject); mainQuery.doesNotMatchKeyInQuery("objectId", "objectId", Parse.Query.or(subQuery, subQuery2)); - mainQuery.find(expectSuccess({ - success: function(results) { - equal(results.length, 1); - equal(results[0].get('name'), 'Bob'); - done(); - } - })); + mainQuery.find().then(function(results) { + equal(results.length, 1); + equal(results[0].get('name'), 'Bob'); + done(); + }); }); }); @@ -2830,63 +2666,40 @@ describe('Parse.Query testing', () => { const obj = new TestObject(); obj.set("length", 5); equal(obj.get("length"), 5); - obj.save(null, { - success: function() { - const query = new Parse.Query(TestObject); - query.find({ - success: function(results) { - equal(results.length, 1); - equal(results[0].get("length"), 5); - done(); - }, - error: function(error) { - ok(false, error.message); - done(); - } - }); - }, - error: function(error) { + obj.save().then(function() { + const query = new Parse.Query(TestObject); + query.find().then(function(results) { + equal(results.length, 1); + equal(results[0].get("length"), 5); + done(); + }, function(error) { ok(false, error.message); done(); - } + }); + }, function(error) { + ok(false, error.message); + done(); }); }); it("include user", function(done) { - Parse.User.signUp("bob", "password", { age: 21 }, { - success: function(user) { + Parse.User.signUp("bob", "password", { age: 21 }) + .then(function(user) { const TestObject = Parse.Object.extend("TestObject"); const obj = new TestObject(); obj.save({ owner: user - }, { - success: function(obj) { - const query = new Parse.Query(TestObject); - query.include("owner"); - query.get(obj.id, { - success: function(objAgain) { - equal(objAgain.id, obj.id); - ok(objAgain.get("owner") instanceof Parse.User); - equal(objAgain.get("owner").get("age"), 21); - done(); - }, - error: function(objAgain, error) { - ok(false, error.message); - done(); - } - }); - }, - error: function(obj, error) { - ok(false, error.message); + }).then(function(obj) { + const query = new Parse.Query(TestObject); + query.include("owner"); + query.get(obj.id).then(function(objAgain) { + equal(objAgain.id, obj.id); + ok(objAgain.get("owner") instanceof Parse.User); + equal(objAgain.get("owner").get("age"), 21); done(); - } - }); - }, - error: function(user, error) { - ok(false, error.message); - done(); - } - }); + }, done.fail); + }, done.fail); + }, done.fail); }); it("or queries", function(done) { @@ -2895,24 +2708,20 @@ describe('Parse.Query testing', () => { object.set('x', x); return object; }); - Parse.Object.saveAll(objects, expectSuccess({ - success: function() { - const query1 = new Parse.Query('BoxedNumber'); - query1.lessThan('x', 2); - const query2 = new Parse.Query('BoxedNumber'); - query2.greaterThan('x', 5); - const orQuery = Parse.Query.or(query1, query2); - orQuery.find(expectSuccess({ - success: function(results) { - equal(results.length, 6); - for (const number of results) { - ok(number.get('x') < 2 || number.get('x') > 5); - } - done(); - } - })); - } - })); + Parse.Object.saveAll(objects).then(function() { + const query1 = new Parse.Query('BoxedNumber'); + query1.lessThan('x', 2); + const query2 = new Parse.Query('BoxedNumber'); + query2.greaterThan('x', 5); + const orQuery = Parse.Query.or(query1, query2); + orQuery.find().then(function(results) { + equal(results.length, 6); + for (const number of results) { + ok(number.get('x') < 2 || number.get('x') > 5); + } + done(); + }); + }); }); // This relies on matchesQuery aka the $inQuery operator @@ -2926,23 +2735,19 @@ describe('Parse.Query testing', () => { return parent; }); - Parse.Object.saveAll(objects, expectSuccess({ - success: function() { - const subQuery = new Parse.Query('Child'); - subQuery.equalTo('x', 4); - const query1 = new Parse.Query('Parent'); - query1.matchesQuery('child', subQuery); - const query2 = new Parse.Query('Parent'); - query2.lessThan('y', 2); - const orQuery = Parse.Query.or(query1, query2); - orQuery.find(expectSuccess({ - success: function(results) { - equal(results.length, 3); - done(); - } - })); - } - })); + Parse.Object.saveAll(objects).then(function() { + const subQuery = new Parse.Query('Child'); + subQuery.equalTo('x', 4); + const query1 = new Parse.Query('Parent'); + query1.matchesQuery('child', subQuery); + const query2 = new Parse.Query('Parent'); + query2.lessThan('y', 2); + const orQuery = Parse.Query.or(query1, query2); + orQuery.find().then(function(results) { + equal(results.length, 3); + done(); + }); + }); }); it("async methods", function(done) { @@ -2952,7 +2757,7 @@ describe('Parse.Query testing', () => { return obj.save(); }); - Parse.Promise.when(saves).then(function() { + Promise.all(saves).then(function() { const query = new Parse.Query("TestObject"); query.ascending("x"); return query.first(); @@ -2999,21 +2804,15 @@ describe('Parse.Query testing', () => { const seen = []; query.each(function(obj) { seen[obj.get("x")] = (seen[obj.get("x")] || 0) + 1; - }, { batchSize: 10, - success: function() { - equal(seen.length, COUNT); - for (let i = 0; i < COUNT; i++) { - equal(seen[i], 1, "Should have seen object number " + i); - } - done(); - }, - error: function(error) { - ok(false, error); - done(); + }).then(function() { + equal(seen.length, COUNT); + for (let i = 0; i < COUNT; i++) { + equal(seen[i], 1, "Should have seen object number " + i); } - }); + done(); + }, done.fail); }); }); @@ -3035,12 +2834,12 @@ describe('Parse.Query testing', () => { const query = new Parse.Query(TestObject); query.lessThan("x", COUNT); return query.each(function(obj) { - const promise = new Parse.Promise(); - process.nextTick(function() { - seen[obj.get("x")] = (seen[obj.get("x")] || 0) + 1; - promise.resolve(); + return new Promise((resolve) => { + process.nextTick(function() { + seen[obj.get("x")] = (seen[obj.get("x")] || 0) + 1; + resolve(); + }); }); - return promise; }, { batchSize: 10 }); @@ -3434,8 +3233,9 @@ describe('Parse.Query testing', () => { members: [user], }); - return Parse.Promise.when(post.save(), group.save()); - }).then((p) => { + return Promise.all([post.save(), group.save()]); + }).then((results) => { + const p = results[0]; return new Parse.Query(PostObject) .matchesKeyInQuery("author", "members", new Parse.Query(GroupObject)) .find() @@ -3481,7 +3281,7 @@ describe('Parse.Query testing', () => { expect(results.length).toBe(2); } done(); - }).fail((err) => { + }).catch((err) => { jfail(err); fail('should not fail'); done(); @@ -3580,17 +3380,15 @@ describe('Parse.Query testing', () => { const parent = new Parse.Object('Parent'); child.set('foo', 'bar'); parent.set('child', child); - Parse.Object.saveAll([child, parent], function(response){ + Parse.Object.saveAll([child, parent]).then(function(response){ const savedParent = response[1]; const parentQuery = new Parse.Query('Parent'); parentQuery.include('child'); - parentQuery.get(savedParent.id, { - success: function(parentObj) { - const childPointer = parentObj.get('child'); - ok(childPointer); - equal(childPointer.get('foo'), 'bar'); - done(); - } + parentQuery.get(savedParent.id).then(function(parentObj) { + const childPointer = parentObj.get('child'); + ok(childPointer); + equal(childPointer.get('foo'), 'bar'); + done(); }); }); }); @@ -3599,19 +3397,15 @@ describe('Parse.Query testing', () => { const Foobar = new Parse.Object('Foobar'); Foobar.set('foo', 'bar'); Foobar.set('fizz', 'buzz'); - Foobar.save({ - success: function(savedFoobar){ - const foobarQuery = new Parse.Query('Foobar'); - foobarQuery.select('fizz'); - foobarQuery.get(savedFoobar.id,{ - success: function(foobarObj){ - equal(foobarObj.get('fizz'), 'buzz'); - equal(foobarObj.get('foo'), undefined); - done(); - } - }); - } - }) + Foobar.save().then(function(savedFoobar){ + const foobarQuery = new Parse.Query('Foobar'); + foobarQuery.select('fizz'); + foobarQuery.get(savedFoobar.id).then(function(foobarObj){ + equal(foobarObj.get('fizz'), 'buzz'); + equal(foobarObj.get('foo'), undefined); + done(); + }); + }); }); it('select nested keys (issue #1567)', function(done) { @@ -3628,18 +3422,16 @@ describe('Parse.Query testing', () => { const foobarQuery = new Parse.Query('Foobar'); foobarQuery.include('barBaz'); foobarQuery.select(['fizz', 'barBaz.key']); - foobarQuery.get(savedFoobar.id,{ - success: function(foobarObj){ - equal(foobarObj.get('fizz'), 'buzz'); - equal(foobarObj.get('foo'), undefined); - if (foobarObj.has('barBaz')) { - equal(foobarObj.get('barBaz').get('key'), 'value'); - equal(foobarObj.get('barBaz').get('otherKey'), undefined); - } else { - fail('barBaz should be set'); - } - done(); + foobarQuery.get(savedFoobar.id).then(function(foobarObj) { + equal(foobarObj.get('fizz'), 'buzz'); + equal(foobarObj.get('foo'), undefined); + if (foobarObj.has('barBaz')) { + equal(foobarObj.get('barBaz').get('key'), 'value'); + equal(foobarObj.get('barBaz').get('otherKey'), undefined); + } else { + fail('barBaz should be set'); } + done(); }); }); }); @@ -3666,20 +3458,18 @@ describe('Parse.Query testing', () => { foobarQuery.include('barBaz'); foobarQuery.include('barBaz.bazoo'); foobarQuery.select(['fizz', 'barBaz.key', 'barBaz.bazoo.some']); - foobarQuery.get(savedFoobar.id,{ - success: function(foobarObj){ - equal(foobarObj.get('fizz'), 'buzz'); - equal(foobarObj.get('foo'), undefined); - if (foobarObj.has('barBaz')) { - equal(foobarObj.get('barBaz').get('key'), 'value'); - equal(foobarObj.get('barBaz').get('otherKey'), undefined); - equal(foobarObj.get('barBaz').get('bazoo').get('some'), 'thing'); - equal(foobarObj.get('barBaz').get('bazoo').get('otherSome'), undefined); - } else { - fail('barBaz should be set'); - } - done(); + foobarQuery.get(savedFoobar.id).then(function(foobarObj) { + equal(foobarObj.get('fizz'), 'buzz'); + equal(foobarObj.get('foo'), undefined); + if (foobarObj.has('barBaz')) { + equal(foobarObj.get('barBaz').get('key'), 'value'); + equal(foobarObj.get('barBaz').get('otherKey'), undefined); + equal(foobarObj.get('barBaz').get('bazoo').get('some'), 'thing'); + equal(foobarObj.get('barBaz').get('bazoo').get('otherSome'), undefined); + } else { + fail('barBaz should be set'); } + done(); }); }); }); @@ -4002,13 +3792,11 @@ describe('Parse.Query testing', () => { const groupsWithRoleX = new Parse.Query('Group'); groupsWithRoleX.matchesKeyInQuery('objectId', 'belongsTo.objectId', rolesOfTypeX); - groupsWithRoleX.find(expectSuccess({ - success: function(results) { - equal(results.length, 1); - equal(results[0].get('name'), group1.get('name')); - done(); - } - })) + groupsWithRoleX.find().then(function(results) { + equal(results.length, 1); + equal(results[0].get('name'), group1.get('name')); + done(); + }); }) }); @@ -4044,13 +3832,11 @@ describe('Parse.Query testing', () => { const groupsWithRoleX = new Parse.Query('Group'); groupsWithRoleX.doesNotMatchKeyInQuery('objectId', 'belongsTo.objectId', rolesOfTypeX); - groupsWithRoleX.find(expectSuccess({ - success: function(results) { - equal(results.length, 1); - equal(results[0].get('name'), group2.get('name')); - done(); - } - })) + groupsWithRoleX.find().then(function(results) { + equal(results.length, 1); + equal(results[0].get('name'), group2.get('name')); + done(); + }); }) }); @@ -4109,7 +3895,10 @@ describe('Parse.Query testing', () => { } }; q.withJSON(jsonQ); - q.find(expectError(Parse.Error.INVALID_JSON, done)); + q.find() + .then(done.fail) + .catch(e => expect(e.code).toBe(Parse.Error.INVALID_JSON)) + .finally(done); }); it('withJSON with geoWithin.centerSphere fails with invalid distance', (done) => { @@ -4124,7 +3913,10 @@ describe('Parse.Query testing', () => { } }; q.withJSON(jsonQ); - q.find(expectError(Parse.Error.INVALID_JSON, done)); + q.find() + .then(done.fail) + .catch(e => expect(e.code).toBe(Parse.Error.INVALID_JSON)) + .finally(() => done()); }); it('withJSON with geoWithin.centerSphere fails with invalid coordinate', (done) => { @@ -4139,7 +3931,7 @@ describe('Parse.Query testing', () => { } }; q.withJSON(jsonQ); - q.find(expectError(undefined, done)); + q.find().then(done.fail).catch(done); }); it('withJSON with geoWithin.centerSphere fails with invalid geo point', (done) => { @@ -4154,6 +3946,6 @@ describe('Parse.Query testing', () => { } }; q.withJSON(jsonQ); - q.find(expectError(undefined, done)); + q.find().then(done.fail).catch(done); }); }); diff --git a/spec/ParseRelation.spec.js b/spec/ParseRelation.spec.js index c7807819..b388255b 100644 --- a/spec/ParseRelation.spec.js +++ b/spec/ParseRelation.spec.js @@ -41,41 +41,31 @@ describe('Parse.Relation testing', () => { }); }); - it("query relation without schema", (done) => { + it("query relation without schema", async () => { const ChildObject = Parse.Object.extend("ChildObject"); const childObjects = []; for (let i = 0; i < 10; i++) { childObjects.push(new ChildObject({x:i})); } - Parse.Object.saveAll(childObjects, expectSuccess({ - success: function() { - const ParentObject = Parse.Object.extend("ParentObject"); - const parent = new ParentObject(); - parent.set("x", 4); - const relation = parent.relation("child"); - relation.add(childObjects[0]); - parent.save(null, expectSuccess({ - success: function() { - const parentAgain = new ParentObject(); - parentAgain.id = parent.id; - const relation = parentAgain.relation("child"); - relation.query().find(expectSuccess({ - success: function(list) { - equal(list.length, 1, - "Should have gotten one element back"); - equal(list[0].id, childObjects[0].id, - "Should have gotten the right value"); - done(); - } - })); - } - })); - } - })); + await Parse.Object.saveAll(childObjects); + const ParentObject = Parse.Object.extend("ParentObject"); + const parent = new ParentObject(); + parent.set("x", 4); + let relation = parent.relation("child"); + relation.add(childObjects[0]); + await parent.save(); + const parentAgain = new ParentObject(); + parentAgain.id = parent.id; + relation = parentAgain.relation("child"); + const list = await relation.query().find(); + equal(list.length, 1, + "Should have gotten one element back"); + equal(list[0].id, childObjects[0].id, + "Should have gotten the right value"); }); - it("relations are constructed right from query", (done) => { + it("relations are constructed right from query", async () => { const ChildObject = Parse.Object.extend("ChildObject"); const childObjects = []; @@ -83,42 +73,23 @@ describe('Parse.Relation testing', () => { childObjects.push(new ChildObject({x: i})); } - Parse.Object.saveAll(childObjects, { - success: function() { - const ParentObject = Parse.Object.extend("ParentObject"); - const parent = new ParentObject(); - parent.set("x", 4); - const relation = parent.relation("child"); - relation.add(childObjects[0]); - parent.save(null, { - success: function() { - const query = new Parse.Query(ParentObject); - query.get(parent.id, { - success: function(object) { - const relationAgain = object.relation("child"); - relationAgain.query().find({ - success: function(list) { - equal(list.length, 1, - "Should have gotten one element back"); - equal(list[0].id, childObjects[0].id, - "Should have gotten the right value"); - ok(!parent.dirty("child"), - "The relation should not be dirty"); - done(); - }, - error: function() { - ok(false, "This shouldn't have failed"); - done(); - } - }); - - } - }); - } - }); - } - }); - + await Parse.Object.saveAll(childObjects); + const ParentObject = Parse.Object.extend("ParentObject"); + const parent = new ParentObject(); + parent.set("x", 4); + const relation = parent.relation("child"); + relation.add(childObjects[0]); + await parent.save(); + const query = new Parse.Query(ParentObject); + const object = await query.get(parent.id); + const relationAgain = object.relation("child"); + const list = await relationAgain.query().find(); + equal(list.length, 1, + "Should have gotten one element back"); + equal(list[0].id, childObjects[0].id, + "Should have gotten the right value"); + ok(!parent.dirty("child"), + "The relation should not be dirty"); }); it("compound add and remove relation", (done) => { @@ -191,7 +162,7 @@ describe('Parse.Relation testing', () => { }).then(done, done.fail); }); - it_exclude_dbs(['postgres'])("queries with relations", (done) => { + it_exclude_dbs(['postgres'])("queries with relations", async () => { const ChildObject = Parse.Object.extend("ChildObject"); const childObjects = []; @@ -199,80 +170,59 @@ describe('Parse.Relation testing', () => { childObjects.push(new ChildObject({x: i})); } - Parse.Object.saveAll(childObjects, { - success: function() { - const ParentObject = Parse.Object.extend("ParentObject"); - const parent = new ParentObject(); - parent.set("x", 4); - const relation = parent.relation("child"); - relation.add(childObjects[0]); - relation.add(childObjects[1]); - relation.add(childObjects[2]); - parent.save(null, { - success: function() { - const query = relation.query(); - query.equalTo("x", 2); - query.find({ - success: function(list) { - equal(list.length, 1, - "There should only be one element"); - ok(list[0] instanceof ChildObject, - "Should be of type ChildObject"); - equal(list[0].id, childObjects[2].id, - "We should have gotten back the right result"); - done(); - } - }); - } - }); - } - }); + await Parse.Object.saveAll(childObjects); + const ParentObject = Parse.Object.extend("ParentObject"); + const parent = new ParentObject(); + parent.set("x", 4); + const relation = parent.relation("child"); + relation.add(childObjects[0]); + relation.add(childObjects[1]); + relation.add(childObjects[2]); + await parent.save(); + const query = relation.query(); + query.equalTo("x", 2); + const list = await query.find(); + equal(list.length, 1, + "There should only be one element"); + ok(list[0] instanceof ChildObject, + "Should be of type ChildObject"); + equal(list[0].id, childObjects[2].id, + "We should have gotten back the right result"); }); - it("queries on relation fields", (done) => { + it("queries on relation fields", async () => { const ChildObject = Parse.Object.extend("ChildObject"); const childObjects = []; for (let i = 0; i < 10; i++) { childObjects.push(new ChildObject({x: i})); } - Parse.Object.saveAll(childObjects, { - success: function() { - const ParentObject = Parse.Object.extend("ParentObject"); - const parent = new ParentObject(); - parent.set("x", 4); - const relation = parent.relation("child"); - relation.add(childObjects[0]); - relation.add(childObjects[1]); - relation.add(childObjects[2]); - const parent2 = new ParentObject(); - parent2.set("x", 3); - const relation2 = parent2.relation("child"); - relation2.add(childObjects[4]); - relation2.add(childObjects[5]); - relation2.add(childObjects[6]); - const parents = []; - parents.push(parent); - parents.push(parent2); - Parse.Object.saveAll(parents, { - success: function() { - const query = new Parse.Query(ParentObject); - const objects = []; - objects.push(childObjects[4]); - objects.push(childObjects[9]); - query.containedIn("child", objects); - query.find({ - success: function(list) { - equal(list.length, 1, "There should be only one result"); - equal(list[0].id, parent2.id, - "Should have gotten back the right result"); - done(); - } - }); - } - }); - } - }); + await Parse.Object.saveAll(childObjects); + const ParentObject = Parse.Object.extend("ParentObject"); + const parent = new ParentObject(); + parent.set("x", 4); + const relation = parent.relation("child"); + relation.add(childObjects[0]); + relation.add(childObjects[1]); + relation.add(childObjects[2]); + const parent2 = new ParentObject(); + parent2.set("x", 3); + const relation2 = parent2.relation("child"); + relation2.add(childObjects[4]); + relation2.add(childObjects[5]); + relation2.add(childObjects[6]); + const parents = []; + parents.push(parent); + parents.push(parent2); + await Parse.Object.saveAll(parents); + const query = new Parse.Query(ParentObject); + const objects = []; + objects.push(childObjects[4]); + objects.push(childObjects[9]); + const list = await query.containedIn("child", objects).find(); + equal(list.length, 1, "There should be only one result"); + equal(list[0].id, parent2.id, + "Should have gotten back the right result"); }); it("queries on relation fields with multiple containedIn (regression test for #1271)", (done) => { @@ -627,22 +577,19 @@ describe('Parse.Relation testing', () => { Parse.Object.saveAll([owner].concat(restaurants).concat(persons)).then(function() { owner.relation('restaurants').add(restaurants); return owner.save() - }).then(() => { + }).then(async () => { const unfetchedOwner = new OwnerObject(); unfetchedOwner.id = owner.id; const query = unfetchedOwner.relation('restaurants').query(); query.greaterThan("ratings", 4); const mainQuery = new Parse.Query(PersonObject); mainQuery.matchesKeyInQuery("hometown", "location", query); - mainQuery.find(expectSuccess({ - success: function(results) { - equal(results.length, 1); - if (results.length > 0) { - equal(results[0].get('name'), 'Bob'); - } - done(); - } - })); + const results = await mainQuery.find(); + equal(results.length, 1); + if (results.length > 0) { + equal(results[0].get('name'), 'Bob'); + } + done(); }, (e) => { fail(JSON.stringify(e)); done(); @@ -668,7 +615,7 @@ describe('Parse.Relation testing', () => { Parse.Object.saveAll([owner].concat(restaurants).concat(persons)).then(function() { owner.relation('restaurants').add(restaurants); return owner.save() - }).then(() => { + }).then(async () => { const unfetchedOwner = new OwnerObject(); unfetchedOwner.id = owner.id; const query = unfetchedOwner.relation('restaurants').query(); @@ -676,16 +623,13 @@ describe('Parse.Relation testing', () => { const mainQuery = new Parse.Query(PersonObject); mainQuery.doesNotMatchKeyInQuery("hometown", "location", query); mainQuery.ascending('name'); - mainQuery.find(expectSuccess({ - success: function(results) { - equal(results.length, 2); - if (results.length > 0) { - equal(results[0].get('name'), 'Billy'); - equal(results[1].get('name'), 'Tom'); - } - done(); - } - })); + const results = await mainQuery.find() + equal(results.length, 2); + if (results.length > 0) { + equal(results[0].get('name'), 'Billy'); + equal(results[1].get('name'), 'Tom'); + } + done(); }, (e) => { fail(JSON.stringify(e)); done(); diff --git a/spec/ParseRole.spec.js b/spec/ParseRole.spec.js index 21b430db..19f34bb4 100644 --- a/spec/ParseRole.spec.js +++ b/spec/ParseRole.spec.js @@ -227,7 +227,7 @@ describe('Parse Role testing', () => { // return with result and roleId for later comparison const promises = [admin, moderator, contentManager, superModerator].map((role) => { return auth._getAllRolesNamesForRoleIds([role.id]).then((result) => { - return Parse.Promise.as({ + return Promise.resolve({ id: role.id, name: role.get('name'), roleNames: result @@ -235,7 +235,7 @@ describe('Parse Role testing', () => { }) }); - return Parse.Promise.when(promises); + return Promise.all(promises); }).then((results) => { results.forEach((result) => { const id = result.id; @@ -257,7 +257,7 @@ describe('Parse Role testing', () => { } }); done(); - }).fail(() => { + }).catch(() => { done(); }) diff --git a/spec/ParseServerRESTController.spec.js b/spec/ParseServerRESTController.spec.js index 4759d1a5..602f1d62 100644 --- a/spec/ParseServerRESTController.spec.js +++ b/spec/ParseServerRESTController.spec.js @@ -64,7 +64,7 @@ describe('ParseServerRESTController', () => { expect(res.results.length).toBe(1); expect(res.results[0].key).toEqual("value"); done(); - }).fail((err) => { + }).catch((err) => { console.log(err); jfail(err); done(); @@ -81,7 +81,7 @@ describe('ParseServerRESTController', () => { // Result is in JSON format expect(res.objectId).toEqual(userId); done(); - }).fail((err) => { + }).catch((err) => { console.log(err); jfail(err); done(); diff --git a/spec/ParseUser.spec.js b/spec/ParseUser.spec.js index 3e347008..3b2f985d 100644 --- a/spec/ParseUser.spec.js +++ b/spec/ParseUser.spec.js @@ -28,141 +28,115 @@ function verifyACL(user) { } describe('Parse.User testing', () => { - it("user sign up class method", (done) => { - Parse.User.signUp("asdf", "zxcv", null, { - success: function(user) { - ok(user.getSessionToken()); - done(); - } - }); + it("user sign up class method", async (done) => { + const user = await Parse.User.signUp("asdf", "zxcv"); + ok(user.getSessionToken()); + done(); }); - it("user sign up instance method", (done) => { + it("user sign up instance method", async () => { const user = new Parse.User(); user.setPassword("asdf"); user.setUsername("zxcv"); - user.signUp(null, { - success: function(user) { - ok(user.getSessionToken()); - done(); + await user.signUp(); + ok(user.getSessionToken()); + }); + + it("user login wrong username", async (done) => { + await Parse.User.signUp("asdf", "zxcv"); + try { + await Parse.User.logIn("non_existent_user", "asdf3"); + done.fail(); + } catch (e) { + expect(e.code).toBe(Parse.Error.OBJECT_NOT_FOUND); + done(); + } + }); + + it("user login wrong password", async (done) => { + await Parse.User.signUp("asdf", "zxcv"); + try { + await Parse.User.logIn("asdf", "asdfWrong"); + done.fail(); + } catch (e) { + expect(e.code).toBe(Parse.Error.OBJECT_NOT_FOUND); + done(); + } + }); + + it('user login with non-string username with REST API', async (done) => { + await Parse.User.signUp('asdf', 'zxcv'); + rp.post({ + url: 'http://localhost:8378/1/login', + headers: { + 'X-Parse-Application-Id': Parse.applicationId, + 'X-Parse-REST-API-Key': 'rest', }, - error: function(userAgain, error) { - ok(undefined, error); + json: { + _method: 'GET', + username: {'$regex':'^asd'}, + password: 'zxcv', } + }).then((res) => { + fail(`no request should succeed: ${JSON.stringify(res)}`); + done(); + }).catch((err) => { + expect(err.statusCode).toBe(404); + expect(err.message).toMatch('{"code":101,"error":"Invalid username/password."}'); + done(); }); }); - it("user login wrong username", (done) => { - Parse.User.signUp("asdf", "zxcv", null, { - success: function() { - Parse.User.logIn("non_existent_user", "asdf3", - expectError(Parse.Error.OBJECT_NOT_FOUND, done)); + it('user login with non-string username with REST API (again)', async (done) => { + await Parse.User.signUp('asdf', 'zxcv'); + rp.post({ + url: 'http://localhost:8378/1/login', + headers: { + 'X-Parse-Application-Id': Parse.applicationId, + 'X-Parse-REST-API-Key': 'rest', }, - error: function(err) { - jfail(err); - fail("Shit should not fail"); - done(); + json: { + _method: 'GET', + username: 'asdf', + password: {'$regex':'^zx'}, } + }).then((res) => { + fail(`no request should succeed: ${JSON.stringify(res)}`); + done(); + }).catch((err) => { + expect(err.statusCode).toBe(404); + expect(err.message).toMatch('{"code":101,"error":"Invalid username/password."}'); + done(); }); }); - it("user login wrong password", (done) => { - Parse.User.signUp("asdf", "zxcv", null, { - success: function() { - Parse.User.logIn("asdf", "asdfWrong", - expectError(Parse.Error.OBJECT_NOT_FOUND, done)); + it('user login using POST with REST API', async (done) => { + await Parse.User.signUp('some_user', 'some_password'); + rp.post({ + url: 'http://localhost:8378/1/login', + headers: { + 'X-Parse-Application-Id': Parse.applicationId, + 'X-Parse-REST-API-Key': 'rest', + }, + json: { + username: 'some_user', + password: 'some_password', } + }).then((res) => { + expect(res.username).toBe('some_user'); + done(); + }).catch((err) => { + fail(`no request should fail: ${JSON.stringify(err)}`); + done(); }); }); - it('user login with non-string username with REST API', (done) => { - Parse.User.signUp('asdf', 'zxcv', null, { - success: () => { - return rp.post({ - url: 'http://localhost:8378/1/login', - headers: { - 'X-Parse-Application-Id': Parse.applicationId, - 'X-Parse-REST-API-Key': 'rest', - }, - json: { - _method: 'GET', - username: {'$regex':'^asd'}, - password: 'zxcv', - } - }).then((res) => { - fail(`no request should succeed: ${JSON.stringify(res)}`); - done(); - }).catch((err) => { - expect(err.statusCode).toBe(404); - expect(err.message).toMatch('{"code":101,"error":"Invalid username/password."}'); - done(); - }); - }, - }); - }); - - it('user login with non-string username with REST API (again)', (done) => { - Parse.User.signUp('asdf', 'zxcv', null, { - success: () => { - return rp.post({ - url: 'http://localhost:8378/1/login', - headers: { - 'X-Parse-Application-Id': Parse.applicationId, - 'X-Parse-REST-API-Key': 'rest', - }, - json: { - _method: 'GET', - username: 'asdf', - password: {'$regex':'^zx'}, - } - }).then((res) => { - fail(`no request should succeed: ${JSON.stringify(res)}`); - done(); - }).catch((err) => { - expect(err.statusCode).toBe(404); - expect(err.message).toMatch('{"code":101,"error":"Invalid username/password."}'); - done(); - }); - }, - }); - }); - - it('user login using POST with REST API', (done) => { - Parse.User.signUp('some_user', 'some_password', null, { - success: () => { - return rp.post({ - url: 'http://localhost:8378/1/login', - headers: { - 'X-Parse-Application-Id': Parse.applicationId, - 'X-Parse-REST-API-Key': 'rest', - }, - json: { - username: 'some_user', - password: 'some_password', - } - }).then((res) => { - expect(res.username).toBe('some_user'); - done(); - }).catch((err) => { - fail(`no request should fail: ${JSON.stringify(err)}`); - done(); - }); - }, - }); - }); - - it("user login", (done) => { - Parse.User.signUp("asdf", "zxcv", null, { - success: function() { - Parse.User.logIn("asdf", "zxcv", { - success: function(user) { - equal(user.get("username"), "asdf"); - verifyACL(user); - done(); - } - }); - } - }); + it("user login", async (done) => { + await Parse.User.signUp("asdf", "zxcv"); + const user = await Parse.User.logIn("asdf", "zxcv"); + equal(user.get("username"), "asdf"); + verifyACL(user); + done(); }); it('should respect ACL without locking user out', (done) => { @@ -360,7 +334,7 @@ describe('Parse.User testing', () => { let user = null; let sessionToken = null; - Parse.Promise.as().then(function() { + Promise.resolve().then(function() { return Parse.User.signUp("Jason", "Parse", { "code": "red" }); }).then(function(newUser) { @@ -396,7 +370,7 @@ describe('Parse.User testing', () => { }, function(error) { ok(error); // Handle the error. - return Parse.Promise.as(); + return Promise.resolve(); }).then(function() { done(); @@ -406,123 +380,91 @@ describe('Parse.User testing', () => { }); }); - it("cannot save non-authed user", (done) => { + it("cannot save non-authed user", async (done) => { let user = new Parse.User(); user.set({ "password": "asdf", "email": "asdf@example.com", "username": "zxcv" }); - user.signUp(null, { - success: function(userAgain) { - equal(userAgain, user); - const query = new Parse.Query(Parse.User); - query.get(user.id, { - success: function(userNotAuthed) { - user = new Parse.User(); - user.set({ - "username": "hacker", - "password": "password" - }); - user.signUp(null, { - success: function(userAgain) { - equal(userAgain, user); - userNotAuthed.set("username", "changed"); - userNotAuthed.save().then(fail, (err) => { - expect(err.code).toEqual(Parse.Error.SESSION_MISSING); - done(); - }); - }, - error: function(model, error) { - ok(undefined, error); - } - }); - }, - error: function(model, error) { - ok(undefined, error); - } - }); - } + let userAgain = await user.signUp(); + equal(userAgain, user); + const query = new Parse.Query(Parse.User); + const userNotAuthed = await query.get(user.id); + user = new Parse.User(); + user.set({ + "username": "hacker", + "password": "password" + }); + userAgain = await user.signUp(); + equal(userAgain, user); + userNotAuthed.set("username", "changed"); + userNotAuthed.save().then(fail, (err) => { + expect(err.code).toEqual(Parse.Error.SESSION_MISSING); + done(); }); }); - it("cannot delete non-authed user", (done) => { + it("cannot delete non-authed user", async (done) => { let user = new Parse.User(); - user.signUp({ + await user.signUp({ "password": "asdf", "email": "asdf@example.com", "username": "zxcv" - }, { - success: function() { - const query = new Parse.Query(Parse.User); - query.get(user.id, { - success: function(userNotAuthed) { - user = new Parse.User(); - user.signUp({ - "username": "hacker", - "password": "password" - }, { - success: function(userAgain) { - equal(userAgain, user); - userNotAuthed.set("username", "changed"); - userNotAuthed.destroy(expectError( - Parse.Error.SESSION_MISSING, done)); - } - }); - } - }); - } }); + const query = new Parse.Query(Parse.User); + const userNotAuthed = await query.get(user.id); + user = new Parse.User(); + const userAgain = await user.signUp({ + "username": "hacker", + "password": "password" + }); + equal(userAgain, user); + userNotAuthed.set("username", "changed"); + try { + await userNotAuthed.destroy(); + done.fail(); + } catch(e) { + expect(e.code).toBe(Parse.Error.SESSION_MISSING); + done(); + } }); - it("cannot saveAll with non-authed user", (done) => { + it("cannot saveAll with non-authed user", async (done) => { let user = new Parse.User(); - user.signUp({ + await user.signUp({ "password": "asdf", "email": "asdf@example.com", "username": "zxcv" - }, { - success: function() { - const query = new Parse.Query(Parse.User); - query.get(user.id, { - success: function(userNotAuthed) { - user = new Parse.User(); - user.signUp({ - username: "hacker", - password: "password" - }, { - success: function() { - query.get(user.id, { - success: function(userNotAuthedNotChanged) { - userNotAuthed.set("username", "changed"); - const object = new TestObject(); - object.save({ - user: userNotAuthedNotChanged - }, { - success: function() { - const item1 = new TestObject(); - item1.save({ - number: 0 - }, { - success: function(item1) { - item1.set("number", 1); - const item2 = new TestObject(); - item2.set("number", 2); - Parse.Object.saveAll( - [item1, item2, userNotAuthed], - expectError(Parse.Error.SESSION_MISSING, done)); - } - }); - } - }); - } - }); - } - }); - } - }); - } }); + const query = new Parse.Query(Parse.User); + const userNotAuthed = await query.get(user.id); + user = new Parse.User(); + await user.signUp({ + username: "hacker", + password: "password" + }); + const userNotAuthedNotChanged = await query.get(user.id); + userNotAuthed.set("username", "changed"); + const object = new TestObject(); + await object.save({ + user: userNotAuthedNotChanged + }); + const item1 = new TestObject(); + await item1.save({ + number: 0 + }); + item1.set("number", 1); + const item2 = new TestObject(); + item2.set("number", 2); + try { + await Parse.Object.saveAll( + [item1, item2, userNotAuthed]); + done.fail(); + } catch(e) { + expect(e.code).toBe(Parse.Error.SESSION_MISSING); + done(); + } }); it('never locks himself up', async () => { @@ -661,79 +603,55 @@ describe('Parse.User testing', () => { }); }); - it("user associations", (done) => { + it("user associations", async (done) => { const child = new TestObject(); - child.save(null, { - success: function() { - const user = new Parse.User(); - user.set("password", "asdf"); - user.set("email", "asdf@example.com"); - user.set("username", "zxcv"); - user.set("child", child); - user.signUp(null, { - success: function() { - const object = new TestObject(); - object.set("user", user); - object.save(null, { - success: function() { - const query = new Parse.Query(TestObject); - query.get(object.id, { - success: function(objectAgain) { - const userAgain = objectAgain.get("user"); - userAgain.fetch({ - success: function() { - equal(user.id, userAgain.id); - equal(userAgain.get("child").id, child.id); - done(); - } - }); - } - }); - } - }); - } - }); - } - }); - }); - - it("user queries", (done) => { + await child.save(); const user = new Parse.User(); user.set("password", "asdf"); user.set("email", "asdf@example.com"); user.set("username", "zxcv"); - user.signUp(null, { - success: function() { - const query = new Parse.Query(Parse.User); - query.get(user.id, { - success: function(userAgain) { - equal(userAgain.id, user.id); - query.find({ - success: function(users) { - equal(users.length, 1); - equal(users[0].id, user.id); - ok(userAgain.get("email"), "asdf@example.com"); - done(); - } - }); - } - }); - } - }); + user.set("child", child); + await user.signUp(); + const object = new TestObject(); + object.set("user", user); + await object.save(); + const query = new Parse.Query(TestObject); + const objectAgain = await query.get(object.id); + const userAgain = objectAgain.get("user"); + await userAgain.fetch(); + equal(user.id, userAgain.id); + equal(userAgain.get("child").id, child.id); + done(); + }); + + it("user queries", async (done) => { + const user = new Parse.User(); + user.set("password", "asdf"); + user.set("email", "asdf@example.com"); + user.set("username", "zxcv"); + await user.signUp(); + const query = new Parse.Query(Parse.User); + const userAgain = await query.get(user.id); + equal(userAgain.id, user.id); + const users = await query.find(); + equal(users.length, 1); + equal(users[0].id, user.id); + ok(userAgain.get("email"), "asdf@example.com"); + done(); }); function signUpAll(list, optionsOrCallback) { - let promise = Parse.Promise.as(); + let promise = Promise.resolve(); list.forEach((user) => { promise = promise.then(function() { return user.signUp(); }); }); promise = promise.then(function() { return list; }); - return promise._thenRunCallbacks(optionsOrCallback); + return promise.then(optionsOrCallback); } - it("contained in user array queries", (done) => { + it("contained in user array queries", async (done) => { const USERS = 4; const MESSAGES = 5; @@ -746,7 +664,7 @@ describe('Parse.User testing', () => { return user; }); - signUpAll(userList, function(users) { + signUpAll(userList, async function(users) { // Make a list of messages. if (!users || users.length != USERS) { fail('signupAll failed'); @@ -761,108 +679,72 @@ describe('Parse.User testing', () => { }); // Save all the messages. - Parse.Object.saveAll(messageList, function() { + await Parse.Object.saveAll(messageList); - // Assemble an "in" list. - const inList = [users[0], users[3], users[3]]; // Intentional dupe - const query = new Parse.Query(TestObject); - query.containedIn("from", inList); - query.find({ - success: function(results) { - equal(results.length, 3); - done(); - } - }); - - }); + // Assemble an "in" list. + const inList = [users[0], users[3], users[3]]; // Intentional dupe + const query = new Parse.Query(TestObject); + query.containedIn("from", inList); + const results = await query.find(); + equal(results.length, 3); + done(); }); }); - it("saving a user signs them up but doesn't log them in", (done) => { + it("saving a user signs them up but doesn't log them in", async (done) => { const user = new Parse.User(); - user.save({ + await user.save({ password: "asdf", email: "asdf@example.com", username: "zxcv" - }, { - success: function() { - equal(Parse.User.current(), null); - done(); - } }); + equal(Parse.User.current(), null); + done(); }); - it("user updates", (done) => { + it("user updates", async (done) => { const user = new Parse.User(); - user.signUp({ + await user.signUp({ password: "asdf", email: "asdf@example.com", username: "zxcv" - }, { - success: function(user) { - user.set("username", "test"); - user.save(null, { - success: function() { - equal(Object.keys(user.attributes).length, 6); - ok(user.attributes["username"]); - ok(user.attributes["email"]); - user.destroy({ - success: function() { - const query = new Parse.Query(Parse.User); - query.get(user.id, { - error: function(model, error) { - // The user should no longer exist. - equal(error.code, Parse.Error.OBJECT_NOT_FOUND); - done(); - } - }); - }, - error: function(model, error) { - ok(undefined, error); - } - }); - }, - error: function(model, error) { - ok(undefined, error); - } - }); - }, - error: function(model, error) { - ok(undefined, error); - } }); + + user.set("username", "test"); + await user.save(); + equal(Object.keys(user.attributes).length, 6); + ok(user.attributes["username"]); + ok(user.attributes["email"]); + await user.destroy(); + const query = new Parse.Query(Parse.User); + try { + await query.get(user.id); + done.fail(); + } catch (error) { + // The user should no longer exist. + equal(error.code, Parse.Error.OBJECT_NOT_FOUND); + done(); + } }); - it("count users", (done) => { + it("count users", async (done) => { const james = new Parse.User(); james.set("username", "james"); james.set("password", "mypass"); - james.signUp(null, { - success: function() { - const kevin = new Parse.User(); - kevin.set("username", "kevin"); - kevin.set("password", "mypass"); - kevin.signUp(null, { - success: function() { - const query = new Parse.Query(Parse.User); - query.count({ - success: function(count) { - equal(count, 2); - done(); - } - }); - } - }); - } - }); + await james.signUp(); + const kevin = new Parse.User(); + kevin.set("username", "kevin"); + kevin.set("password", "mypass"); + await kevin.signUp(); + const query = new Parse.Query(Parse.User); + const count = await query.count(); + equal(count, 2); + done(); }); - it("user sign up with container class", (done) => { - Parse.User.signUp("ilya", "mypass", { "array": ["hello"] }, { - success: function() { - done(); - } - }); + it("user sign up with container class", async (done) => { + await Parse.User.signUp("ilya", "mypass", { "array": ["hello"] }); + done(); }); it("user modified while saving", (done) => { @@ -870,22 +752,23 @@ describe('Parse.User testing', () => { const user = new Parse.User(); user.set("username", "alice"); user.set("password", "password"); - user.signUp(null, { - success: function(userAgain) { - equal(userAgain.get("username"), "bob"); - ok(userAgain.dirty("username")); - const query = new Parse.Query(Parse.User); - query.get(user.id, { - success: function(freshUser) { - equal(freshUser.id, user.id); - equal(freshUser.get("username"), "alice"); - Parse.Object.enableSingleInstance(); - done(); - } - }); - } + user.signUp().then(function(userAgain) { + equal(userAgain.get("username"), "bob"); + ok(userAgain.dirty("username")); + const query = new Parse.Query(Parse.User); + query.get(user.id).then((freshUser) => { + console.log(freshUser.toJSON()); + equal(freshUser.id, user.id); + equal(freshUser.get("username"), "alice"); + Parse.Object.enableSingleInstance(); + done(); + }); + }); + // Jump a frame so the signup call is properly sent + // This is due to the fact that now, we use real promises + process.nextTick(() => { + ok(user.set("username", "bob")); }); - ok(user.set("username", "bob")); }); it("user modified while saving with unsaved child", (done) => { @@ -894,48 +777,41 @@ describe('Parse.User testing', () => { user.set("username", "alice"); user.set("password", "password"); user.set("child", new TestObject()); - user.signUp(null, { - success: function(userAgain) { - equal(userAgain.get("username"), "bob"); - // Should be dirty, but it depends on batch support. - // ok(userAgain.dirty("username")); - const query = new Parse.Query(Parse.User); - query.get(user.id, { - success: function(freshUser) { - equal(freshUser.id, user.id); - // Should be alice, but it depends on batch support. - equal(freshUser.get("username"), "bob"); - Parse.Object.enableSingleInstance(); - done(); - } - }); - } + user.signUp().then((userAgain) => { + equal(userAgain.get("username"), "bob"); + // Should be dirty, but it depends on batch support. + // ok(userAgain.dirty("username")); + const query = new Parse.Query(Parse.User); + query.get(user.id).then((freshUser) => { + equal(freshUser.id, user.id); + // Should be alice, but it depends on batch support. + equal(freshUser.get("username"), "bob"); + Parse.Object.enableSingleInstance(); + done(); + }); }); ok(user.set("username", "bob")); }); - it("user loaded from localStorage from signup", (done) => { - Parse.User.signUp("alice", "password", null, { - success: function(alice) { - ok(alice.id, "Alice should have an objectId"); - ok(alice.getSessionToken(), "Alice should have a session token"); - equal(alice.get("password"), undefined, - "Alice should not have a password"); + it("user loaded from localStorage from signup", async (done) => { + const alice = await Parse.User.signUp("alice", "password"); + ok(alice.id, "Alice should have an objectId"); + ok(alice.getSessionToken(), "Alice should have a session token"); + equal(alice.get("password"), undefined, + "Alice should not have a password"); - // Simulate the environment getting reset. - Parse.User._currentUser = null; - Parse.User._currentUserMatchesDisk = false; + // Simulate the environment getting reset. + Parse.User._currentUser = null; + Parse.User._currentUserMatchesDisk = false; - const aliceAgain = Parse.User.current(); - equal(aliceAgain.get("username"), "alice"); - equal(aliceAgain.id, alice.id, "currentUser should have objectId"); - ok(aliceAgain.getSessionToken(), - "currentUser should have a sessionToken"); - equal(alice.get("password"), undefined, - "currentUser should not have password"); - done(); - } - }); + const aliceAgain = Parse.User.current(); + equal(aliceAgain.get("username"), "alice"); + equal(aliceAgain.id, alice.id, "currentUser should have objectId"); + ok(aliceAgain.getSessionToken(), + "currentUser should have a sessionToken"); + equal(alice.get("password"), undefined, + "currentUser should not have password"); + done(); }); @@ -1039,55 +915,42 @@ describe('Parse.User testing', () => { }); }); - it("user with missing username", (done) => { + it("user with missing username", async (done) => { const user = new Parse.User(); user.set("password", "foo"); - user.signUp(null, { - success: function() { - ok(null, "This should have failed"); - done(); - }, - error: function(userAgain, error) { - equal(error.code, Parse.Error.OTHER_CAUSE); - done(); - } - }); + try { + await user.signUp(); + done.fail(); + } catch(error) { + equal(error.code, Parse.Error.OTHER_CAUSE); + done(); + } }); - it("user with missing password", (done) => { + it("user with missing password", async (done) => { const user = new Parse.User(); user.set("username", "foo"); - user.signUp(null, { - success: function() { - ok(null, "This should have failed"); - done(); - }, - error: function(userAgain, error) { - equal(error.code, Parse.Error.OTHER_CAUSE); - done(); - } - }); + try { + await user.signUp(); + done.fail(); + } catch(error) { + equal(error.code, Parse.Error.OTHER_CAUSE); + done(); + } }); - it("user stupid subclassing", (done) => { + it("user stupid subclassing", async (done) => { const SuperUser = Parse.Object.extend("User"); const user = new SuperUser(); user.set("username", "bob"); user.set("password", "welcome"); ok(user instanceof Parse.User, "Subclassing User should have worked"); - user.signUp(null, { - success: function() { - done(); - }, - error: function() { - ok(false, "Signing up should have worked"); - done(); - } - }); + await user.signUp(); + done(); }); - it("user signup class method uses subclassing", (done) => { + it("user signup class method uses subclassing", async (done) => { const SuperUser = Parse.User.extend({ secret: function() { @@ -1095,64 +958,38 @@ describe('Parse.User testing', () => { } }); - Parse.User.signUp("bob", "welcome", null, { - success: function(user) { - ok(user instanceof SuperUser, "Subclassing User should have worked"); - equal(user.secret(), 1337); - done(); - }, - error: function() { - ok(false, "Signing up should have worked"); - done(); - } - }); + const user = await Parse.User.signUp("bob", "welcome"); + ok(user instanceof SuperUser, "Subclassing User should have worked"); + equal(user.secret(), 1337); + done(); }); - it("user on disk gets updated after save", (done) => { + it("user on disk gets updated after save", async (done) => { Parse.User.extend({ isSuper: function() { return true; } }); - Parse.User.signUp("bob", "welcome", null, { - success: function(user) { - // Modify the user and save. - user.save("secret", 1337, { - success: function() { - // Force the current user to read from disk - delete Parse.User._currentUser; - delete Parse.User._currentUserMatchesDisk; - const userFromDisk = Parse.User.current(); - equal(userFromDisk.get("secret"), 1337); - ok(userFromDisk.isSuper(), "The subclass should have been used"); - done(); - }, - error: function() { - ok(false, "Saving should have worked"); - done(); - } - }); - }, - error: function() { - ok(false, "Sign up should have worked"); - done(); - } - }); + const user = await Parse.User.signUp("bob", "welcome"); + await user.save("secret", 1337) + delete Parse.User._currentUser; + delete Parse.User._currentUserMatchesDisk; + + const userFromDisk = Parse.User.current(); + equal(userFromDisk.get("secret"), 1337); + ok(userFromDisk.isSuper(), "The subclass should have been used"); + done(); }); - it("current user isn't dirty", (done) => { - - Parse.User.signUp("andrew", "oppa", { style: "gangnam" }, expectSuccess({ - success: function(user) { - ok(!user.dirty("style"), "The user just signed up."); - Parse.User._currentUser = null; - Parse.User._currentUserMatchesDisk = false; - const userAgain = Parse.User.current(); - ok(!userAgain.dirty("style"), "The user was just read from disk."); - done(); - } - })); + it("current user isn't dirty", async (done) => { + const user = await Parse.User.signUp("andrew", "oppa", { style: "gangnam" }); + ok(!user.dirty("style"), "The user just signed up."); + Parse.User._currentUser = null; + Parse.User._currentUserMatchesDisk = false; + const userAgain = Parse.User.current(); + ok(!userAgain.dirty("style"), "The user was just read from disk."); + done(); }); const getMockFacebookProviderWithIdToken = function(id, token) { @@ -1255,29 +1092,21 @@ describe('Parse.User testing', () => { } }); - it("log in with provider", (done) => { + it("log in with provider", async (done) => { const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function(model) { - ok(model instanceof Parse.User, "Model should be a Parse.User"); - strictEqual(Parse.User.current(), model); - ok(model.extended(), "Should have used subclass."); - strictEqual(provider.authData.id, provider.synchronizedUserId); - strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); - strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); - ok(model._isLinked("facebook"), "User should be linked to facebook"); - done(); - }, - error: function(model, error) { - jfail(error); - ok(false, "linking should have worked"); - done(); - } - }); + const model = await Parse.User._logInWith("facebook"); + ok(model instanceof Parse.User, "Model should be a Parse.User"); + strictEqual(Parse.User.current(), model); + ok(model.extended(), "Should have used subclass."); + strictEqual(provider.authData.id, provider.synchronizedUserId); + strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); + strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); + ok(model._isLinked("facebook"), "User should be linked to facebook"); + done(); }); - it("user authData should be available in cloudcode (#2342)", (done) => { + it("user authData should be available in cloudcode (#2342)", async (done) => { Parse.Cloud.define('checkLogin', (req, res) => { expect(req.user).not.toBeUndefined(); @@ -1287,105 +1116,66 @@ describe('Parse.User testing', () => { const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function(model) { - ok(model instanceof Parse.User, "Model should be a Parse.User"); - strictEqual(Parse.User.current(), model); - ok(model.extended(), "Should have used subclass."); - strictEqual(provider.authData.id, provider.synchronizedUserId); - strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); - strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); - ok(model._isLinked("facebook"), "User should be linked to facebook"); + const model = await Parse.User._logInWith("facebook"); + ok(model instanceof Parse.User, "Model should be a Parse.User"); + strictEqual(Parse.User.current(), model); + ok(model.extended(), "Should have used subclass."); + strictEqual(provider.authData.id, provider.synchronizedUserId); + strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); + strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); + ok(model._isLinked("facebook"), "User should be linked to facebook"); - Parse.Cloud.run('checkLogin').then(done, done); - }, - error: function(model, error) { - jfail(error); - ok(false, "linking should have worked"); - done(); - } - }); + Parse.Cloud.run('checkLogin').then(done, done); }); - it("log in with provider and update token", (done) => { + it("log in with provider and update token", async (done) => { const provider = getMockFacebookProvider(); const secondProvider = getMockFacebookProviderWithIdToken('8675309', 'jenny_valid_token'); - const errorHandler = function() { - fail('should not fail'); - done(); - } Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: () => { - Parse.User._registerAuthenticationProvider(secondProvider); - return Parse.User.logOut().then(() => { - Parse.User._logInWith("facebook", { - success: () => { - expect(secondProvider.synchronizedAuthToken).toEqual('jenny_valid_token'); - // Make sure we can login with the new token again - Parse.User.logOut().then(() => { - Parse.User._logInWith("facebook", { - success: done, - error: errorHandler - }); - }); - }, - error: errorHandler - }); - }) - }, - error: errorHandler - }).catch((err) => { - errorHandler(err); - done(); - }); + await Parse.User._logInWith("facebook"); + Parse.User._registerAuthenticationProvider(secondProvider); + await Parse.User.logOut(); + await Parse.User._logInWith("facebook"); + expect(secondProvider.synchronizedAuthToken).toEqual('jenny_valid_token'); + // Make sure we can login with the new token again + await Parse.User.logOut(); + await Parse.User._logInWith("facebook"); + done(); }); - it('returns authData when authed and logged in with provider (regression test for #1498)', done => { + it('returns authData when authed and logged in with provider (regression test for #1498)', async (done) => { Parse.Object.enableSingleInstance(); const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith('facebook', { - success: user => { - const userQuery = new Parse.Query(Parse.User); - userQuery.get(user.id) - .then(user => { - expect(user.get('authData')).not.toBeUndefined(); - Parse.Object.disableSingleInstance(); - done(); - }); - } - }); + const user = await Parse.User._logInWith('facebook'); + const userQuery = new Parse.Query(Parse.User); + userQuery.get(user.id) + .then(user => { + expect(user.get('authData')).not.toBeUndefined(); + Parse.Object.disableSingleInstance(); + done(); + }); }); - it('only creates a single session for an installation / user pair (#2885)', done => { + it('only creates a single session for an installation / user pair (#2885)', async (done) => { Parse.Object.disableSingleInstance(); const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User.logInWith('facebook', { - success: () => { - return Parse.User.logInWith('facebook', { - success: () => { - return Parse.User.logInWith('facebook', { - success: (user) => { - const sessionToken = user.getSessionToken(); - const query = new Parse.Query('_Session'); - return query.find({ useMasterKey: true }) - .then((results) => { - expect(results.length).toBe(1); - expect(results[0].get('sessionToken')).toBe(sessionToken); - expect(results[0].get('createdWith')).toEqual({ - action: 'login', - authProvider: 'facebook' - }); - done(); - }).catch(done.fail); - } - }); - } + await Parse.User.logInWith('facebook') + await Parse.User.logInWith('facebook'); + const user = await Parse.User.logInWith('facebook'); + const sessionToken = user.getSessionToken(); + const query = new Parse.Query('_Session'); + return query.find({ useMasterKey: true }) + .then((results) => { + expect(results.length).toBe(1); + expect(results[0].get('sessionToken')).toBe(sessionToken); + expect(results[0].get('createdWith')).toEqual({ + action: 'login', + authProvider: 'facebook' }); - } - }); + done(); + }).catch(done.fail); }); it('log in with provider with files', done => { @@ -1408,509 +1198,313 @@ describe('Parse.User testing', () => { }).catch(done.fail); }); - it("log in with provider twice", (done) => { + it("log in with provider twice", async (done) => { const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function(model) { - ok(model instanceof Parse.User, "Model should be a Parse.User"); - strictEqual(Parse.User.current(), model); - ok(model.extended(), "Should have used the subclass."); - strictEqual(provider.authData.id, provider.synchronizedUserId); - strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); - strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); - ok(model._isLinked("facebook"), "User should be linked to facebook"); + const model = await Parse.User._logInWith("facebook"); + ok(model instanceof Parse.User, "Model should be a Parse.User"); + strictEqual(Parse.User.current(), model); + ok(model.extended(), "Should have used the subclass."); + strictEqual(provider.authData.id, provider.synchronizedUserId); + strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); + strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); + ok(model._isLinked("facebook"), "User should be linked to facebook"); - Parse.User.logOut().then(() => { - ok(provider.loggedOut); - provider.loggedOut = false; - - Parse.User._logInWith("facebook", { - success: function(innerModel) { - ok(innerModel instanceof Parse.User, - "Model should be a Parse.User"); - ok(innerModel === Parse.User.current(), - "Returned model should be the current user"); - ok(provider.authData.id === provider.synchronizedUserId); - ok(provider.authData.access_token === provider.synchronizedAuthToken); - ok(innerModel._isLinked("facebook"), - "User should be linked to facebook"); - ok(innerModel.existed(), "User should not be newly-created"); - done(); - }, - error: function(model, error) { - jfail(error); - ok(false, "LogIn should have worked"); - done(); - } - }); - }, done.fail); - }, - error: function(model, error) { - jfail(error); - ok(false, "LogIn should have worked"); - done(); - } - }); + Parse.User.logOut().then(async () => { + ok(provider.loggedOut); + provider.loggedOut = false; + const innerModel = await Parse.User._logInWith("facebook"); + ok(innerModel instanceof Parse.User, + "Model should be a Parse.User"); + ok(innerModel === Parse.User.current(), + "Returned model should be the current user"); + ok(provider.authData.id === provider.synchronizedUserId); + ok(provider.authData.access_token === provider.synchronizedAuthToken); + ok(innerModel._isLinked("facebook"), + "User should be linked to facebook"); + ok(innerModel.existed(), "User should not be newly-created"); + done(); + }, done.fail); }); - it("log in with provider failed", (done) => { + it("log in with provider failed", async (done) => { const provider = getMockFacebookProvider(); provider.shouldError = true; Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function() { - ok(false, "logIn should not have succeeded"); - }, - error: function(model, error) { - ok(error, "Error should be non-null"); - done(); - } - }); + try { + await Parse.User._logInWith("facebook"); + done.fail(); + } catch (error) { + ok(error, "Error should be non-null"); + done(); + } }); - it("log in with provider cancelled", (done) => { + it("log in with provider cancelled", async (done) => { const provider = getMockFacebookProvider(); provider.shouldCancel = true; Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function() { - ok(false, "logIn should not have succeeded"); - }, - error: function(model, error) { - ok(error === null, "Error should be null"); - done(); - } - }); + try { + await Parse.User._logInWith("facebook"); + done.fail(); + } catch (error) { + ok(error === null, "Error should be null"); + done(); + } }); - it("login with provider should not call beforeSave trigger", (done) => { + it("login with provider should not call beforeSave trigger", async (done) => { const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function() { - Parse.User.logOut().then(() => { - Parse.Cloud.beforeSave(Parse.User, function(req, res) { - res.error("Before save shouldn't be called on login"); - }); - - Parse.User._logInWith("facebook", { - success: function() { - done(); - }, - error: function(model, error) { - ok(undefined, error); - done(); - } - }); - }); - } + await Parse.User._logInWith("facebook"); + Parse.User.logOut().then(async () => { + Parse.Cloud.beforeSave(Parse.User, function(req, res) { + res.error("Before save shouldn't be called on login"); + }); + await Parse.User._logInWith("facebook"); + done(); }); }); - it("link with provider", (done) => { + it("link with provider", async (done) => { const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); const user = new Parse.User(); user.set("username", "testLinkWithProvider"); user.set("password", "mypass"); - user.signUp(null, { - success: function() { - user._linkWith("facebook", { - success: function(model) { - ok(model instanceof Parse.User, "Model should be a Parse.User"); - strictEqual(Parse.User.current(), model); - strictEqual(provider.authData.id, provider.synchronizedUserId); - strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); - strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); - ok(model._isLinked("facebook"), "User should be linked"); - done(); - }, - error: function() { - ok(false, "linking should have succeeded"); - done(); - } - }); - }, - error: function() { - ok(false, "signup should not have failed"); - done(); - } - }); + await user.signUp(); + const model = await user._linkWith("facebook"); + ok(model instanceof Parse.User, "Model should be a Parse.User"); + strictEqual(Parse.User.current(), model); + strictEqual(provider.authData.id, provider.synchronizedUserId); + strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); + strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); + ok(model._isLinked("facebook"), "User should be linked"); + done(); }); // What this means is, only one Parse User can be linked to a // particular Facebook account. - it("link with provider for already linked user", (done) => { + it("link with provider for already linked user", async (done) => { const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); const user = new Parse.User(); user.set("username", "testLinkWithProviderToAlreadyLinkedUser"); user.set("password", "mypass"); - user.signUp(null, { - success: function() { - user._linkWith("facebook", { - success: function(model) { - ok(model instanceof Parse.User, "Model should be a Parse.User"); - strictEqual(Parse.User.current(), model); - strictEqual(provider.authData.id, provider.synchronizedUserId); - strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); - strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); - ok(model._isLinked("facebook"), "User should be linked."); - const user2 = new Parse.User(); - user2.set("username", "testLinkWithProviderToAlreadyLinkedUser2"); - user2.set("password", "mypass"); - user2.signUp(null, { - success: function() { - user2._linkWith('facebook', { - success: (err) => { - jfail(err); - done(); - }, - error: function(model, error) { - expect(error.code).toEqual( - Parse.Error.ACCOUNT_ALREADY_LINKED); - done(); - }, - }); - }, - error: function() { - ok(false, "linking should have failed"); - done(); - } - }); - }, - error: function() { - ok(false, "linking should have succeeded"); - done(); - } - }); - }, - error: function() { - ok(false, "signup should not have failed"); - done(); - } - }); + await user.signUp(); + const model = await user._linkWith("facebook"); + ok(model instanceof Parse.User, "Model should be a Parse.User"); + strictEqual(Parse.User.current(), model); + strictEqual(provider.authData.id, provider.synchronizedUserId); + strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); + strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); + ok(model._isLinked("facebook"), "User should be linked."); + const user2 = new Parse.User(); + user2.set("username", "testLinkWithProviderToAlreadyLinkedUser2"); + user2.set("password", "mypass"); + await user2.signUp(); + try { + await user2._linkWith('facebook'); + done.fail(); + } catch (error) { + expect(error.code).toEqual( + Parse.Error.ACCOUNT_ALREADY_LINKED); + done(); + } }); - it("link with provider failed", (done) => { + it("link with provider failed", async (done) => { const provider = getMockFacebookProvider(); provider.shouldError = true; Parse.User._registerAuthenticationProvider(provider); const user = new Parse.User(); user.set("username", "testLinkWithProvider"); user.set("password", "mypass"); - user.signUp(null, { - success: function() { - user._linkWith("facebook", { - success: function() { - ok(false, "linking should fail"); - done(); - }, - error: function(model, error) { - ok(error, "Linking should fail"); - ok(!model._isLinked("facebook"), - "User should not be linked to facebook"); - done(); - } - }); - }, - error: function() { - ok(false, "signup should not have failed"); - done(); - } - }); + await user.signUp(); + try { + await user._linkWith("facebook"); + done.fail(); + } catch(error) { + ok(error, "Linking should fail"); + ok(!user._isLinked("facebook"), + "User should not be linked to facebook"); + done(); + } }); - it("link with provider cancelled", (done) => { + it("link with provider cancelled", async (done) => { const provider = getMockFacebookProvider(); provider.shouldCancel = true; Parse.User._registerAuthenticationProvider(provider); const user = new Parse.User(); user.set("username", "testLinkWithProvider"); user.set("password", "mypass"); - user.signUp(null, { - success: function() { - user._linkWith("facebook", { - success: function() { - ok(false, "linking should fail"); - done(); - }, - error: function(model, error) { - ok(!error, "Linking should be cancelled"); - ok(!model._isLinked("facebook"), - "User should not be linked to facebook"); - done(); - } - }); - }, - error: function() { - ok(false, "signup should not have failed"); - done(); - } - }); + await user.signUp(); + try { + await user._linkWith("facebook"); + done.fail(); + } catch(error) { + ok(!error, "Linking should be cancelled"); + ok(!user._isLinked("facebook"), + "User should not be linked to facebook"); + done(); + } }); - it("unlink with provider", (done) => { + it("unlink with provider", async (done) => { const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function(model) { - ok(model instanceof Parse.User, "Model should be a Parse.User."); - strictEqual(Parse.User.current(), model); - ok(model.extended(), "Should have used the subclass."); - strictEqual(provider.authData.id, provider.synchronizedUserId); - strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); - strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); - ok(model._isLinked("facebook"), "User should be linked to facebook."); - - model._unlinkFrom("facebook", { - success: function(model) { - ok(!model._isLinked("facebook"), "User should not be linked."); - ok(!provider.synchronizedUserId, "User id should be cleared."); - ok(!provider.synchronizedAuthToken, - "Auth token should be cleared."); - ok(!provider.synchronizedExpiration, - "Expiration should be cleared."); - done(); - }, - error: function() { - ok(false, "unlinking should succeed"); - done(); - } - }); - }, - error: function() { - ok(false, "linking should have worked"); - done(); - } - }); + const model = await Parse.User._logInWith("facebook"); + ok(model instanceof Parse.User, "Model should be a Parse.User."); + strictEqual(Parse.User.current(), model); + ok(model.extended(), "Should have used the subclass."); + strictEqual(provider.authData.id, provider.synchronizedUserId); + strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); + strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); + ok(model._isLinked("facebook"), "User should be linked to facebook."); + await model._unlinkFrom("facebook"); + ok(!model._isLinked("facebook"), "User should not be linked."); + ok(!provider.synchronizedUserId, "User id should be cleared."); + ok(!provider.synchronizedAuthToken, + "Auth token should be cleared."); + ok(!provider.synchronizedExpiration, + "Expiration should be cleared."); + done(); }); - it("unlink and link", (done) => { + it("unlink and link", async (done) => { const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function(model) { - ok(model instanceof Parse.User, "Model should be a Parse.User"); - strictEqual(Parse.User.current(), model); - ok(model.extended(), "Should have used the subclass."); - strictEqual(provider.authData.id, provider.synchronizedUserId); - strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); - strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); - ok(model._isLinked("facebook"), "User should be linked to facebook"); + const model = await Parse.User._logInWith("facebook"); + ok(model instanceof Parse.User, "Model should be a Parse.User"); + strictEqual(Parse.User.current(), model); + ok(model.extended(), "Should have used the subclass."); + strictEqual(provider.authData.id, provider.synchronizedUserId); + strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); + strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); + ok(model._isLinked("facebook"), "User should be linked to facebook"); - model._unlinkFrom("facebook", { - success: function(model) { - ok(!model._isLinked("facebook"), - "User should not be linked to facebook"); - ok(!provider.synchronizedUserId, "User id should be cleared"); - ok(!provider.synchronizedAuthToken, "Auth token should be cleared"); - ok(!provider.synchronizedExpiration, - "Expiration should be cleared"); + await model._unlinkFrom("facebook"); + ok(!model._isLinked("facebook"), + "User should not be linked to facebook"); + ok(!provider.synchronizedUserId, "User id should be cleared"); + ok(!provider.synchronizedAuthToken, "Auth token should be cleared"); + ok(!provider.synchronizedExpiration, + "Expiration should be cleared"); - model._linkWith("facebook", { - success: function(model) { - ok(provider.synchronizedUserId, "User id should have a value"); - ok(provider.synchronizedAuthToken, - "Auth token should have a value"); - ok(provider.synchronizedExpiration, - "Expiration should have a value"); - ok(model._isLinked("facebook"), - "User should be linked to facebook"); - done(); - }, - error: function() { - ok(false, "linking again should succeed"); - done(); - } - }); - }, - error: function() { - ok(false, "unlinking should succeed"); - done(); - } - }); - }, - error: function() { - ok(false, "linking should have worked"); - done(); - } - }); + await model._linkWith("facebook"); + ok(provider.synchronizedUserId, "User id should have a value"); + ok(provider.synchronizedAuthToken, + "Auth token should have a value"); + ok(provider.synchronizedExpiration, + "Expiration should have a value"); + ok(model._isLinked("facebook"), + "User should be linked to facebook"); + done(); }); - it("link multiple providers", (done) => { + it("link multiple providers", async (done) => { const provider = getMockFacebookProvider(); const mockProvider = getMockMyOauthProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function(model) { - ok(model instanceof Parse.User, "Model should be a Parse.User"); - strictEqual(Parse.User.current(), model); - ok(model.extended(), "Should have used the subclass."); - strictEqual(provider.authData.id, provider.synchronizedUserId); - strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); - strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); - ok(model._isLinked("facebook"), "User should be linked to facebook"); - Parse.User._registerAuthenticationProvider(mockProvider); - const objectId = model.id; - model._linkWith("myoauth", { - success: function(model) { - expect(model.id).toEqual(objectId); - ok(model._isLinked("facebook"), "User should be linked to facebook"); - ok(model._isLinked("myoauth"), "User should be linked to myoauth"); - done(); - }, - error: function(error) { - jfail(error); - fail('SHould not fail'); - done(); - } - }) - }, - error: function() { - ok(false, "linking should have worked"); - done(); - } - }); + const model = await Parse.User._logInWith("facebook"); + ok(model instanceof Parse.User, "Model should be a Parse.User"); + strictEqual(Parse.User.current(), model); + ok(model.extended(), "Should have used the subclass."); + strictEqual(provider.authData.id, provider.synchronizedUserId); + strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); + strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); + ok(model._isLinked("facebook"), "User should be linked to facebook"); + Parse.User._registerAuthenticationProvider(mockProvider); + const objectId = model.id; + await model._linkWith("myoauth"); + expect(model.id).toEqual(objectId); + ok(model._isLinked("facebook"), "User should be linked to facebook"); + ok(model._isLinked("myoauth"), "User should be linked to myoauth"); + done(); }); - it("link multiple providers and updates token", (done) => { + it("link multiple providers and updates token", async (done) => { const provider = getMockFacebookProvider(); const secondProvider = getMockFacebookProviderWithIdToken('8675309', 'jenny_valid_token'); - const errorHandler = function(model, error) { - jfail(error); - fail('Should not fail'); + const mockProvider = getMockMyOauthProvider(); + Parse.User._registerAuthenticationProvider(provider); + const model = await Parse.User._logInWith("facebook"); + Parse.User._registerAuthenticationProvider(mockProvider); + const objectId = model.id; + await model._linkWith("myoauth"); + Parse.User._registerAuthenticationProvider(secondProvider); + await Parse.User.logOut(); + await Parse.User._logInWith("facebook"); + await Parse.User.logOut(); + const user = await Parse.User._logInWith("myoauth"); + expect(user.id).toBe(objectId); + done(); + }); + + it("link multiple providers and update token", async (done) => { + const provider = getMockFacebookProvider(); + const mockProvider = getMockMyOauthProvider(); + Parse.User._registerAuthenticationProvider(provider); + const model = await Parse.User._logInWith("facebook"); + ok(model instanceof Parse.User, "Model should be a Parse.User"); + strictEqual(Parse.User.current(), model); + ok(model.extended(), "Should have used the subclass."); + strictEqual(provider.authData.id, provider.synchronizedUserId); + strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); + strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); + ok(model._isLinked("facebook"), "User should be linked to facebook"); + Parse.User._registerAuthenticationProvider(mockProvider); + const objectId = model.id; + await model._linkWith("myoauth"); + expect(model.id).toEqual(objectId); + ok(model._isLinked("facebook"), "User should be linked to facebook"); + ok(model._isLinked("myoauth"), "User should be linked to myoauth"); + await model._linkWith("facebook"); + ok(model._isLinked("facebook"), "User should be linked to facebook"); + ok(model._isLinked("myoauth"), "User should be linked to myoauth"); + done(); + }); + + it('should fail linking with existing', async (done) => { + const provider = getMockFacebookProvider(); + Parse.User._registerAuthenticationProvider(provider); + await Parse.User._logInWith("facebook"); + await Parse.User.logOut(); + const user = new Parse.User(); + user.setUsername('user'); + user.setPassword('password'); + await user.signUp(); + // try to link here + try { + await user._linkWith('facebook'); + done.fail(); + } catch(e) { done(); } - const mockProvider = getMockMyOauthProvider(); - Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function(model) { - Parse.User._registerAuthenticationProvider(mockProvider); - const objectId = model.id; - model._linkWith("myoauth", { - success: function() { - Parse.User._registerAuthenticationProvider(secondProvider); - Parse.User.logOut().then(() => { - return Parse.User._logInWith("facebook", { - success: () => { - Parse.User.logOut().then(() => { - return Parse.User._logInWith("myoauth", { - success: (user) => { - expect(user.id).toBe(objectId); - done(); - } - }) - }) - }, - error: errorHandler - }); - }) - }, - error: errorHandler - }) - }, - error: errorHandler - }); }); - it("link multiple providers and update token", (done) => { + it('should fail linking with existing through REST', async (done) => { const provider = getMockFacebookProvider(); - const mockProvider = getMockMyOauthProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function(model) { - ok(model instanceof Parse.User, "Model should be a Parse.User"); - strictEqual(Parse.User.current(), model); - ok(model.extended(), "Should have used the subclass."); - strictEqual(provider.authData.id, provider.synchronizedUserId); - strictEqual(provider.authData.access_token, provider.synchronizedAuthToken); - strictEqual(provider.authData.expiration_date, provider.synchronizedExpiration); - ok(model._isLinked("facebook"), "User should be linked to facebook"); - Parse.User._registerAuthenticationProvider(mockProvider); - const objectId = model.id; - model._linkWith("myoauth", { - success: function(model) { - expect(model.id).toEqual(objectId); - ok(model._isLinked("facebook"), "User should be linked to facebook"); - ok(model._isLinked("myoauth"), "User should be linked to myoauth"); - model._linkWith("facebook", { - success: () => { - ok(model._isLinked("facebook"), "User should be linked to facebook"); - ok(model._isLinked("myoauth"), "User should be linked to myoauth"); - done(); - }, - error: () => { - fail('should link again'); - done(); - } - }) - }, - error: function(error) { - jfail(error); - fail('SHould not fail'); - done(); - } - }) - }, - error: function() { - ok(false, "linking should have worked"); + const model = await Parse.User._logInWith("facebook"); + const userId = model.id; + Parse.User.logOut().then(() => { + request.post({ + url:Parse.serverURL + '/classes/_User', + headers: { + 'X-Parse-Application-Id': Parse.applicationId, + 'X-Parse-REST-API-Key': 'rest' + }, + json: {authData: {facebook: provider.authData}} + }, (err,res, body) => { + // make sure the location header is properly set + expect(userId).not.toBeUndefined(); + expect(body.objectId).toEqual(userId); + expect(res.headers.location).toEqual(Parse.serverURL + '/users/' + userId); done(); - } - }); - }); - - it('should fail linking with existing', (done) => { - const provider = getMockFacebookProvider(); - Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function() { - Parse.User.logOut().then(() => { - const user = new Parse.User(); - user.setUsername('user'); - user.setPassword('password'); - return user.signUp().then(() => { - // try to link here - user._linkWith('facebook', { - success: () => { - fail('should not succeed'); - done(); - }, - error: () => { - done(); - } - }); - }); - }); - } - }); - }); - - it('should fail linking with existing through REST', (done) => { - const provider = getMockFacebookProvider(); - Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function(model) { - const userId = model.id; - Parse.User.logOut().then(() => { - request.post({ - url:Parse.serverURL + '/classes/_User', - headers: { - 'X-Parse-Application-Id': Parse.applicationId, - 'X-Parse-REST-API-Key': 'rest' - }, - json: {authData: {facebook: provider.authData}} - }, (err,res, body) => { - // make sure the location header is properly set - expect(userId).not.toBeUndefined(); - expect(body.objectId).toEqual(userId); - expect(res.headers.location).toEqual(Parse.serverURL + '/users/' + userId); - done(); - }); - }); - } + }); }); }); @@ -1999,30 +1593,27 @@ describe('Parse.User testing', () => { }); }); - it('should properly error when password is missing', (done) => { + it('should properly error when password is missing', async (done) => { const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function(user) { - user.set('username', 'myUser'); - user.set('email', 'foo@example.com'); - user.save().then(() => { - return Parse.User.logOut(); - }).then(() => { - return Parse.User.logIn('myUser', 'password'); - }).then(() => { - fail('should not succeed'); - done(); - }, (err) => { - expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND); - expect(err.message).toEqual('Invalid username/password.'); - done(); - }) - } + const user = await Parse.User._logInWith("facebook"); + user.set('username', 'myUser'); + user.set('email', 'foo@example.com'); + user.save().then(() => { + return Parse.User.logOut(); + }).then(() => { + return Parse.User.logIn('myUser', 'password'); + }).then(() => { + fail('should not succeed'); + done(); + }, (err) => { + expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND); + expect(err.message).toEqual('Invalid username/password.'); + done(); }); }); - it('should have authData in beforeSave and afterSave', (done) => { + it('should have authData in beforeSave and afterSave', async (done) => { Parse.Cloud.beforeSave('_User', (request, response) => { const authData = request.object.get('authData'); @@ -2050,11 +1641,8 @@ describe('Parse.User testing', () => { const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); - Parse.User._logInWith("facebook", { - success: function() { - done(); - } - }); + await Parse.User._logInWith("facebook"); + done(); }); it('set password then change password', (done) => { @@ -2072,25 +1660,23 @@ describe('Parse.User testing', () => { }); }); - it("authenticated check", (done) => { + it("authenticated check", async (done) => { const user = new Parse.User(); user.set("username", "darkhelmet"); user.set("password", "onetwothreefour"); ok(!user.authenticated()); - user.signUp(null, expectSuccess({ - success: function() { - ok(user.authenticated()); - done(); - } - })); + await user.signUp(null); + ok(user.authenticated()); + done(); }); - it("log in with explicit facebook auth data", (done) => { - Parse.FacebookUtils.logIn({ + it("log in with explicit facebook auth data", async (done) => { + await Parse.FacebookUtils.logIn({ id: "8675309", access_token: "jenny", expiration_date: new Date().toJSON() - }, expectSuccess({success: done})); + }); + done(); }); it("log in async with explicit facebook auth data", (done) => { @@ -2106,36 +1692,30 @@ describe('Parse.User testing', () => { }); }); - it("link with explicit facebook auth data", (done) => { - Parse.User.signUp("mask", "open sesame", null, expectSuccess({ - success: function(user) { - Parse.FacebookUtils.link(user, { - id: "8675309", - access_token: "jenny", - expiration_date: new Date().toJSON() - }).then(done, (error) => { - jfail(error); - done(); - }); - } - })); + it("link with explicit facebook auth data", async (done) => { + const user = await Parse.User.signUp("mask", "open sesame"); + Parse.FacebookUtils.link(user, { + id: "8675309", + access_token: "jenny", + expiration_date: new Date().toJSON() + }).then(done, (error) => { + jfail(error); + done(); + }); }); - it("link async with explicit facebook auth data", (done) => { - Parse.User.signUp("mask", "open sesame", null, expectSuccess({ - success: function(user) { - Parse.FacebookUtils.link(user, { - id: "8675309", - access_token: "jenny", - expiration_date: new Date().toJSON() - }).then(function() { - done(); - }, function(error) { - ok(false, error); - done(); - }); - } - })); + it("link async with explicit facebook auth data", async (done) => { + const user = await Parse.User.signUp("mask", "open sesame"); + Parse.FacebookUtils.link(user, { + id: "8675309", + access_token: "jenny", + expiration_date: new Date().toJSON() + }).then(function() { + done(); + }, function(error) { + ok(false, error); + done(); + }); }); it("async methods", (done) => { @@ -2228,7 +1808,7 @@ describe('Parse.User testing', () => { user.setPassword("asdf"); user.setUsername("zxcv"); let currentSessionToken = ""; - Parse.Promise.as().then(function() { + Promise.resolve().then(function() { return user.signUp(); }).then(function(){ currentSessionToken = user.getSessionToken(); @@ -2313,7 +1893,7 @@ describe('Parse.User testing', () => { }); it('create session from user', (done) => { - Parse.Promise.as().then(() => { + Promise.resolve().then(() => { return Parse.User.signUp("finn", "human", { foo: "bar" }); }).then((user) => { request.post({ @@ -2337,7 +1917,7 @@ describe('Parse.User testing', () => { }); it('user get session from token on signup', (done) => { - Parse.Promise.as().then(() => { + Promise.resolve().then(() => { return Parse.User.signUp("finn", "human", { foo: "bar" }); }).then((user) => { request.get({ @@ -2361,7 +1941,7 @@ describe('Parse.User testing', () => { }); it('user get session from token on login', (done) => { - Parse.Promise.as().then(() => { + Promise.resolve().then(() => { return Parse.User.signUp("finn", "human", { foo: "bar" }); }).then(() => { return Parse.User.logOut().then(() => { @@ -2389,7 +1969,7 @@ describe('Parse.User testing', () => { }); it('user update session with other field', (done) => { - Parse.Promise.as().then(() => { + Promise.resolve().then(() => { return Parse.User.signUp("finn", "human", { foo: "bar" }); }).then((user) => { request.get({ @@ -2420,7 +2000,7 @@ describe('Parse.User testing', () => { }); it('cannot update session if invalid or no session token', (done) => { - Parse.Promise.as().then(() => { + Promise.resolve().then(() => { return Parse.User.signUp("finn", "human", { foo: "bar" }); }).then((user) => { request.get({ @@ -2464,7 +2044,7 @@ describe('Parse.User testing', () => { }); it('get session only for current user', (done) => { - Parse.Promise.as().then(() => { + Promise.resolve().then(() => { return Parse.User.signUp("test1", "test", { foo: "bar" }); }).then(() => { return Parse.User.signUp("test2", "test", { foo: "bar" }); @@ -2492,7 +2072,7 @@ describe('Parse.User testing', () => { }); it('delete session by object', (done) => { - Parse.Promise.as().then(() => { + Promise.resolve().then(() => { return Parse.User.signUp("test1", "test", { foo: "bar" }); }).then(() => { return Parse.User.signUp("test2", "test", { foo: "bar" }); @@ -2545,7 +2125,7 @@ describe('Parse.User testing', () => { }); it('cannot delete session if no sessionToken', (done) => { - Parse.Promise.as().then(() => { + Promise.resolve().then(() => { return Parse.User.signUp("test1", "test", { foo: "bar" }); }).then(() => { return Parse.User.signUp("test2", "test", { foo: "bar" }); @@ -2600,7 +2180,7 @@ describe('Parse.User testing', () => { it('changing password clears sessions', (done) => { let sessionToken = null; - Parse.Promise.as().then(function() { + Promise.resolve().then(function() { return Parse.User.signUp("fosco", "parse"); }).then(function(newUser) { equal(Parse.User.current(), newUser); @@ -2622,7 +2202,7 @@ describe('Parse.User testing', () => { it('test parse user become', (done) => { let sessionToken = null; - Parse.Promise.as().then(function() { + Promise.resolve().then(function() { return Parse.User.signUp("flessard", "folo",{'foo':1}); }).then(function(newUser) { equal(Parse.User.current(), newUser); @@ -2645,7 +2225,7 @@ describe('Parse.User testing', () => { let user = null; let sessionToken = null; - Parse.Promise.as().then(function() { + Promise.resolve().then(function() { return Parse.User.signUp('log', 'out'); }).then((newUser) => { user = newUser; @@ -2673,41 +2253,35 @@ describe('Parse.User testing', () => { }); }); - it("session expiresAt correct format", (done) => { - Parse.User.signUp("asdf", "zxcv", null, { - success: function() { - request.get({ - url: 'http://localhost:8378/1/classes/_Session', - json: true, - headers: { - 'X-Parse-Application-Id': 'test', - 'X-Parse-Master-Key': 'test', - }, - }, (error, response, body) => { - expect(body.results[0].expiresAt.__type).toEqual('Date'); - done(); - }) - } + it("session expiresAt correct format", async (done) => { + await Parse.User.signUp("asdf", "zxcv"); + request.get({ + url: 'http://localhost:8378/1/classes/_Session', + json: true, + headers: { + 'X-Parse-Application-Id': 'test', + 'X-Parse-Master-Key': 'test', + }, + }, (error, response, body) => { + expect(body.results[0].expiresAt.__type).toEqual('Date'); + done(); }); }); - it("Invalid session tokens are rejected", (done) => { - Parse.User.signUp("asdf", "zxcv", null, { - success: function() { - request.get({ - url: 'http://localhost:8378/1/classes/AClass', - json: true, - headers: { - 'X-Parse-Application-Id': 'test', - 'X-Parse-Rest-API-Key': 'rest', - 'X-Parse-Session-Token': 'text' - }, - }, (error, response, body) => { - expect(body.code).toBe(209); - expect(body.error).toBe('Invalid session token'); - done(); - }) - } + it("Invalid session tokens are rejected", async (done) => { + await Parse.User.signUp("asdf", "zxcv"); + request.get({ + url: 'http://localhost:8378/1/classes/AClass', + json: true, + headers: { + 'X-Parse-Application-Id': 'test', + 'X-Parse-Rest-API-Key': 'rest', + 'X-Parse-Session-Token': 'text' + }, + }, (error, response, body) => { + expect(body.code).toBe(209); + expect(body.error).toBe('Invalid session token'); + done(); }); }); @@ -2901,7 +2475,7 @@ describe('Parse.User testing', () => { }); }); - it('should not send email when email is not a string', (done) => { + it('should not send email when email is not a string', async (done) => { let emailCalled = false; let emailOptions; const emailAdapter = { @@ -2922,29 +2496,26 @@ describe('Parse.User testing', () => { user.set('username', 'asdf@jkl.com'); user.set('password', 'zxcv'); user.set('email', 'asdf@jkl.com'); - user.signUp(null, { - success: (user) => { - return rp.post({ - url: 'http://localhost:8378/1/requestPasswordReset', - headers: { - 'X-Parse-Application-Id': Parse.applicationId, - 'X-Parse-Session-Token': user.sessionToken, - 'X-Parse-REST-API-Key': 'rest', - }, - json: { - email: {"$regex":"^asd"}, - } - }).then((res) => { - fail('no request should succeed: ' + JSON.stringify(res)); - done(); - }).catch((err) => { - expect(emailCalled).toBeTruthy(); - expect(emailOptions).toBeDefined(); - expect(err.statusCode).toBe(400); - expect(err.message).toMatch('{"code":125,"error":"you must provide a valid email string"}'); - done(); - }); + await user.signUp(); + rp.post({ + url: 'http://localhost:8378/1/requestPasswordReset', + headers: { + 'X-Parse-Application-Id': Parse.applicationId, + 'X-Parse-Session-Token': user.sessionToken, + 'X-Parse-REST-API-Key': 'rest', }, + json: { + email: {"$regex":"^asd"}, + } + }).then((res) => { + fail('no request should succeed: ' + JSON.stringify(res)); + done(); + }).catch((err) => { + expect(emailCalled).toBeTruthy(); + expect(emailOptions).toBeDefined(); + expect(err.statusCode).toBe(400); + expect(err.message).toMatch('{"code":125,"error":"you must provide a valid email string"}'); + done(); }); }); @@ -3055,37 +2626,22 @@ describe('Parse.User testing', () => { }); }); - it('should not overwrite username when unlinking facebook user (regression test for #1532)', done => { + it('should not overwrite username when unlinking facebook user (regression test for #1532)', async (done) => { Parse.Object.disableSingleInstance(); const provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); - const user = new Parse.User(); + let user = new Parse.User(); user.set("username", "testLinkWithProvider"); user.set("password", "mypass"); - user.signUp() - .then(user => user._linkWith("facebook", { - success: user => { - expect(user.get('username')).toEqual('testLinkWithProvider'); - expect(Parse.FacebookUtils.isLinked(user)).toBeTruthy(); - return user._unlinkFrom('facebook') - .then(() => user.fetch()) - .then(user => { - expect(user.get('username')).toEqual('testLinkWithProvider'); - expect(Parse.FacebookUtils.isLinked(user)).toBeFalsy(); - done(); - }); - }, - error: error => { - fail('Unexpected failure testing linking'); - fail(JSON.stringify(error)); - done(); - } - })) - .catch(error => { - fail('Unexpected failure testing in unlink user test'); - jfail(error); - done(); - }); + await user.signUp(); + await user._linkWith("facebook"); + expect(user.get('username')).toEqual('testLinkWithProvider'); + expect(Parse.FacebookUtils.isLinked(user)).toBeTruthy(); + await user._unlinkFrom('facebook') + user = await user.fetch() + expect(user.get('username')).toEqual('testLinkWithProvider'); + expect(Parse.FacebookUtils.isLinked(user)).toBeFalsy(); + done(); }); it('should revoke sessions when converting anonymous user to "normal" user', done => { diff --git a/spec/PurchaseValidation.spec.js b/spec/PurchaseValidation.spec.js index 25fdb73a..39d5b4e5 100644 --- a/spec/PurchaseValidation.spec.js +++ b/spec/PurchaseValidation.spec.js @@ -21,7 +21,7 @@ function createProduct() { describe("test validate_receipt endpoint", () => { beforeEach(done => { - createProduct().then(done).fail(function(){ + createProduct().then(done).catch(function(){ done(); }); }) @@ -182,7 +182,7 @@ describe("test validate_receipt endpoint", () => { expect(productAgain.get('downloadName')).toEqual(productAgain.get('download').name()); expect(productAgain.get("title")).toEqual("a new title"); done(); - }).fail(function(err){ + }).catch(function(err){ fail(JSON.stringify(err)); done(); }); @@ -199,7 +199,7 @@ describe("test validate_receipt endpoint", () => { }).then(function(){ fail("Should not succeed"); done(); - }).fail(function(err){ + }).catch(function(err){ expect(err.code).toEqual(Parse.Error.INCORRECT_TYPE); expect(err.message).toEqual("title is required."); done(); diff --git a/spec/Schema.spec.js b/spec/Schema.spec.js index c2f738e6..e308234f 100644 --- a/spec/Schema.spec.js +++ b/spec/Schema.spec.js @@ -750,7 +750,7 @@ describe('SchemaController', () => { hasAllPODobject().save() .then(() => config.database.loadSchema()) .then(schema => schema.deleteField('missingField', 'HasAllPOD')) - .fail(error => { + .catch(error => { expect(error.code).toEqual(255); expect(error.message).toEqual('Field missingField does not exist, cannot delete.'); done(); diff --git a/spec/SessionTokenCache.spec.js b/spec/SessionTokenCache.spec.js index 9e230116..584a2c09 100644 --- a/spec/SessionTokenCache.spec.js +++ b/spec/SessionTokenCache.spec.js @@ -6,7 +6,7 @@ describe('SessionTokenCache', function() { const Parse = require('parse/node'); spyOn(Parse, "Query").and.returnValue({ - first: jasmine.createSpy("first").and.returnValue(Parse.Promise.as(new Parse.Object("_Session", { + first: jasmine.createSpy("first").and.returnValue(Promise.resolve(new Parse.Object("_Session", { user: new Parse.User({id:"userId"}) }))), equalTo: function(){} diff --git a/spec/UserPII.spec.js b/spec/UserPII.spec.js index f581f5a4..64822cd4 100644 --- a/spec/UserPII.spec.js +++ b/spec/UserPII.spec.js @@ -31,7 +31,7 @@ describe('Personally Identifiable Information', () => { fetchedUser => { expect(fetchedUser.get('email')).toBe(EMAIL); }, e => console.error('error', e)) - .done(() => done()); + .then(done).catch(done.fail); }); it('should not be able to get PII via API with object', (done) => { @@ -42,11 +42,12 @@ describe('Personally Identifiable Information', () => { userObj.fetch().then( fetchedUser => { expect(fetchedUser.get('email')).toBe(undefined); + done(); }) - .fail(e => { + .catch(e => { done.fail(JSON.stringify(e)); }) - .done(() => done()); + .then(done).catch(done.fail); }); }); @@ -59,7 +60,7 @@ describe('Personally Identifiable Information', () => { fetchedUser => { expect(fetchedUser.get('email')).toBe(EMAIL); }, e => console.error('error', e)) - .done(() => done()); + .then(done).catch(done.fail); }); }); @@ -285,7 +286,7 @@ describe('Personally Identifiable Information', () => { expect(fetchedUser.get('zip')).toBe(undefined); expect(fetchedUser.get('ssn')).toBe(undefined); }, e => console.error('error', e)) - .done(() => done()); + .then(done).catch(done.fail); }); }); @@ -300,7 +301,7 @@ describe('Personally Identifiable Information', () => { expect(fetchedUser.get('zip')).toBe(ZIP); expect(fetchedUser.get('ssn')).toBe(SSN); }, e => console.error('error', e)) - .done(() => done()); + .then(done).catch(done.fail); }); }); @@ -397,7 +398,7 @@ describe('Personally Identifiable Information', () => { expect(fetchedUser.email).toBe(undefined); }, e => console.error('error', e.message) - ).done(() => done()); + ).then(done).catch(done.fail); }); it('should get PII via REST with self credentials', (done) => { @@ -418,7 +419,7 @@ describe('Personally Identifiable Information', () => { expect(fetchedUser.ssn).toBe(SSN); }, e => console.error('error', e.message) - ).done(() => done()); + ).then(done).catch(done.fail); }); it('should get PII via REST using master key', (done) => { @@ -438,7 +439,7 @@ describe('Personally Identifiable Information', () => { expect(fetchedUser.ssn).toBe(SSN); }, e => console.error('error', e.message) - ).done(() => done()); + ).then(done).catch(done.fail); }); it('should not get PII via REST by ID', (done) => { @@ -457,7 +458,7 @@ describe('Personally Identifiable Information', () => { expect(fetchedUser.email).toBe(undefined); }, e => console.error('error', e.message) - ).done(() => done()); + ).then(done).catch(done.fail); }); it('should get PII via REST by ID with self credentials', (done) => { @@ -477,7 +478,7 @@ describe('Personally Identifiable Information', () => { expect(fetchedUser.email).toBe(EMAIL); }, e => console.error('error', e.message) - ).done(() => done()); + ).then(done).catch(done.fail); }); it('should get PII via REST by ID with master key', (done) => { @@ -497,7 +498,7 @@ describe('Personally Identifiable Information', () => { expect(fetchedUser.email).toBe(EMAIL); }, e => console.error('error', e.message) - ).done(() => done()); + ).then(done).catch(done.fail); }); }); }); diff --git a/spec/ValidationAndPasswordsReset.spec.js b/spec/ValidationAndPasswordsReset.spec.js index 3cc1b1a2..bd82122f 100644 --- a/spec/ValidationAndPasswordsReset.spec.js +++ b/spec/ValidationAndPasswordsReset.spec.js @@ -42,26 +42,19 @@ describe("Custom Pages, Email Verification, Password Reset", () => { emailAdapter: emailAdapter, publicServerURL: "http://localhost:8378/1" }) - .then(() => { + .then(async () => { spyOn(emailAdapter, 'sendVerificationEmail'); const user = new Parse.User(); user.setPassword("asdf"); user.setUsername("zxcv"); user.setEmail('testIfEnabled@parse.com'); - user.signUp(null, { - success: function(user) { - expect(emailAdapter.sendVerificationEmail).toHaveBeenCalled(); - user.fetch() - .then(() => { - expect(user.get('emailVerified')).toEqual(false); - done(); - }); - }, - error: function() { - fail('Failed to save user'); + await user.signUp(); + expect(emailAdapter.sendVerificationEmail).toHaveBeenCalled(); + user.fetch() + .then(() => { + expect(user.get('emailVerified')).toEqual(false); done(); - } - }); + }); }); }); @@ -77,25 +70,18 @@ describe("Custom Pages, Email Verification, Password Reset", () => { emailAdapter: emailAdapter, publicServerURL: "http://localhost:8378/1" }) - .then(() => { + .then(async () => { spyOn(emailAdapter, 'sendVerificationEmail'); const user = new Parse.User(); user.setPassword("asdf"); user.setUsername("zxcv"); - user.signUp(null, { - success: function(user) { - expect(emailAdapter.sendVerificationEmail).not.toHaveBeenCalled(); - user.fetch() - .then(() => { - expect(user.get('emailVerified')).toEqual(undefined); - done(); - }); - }, - error: function() { - fail('Failed to save user'); + await user.signUp(); + expect(emailAdapter.sendVerificationEmail).not.toHaveBeenCalled(); + user.fetch() + .then(() => { + expect(user.get('emailVerified')).toEqual(undefined); done(); - } - }); + }); }); }); @@ -110,83 +96,62 @@ describe("Custom Pages, Email Verification, Password Reset", () => { verifyUserEmails: true, emailAdapter: emailAdapter, publicServerURL: "http://localhost:8378/1" - }) - .then(() => { - spyOn(emailAdapter, 'sendVerificationEmail'); - const user = new Parse.User(); - user.setPassword("asdf"); - user.setUsername("zxcv"); - user.signUp(null, { - success: function(user) { - expect(emailAdapter.sendVerificationEmail).not.toHaveBeenCalled(); - user.fetch() - .then((user) => { - user.set("email", "testWhenUpdating@parse.com"); - return user.save(); - }).then((user) => { - return user.fetch(); - }).then(() => { - expect(user.get('emailVerified')).toEqual(false); - // Wait as on update email, we need to fetch the username - setTimeout(function(){ - expect(emailAdapter.sendVerificationEmail).toHaveBeenCalled(); - done(); - }, 200); - }); - }, - error: function() { - fail('Failed to save user'); + }).then(async () => { + spyOn(emailAdapter, 'sendVerificationEmail'); + const user = new Parse.User(); + user.setPassword("asdf"); + user.setUsername("zxcv"); + await user.signUp(); + expect(emailAdapter.sendVerificationEmail).not.toHaveBeenCalled(); + user.fetch() + .then((user) => { + user.set("email", "testWhenUpdating@parse.com"); + return user.save(); + }).then((user) => { + return user.fetch(); + }).then(() => { + expect(user.get('emailVerified')).toEqual(false); + // Wait as on update email, we need to fetch the username + setTimeout(function(){ + expect(emailAdapter.sendVerificationEmail).toHaveBeenCalled(); done(); - } + }, 200); }); - }); + }); }); - it('does send a validation email with valid verification link when updating the email', done => { + it('does send a validation email with valid verification link when updating the email', async done => { const emailAdapter = { sendVerificationEmail: () => Promise.resolve(), sendPasswordResetEmail: () => Promise.resolve(), sendMail: () => Promise.resolve() } - reconfigureServer({ + await reconfigureServer({ appName: 'unused', verifyUserEmails: true, emailAdapter: emailAdapter, publicServerURL: "http://localhost:8378/1" }) - .then(() => { - spyOn(emailAdapter, 'sendVerificationEmail').and.callFake((options) => { - expect(options.link).not.toBeNull(); - expect(options.link).not.toMatch(/token=undefined/); - Promise.resolve(); - }); - const user = new Parse.User(); - user.setPassword("asdf"); - user.setUsername("zxcv"); - user.signUp(null, { - success: function(user) { - expect(emailAdapter.sendVerificationEmail).not.toHaveBeenCalled(); - user.fetch() - .then((user) => { - user.set("email", "testValidLinkWhenUpdating@parse.com"); - return user.save(); - }).then((user) => { - return user.fetch(); - }).then(() => { - expect(user.get('emailVerified')).toEqual(false); - // Wait as on update email, we need to fetch the username - setTimeout(function(){ - expect(emailAdapter.sendVerificationEmail).toHaveBeenCalled(); - done(); - }, 200); - }); - }, - error: function() { - fail('Failed to save user'); - done(); - } - }); - }); + spyOn(emailAdapter, 'sendVerificationEmail').and.callFake((options) => { + expect(options.link).not.toBeNull(); + expect(options.link).not.toMatch(/token=undefined/); + Promise.resolve(); + }); + const user = new Parse.User(); + user.setPassword("asdf"); + user.setUsername("zxcv"); + await user.signUp(); + expect(emailAdapter.sendVerificationEmail).not.toHaveBeenCalled(); + await user.fetch() + user.set("email", "testValidLinkWhenUpdating@parse.com"); + await user.save(); + await user.fetch(); + expect(user.get('emailVerified')).toEqual(false); + // Wait as on update email, we need to fetch the username + setTimeout(function(){ + expect(emailAdapter.sendVerificationEmail).toHaveBeenCalled(); + done(); + }, 200); }); it('does send with a simple adapter', done => { @@ -211,32 +176,25 @@ describe("Custom Pages, Email Verification, Password Reset", () => { emailAdapter: emailAdapter, publicServerURL: "http://localhost:8378/1" }) - .then(() => { + .then(async () => { const user = new Parse.User(); user.setPassword("asdf"); user.setUsername("zxcv"); user.set("email", "testSendSimpleAdapter@parse.com"); - user.signUp(null, { - success: function(user) { - expect(calls).toBe(1); - user.fetch() - .then((user) => { - return user.save(); - }).then(() => { - return Parse.User.requestPasswordReset("testSendSimpleAdapter@parse.com").catch(() => { - fail('Should not fail requesting a password'); - done(); - }) - }).then(() => { - expect(calls).toBe(2); - done(); - }); - }, - error: function() { - fail('Failed to save user'); + await user.signUp(); + expect(calls).toBe(1); + user.fetch() + .then((user) => { + return user.save(); + }).then(() => { + return Parse.User.requestPasswordReset("testSendSimpleAdapter@parse.com").catch(() => { + fail('Should not fail requesting a password'); + done(); + }) + }).then(() => { + expect(calls).toBe(2); done(); - } - }); + }); }); }); @@ -535,25 +493,16 @@ describe("Custom Pages, Email Verification, Password Reset", () => { verifyUserEmails: false, emailAdapter: emailAdapter, }) - .then(() => { + .then(async () => { spyOn(emailAdapter, 'sendVerificationEmail'); const user = new Parse.User(); user.setPassword("asdf"); user.setUsername("zxcv"); - user.signUp(null, { - success: function(user) { - user.fetch() - .then(() => { - expect(emailAdapter.sendVerificationEmail.calls.count()).toEqual(0); - expect(user.get('emailVerified')).toEqual(undefined); - done(); - }); - }, - error: function() { - fail('Failed to save user'); - done(); - } - }); + await user.signUp(); + await user.fetch() + expect(emailAdapter.sendVerificationEmail.calls.count()).toEqual(0); + expect(user.get('emailVerified')).toEqual(undefined); + done(); }); }); @@ -574,21 +523,14 @@ describe("Custom Pages, Email Verification, Password Reset", () => { emailAdapter: emailAdapter, publicServerURL: "http://localhost:8378/1" }) - .then(() => { + .then(async () => { const user = new Parse.User(); user.setPassword("asdf"); user.setUsername("zxcv"); user.set('email', 'user@parse.com'); - user.signUp(null, { - success: () => { - expect(emailSent).toBe(true); - done(); - }, - error: function() { - fail('Failed to save user'); - done(); - } - }); + await user.signUp(); + expect(emailSent).toBe(true); + done(); }); }) @@ -889,4 +831,6 @@ describe("Custom Pages, Email Verification, Password Reset", () => { }); }); }); -}) + +}); + diff --git a/spec/WinstonLoggerAdapter.spec.js b/spec/WinstonLoggerAdapter.spec.js index da450b63..4a48745b 100644 --- a/spec/WinstonLoggerAdapter.spec.js +++ b/spec/WinstonLoggerAdapter.spec.js @@ -21,7 +21,7 @@ describe('info logs', () => { // Check the error log // Regression #2639 winstonLoggerAdapter.query({ - from: new Date(Date.now() - 500), + from: new Date(Date.now() - 200), size: 100, level: 'error' }, (results) => { diff --git a/spec/helper.js b/spec/helper.js index adcee449..efa3f3f7 100644 --- a/spec/helper.js +++ b/spec/helper.js @@ -155,10 +155,6 @@ const reconfigureServer = changedConfiguration => { const Parse = require('parse/node'); Parse.serverURL = 'http://localhost:' + port + '/1'; -// This is needed because we ported a bunch of tests from the non-A+ way. -// TODO: update tests to work in an A+ way -Parse.Promise.disableAPlusCompliant(); - // 10 minutes timeout beforeAll(startDB, 10 * 60 * 1000); @@ -239,27 +235,14 @@ const Container = Parse.Object.extend({ // Convenience method to create a new TestObject with a callback function create(options, callback) { const t = new TestObject(options); - t.save(null, { success: callback }); + return t.save().then(callback); } -function createTestUser(success, error) { +function createTestUser() { const user = new Parse.User(); user.set('username', 'test'); user.set('password', 'moon-y'); - const promise = user.signUp(); - if (success || error) { - promise.then(function(user) { - if (success) { - success(user); - } - }, function(err) { - if (error) { - error(err); - } - }); - } else { - return promise; - } + return user.signUp(); } // Shims for compatibility with the old qunit tests. @@ -275,37 +258,6 @@ function strictEqual(a, b, message) { function notEqual(a, b, message) { expect(a).not.toEqual(b, message); } -function expectSuccess(params, done) { - return { - success: params.success, - error: function() { - fail('failure happened in expectSuccess'); - done ? done() : null; - }, - } -} -function expectError(errorCode, callback) { - return { - success: function(result) { - console.log('got result', result); - fail('expected error but got success'); - }, - error: function(obj, e) { - // Some methods provide 2 parameters. - e = e || obj; - if (errorCode !== undefined) { - if (!e) { - fail('expected a specific error but got a blank error'); - return; - } - expect(e.code).toEqual(errorCode, e.message); - } - if (callback) { - callback(e); - } - }, - } -} // Because node doesn't have Parse._.contains function arrayContains(arr, item) { @@ -397,8 +349,6 @@ global.ok = ok; global.equal = equal; global.strictEqual = strictEqual; global.notEqual = notEqual; -global.expectSuccess = expectSuccess; -global.expectError = expectError; global.arrayContains = arrayContains; global.jequal = jequal; global.range = range; diff --git a/spec/index.spec.js b/spec/index.spec.js index f962a4f0..4e48cb2b 100644 --- a/spec/index.spec.js +++ b/spec/index.spec.js @@ -292,7 +292,7 @@ describe('server', () => { }).then((obj) => { expect(obj.id).toEqual(objId); server.close(done); - }).fail(() => { + }).catch(() => { server.close(done); }) }); diff --git a/src/LiveQuery/ParseLiveQueryServer.js b/src/LiveQuery/ParseLiveQueryServer.js index b8b7bf3d..fb89ca81 100644 --- a/src/LiveQuery/ParseLiveQueryServer.js +++ b/src/LiveQuery/ParseLiveQueryServer.js @@ -174,7 +174,7 @@ class ParseLiveQueryServer { // subscription, we do not need to check ACL let originalACLCheckingPromise; if (!isOriginalSubscriptionMatched) { - originalACLCheckingPromise = Parse.Promise.as(false); + originalACLCheckingPromise = Promise.resolve(false); } else { let originalACL; if (message.originalParseObject) { @@ -186,16 +186,18 @@ class ParseLiveQueryServer { // subscription, we do not need to check ACL let currentACLCheckingPromise; if (!isCurrentSubscriptionMatched) { - currentACLCheckingPromise = Parse.Promise.as(false); + currentACLCheckingPromise = Promise.resolve(false); } else { const currentACL = message.currentParseObject.getACL(); currentACLCheckingPromise = this._matchesACL(currentACL, client, requestId); } - Parse.Promise.when( - originalACLCheckingPromise, - currentACLCheckingPromise - ).then((isOriginalMatched, isCurrentMatched) => { + Promise.all( + [ + originalACLCheckingPromise, + currentACLCheckingPromise + ] + ).then(([isOriginalMatched, isCurrentMatched]) => { logger.verbose('Original %j | Current %j | Match: %s, %s, %s, %s | Query: %s', originalParseObject, currentParseObject, @@ -330,12 +332,12 @@ class ParseLiveQueryServer { _matchesACL(acl: any, client: any, requestId: number): any { // Return true directly if ACL isn't present, ACL is public read, or client has master key if (!acl || acl.getPublicReadAccess() || client.hasMasterKey) { - return Parse.Promise.as(true); + return Promise.resolve(true); } // Check subscription sessionToken matches ACL first const subscriptionInfo = client.getSubscriptionInfo(requestId); if (typeof subscriptionInfo === 'undefined') { - return Parse.Promise.as(false); + return Promise.resolve(false); } const subscriptionSessionToken = subscriptionInfo.sessionToken; @@ -343,11 +345,11 @@ class ParseLiveQueryServer { return acl.getReadAccess(userId); }).then((isSubscriptionSessionTokenMatched) => { if (isSubscriptionSessionTokenMatched) { - return Parse.Promise.as(true); + return Promise.resolve(true); } // Check if the user has any roles that match the ACL - return new Parse.Promise((resolve, reject) => { + return new Promise((resolve, reject) => { // Resolve false right away if the acl doesn't have any roles const acl_has_roles = Object.keys(acl.permissionsById).some(key => key.startsWith("role:")); @@ -360,7 +362,7 @@ class ParseLiveQueryServer { // Pass along a null if there is no user id if (!userId) { - return Parse.Promise.as(null); + return Promise.resolve(null); } // Prepare a user object to query for roles @@ -374,7 +376,7 @@ class ParseLiveQueryServer { // Pass along an empty array (of roles) if no user if (!user) { - return Parse.Promise.as([]); + return Promise.resolve([]); } // Then get the user's roles @@ -400,7 +402,7 @@ class ParseLiveQueryServer { }).then((isRoleMatched) => { if(isRoleMatched) { - return Parse.Promise.as(true); + return Promise.resolve(true); } // Check client sessionToken matches ACL @@ -409,9 +411,9 @@ class ParseLiveQueryServer { return acl.getReadAccess(userId); }); }).then((isMatched) => { - return Parse.Promise.as(isMatched); + return Promise.resolve(isMatched); }, () => { - return Parse.Promise.as(false); + return Promise.resolve(false); }); } diff --git a/src/LiveQuery/SessionTokenCache.js b/src/LiveQuery/SessionTokenCache.js index a38c951c..249f5579 100644 --- a/src/LiveQuery/SessionTokenCache.js +++ b/src/LiveQuery/SessionTokenCache.js @@ -7,7 +7,7 @@ function userForSessionToken(sessionToken){ q.equalTo("sessionToken", sessionToken); return q.first({useMasterKey:true}).then(function(session){ if(!session){ - return Parse.Promise.error("No session found for session token"); + return Promise.reject("No session found for session token"); } return session.get("user"); }); @@ -25,21 +25,21 @@ class SessionTokenCache { getUserId(sessionToken: string): any { if (!sessionToken) { - return Parse.Promise.error('Empty sessionToken'); + return Promise.reject('Empty sessionToken'); } const userId = this.cache.get(sessionToken); if (userId) { logger.verbose('Fetch userId %s of sessionToken %s from Cache', userId, sessionToken); - return Parse.Promise.as(userId); + return Promise.resolve(userId); } return userForSessionToken(sessionToken).then((user) => { logger.verbose('Fetch userId %s of sessionToken %s from Parse', user.id, sessionToken); const userId = user.id; this.cache.set(sessionToken, userId); - return Parse.Promise.as(userId); + return Promise.resolve(userId); }, (error) => { logger.error('Can not fetch userId for sessionToken %j, error %j', sessionToken, error); - return Parse.Promise.error(error); + return Promise.reject(error); }); } } diff --git a/src/ParseServerRESTController.js b/src/ParseServerRESTController.js index 63e8d0a4..547260a4 100644 --- a/src/ParseServerRESTController.js +++ b/src/ParseServerRESTController.js @@ -6,15 +6,15 @@ const Parse = require('parse/node'); function getSessionToken(options) { if (options && typeof options.sessionToken === 'string') { - return Parse.Promise.as(options.sessionToken); + return Promise.resolve(options.sessionToken); } - return Parse.Promise.as(null); + return Promise.resolve(null); } function getAuth(options = {}, config) { const installationId = options.installationId || 'cloud'; if (options.useMasterKey) { - return Parse.Promise.as(new Auth.Auth({config, isMaster: true, installationId })); + return Promise.resolve(new Auth.Auth({config, isMaster: true, installationId })); } return getSessionToken(options).then((sessionToken) => { if (sessionToken) { @@ -25,7 +25,7 @@ function getAuth(options = {}, config) { installationId }); } else { - return Parse.Promise.as(new Auth.Auth({ config, installationId })); + return Promise.resolve(new Auth.Auth({ config, installationId })); } }) } @@ -48,12 +48,12 @@ function ParseServerRESTController(applicationId, router) { if (path === '/batch') { const promises = data.requests.map((request) => { return handleRequest(request.method, request.path, request.body, options).then((response) => { - return Parse.Promise.as({success: response}); + return Promise.resolve({success: response}); }, (error) => { - return Parse.Promise.as({error: {code: error.code, error: error.message}}); + return Promise.resolve({error: {code: error.code, error: error.message}}); }); }); - return Parse.Promise.all(promises); + return Promise.all(promises); } let query; @@ -61,7 +61,7 @@ function ParseServerRESTController(applicationId, router) { query = data; } - return new Parse.Promise((resolve, reject) => { + return new Promise((resolve, reject) => { getAuth(options, config).then((auth) => { const request = { body: data, diff --git a/src/cloud-code/httpRequest.js b/src/cloud-code/httpRequest.js index 32102341..5fd8eae7 100644 --- a/src/cloud-code/httpRequest.js +++ b/src/cloud-code/httpRequest.js @@ -1,5 +1,4 @@ import request from 'request'; -import Parse from 'parse/node'; import HTTPResponse from './HTTPResponse'; import querystring from 'querystring'; import log from '../logger'; @@ -35,7 +34,6 @@ var encodeBody = function({body, headers = {}}) { } module.exports = function(options) { - var promise = new Parse.Promise(); var callbacks = { success: options.success, error: options.error @@ -54,30 +52,30 @@ module.exports = function(options) { } // force the response as a buffer options.encoding = null; + return new Promise((resolve, reject) => { + request(options, (error, response, body) => { + if (error) { + if (callbacks.error) { + callbacks.error(error); + } + return reject(error); + } + const httpResponse = new HTTPResponse(response, body); - request(options, (error, response, body) => { - if (error) { - if (callbacks.error) { - callbacks.error(error); + // Consider <200 && >= 400 as errors + if (httpResponse.status < 200 || httpResponse.status >= 400) { + if (callbacks.error) { + callbacks.error(httpResponse); + } + return reject(httpResponse); + } else { + if (callbacks.success) { + callbacks.success(httpResponse); + } + return resolve(httpResponse); } - return promise.reject(error); - } - const httpResponse = new HTTPResponse(response, body); - - // Consider <200 && >= 400 as errors - if (httpResponse.status < 200 || httpResponse.status >= 400) { - if (callbacks.error) { - callbacks.error(httpResponse); - } - return promise.reject(httpResponse); - } else { - if (callbacks.success) { - callbacks.success(httpResponse); - } - return promise.resolve(httpResponse); - } + }); }); - return promise; }; module.exports.encodeBody = encodeBody;