diff --git a/.travis.yml b/.travis.yml index c44e214609..8863a748b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,6 @@ env: - MONGODB_VERSION=3.2.6 matrix: fast_finish: true, - allow_failures: - - env: PARSE_SERVER_TEST_DB=postgres branches: only: - master diff --git a/spec/AdaptableController.spec.js b/spec/AdaptableController.spec.js index 5c7747e512..a5d5994662 100644 --- a/spec/AdaptableController.spec.js +++ b/spec/AdaptableController.spec.js @@ -10,7 +10,6 @@ MockController.prototype = Object.create(AdaptableController.prototype); MockController.prototype.constructor = AdaptableController; describe("AdaptableController", ()=>{ - it("should use the provided adapter", (done) => { var adapter = new FilesAdapter(); var controller = new FilesController(adapter); diff --git a/spec/CLI.spec.js b/spec/CLI.spec.js index c0a749d2b4..733e1e3a00 100644 --- a/spec/CLI.spec.js +++ b/spec/CLI.spec.js @@ -24,7 +24,6 @@ var definitions = { } describe("commander additions", () => { - afterEach((done) => { commander.options = []; delete commander.arg0; diff --git a/spec/Client.spec.js b/spec/Client.spec.js index 7ebc502929..14b1795529 100644 --- a/spec/Client.spec.js +++ b/spec/Client.spec.js @@ -2,7 +2,6 @@ var Client = require('../src/LiveQuery/Client').Client; var ParseWebSocket = require('../src/LiveQuery/ParseWebSocketServer').ParseWebSocket; describe('Client', function() { - it('can be initialized', function() { var parseWebSocket = new ParseWebSocket({}); var client = new Client(1, parseWebSocket); diff --git a/spec/CloudCodeLogger.spec.js b/spec/CloudCodeLogger.spec.js index a556762a8f..54c03a534b 100644 --- a/spec/CloudCodeLogger.spec.js +++ b/spec/CloudCodeLogger.spec.js @@ -3,7 +3,6 @@ var LoggerController = require('../src/Controllers/LoggerController').LoggerCont var FileLoggerAdapter = require('../src/Adapters/Logger/FileLoggerAdapter').FileLoggerAdapter; describe("Cloud Code Logger", () => { - it("should expose log to functions", (done) => { var logController = new LoggerController(new FileLoggerAdapter()); diff --git a/spec/EventEmitterPubSub.spec.js b/spec/EventEmitterPubSub.spec.js index abfa9fb232..c457215be8 100644 --- a/spec/EventEmitterPubSub.spec.js +++ b/spec/EventEmitterPubSub.spec.js @@ -1,7 +1,6 @@ var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub; describe('EventEmitterPubSub', function() { - it('can publish and subscribe', function() { var publisher = EventEmitterPubSub.createPublisher(); var subscriber = EventEmitterPubSub.createSubscriber(); diff --git a/spec/FileLoggerAdapter.spec.js b/spec/FileLoggerAdapter.spec.js index 2501a1218d..844cb59650 100644 --- a/spec/FileLoggerAdapter.spec.js +++ b/spec/FileLoggerAdapter.spec.js @@ -5,7 +5,6 @@ var Parse = require('parse/node').Parse; var request = require('request'); describe('info logs', () => { - it("Verify INFO logs", (done) => { var fileLoggerAdapter = new FileLoggerAdapter(); fileLoggerAdapter.info('testing info logs', () => { @@ -27,7 +26,6 @@ describe('info logs', () => { }); describe('error logs', () => { - it("Verify ERROR logs", (done) => { var fileLoggerAdapter = new FileLoggerAdapter(); fileLoggerAdapter.error('testing error logs', () => { @@ -50,7 +48,6 @@ describe('error logs', () => { }); describe('verbose logs', () => { - it("mask sensitive information in _User class", (done) => { reconfigureServer({ verbose: true }) .then(() => createTestUser()) diff --git a/spec/HTTPRequest.spec.js b/spec/HTTPRequest.spec.js index 37a5c48d55..e4096f5b9b 100644 --- a/spec/HTTPRequest.spec.js +++ b/spec/HTTPRequest.spec.js @@ -36,7 +36,6 @@ app.listen(13371); describe("httpRequest", () => { - it("should do /hello", (done) => { httpRequest({ url: httpRequestServer+"/hello" @@ -51,7 +50,7 @@ describe("httpRequest", () => { done(); }) }); - + it("should do /hello with callback and promises", (done) => { var calls = 0; httpRequest({ @@ -70,7 +69,7 @@ describe("httpRequest", () => { done(); }) }); - + it("should do not follow redirects by default", (done) => { httpRequest({ @@ -83,7 +82,7 @@ describe("httpRequest", () => { done(); }) }); - + it("should follow redirects when set", (done) => { httpRequest({ @@ -100,17 +99,17 @@ describe("httpRequest", () => { done(); }) }); - + it("should fail on 404", (done) => { var calls = 0; httpRequest({ url: httpRequestServer+"/404", - success: function() { + success: function() { calls++; fail("should not succeed"); done(); }, - error: function(httpResponse) { + error: function(httpResponse) { calls++; expect(calls).toBe(1); expect(httpResponse.status).toBe(404); @@ -121,7 +120,7 @@ describe("httpRequest", () => { } }); }) - + it("should fail on 404", (done) => { httpRequest({ url: httpRequestServer+"/404", @@ -136,7 +135,7 @@ describe("httpRequest", () => { done(); }) }) - + it("should post on echo", (done) => { var calls = 0; httpRequest({ @@ -160,27 +159,27 @@ describe("httpRequest", () => { done(); }) }); - + it("should encode a query string body by default", (done) => { let options = { - body: {"foo": "bar"}, + body: {"foo": "bar"}, } let result = httpRequest.encodeBody(options); expect(result.body).toEqual('foo=bar'); expect(result.headers['Content-Type']).toEqual('application/x-www-form-urlencoded'); done(); - + }) - + it("should encode a JSON body", (done) => { let options = { - body: {"foo": "bar"}, + body: {"foo": "bar"}, headers: {'Content-Type': 'application/json'} } let result = httpRequest.encodeBody(options); expect(result.body).toEqual('{"foo":"bar"}'); done(); - + }) it("should encode a www-form body", (done) => { let options = { @@ -193,7 +192,7 @@ describe("httpRequest", () => { }); it("should not encode a wrong content type", (done) => { let options = { - body:{"foo": "bar", "bar": "baz"}, + body:{"foo": "bar", "bar": "baz"}, headers: {'cOntent-tYpe': 'mime/jpeg'} } let result = httpRequest.encodeBody(options); @@ -204,18 +203,18 @@ describe("httpRequest", () => { it("should fail gracefully", (done) => { httpRequest({ url: "http://not a good url", - success: function() { + success: function() { fail("should not succeed"); done(); }, - error: function(error) { + error: function(error) { expect(error).not.toBeUndefined(); expect(error).not.toBeNull(); done(); } }); }); - + it("should params object to query string", (done) => { httpRequest({ url: httpRequestServer+"/qs", diff --git a/spec/InstallationsRouter.spec.js b/spec/InstallationsRouter.spec.js index 2d7224a0d6..f147a83cf6 100644 --- a/spec/InstallationsRouter.spec.js +++ b/spec/InstallationsRouter.spec.js @@ -103,7 +103,7 @@ describe('InstallationsRouter', () => { }); }); - it('query installations with count = 1', (done) => { + it_exclude_dbs(['postgres'])('query installations with count = 1', (done) => { var androidDeviceRequest = { 'installationId': '12345678-abcd-abcd-abcd-123456789abc', 'deviceType': 'android' @@ -133,7 +133,7 @@ describe('InstallationsRouter', () => { }); }); - it('query installations with limit = 0 and count = 1', (done) => { + it_exclude_dbs(['postgres'])('query installations with limit = 0 and count = 1', (done) => { var androidDeviceRequest = { 'installationId': '12345678-abcd-abcd-abcd-123456789abc', 'deviceType': 'android' diff --git a/spec/MongoTransform.spec.js b/spec/MongoTransform.spec.js index 44ab1cf551..6a6ba9f7b2 100644 --- a/spec/MongoTransform.spec.js +++ b/spec/MongoTransform.spec.js @@ -6,7 +6,6 @@ let dd = require('deep-diff'); let mongodb = require('mongodb'); describe('parseObjectToMongoObjectForCreate', () => { - it('a basic number', (done) => { var input = {five: 5}; var output = transform.parseObjectToMongoObjectForCreate(null, input, { @@ -51,7 +50,7 @@ describe('parseObjectToMongoObjectForCreate', () => { //TODO: object creation requests shouldn't be seeing __op delete, it makes no sense to //have __op delete in a new object. Figure out what this should actually be testing. - notWorking('a delete op', (done) => { + xit('a delete op', (done) => { var input = {deleteMe: {__op: 'Delete'}}; var output = transform.parseObjectToMongoObjectForCreate(null, input, { fields: {} }); jequal(output, {}); @@ -64,37 +63,33 @@ describe('parseObjectToMongoObjectForCreate', () => { done(); }); - describe('GeoPoints', () => { - it('plain', (done) => { - var geoPoint = {__type: 'GeoPoint', longitude: 180, latitude: -180}; - var out = transform.parseObjectToMongoObjectForCreate(null, {location: geoPoint},{ - fields: {location: {type: 'GeoPoint'}} - }); - expect(out.location).toEqual([180, -180]); - done(); + it('plain', (done) => { + var geoPoint = {__type: 'GeoPoint', longitude: 180, latitude: -180}; + var out = transform.parseObjectToMongoObjectForCreate(null, {location: geoPoint},{ + fields: {location: {type: 'GeoPoint'}} }); + expect(out.location).toEqual([180, -180]); + done(); + }); - it('in array', (done) => { - var geoPoint = {__type: 'GeoPoint', longitude: 180, latitude: -180}; - var out = transform.parseObjectToMongoObjectForCreate(null, {locations: [geoPoint, geoPoint]},{ - fields: {locations: {type: 'Array'}} - }); - expect(out.locations).toEqual([geoPoint, geoPoint]); - done(); + it('in array', (done) => { + var geoPoint = {__type: 'GeoPoint', longitude: 180, latitude: -180}; + var out = transform.parseObjectToMongoObjectForCreate(null, {locations: [geoPoint, geoPoint]},{ + fields: {locations: {type: 'Array'}} }); + expect(out.locations).toEqual([geoPoint, geoPoint]); + done(); + }); - it('in sub-object', (done) => { - var geoPoint = {__type: 'GeoPoint', longitude: 180, latitude: -180}; - var out = transform.parseObjectToMongoObjectForCreate(null, { locations: { start: geoPoint }},{ - fields: {locations: {type: 'Object'}} - }); - expect(out).toEqual({ locations: { start: geoPoint } }); - done(); + it('in sub-object', (done) => { + var geoPoint = {__type: 'GeoPoint', longitude: 180, latitude: -180}; + var out = transform.parseObjectToMongoObjectForCreate(null, { locations: { start: geoPoint }},{ + fields: {locations: {type: 'Object'}} }); + expect(out).toEqual({ locations: { start: geoPoint } }); + done(); }); -}); -describe('transformWhere', () => { it('objectId', (done) => { var out = transform.transformWhere(null, {objectId: 'foo'}); expect(out._id).toEqual('foo'); @@ -109,9 +104,7 @@ describe('transformWhere', () => { jequal(input.objectId, output._id); done(); }); -}); -describe('mongoObjectToParseObject', () => { it('built-in timestamps', (done) => { var input = {createdAt: new Date(), updatedAt: new Date()}; var output = transform.mongoObjectToParseObject(null, input, { fields: {} }); @@ -191,9 +184,6 @@ describe('mongoObjectToParseObject', () => { expect(dd(output, input)).toEqual(undefined); done(); }); -}); - -describe('transform schema key changes', () => { it('changes new pointer key', (done) => { var input = { diff --git a/spec/OAuth.spec.js b/spec/OAuth.spec.js index a8da7ed08b..60cb7d9189 100644 --- a/spec/OAuth.spec.js +++ b/spec/OAuth.spec.js @@ -4,7 +4,6 @@ var Config = require("../src/Config"); var defaultColumns = require('../src/Controllers/SchemaController').defaultColumns; describe('OAuth', function() { - it("Nonce should have right length", (done) => { jequal(OAuth.nonce().length, 30); done(); @@ -218,29 +217,27 @@ describe('OAuth', function() { return request.post(options, callback); } - it("should create user with REST API", (done) => { - + it_exclude_dbs(['postgres'])("should create user with REST API", done => { createOAuthUser((error, response, body) => { - expect(error).toBe(null); - var b = JSON.parse(body); - ok(b.sessionToken); - expect(b.objectId).not.toBeNull(); - expect(b.objectId).not.toBeUndefined(); - var sessionToken = b.sessionToken; - var q = new Parse.Query("_Session"); - q.equalTo('sessionToken', sessionToken); - q.first({useMasterKey: true}).then((res) => { - expect(res.get("installationId")).toEqual('yolo'); - done(); - }).fail((err) => { - fail('should not fail fetching the session'); - done(); - }) - }); - + expect(error).toBe(null); + var b = JSON.parse(body); + ok(b.sessionToken); + expect(b.objectId).not.toBeNull(); + expect(b.objectId).not.toBeUndefined(); + var sessionToken = b.sessionToken; + var q = new Parse.Query("_Session"); + q.equalTo('sessionToken', sessionToken); + q.first({useMasterKey: true}).then((res) => { + expect(res.get("installationId")).toEqual('yolo'); + done(); + }).fail((err) => { + fail('should not fail fetching the session'); + done(); + }) + }); }); - it("should only create a single user with REST API", (done) => { + it_exclude_dbs(['postgres'])("should only create a single user with REST API", (done) => { var objectId; createOAuthUser((error, response, body) => { expect(error).toBe(null); @@ -260,7 +257,7 @@ describe('OAuth', function() { }); }); - it("unlink and link with custom provider", (done) => { + it_exclude_dbs(['postgres'])("unlink and link with custom provider", (done) => { var provider = getMockMyOauthProvider(); Parse.User._registerAuthenticationProvider(provider); Parse.User._logInWith("myoauth", { diff --git a/spec/Parse.Push.spec.js b/spec/Parse.Push.spec.js index 71d84ab994..d0bad72835 100644 --- a/spec/Parse.Push.spec.js +++ b/spec/Parse.Push.spec.js @@ -3,7 +3,6 @@ let request = require('request'); describe('Parse.Push', () => { - var setup = function() { var pushAdapter = { send: function(body, installations) { @@ -51,7 +50,7 @@ describe('Parse.Push', () => { }); } - it('should properly send push', (done) => { + it_exclude_dbs(['postgres'])('should properly send push', (done) => { return setup().then(() => { return Parse.Push.send({ where: { @@ -72,7 +71,7 @@ describe('Parse.Push', () => { }); }); - it('should properly send push with lowercaseIncrement', (done) => { + it_exclude_dbs(['postgres'])('should properly send push with lowercaseIncrement', (done) => { return setup().then(() => { return Parse.Push.send({ where: { @@ -92,7 +91,7 @@ describe('Parse.Push', () => { }); }); - it('should not allow clients to query _PushStatus', done => { + it_exclude_dbs(['postgres'])('should not allow clients to query _PushStatus', done => { setup() .then(() => Parse.Push.send({ where: { @@ -117,7 +116,7 @@ describe('Parse.Push', () => { }); }); - it('should allow master key to query _PushStatus', done => { + it_exclude_dbs(['postgres'])('should allow master key to query _PushStatus', done => { setup() .then(() => Parse.Push.send({ where: { @@ -145,7 +144,7 @@ describe('Parse.Push', () => { }); }); - it('should throw error if missing push configuration', done => { + it_exclude_dbs(['postgres'])('should throw error if missing push configuration', done => { reconfigureServer({push: null}) .then(() => { return Parse.Push.send({ diff --git a/spec/ParseACL.spec.js b/spec/ParseACL.spec.js index 5d4f1cef2b..bbab57d526 100644 --- a/spec/ParseACL.spec.js +++ b/spec/ParseACL.spec.js @@ -155,7 +155,7 @@ describe('Parse.ACL', () => { }); }); - it("acl an object owned by one user and public delete", (done) => { + it_exclude_dbs(['postgres'])("acl an object owned by one user and public delete", (done) => { // Create an object owned by Alice. var user = new Parse.User(); user.set("username", "alice"); @@ -359,7 +359,7 @@ describe('Parse.ACL', () => { }); }); - it("acl making an object publicly readable and public get", (done) => { + it_exclude_dbs(['postgres'])("acl making an object publicly readable and public get", (done) => { // Create an object owned by Alice. var user = new Parse.User(); user.set("username", "alice"); @@ -407,7 +407,7 @@ describe('Parse.ACL', () => { }); }); - it("acl making an object publicly readable and public find", (done) => { + it_exclude_dbs(['postgres'])("acl making an object publicly readable and public find", (done) => { // Create an object owned by Alice. var user = new Parse.User(); user.set("username", "alice"); @@ -457,7 +457,7 @@ describe('Parse.ACL', () => { }); }); - it("acl making an object publicly readable and public update", (done) => { + it_exclude_dbs(['postgres'])("acl making an object publicly readable and public update", (done) => { // Create an object owned by Alice. var user = new Parse.User(); user.set("username", "alice"); @@ -504,7 +504,7 @@ describe('Parse.ACL', () => { }); }); - it("acl making an object publicly readable and public delete", (done) => { + it_exclude_dbs(['postgres'])("acl making an object publicly readable and public delete", (done) => { // Create an object owned by Alice. var user = new Parse.User(); user.set("username", "alice"); @@ -548,7 +548,7 @@ describe('Parse.ACL', () => { }); }); - it("acl making an object publicly writable and public get", (done) => { + it_exclude_dbs(['postgres'])("acl making an object publicly writable and public get", (done) => { // Create an object owned by Alice. var user = new Parse.User(); user.set("username", "alice"); @@ -595,7 +595,7 @@ describe('Parse.ACL', () => { }); }); - it("acl making an object publicly writable and public find", (done) => { + it_exclude_dbs(['postgres'])("acl making an object publicly writable and public find", (done) => { // Create an object owned by Alice. var user = new Parse.User(); user.set("username", "alice"); @@ -642,7 +642,7 @@ describe('Parse.ACL', () => { }); }); - it("acl making an object publicly writable and public update", (done) => { + it_exclude_dbs(['postgres'])("acl making an object publicly writable and public update", (done) => { // Create an object owned by Alice. var user = new Parse.User(); user.set("username", "alice"); @@ -688,7 +688,7 @@ describe('Parse.ACL', () => { }); }); - it("acl making an object publicly writable and public delete", (done) => { + it_exclude_dbs(['postgres'])("acl making an object publicly writable and public delete", (done) => { // Create an object owned by Alice. var user = new Parse.User(); user.set("username", "alice"); @@ -1051,7 +1051,7 @@ describe('Parse.ACL', () => { }); }); - it("acl sharing with another user and public delete", (done) => { + it_exclude_dbs(['postgres'])("acl sharing with another user and public delete", (done) => { // Sign in as Bob. Parse.User.signUp("bob", "pass", null, { success: function(bob) { @@ -1202,7 +1202,7 @@ describe('Parse.ACL', () => { }); }); - it('regression test #701', done => { + it_exclude_dbs(['postgres'])('regression test #701', done => { var anonUser = { authData: { anonymous: { @@ -1230,5 +1230,4 @@ describe('Parse.ACL', () => { rest.create(config, auth.nobody(config), '_User', anonUser) }) - }); diff --git a/spec/ParseAPI.spec.js b/spec/ParseAPI.spec.js index 1072a41ece..1693a86c6a 100644 --- a/spec/ParseAPI.spec.js +++ b/spec/ParseAPI.spec.js @@ -128,7 +128,7 @@ describe('miscellaneous', function() { .catch(done); }); - it('ensure that if people already have duplicate users, they can still sign up new users', done => { + it_exclude_dbs(['postgres'])('ensure that if people already have duplicate users, they can still sign up new users', done => { let config = new Config('test'); // Remove existing data to clear out unique index TestUtils.destroyAllDataPermanently() @@ -137,7 +137,8 @@ describe('miscellaneous', function() { .then(() => config.database.adapter.createObject('_User', userSchema, { objectId: 'y', username: 'u' }).catch(fail)) // Create a new server to try to recreate the unique indexes .then(reconfigureServer) - .catch(() => { + .catch(error => { + expect(error.code).toEqual(Parse.Error.DUPLICATE_VALUE); let user = new Parse.User(); user.setPassword('asdf'); user.setUsername('zxcv'); @@ -370,166 +371,164 @@ describe('miscellaneous', function() { }) }); - describe('beforeSave', () => { - it('object is set on create and update', done => { - let triggerTime = 0; - // Register a mock beforeSave hook - Parse.Cloud.beforeSave('GameScore', (req, res) => { - let object = req.object; - expect(object instanceof Parse.Object).toBeTruthy(); - expect(object.get('fooAgain')).toEqual('barAgain'); - if (triggerTime == 0) { - // Create - expect(object.get('foo')).toEqual('bar'); - // No objectId/createdAt/updatedAt - expect(object.id).toBeUndefined(); - expect(object.createdAt).toBeUndefined(); - expect(object.updatedAt).toBeUndefined(); - } else if (triggerTime == 1) { - // Update - expect(object.get('foo')).toEqual('baz'); - expect(object.id).not.toBeUndefined(); - expect(object.createdAt).not.toBeUndefined(); - expect(object.updatedAt).not.toBeUndefined(); - } else { - res.error(); - } - triggerTime++; - res.success(); - }); - - let obj = new Parse.Object('GameScore'); - obj.set('foo', 'bar'); - obj.set('fooAgain', 'barAgain'); - obj.save().then(() => { - // We only update foo - obj.set('foo', 'baz'); - return obj.save(); - }).then(() => { - // Make sure the checking has been triggered - expect(triggerTime).toBe(2); - done(); - }, error => { - fail(error); - done(); - }); + it('object is set on create and update', done => { + let triggerTime = 0; + // Register a mock beforeSave hook + Parse.Cloud.beforeSave('GameScore', (req, res) => { + let object = req.object; + expect(object instanceof Parse.Object).toBeTruthy(); + expect(object.get('fooAgain')).toEqual('barAgain'); + if (triggerTime == 0) { + // Create + expect(object.get('foo')).toEqual('bar'); + // No objectId/createdAt/updatedAt + expect(object.id).toBeUndefined(); + expect(object.createdAt).toBeUndefined(); + expect(object.updatedAt).toBeUndefined(); + } else if (triggerTime == 1) { + // Update + expect(object.get('foo')).toEqual('baz'); + expect(object.id).not.toBeUndefined(); + expect(object.createdAt).not.toBeUndefined(); + expect(object.updatedAt).not.toBeUndefined(); + } else { + res.error(); + } + triggerTime++; + res.success(); }); - it('works when object is passed to success', done => { - let triggerTime = 0; - // Register a mock beforeSave hook - Parse.Cloud.beforeSave('GameScore', (req, res) => { - let object = req.object; - object.set('foo', 'bar'); - triggerTime++; - res.success(object); - }); - let obj = new Parse.Object('GameScore'); + let obj = new Parse.Object('GameScore'); + obj.set('foo', 'bar'); + obj.set('fooAgain', 'barAgain'); + obj.save().then(() => { + // We only update foo obj.set('foo', 'baz'); - obj.save().then(() => { - expect(triggerTime).toBe(1); - expect(obj.get('foo')).toEqual('bar'); - done(); - }, error => { - fail(error); - done(); - }); + return obj.save(); + }).then(() => { + // Make sure the checking has been triggered + expect(triggerTime).toBe(2); + done(); + }, error => { + fail(error); + done(); + }); + }); + it('works when object is passed to success', done => { + let triggerTime = 0; + // Register a mock beforeSave hook + Parse.Cloud.beforeSave('GameScore', (req, res) => { + let object = req.object; + object.set('foo', 'bar'); + triggerTime++; + res.success(object); }); - it('original object is set on update', done => { - let triggerTime = 0; - // Register a mock beforeSave hook - Parse.Cloud.beforeSave('GameScore', (req, res) => { - let object = req.object; - expect(object instanceof Parse.Object).toBeTruthy(); - expect(object.get('fooAgain')).toEqual('barAgain'); - let originalObject = req.original; - if (triggerTime == 0) { - // No id/createdAt/updatedAt - expect(object.id).toBeUndefined(); - expect(object.createdAt).toBeUndefined(); - expect(object.updatedAt).toBeUndefined(); - // Create - expect(object.get('foo')).toEqual('bar'); - // Check the originalObject is undefined - expect(originalObject).toBeUndefined(); - } else if (triggerTime == 1) { - // Update - expect(object.id).not.toBeUndefined(); - expect(object.createdAt).not.toBeUndefined(); - expect(object.updatedAt).not.toBeUndefined(); - expect(object.get('foo')).toEqual('baz'); - // Check the originalObject - expect(originalObject instanceof Parse.Object).toBeTruthy(); - expect(originalObject.get('fooAgain')).toEqual('barAgain'); - expect(originalObject.id).not.toBeUndefined(); - expect(originalObject.createdAt).not.toBeUndefined(); - expect(originalObject.updatedAt).not.toBeUndefined(); - expect(originalObject.get('foo')).toEqual('bar'); - } else { - res.error(); - } - triggerTime++; - res.success(); - }); + let obj = new Parse.Object('GameScore'); + obj.set('foo', 'baz'); + obj.save().then(() => { + expect(triggerTime).toBe(1); + expect(obj.get('foo')).toEqual('bar'); + done(); + }, error => { + fail(error); + done(); + }); + }); - let obj = new Parse.Object('GameScore'); - obj.set('foo', 'bar'); - obj.set('fooAgain', 'barAgain'); - obj.save().then(() => { - // We only update foo - obj.set('foo', 'baz'); - return obj.save(); - }).then(() => { - // Make sure the checking has been triggered - expect(triggerTime).toBe(2); - done(); - }, error => { - fail(error); - done(); - }); + it('original object is set on update', done => { + let triggerTime = 0; + // Register a mock beforeSave hook + Parse.Cloud.beforeSave('GameScore', (req, res) => { + let object = req.object; + expect(object instanceof Parse.Object).toBeTruthy(); + expect(object.get('fooAgain')).toEqual('barAgain'); + let originalObject = req.original; + if (triggerTime == 0) { + // No id/createdAt/updatedAt + expect(object.id).toBeUndefined(); + expect(object.createdAt).toBeUndefined(); + expect(object.updatedAt).toBeUndefined(); + // Create + expect(object.get('foo')).toEqual('bar'); + // Check the originalObject is undefined + expect(originalObject).toBeUndefined(); + } else if (triggerTime == 1) { + // Update + expect(object.id).not.toBeUndefined(); + expect(object.createdAt).not.toBeUndefined(); + expect(object.updatedAt).not.toBeUndefined(); + expect(object.get('foo')).toEqual('baz'); + // Check the originalObject + expect(originalObject instanceof Parse.Object).toBeTruthy(); + expect(originalObject.get('fooAgain')).toEqual('barAgain'); + expect(originalObject.id).not.toBeUndefined(); + expect(originalObject.createdAt).not.toBeUndefined(); + expect(originalObject.updatedAt).not.toBeUndefined(); + expect(originalObject.get('foo')).toEqual('bar'); + } else { + res.error(); + } + triggerTime++; + res.success(); + }); + + let obj = new Parse.Object('GameScore'); + obj.set('foo', 'bar'); + obj.set('fooAgain', 'barAgain'); + obj.save().then(() => { + // We only update foo + obj.set('foo', 'baz'); + return obj.save(); + }).then(() => { + // Make sure the checking has been triggered + expect(triggerTime).toBe(2); + done(); + }, error => { + fail(error); + done(); }); + }); - it('pointer mutation properly saves object', done => { - let className = 'GameScore'; + it('pointer mutation properly saves object', done => { + let className = 'GameScore'; - Parse.Cloud.beforeSave(className, (req, res) => { - let object = req.object; - expect(object instanceof Parse.Object).toBeTruthy(); + Parse.Cloud.beforeSave(className, (req, res) => { + let object = req.object; + expect(object instanceof Parse.Object).toBeTruthy(); - let child = object.get('child'); - expect(child instanceof Parse.Object).toBeTruthy(); - child.set('a', 'b'); - child.save().then(() => { - res.success(); - }); + let child = object.get('child'); + expect(child instanceof Parse.Object).toBeTruthy(); + child.set('a', 'b'); + child.save().then(() => { + res.success(); }); + }); - let obj = new Parse.Object(className); - obj.set('foo', 'bar'); + let obj = new Parse.Object(className); + obj.set('foo', 'bar'); - let child = new Parse.Object('Child'); - child.save().then(() => { - obj.set('child', child); - return obj.save(); - }).then(() => { - let query = new Parse.Query(className); - query.include('child'); - return query.get(obj.id).then(objAgain => { - expect(objAgain.get('foo')).toEqual('bar'); - - let childAgain = objAgain.get('child'); - expect(childAgain instanceof Parse.Object).toBeTruthy(); - expect(childAgain.get('a')).toEqual('b'); - - return Promise.resolve(); - }); - }).then(() => { - done(); - }, error => { - fail(error); - done(); + let child = new Parse.Object('Child'); + child.save().then(() => { + obj.set('child', child); + return obj.save(); + }).then(() => { + let query = new Parse.Query(className); + query.include('child'); + return query.get(obj.id).then(objAgain => { + expect(objAgain.get('foo')).toEqual('bar'); + + let childAgain = objAgain.get('child'); + expect(childAgain instanceof Parse.Object).toBeTruthy(); + expect(childAgain.get('a')).toEqual('b'); + + return Promise.resolve(); }); + }).then(() => { + done(); + }, error => { + fail(error); + done(); }); }); @@ -741,7 +740,7 @@ describe('miscellaneous', function() { }); }); - it('beforeSave receives ACL', done => { + it_exclude_dbs(['postgres'])('beforeSave receives ACL', done => { let triggerTime = 0; // Register a mock beforeSave hook Parse.Cloud.beforeSave('GameScore', function(req, res) { @@ -781,7 +780,7 @@ describe('miscellaneous', function() { }); }); - it('afterSave receives ACL', done => { + it_exclude_dbs(['postgres'])('afterSave receives ACL', done => { let triggerTime = 0; // Register a mock beforeSave hook Parse.Cloud.afterSave('GameScore', function(req, res) { @@ -821,7 +820,7 @@ describe('miscellaneous', function() { }); }); - it('should return the updated fields on PUT', (done) => { + it_exclude_dbs(['postgres'])('should return the updated fields on PUT', done => { let obj = new Parse.Object('GameScore'); obj.save({a:'hello', c: 1, d: ['1'], e:['1'], f:['1','2']}).then(( ) => { var headers = { @@ -1174,7 +1173,7 @@ describe('miscellaneous', function() { }); }); - it('gets relation fields', (done) => { + it_exclude_dbs(['postgres'])('gets relation fields', (done) => { let object = new Parse.Object('AnObject'); let relatedObject = new Parse.Object('RelatedObject'); Parse.Object.saveAll([object, relatedObject]).then(() => { @@ -1287,7 +1286,7 @@ describe('miscellaneous', function() { }); }); - it('bans interior keys containing . or $', done => { + it_exclude_dbs(['postgres'])('bans interior keys containing . or $', done => { new Parse.Object('Obj').save({innerObj: {'key with a $': 'fails'}}) .catch(error => { expect(error.code).toEqual(Parse.Error.INVALID_NESTED_KEY); @@ -1307,7 +1306,7 @@ describe('miscellaneous', function() { }) }); - it('does not change inner object keys named _auth_data_something', done => { + it_exclude_dbs(['postgres'])('does not change inner object keys named _auth_data_something', done => { new Parse.Object('O').save({ innerObj: {_auth_data_facebook: 7}}) .then(object => new Parse.Query('O').get(object.id)) .then(object => { @@ -1334,7 +1333,7 @@ describe('miscellaneous', function() { }); }); - it('does not change inner objects if the key has the same name as a geopoint field on the class, and the value is an array of length 2, or if the key has the same name as a file field on the class, and the value is a string', done => { + it_exclude_dbs(['postgres'])('does not change inner objects if the key has the same name as a geopoint field on the class, and the value is an array of length 2, or if the key has the same name as a file field on the class, and the value is a string', done => { let file = new Parse.File('myfile.txt', { base64: 'eAo=' }); file.save() .then(f => { @@ -1357,7 +1356,7 @@ describe('miscellaneous', function() { }); }); - it('purge all objects in class', (done) => { + it_exclude_dbs(['postgres'])('purge all objects in class', (done) => { let object = new Parse.Object('TestObject'); object.set('foo', 'bar'); let object2 = new Parse.Object('TestObject'); @@ -1407,7 +1406,7 @@ describe('miscellaneous', function() { }); }); - it('purge all objects in _Role also purge cache', (done) => { + it_exclude_dbs(['postgres'])('purge all objects in _Role also purge cache', (done) => { let headers = { 'Content-Type': 'application/json', 'X-Parse-Application-Id': 'test', diff --git a/spec/ParseCloudCodePublisher.spec.js b/spec/ParseCloudCodePublisher.spec.js index c018af05f2..c1fe03649d 100644 --- a/spec/ParseCloudCodePublisher.spec.js +++ b/spec/ParseCloudCodePublisher.spec.js @@ -2,7 +2,6 @@ var ParseCloudCodePublisher = require('../src/LiveQuery/ParseCloudCodePublisher' var Parse = require('parse/node'); describe('ParseCloudCodePublisher', function() { - beforeEach(function(done) { // Mock ParsePubSub var mockParsePubSub = { diff --git a/spec/ParseFile.spec.js b/spec/ParseFile.spec.js index 0e1db6a3c7..90731c0941 100644 --- a/spec/ParseFile.spec.js +++ b/spec/ParseFile.spec.js @@ -210,7 +210,7 @@ describe('Parse.File testing', () => { })); }); - it("save file in object", done => { + it_exclude_dbs(['postgres'])("save file in object", done => { var file = new Parse.File("hello.txt", data, "text/plain"); ok(!file.url()); file.save(expectSuccess({ @@ -237,7 +237,7 @@ describe('Parse.File testing', () => { })); }); - it("save file in object with escaped characters in filename", done => { + it_exclude_dbs(['postgres'])("save file in object with escaped characters in filename", done => { var file = new Parse.File("hello . txt", data, "text/plain"); ok(!file.url()); file.save(expectSuccess({ @@ -265,7 +265,7 @@ describe('Parse.File testing', () => { })); }); - it("autosave file in object", done => { + it_exclude_dbs(['postgres'])("autosave file in object", done => { var file = new Parse.File("hello.txt", data, "text/plain"); ok(!file.url()); var object = new Parse.Object("TestObject"); @@ -287,7 +287,7 @@ describe('Parse.File testing', () => { })); }); - it("autosave file in object in object", done => { + it_exclude_dbs(['postgres'])("autosave file in object in object", done => { var file = new Parse.File("hello.txt", data, "text/plain"); ok(!file.url()); @@ -355,7 +355,7 @@ describe('Parse.File testing', () => { }); }); - it("file toJSON testing", done => { + it_exclude_dbs(['postgres'])("file toJSON testing", done => { var file = new Parse.File("hello.txt", data, "text/plain"); ok(!file.url()); var object = new Parse.Object("TestObject"); @@ -491,7 +491,7 @@ describe('Parse.File testing', () => { }); }); - it('creates correct url for old files hosted on files.parsetfss.com', done => { + it_exclude_dbs(['postgres'])('creates correct url for old files hosted on files.parsetfss.com', done => { var file = { __type: 'File', url: 'http://irrelevant.elephant/', @@ -511,7 +511,7 @@ describe('Parse.File testing', () => { }); }); - it('creates correct url for old files hosted on files.parse.com', done => { + it_exclude_dbs(['postgres'])('creates correct url for old files hosted on files.parse.com', done => { var file = { __type: 'File', url: 'http://irrelevant.elephant/', @@ -531,7 +531,7 @@ describe('Parse.File testing', () => { }); }); - it('supports files in objects without urls', done => { + it_exclude_dbs(['postgres'])('supports files in objects without urls', done => { var file = { __type: 'File', name: '123.txt' diff --git a/spec/ParseGeoPoint.spec.js b/spec/ParseGeoPoint.spec.js index c24ae1ac1f..54d193a3f2 100644 --- a/spec/ParseGeoPoint.spec.js +++ b/spec/ParseGeoPoint.spec.js @@ -4,7 +4,7 @@ var TestObject = Parse.Object.extend('TestObject'); describe('Parse.GeoPoint testing', () => { - it('geo point roundtrip', (done) => { + it_exclude_dbs(['postgres'])('geo point roundtrip', (done) => { var point = new Parse.GeoPoint(44.0, -11.0); var obj = new TestObject(); obj.set('location', point); @@ -26,7 +26,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo point exception two fields', (done) => { + it_exclude_dbs(['postgres'])('geo point exception two fields', (done) => { var point = new Parse.GeoPoint(20, 20); var obj = new TestObject(); obj.set('locationOne', point); @@ -39,7 +39,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo line', (done) => { + it_exclude_dbs(['postgres'])('geo line', (done) => { var line = []; for (var i = 0; i < 10; ++i) { var obj = new TestObject(); @@ -67,7 +67,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo max distance large', (done) => { + it_exclude_dbs(['postgres'])('geo max distance large', (done) => { var objects = []; [0, 1, 2].map(function(i) { var obj = new TestObject(); @@ -90,7 +90,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo max distance medium', (done) => { + it_exclude_dbs(['postgres'])('geo max distance medium', (done) => { var objects = []; [0, 1, 2].map(function(i) { var obj = new TestObject(); @@ -114,7 +114,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo max distance small', (done) => { + it_exclude_dbs(['postgres'])('geo max distance small', (done) => { var objects = []; [0, 1, 2].map(function(i) { var obj = new TestObject(); @@ -153,7 +153,7 @@ describe('Parse.GeoPoint testing', () => { Parse.Object.saveAll([sacramento, sf, honolulu], callback); }; - it('geo max distance in km everywhere', (done) => { + it_exclude_dbs(['postgres'])('geo max distance in km everywhere', (done) => { makeSomeGeoPoints(function(list) { var sfo = new Parse.GeoPoint(37.6189722, -122.3748889); var query = new Parse.Query(TestObject); @@ -167,7 +167,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo max distance in km california', (done) => { + it_exclude_dbs(['postgres'])('geo max distance in km california', (done) => { makeSomeGeoPoints(function(list) { var sfo = new Parse.GeoPoint(37.6189722, -122.3748889); var query = new Parse.Query(TestObject); @@ -183,7 +183,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo max distance in km bay area', (done) => { + it_exclude_dbs(['postgres'])('geo max distance in km bay area', (done) => { makeSomeGeoPoints(function(list) { var sfo = new Parse.GeoPoint(37.6189722, -122.3748889); var query = new Parse.Query(TestObject); @@ -198,7 +198,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo max distance in km mid peninsula', (done) => { + it_exclude_dbs(['postgres'])('geo max distance in km mid peninsula', (done) => { makeSomeGeoPoints(function(list) { var sfo = new Parse.GeoPoint(37.6189722, -122.3748889); var query = new Parse.Query(TestObject); @@ -212,7 +212,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo max distance in miles everywhere', (done) => { + it_exclude_dbs(['postgres'])('geo max distance in miles everywhere', (done) => { makeSomeGeoPoints(function(list) { var sfo = new Parse.GeoPoint(37.6189722, -122.3748889); var query = new Parse.Query(TestObject); @@ -226,7 +226,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo max distance in miles california', (done) => { + it_exclude_dbs(['postgres'])('geo max distance in miles california', (done) => { makeSomeGeoPoints(function(list) { var sfo = new Parse.GeoPoint(37.6189722, -122.3748889); var query = new Parse.Query(TestObject); @@ -242,7 +242,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo max distance in miles bay area', (done) => { + it_exclude_dbs(['postgres'])('geo max distance in miles bay area', (done) => { makeSomeGeoPoints(function(list) { var sfo = new Parse.GeoPoint(37.6189722, -122.3748889); var query = new Parse.Query(TestObject); @@ -257,7 +257,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('geo max distance in miles mid peninsula', (done) => { + it_exclude_dbs(['postgres'])('geo max distance in miles mid peninsula', (done) => { makeSomeGeoPoints(function(list) { var sfo = new Parse.GeoPoint(37.6189722, -122.3748889); var query = new Parse.Query(TestObject); @@ -271,7 +271,7 @@ describe('Parse.GeoPoint testing', () => { }); }); - it('works with geobox queries', (done) => { + it_exclude_dbs(['postgres'])('works with geobox queries', (done) => { var inSF = new Parse.GeoPoint(37.75, -122.4); var southwestOfSF = new Parse.GeoPoint(37.708813, -122.526398); var northeastOfSF = new Parse.GeoPoint(37.822802, -122.373962); diff --git a/spec/ParseGlobalConfig.spec.js b/spec/ParseGlobalConfig.spec.js index 504e26990d..7f57cb7ab5 100644 --- a/spec/ParseGlobalConfig.spec.js +++ b/spec/ParseGlobalConfig.spec.js @@ -15,7 +15,7 @@ describe('a GlobalConfig', () => { ).then(done); }); - it('can be retrieved', (done) => { + it_exclude_dbs(['postgres'])('can be retrieved', (done) => { request.get({ url : 'http://localhost:8378/1/config', json : true, @@ -30,7 +30,7 @@ describe('a GlobalConfig', () => { }); }); - it('can be updated when a master key exists', (done) => { + it_exclude_dbs(['postgres'])('can be updated when a master key exists', (done) => { request.put({ url : 'http://localhost:8378/1/config', json : true, @@ -46,7 +46,7 @@ describe('a GlobalConfig', () => { }); }); - it('properly handles delete op', (done) => { + it_exclude_dbs(['postgres'])('properly handles delete op', (done) => { request.put({ url : 'http://localhost:8378/1/config', json : true, @@ -75,7 +75,7 @@ describe('a GlobalConfig', () => { }); }); - it('fail to update if master key is missing', (done) => { + it_exclude_dbs(['postgres'])('fail to update if master key is missing', (done) => { request.put({ url : 'http://localhost:8378/1/config', json : true, @@ -91,7 +91,7 @@ describe('a GlobalConfig', () => { }); }); - it('failed getting config when it is missing', (done) => { + it_exclude_dbs(['postgres'])('failed getting config when it is missing', (done) => { let config = new Config('test'); config.database.adapter.deleteObjectsByQuery( '_GlobalConfig', diff --git a/spec/ParseHooks.spec.js b/spec/ParseHooks.spec.js index 75b5857ea7..7bb4630b33 100644 --- a/spec/ParseHooks.spec.js +++ b/spec/ParseHooks.spec.js @@ -17,8 +17,7 @@ app.use(bodyParser.json({ 'type': '*/*' })) app.listen(12345); describe('Hooks', () => { - - it("should have no hooks registered", (done) => { + it_exclude_dbs(['postgres'])("should have no hooks registered", (done) => { Parse.Hooks.getFunctions().then((res) => { expect(res.constructor).toBe(Array.prototype.constructor); done(); @@ -28,7 +27,7 @@ describe('Hooks', () => { }); }); - it("should have no triggers registered", (done) => { + it_exclude_dbs(['postgres'])("should have no triggers registered", (done) => { Parse.Hooks.getTriggers().then( (res) => { expect(res.constructor).toBe(Array.prototype.constructor); done(); @@ -38,7 +37,7 @@ describe('Hooks', () => { }); }); - it("should CRUD a function registration", (done) => { + it_exclude_dbs(['postgres'])("should CRUD a function registration", (done) => { // Create Parse.Hooks.createFunction("My-Test-Function", "http://someurl") .then(response => { @@ -79,7 +78,7 @@ describe('Hooks', () => { }) }); - it("should CRUD a trigger registration", (done) => { + it_exclude_dbs(['postgres'])("should CRUD a trigger registration", (done) => { // Create Parse.Hooks.createTrigger("MyClass","beforeDelete", "http://someurl").then((res) => { expect(res.className).toBe("MyClass"); @@ -141,7 +140,7 @@ describe('Hooks', () => { }) }); - it("should fail trying to create two times the same function", (done) => { + it_exclude_dbs(['postgres'])("should fail trying to create two times the same function", (done) => { Parse.Hooks.createFunction("my_new_function", "http://url.com").then( () => { return Parse.Hooks.createFunction("my_new_function", "http://url.com") }, () => { @@ -162,7 +161,7 @@ describe('Hooks', () => { }) }); - it("should fail trying to create two times the same trigger", (done) => { + it_exclude_dbs(['postgres'])("should fail trying to create two times the same trigger", (done) => { Parse.Hooks.createTrigger("MyClass", "beforeSave", "http://url.com").then( () => { return Parse.Hooks.createTrigger("MyClass", "beforeSave", "http://url.com") }, () => { @@ -181,7 +180,7 @@ describe('Hooks', () => { }) }); - it("should fail trying to update a function that don't exist", (done) => { + it_exclude_dbs(['postgres'])("should fail trying to update a function that don't exist", (done) => { Parse.Hooks.updateFunction("A_COOL_FUNCTION", "http://url.com").then( () => { fail("Should not succeed") }, (err) => { @@ -198,7 +197,7 @@ describe('Hooks', () => { }); }); - it("should fail trying to update a trigger that don't exist", (done) => { + it_exclude_dbs(['postgres'])("should fail trying to update a trigger that don't exist", (done) => { Parse.Hooks.updateTrigger("AClassName","beforeSave", "http://url.com").then( () => { fail("Should not succeed") }, (err) => { @@ -242,7 +241,7 @@ describe('Hooks', () => { }); - it("should create hooks and properly preload them", (done) => { + it_exclude_dbs(['postgres'])("should create hooks and properly preload them", (done) => { var promises = []; for (var i = 0; i<5; i++) { @@ -277,7 +276,7 @@ describe('Hooks', () => { }) }); - it("should run the function on the test server", (done) => { + it_exclude_dbs(['postgres'])("should run the function on the test server", (done) => { app.post("/SomeFunction", function(req, res) { res.json({success:"OK!"}); @@ -299,7 +298,7 @@ describe('Hooks', () => { }); }); - it("should run the function on the test server", (done) => { + it_exclude_dbs(['postgres'])("should run the function on the test server", (done) => { app.post("/SomeFunctionError", function(req, res) { res.json({error: {code: 1337, error: "hacking that one!"}}); @@ -322,7 +321,7 @@ describe('Hooks', () => { }); }); - it("should provide X-Parse-Webhook-Key when defined", (done) => { + it_exclude_dbs(['postgres'])("should provide X-Parse-Webhook-Key when defined", (done) => { app.post("/ExpectingKey", function(req, res) { if (req.get('X-Parse-Webhook-Key') === 'hook') { res.json({success: "correct key provided"}); @@ -347,7 +346,7 @@ describe('Hooks', () => { }); }); - it("should not pass X-Parse-Webhook-Key if not provided", (done) => { + it_exclude_dbs(['postgres'])("should not pass X-Parse-Webhook-Key if not provided", (done) => { reconfigureServer({ webhookKey: undefined }) .then(() => { app.post("/ExpectingKeyAlso", function(req, res) { @@ -376,7 +375,7 @@ describe('Hooks', () => { }); - it("should run the beforeSave hook on the test server", (done) => { + it_exclude_dbs(['postgres'])("should run the beforeSave hook on the test server", (done) => { var triggerCount = 0; app.post("/BeforeSaveSome", function(req, res) { triggerCount++; @@ -403,7 +402,7 @@ describe('Hooks', () => { }); }); - it("beforeSave hooks should correctly handle responses containing entire object", (done) => { + it_exclude_dbs(['postgres'])("beforeSave hooks should correctly handle responses containing entire object", (done) => { app.post("/BeforeSaveSome2", function(req, res) { var object = Parse.Object.fromJSON(req.body.object); object.set('hello', "world"); @@ -423,7 +422,7 @@ describe('Hooks', () => { }); }); - it("should run the afterSave hook on the test server", (done) => { + it_exclude_dbs(['postgres'])("should run the afterSave hook on the test server", (done) => { var triggerCount = 0; var newObjectId; app.post("/AfterSaveSome", function(req, res) { diff --git a/spec/ParseInstallation.spec.js b/spec/ParseInstallation.spec.js index 7663e9a48f..8681179adb 100644 --- a/spec/ParseInstallation.spec.js +++ b/spec/ParseInstallation.spec.js @@ -16,7 +16,7 @@ let defaultColumns = require('../src/Controllers/SchemaController').defaultColum const installationSchema = { fields: Object.assign({}, defaultColumns._Default, defaultColumns._Installation) }; describe('Installations', () => { - it('creates an android installation with ids', (done) => { + it_exclude_dbs(['postgres'])('creates an android installation with ids', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var device = 'android'; var input = { @@ -34,7 +34,7 @@ describe('Installations', () => { }).catch((error) => { console.log(error); }); }); - it('creates an ios installation with ids', (done) => { + it_exclude_dbs(['postgres'])('creates an ios installation with ids', (done) => { var t = '11433856eed2f1285fb3aa11136718c1198ed5647875096952c66bf8cb976306'; var device = 'ios'; var input = { @@ -52,7 +52,7 @@ describe('Installations', () => { }).catch((error) => { console.log(error); }); }); - it('creates an embedded installation with ids', (done) => { + it_exclude_dbs(['postgres'])('creates an embedded installation with ids', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var device = 'embedded'; var input = { @@ -70,7 +70,7 @@ describe('Installations', () => { }).catch((error) => { console.log(error); }); }); - it('creates an android installation with all fields', (done) => { + it_exclude_dbs(['postgres'])('creates an android installation with all fields', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var device = 'android'; var input = { @@ -93,7 +93,7 @@ describe('Installations', () => { }).catch((error) => { console.log(error); }); }); - it('creates an ios installation with all fields', (done) => { + it_exclude_dbs(['postgres'])('creates an ios installation with all fields', (done) => { var t = '11433856eed2f1285fb3aa11136718c1198ed5647875096952c66bf8cb976306'; var device = 'ios'; var input = { @@ -137,7 +137,7 @@ describe('Installations', () => { }); }); - it('should properly queying installations with masterKey', (done) => { + it_exclude_dbs(['postgres'])('should properly queying installations with masterKey', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var device = 'android'; var input = { @@ -191,7 +191,7 @@ describe('Installations', () => { }); }); - it('creates an object with custom fields', (done) => { + it_exclude_dbs(['postgres'])('creates an object with custom fields', (done) => { var t = '11433856eed2f1285fb3aa11136718c1198ed5647875096952c66bf8cb976306'; var input = { 'deviceToken': t, @@ -211,7 +211,7 @@ describe('Installations', () => { // Note: did not port test 'TestObjectIDForIdentifiers' - it('merging when installationId already exists', (done) => { + it_exclude_dbs(['postgres'])('merging when installationId already exists', (done) => { var installId1 = '12345678-abcd-abcd-abcd-123456789abc'; var t = '11433856eed2f1285fb3aa11136718c1198ed5647875096952c66bf8cb976306'; var installId2 = '12345678-abcd-abcd-abcd-123456789abd'; @@ -244,7 +244,7 @@ describe('Installations', () => { }).catch((error) => { console.log(error); }); }); - it('merging when two objects both only have one id', (done) => { + it_exclude_dbs(['postgres'])('merging when two objects both only have one id', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var t = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; var input1 = { @@ -287,7 +287,7 @@ describe('Installations', () => { }).catch((error) => { console.log(error); }); }); - notWorking('creating multiple devices with same device token works', (done) => { + xit('creating multiple devices with same device token works', (done) => { var installId1 = '11111111-abcd-abcd-abcd-123456789abc'; var installId2 = '22222222-abcd-abcd-abcd-123456789abc'; var installId3 = '33333333-abcd-abcd-abcd-123456789abc'; @@ -318,7 +318,7 @@ describe('Installations', () => { }).catch((error) => { console.log(error); }); }); - it('updating with new channels', (done) => { + it_exclude_dbs(['postgres'])('updating with new channels', (done) => { var input = { installationId: '12345678-abcd-abcd-abcd-123456789abc', deviceType: 'android', @@ -347,7 +347,7 @@ describe('Installations', () => { }); }); - it('update android fails with new installation id', (done) => { + it_exclude_dbs(['postgres'])('update android fails with new installation id', (done) => { var installId1 = '12345678-abcd-abcd-abcd-123456789abc'; var installId2 = '87654321-abcd-abcd-abcd-123456789abc'; var input = { @@ -370,7 +370,7 @@ describe('Installations', () => { }); }); - it('update ios fails with new deviceToken and no installationId', (done) => { + it_exclude_dbs(['postgres'])('update ios fails with new deviceToken and no installationId', (done) => { var a = '11433856eed2f1285fb3aa11136718c1198ed5647875096952c66bf8cb976306'; var b = '91433856eed2f1285fb3aa11136718c1198ed5647875096952c66bf8cb976306'; var input = { @@ -392,7 +392,7 @@ describe('Installations', () => { }); }); - it('update ios updates device token', (done) => { + it_exclude_dbs(['postgres'])('update ios updates device token', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var t = '11433856eed2f1285fb3aa11136718c1198ed5647875096952c66bf8cb976306'; var u = '91433856eed2f1285fb3aa11136718c1198ed5647875096952c66bf8cb976306'; @@ -421,7 +421,7 @@ describe('Installations', () => { }); }); - it('update fails to change deviceType', (done) => { + it_exclude_dbs(['postgres'])('update fails to change deviceType', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var input = { 'installationId': installId, @@ -445,7 +445,7 @@ describe('Installations', () => { }); }); - it('update android with custom field', (done) => { + it_exclude_dbs(['postgres'])('update android with custom field', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var input = { 'installationId': installId, @@ -469,7 +469,7 @@ describe('Installations', () => { }); }); - it('update android device token with duplicate device token', (done) => { + it_exclude_dbs(['postgres'])('update android device token with duplicate device token', (done) => { var installId1 = '11111111-abcd-abcd-abcd-123456789abc'; var installId2 = '22222222-abcd-abcd-abcd-123456789abc'; var t = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; @@ -511,7 +511,7 @@ describe('Installations', () => { }).catch((error) => { console.log(error); }); }); - it('update ios device token with duplicate device token', (done) => { + it_exclude_dbs(['postgres'])('update ios device token with duplicate device token', (done) => { var installId1 = '11111111-abcd-abcd-abcd-123456789abc'; var installId2 = '22222222-abcd-abcd-abcd-123456789abc'; var t = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; @@ -554,7 +554,7 @@ describe('Installations', () => { }).catch((error) => { console.log(error); }); }); - notWorking('update ios device token with duplicate token different app', (done) => { + xit('update ios device token with duplicate token different app', (done) => { var installId1 = '11111111-abcd-abcd-abcd-123456789abc'; var installId2 = '22222222-abcd-abcd-abcd-123456789abc'; var t = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; @@ -579,7 +579,7 @@ describe('Installations', () => { }); }); - it('update ios token and channels', (done) => { + it_exclude_dbs(['postgres'])('update ios token and channels', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var t = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; var input = { @@ -606,7 +606,7 @@ describe('Installations', () => { }); }); - it('update ios linking two existing objects', (done) => { + it_exclude_dbs(['postgres'])('update ios linking two existing objects', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var t = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; var input = { @@ -641,7 +641,7 @@ describe('Installations', () => { }); }); - it('update is linking two existing objects w/ increment', (done) => { + it_exclude_dbs(['postgres'])('update is linking two existing objects w/ increment', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var t = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; var input = { @@ -681,7 +681,7 @@ describe('Installations', () => { }); }); - it('update is linking two existing with installation id', (done) => { + it_exclude_dbs(['postgres'])('update is linking two existing with installation id', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var t = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; var input = { @@ -721,7 +721,7 @@ describe('Installations', () => { }).catch((error) => { console.log(error); }); }); - it('update is linking two existing with installation id w/ op', (done) => { + it_exclude_dbs(['postgres'])('update is linking two existing with installation id w/ op', (done) => { var installId = '12345678-abcd-abcd-abcd-123456789abc'; var t = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; var input = { @@ -766,7 +766,7 @@ describe('Installations', () => { }).catch((error) => { console.log(error); }); }); - it('ios merge existing same token no installation id', (done) => { + it_exclude_dbs(['postgres'])('ios merge existing same token no installation id', (done) => { // Test creating installation when there is an existing object with the // same device token but no installation ID. This is possible when // developers import device tokens from another push provider; the import diff --git a/spec/ParseLiveQueryServer.spec.js b/spec/ParseLiveQueryServer.spec.js index b672fb30b2..d99d7e34d9 100644 --- a/spec/ParseLiveQueryServer.spec.js +++ b/spec/ParseLiveQueryServer.spec.js @@ -7,7 +7,6 @@ var testUserId = 'userId'; var testClassName = 'TestObject'; describe('ParseLiveQueryServer', function() { - beforeEach(function(done) { // Mock ParseWebSocketServer var mockParseWebSocketServer = jasmine.createSpy('ParseWebSocketServer'); diff --git a/spec/ParseObject.spec.js b/spec/ParseObject.spec.js index 7db455207a..81ae2c3844 100644 --- a/spec/ParseObject.spec.js +++ b/spec/ParseObject.spec.js @@ -49,7 +49,7 @@ describe('Parse.Object testing', () => { }); }); - it("save cycle", function(done) { + it_exclude_dbs(['postgres'])("save cycle", function(done) { var a = new Parse.Object("TestObject"); var b = new Parse.Object("TestObject"); a.set("b", b); @@ -117,7 +117,7 @@ describe('Parse.Object testing', () => { }); }); - it("relational fields", function(done) { + it_exclude_dbs(['postgres'])("relational fields", function(done) { var item = new Item(); item.set("property", "x"); var container = new Container(); @@ -205,7 +205,7 @@ describe('Parse.Object testing', () => { }); }); - it("createdAt doesn't change", function(done) { + it_exclude_dbs(['postgres'])("createdAt doesn't change", function(done) { var object = new TestObject({ foo: "bar" }); object.save(null, { success: function() { @@ -268,7 +268,7 @@ describe('Parse.Object testing', () => { }); }); - it("can set null", function(done) { + it_exclude_dbs(['postgres'])("can set null", function(done) { var obj = new Parse.Object("TestObject"); obj.set("foo", null); obj.save(null, { @@ -365,7 +365,7 @@ describe('Parse.Object testing', () => { }).then(fail, err => next(0)); }); - it("simple field deletion", function(done) { + it_exclude_dbs(['postgres'])("simple field deletion", function(done) { var simple = new Parse.Object("SimpleObject"); simple.save({ foo: "bar" @@ -439,7 +439,7 @@ describe('Parse.Object testing', () => { }); }); - it("relation deletion", function(done) { + it_exclude_dbs(['postgres'])("relation deletion", function(done) { var simple = new Parse.Object("SimpleObject"); var child = new Parse.Object("Child"); simple.save({ @@ -578,7 +578,7 @@ describe('Parse.Object testing', () => { }); }); - it("addUnique", function(done) { + it_exclude_dbs(['postgres'])("addUnique", function(done) { var x1 = new Parse.Object('X'); x1.set('stuff', [1, 2]); x1.save().then(() => { @@ -600,7 +600,7 @@ describe('Parse.Object testing', () => { }); }); - it("addUnique with object", function(done) { + it_exclude_dbs(['postgres'])("addUnique with object", function(done) { var x1 = new Parse.Object('X'); x1.set('stuff', [ 1, {'hello': 'world'}, {'foo': 'bar'}]); x1.save().then(() => { @@ -622,7 +622,7 @@ describe('Parse.Object testing', () => { }); }); - it("removes with object", function(done) { + it_exclude_dbs(['postgres'])("removes with object", function(done) { var x1 = new Parse.Object('X'); x1.set('stuff', [ 1, {'hello': 'world'}, {'foo': 'bar'}]); x1.save().then(() => { @@ -668,7 +668,7 @@ describe('Parse.Object testing', () => { }); }); - it("dirty keys", function(done) { + it_exclude_dbs(['postgres'])("dirty keys", function(done) { var object = new Parse.Object("TestObject"); object.set("gogo", "good"); object.set("sito", "sexy"); @@ -763,7 +763,7 @@ describe('Parse.Object testing', () => { }); }); - it("old attribute unset then unset", function(done) { + it_exclude_dbs(['postgres'])("old attribute unset then unset", function(done) { var TestObject = Parse.Object.extend("TestObject"); var obj = new TestObject(); obj.set("x", 3); @@ -832,7 +832,7 @@ describe('Parse.Object testing', () => { }); }); - it("old attribute unset then clear", function(done) { + it_exclude_dbs(['postgres'])("old attribute unset then clear", function(done) { var TestObject = Parse.Object.extend("TestObject"); var obj = new TestObject(); obj.set("x", 3); @@ -901,7 +901,7 @@ describe('Parse.Object testing', () => { }); }); - it("old attribute clear then unset", function(done) { + it_exclude_dbs(['postgres'])("old attribute clear then unset", function(done) { var TestObject = Parse.Object.extend("TestObject"); var obj = new TestObject(); obj.set("x", 3); @@ -970,7 +970,7 @@ describe('Parse.Object testing', () => { }); }); - it("old attribute clear then clear", function(done) { + it_exclude_dbs(['postgres'])("old attribute clear then clear", function(done) { var TestObject = Parse.Object.extend("TestObject"); var obj = new TestObject(); obj.set("x", 3); @@ -1039,7 +1039,7 @@ describe('Parse.Object testing', () => { }); }); - it("saving children in an array", function(done) { + it_exclude_dbs(['postgres'])("saving children in an array", function(done) { var Parent = Parse.Object.extend("Parent"); var Child = Parse.Object.extend("Child"); @@ -1304,7 +1304,7 @@ describe('Parse.Object testing', () => { }); }); - it("bytes work", function(done) { + it_exclude_dbs(['postgres'])("bytes work", function(done) { Parse.Promise.as().then(function() { var obj = new TestObject(); obj.set("bytes", { __type: "Bytes", base64: "ZnJveW8=" }); @@ -1342,7 +1342,7 @@ describe('Parse.Object testing', () => { }); }); - it("fetchAll", function(done) { + it_exclude_dbs(['postgres'])("fetchAll", function(done) { var numItems = 11; var container = new Container(); var items = []; @@ -1389,7 +1389,7 @@ describe('Parse.Object testing', () => { }); }); - it("fetchAll updates dates", function(done) { + it_exclude_dbs(['postgres'])("fetchAll updates dates", function(done) { var updatedObject; var object = new TestObject(); object.set("x", 7); @@ -1409,7 +1409,7 @@ describe('Parse.Object testing', () => { }); }); - it("fetchAll backbone-style callbacks", function(done) { + it_exclude_dbs(['postgres'])("fetchAll backbone-style callbacks", function(done) { var numItems = 11; var container = new Container(); var items = []; @@ -1504,7 +1504,7 @@ describe('Parse.Object testing', () => { // TODO: Verify that with Sessions, this test is wrong... A fetch on // user should not bring down a session token. - notWorking("fetchAll User attributes get merged", function(done) { + xit("fetchAll User attributes get merged", function(done) { var sameUser; var user = new Parse.User(); user.set("username", "asdf"); @@ -1536,7 +1536,7 @@ describe('Parse.Object testing', () => { }); }); - it("fetchAllIfNeeded", function(done) { + it_exclude_dbs(['postgres'])("fetchAllIfNeeded", function(done) { var numItems = 11; var container = new Container(); var items = []; @@ -1574,7 +1574,7 @@ describe('Parse.Object testing', () => { }); }); - it("fetchAllIfNeeded backbone-style callbacks", function(done) { + it_exclude_dbs(['postgres'])("fetchAllIfNeeded backbone-style callbacks", function(done) { var numItems = 11; var container = new Container(); var items = []; @@ -1778,7 +1778,7 @@ describe('Parse.Object testing', () => { }); }); - it('dictionary fetched pointers do not lose data on fetch', (done) => { + it_exclude_dbs(['postgres'])('dictionary fetched pointers do not lose data on fetch', (done) => { var parent = new Parse.Object('Parent'); var dict = {}; for (var i = 0; i < 5; i++) { @@ -1838,7 +1838,7 @@ describe('Parse.Object testing', () => { }); }); - it('should have undefined includes when object is missing', (done) => { + it_exclude_dbs(['postgres'])('should have undefined includes when object is missing', (done) => { let obj1 = new Parse.Object("AnObject"); let obj2 = new Parse.Object("AnObject"); @@ -1867,7 +1867,7 @@ describe('Parse.Object testing', () => { }) }); - it('should have undefined includes when object is missing on deeper path', (done) => { + it_exclude_dbs(['postgres'])('should have undefined includes when object is missing on deeper path', (done) => { let obj1 = new Parse.Object("AnObject"); let obj2 = new Parse.Object("AnObject"); let obj3 = new Parse.Object("AnObject"); diff --git a/spec/ParseQuery.spec.js b/spec/ParseQuery.spec.js index 036b106424..81b4da1e90 100644 --- a/spec/ParseQuery.spec.js +++ b/spec/ParseQuery.spec.js @@ -23,7 +23,7 @@ describe('Parse.Query testing', () => { }); }); - it("notEqualTo with Relation is working", function(done) { + it_exclude_dbs(['postgres'])("notEqualTo with Relation is working", function(done) { var user = new Parse.User(); user.setPassword("asdf"); user.setUsername("zxcv"); @@ -137,7 +137,7 @@ describe('Parse.Query testing', () => { }); }); - it("containedIn object array queries", function(done) { + it_exclude_dbs(['postgres'])("containedIn object array queries", function(done) { var messageList = []; for (var i = 0; i < 4; ++i) { var message = new TestObject({}); @@ -172,7 +172,7 @@ describe('Parse.Query testing', () => { }); }); - it("containsAll number array queries", function(done) { + it_exclude_dbs(['postgres'])("containsAll number array queries", function(done) { var NumberSet = Parse.Object.extend({ className: "NumberSet" }); var objectsList = []; @@ -195,7 +195,7 @@ describe('Parse.Query testing', () => { }); }); - it("containsAll string array queries", function(done) { + it_exclude_dbs(['postgres'])("containsAll string array queries", function(done) { var StringSet = Parse.Object.extend({ className: "StringSet" }); var objectsList = []; @@ -214,7 +214,7 @@ describe('Parse.Query testing', () => { }); }); - it("containsAll date array queries", function(done) { + it_exclude_dbs(['postgres'])("containsAll date array queries", function(done) { var DateSet = Parse.Object.extend({ className: "DateSet" }); function parseDate(iso8601) { @@ -270,7 +270,7 @@ describe('Parse.Query testing', () => { }); }); - it("containsAll object array queries", function(done) { + it_exclude_dbs(['postgres'])("containsAll object array queries", function(done) { var MessageSet = Parse.Object.extend({ className: "MessageSet" }); @@ -312,7 +312,7 @@ describe('Parse.Query testing', () => { className: "BoxedNumber" }); - it("equalTo queries", function(done) { + it_exclude_dbs(['postgres'])("equalTo queries", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -329,7 +329,7 @@ describe('Parse.Query testing', () => { }); }); - it("equalTo undefined", function(done) { + it_exclude_dbs(['postgres'])("equalTo undefined", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -346,7 +346,7 @@ describe('Parse.Query testing', () => { }); }); - it("lessThan queries", function(done) { + it_exclude_dbs(['postgres'])("lessThan queries", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -363,7 +363,7 @@ describe('Parse.Query testing', () => { }); }); - it("lessThanOrEqualTo queries", function(done) { + it_exclude_dbs(['postgres'])("lessThanOrEqualTo queries", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -381,7 +381,7 @@ describe('Parse.Query testing', () => { }); }); - it("greaterThan queries", function(done) { + it_exclude_dbs(['postgres'])("greaterThan queries", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -399,7 +399,7 @@ describe('Parse.Query testing', () => { }); }); - it("greaterThanOrEqualTo queries", function(done) { + it_exclude_dbs(['postgres'])("greaterThanOrEqualTo queries", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -417,7 +417,7 @@ describe('Parse.Query testing', () => { }); }); - it("lessThanOrEqualTo greaterThanOrEqualTo queries", function(done) { + it_exclude_dbs(['postgres'])("lessThanOrEqualTo greaterThanOrEqualTo queries", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -436,7 +436,7 @@ describe('Parse.Query testing', () => { }); }); - it("lessThan greaterThan queries", function(done) { + it_exclude_dbs(['postgres'])("lessThan greaterThan queries", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -473,7 +473,7 @@ describe('Parse.Query testing', () => { }); }); - it("containedIn queries", function(done) { + it_exclude_dbs(['postgres'])("containedIn queries", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -491,7 +491,7 @@ describe('Parse.Query testing', () => { }); }); - it("notContainedIn queries", function(done) { + it_exclude_dbs(['postgres'])("notContainedIn queries", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -510,7 +510,7 @@ describe('Parse.Query testing', () => { }); - it("objectId containedIn queries", function(done) { + it_exclude_dbs(['postgres'])("objectId containedIn queries", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -537,7 +537,7 @@ describe('Parse.Query testing', () => { }); }); - it("objectId equalTo queries", function(done) { + it_exclude_dbs(['postgres'])("objectId equalTo queries", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -560,7 +560,7 @@ describe('Parse.Query testing', () => { }); }); - it("find no elements", function(done) { + it_exclude_dbs(['postgres'])("find no elements", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -681,7 +681,7 @@ describe('Parse.Query testing', () => { className: "Container" }); - it("notEqualTo object", function(done) { + it_exclude_dbs(['postgres'])("notEqualTo object", function(done) { var item1 = new TestObject(); var item2 = new TestObject(); var container1 = new Container({item: item1}); @@ -698,7 +698,7 @@ describe('Parse.Query testing', () => { }); }); - it("skip", function(done) { + it_exclude_dbs(['postgres'])("skip", function(done) { Parse.Object.saveAll([new TestObject(), new TestObject()], function() { var query = new Parse.Query(TestObject); query.skip(1); @@ -717,7 +717,7 @@ describe('Parse.Query testing', () => { }); }); - it("skip doesn't affect count", function(done) { + it_exclude_dbs(['postgres'])("skip doesn't affect count", function(done) { Parse.Object.saveAll([new TestObject(), new TestObject()], function() { var query = new Parse.Query(TestObject); query.count({ @@ -741,7 +741,7 @@ describe('Parse.Query testing', () => { }); }); - it("count", function(done) { + it_exclude_dbs(['postgres'])("count", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -759,7 +759,7 @@ describe('Parse.Query testing', () => { }); }); - it("order by ascending number", function(done) { + it_exclude_dbs(['postgres'])("order by ascending number", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -778,7 +778,7 @@ describe('Parse.Query testing', () => { }); }); - it("order by descending number", function(done) { + it_exclude_dbs(['postgres'])("order by descending number", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -797,7 +797,7 @@ describe('Parse.Query testing', () => { }); }); - it("order by ascending number then descending string", function(done) { + it_exclude_dbs(['postgres'])("order by ascending number then descending string", function(done) { var strings = ["a", "b", "c", "d"]; var makeBoxedNumber = function(num, i) { return new BoxedNumber({ number: num, string: strings[i] }); @@ -824,7 +824,7 @@ describe('Parse.Query testing', () => { }); }); - it("order by descending number then ascending string", function(done) { + it_exclude_dbs(['postgres'])("order by descending number then ascending string", function(done) { var strings = ["a", "b", "c", "d"]; var makeBoxedNumber = function(num, i) { return new BoxedNumber({ number: num, string: strings[i] }); @@ -850,7 +850,7 @@ describe('Parse.Query testing', () => { }); }); - it("order by descending number and string", function(done) { + it_exclude_dbs(['postgres'])("order by descending number and string", function(done) { var strings = ["a", "b", "c", "d"]; var makeBoxedNumber = function(num, i) { return new BoxedNumber({ number: num, string: strings[i] }); @@ -876,7 +876,7 @@ describe('Parse.Query testing', () => { }); }); - it("order by descending number and string, with space", function(done) { + it_exclude_dbs(['postgres'])("order by descending number and string, with space", function(done) { var strings = ["a", "b", "c", "d"]; var makeBoxedNumber = function(num, i) { return new BoxedNumber({ number: num, string: strings[i] }); @@ -902,7 +902,7 @@ describe('Parse.Query testing', () => { }); }); - it("order by descending number and string, with array arg", function(done) { + it_exclude_dbs(['postgres'])("order by descending number and string, with array arg", function(done) { var strings = ["a", "b", "c", "d"]; var makeBoxedNumber = function(num, i) { return new BoxedNumber({ number: num, string: strings[i] }); @@ -928,7 +928,7 @@ describe('Parse.Query testing', () => { }); }); - it("order by descending number and string, with multiple args", function(done) { + it_exclude_dbs(['postgres'])("order by descending number and string, with multiple args", function(done) { var strings = ["a", "b", "c", "d"]; var makeBoxedNumber = function(num, i) { return new BoxedNumber({ number: num, string: strings[i] }); @@ -954,7 +954,7 @@ describe('Parse.Query testing', () => { }); }); - it("can't order by password", function(done) { + it_exclude_dbs(['postgres'])("can't order by password", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -993,7 +993,7 @@ describe('Parse.Query testing', () => { }); }); - it("order by createdAt", function(done) { + it_exclude_dbs(['postgres'])("order by createdAt", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -1017,7 +1017,7 @@ describe('Parse.Query testing', () => { }); }); - it("order by _updated_at", function(done) { + it_exclude_dbs(['postgres'])("order by _updated_at", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; @@ -1046,7 +1046,7 @@ describe('Parse.Query testing', () => { }); }); - it("order by updatedAt", function(done) { + it_exclude_dbs(['postgres'])("order by updatedAt", function(done) { var makeBoxedNumber = function(i) { return new BoxedNumber({ number: i }); }; var numbers = [3, 1, 2].map(makeBoxedNumber); numbers[0].save().then(() => { @@ -1097,7 +1097,7 @@ describe('Parse.Query testing', () => { }); } - it("time equality", function(done) { + it_exclude_dbs(['postgres'])("time equality", function(done) { makeThreeTimeObjects().then(function(list) { var query = new Parse.Query(TestObject); query.equalTo("time", list[1].get("time")); @@ -1111,7 +1111,7 @@ describe('Parse.Query testing', () => { }); }); - it("time lessThan", function(done) { + it_exclude_dbs(['postgres'])("time lessThan", function(done) { makeThreeTimeObjects().then(function(list) { var query = new Parse.Query(TestObject); query.lessThan("time", list[2].get("time")); @@ -1125,7 +1125,7 @@ describe('Parse.Query testing', () => { }); // This test requires Date objects to be consistently stored as a Date. - it("time createdAt", function(done) { + it_exclude_dbs(['postgres'])("time createdAt", function(done) { makeThreeTimeObjects().then(function(list) { var query = new Parse.Query(TestObject); query.greaterThanOrEqualTo("createdAt", list[0].createdAt); @@ -1138,7 +1138,7 @@ describe('Parse.Query testing', () => { }); }); - it("matches string", function(done) { + it_exclude_dbs(['postgres'])("matches string", function(done) { var thing1 = new TestObject(); thing1.set("myString", "football"); var thing2 = new TestObject(); @@ -1155,7 +1155,7 @@ describe('Parse.Query testing', () => { }); }); - it("matches regex", function(done) { + it_exclude_dbs(['postgres'])("matches regex", function(done) { var thing1 = new TestObject(); thing1.set("myString", "football"); var thing2 = new TestObject(); @@ -1172,7 +1172,7 @@ describe('Parse.Query testing', () => { }); }); - it("case insensitive regex success", function(done) { + it_exclude_dbs(['postgres'])("case insensitive regex success", function(done) { var thing = new TestObject(); thing.set("myString", "football"); Parse.Object.saveAll([thing], function() { @@ -1186,13 +1186,13 @@ describe('Parse.Query testing', () => { }); }); - it("regexes with invalid options fail", function(done) { + it_exclude_dbs(['postgres'])("regexes with invalid options fail", function(done) { var query = new Parse.Query(TestObject); query.matches("myString", "FootBall", "some invalid option"); query.find(expectError(Parse.Error.INVALID_QUERY, done)); }); - it("Use a regex that requires all modifiers", function(done) { + it_exclude_dbs(['postgres'])("Use a regex that requires all modifiers", function(done) { var thing = new TestObject(); thing.set("myString", "PArSe\nCom"); Parse.Object.saveAll([thing], function() { @@ -1212,7 +1212,7 @@ describe('Parse.Query testing', () => { }); }); - it("Regular expression constructor includes modifiers inline", function(done) { + it_exclude_dbs(['postgres'])("Regular expression constructor includes modifiers inline", function(done) { var thing = new TestObject(); thing.set("myString", "\n\nbuffer\n\nparse.COM"); Parse.Object.saveAll([thing], function() { @@ -1230,7 +1230,7 @@ describe('Parse.Query testing', () => { var someAscii = "\\E' !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU" + "VWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'"; - it("contains", function(done) { + it_exclude_dbs(['postgres'])("contains", function(done) { Parse.Object.saveAll([new TestObject({myString: "zax" + someAscii + "qub"}), new TestObject({myString: "start" + someAscii}), new TestObject({myString: someAscii + "end"}), @@ -1246,7 +1246,7 @@ describe('Parse.Query testing', () => { }); }); - it("startsWith", function(done) { + it_exclude_dbs(['postgres'])("startsWith", function(done) { Parse.Object.saveAll([new TestObject({myString: "zax" + someAscii + "qub"}), new TestObject({myString: "start" + someAscii}), new TestObject({myString: someAscii + "end"}), @@ -1262,7 +1262,7 @@ describe('Parse.Query testing', () => { }); }); - it("endsWith", function(done) { + it_exclude_dbs(['postgres'])("endsWith", function(done) { Parse.Object.saveAll([new TestObject({myString: "zax" + someAscii + "qub"}), new TestObject({myString: "start" + someAscii}), new TestObject({myString: someAscii + "end"}), @@ -1278,7 +1278,7 @@ describe('Parse.Query testing', () => { }); }); - it("exists", function(done) { + it_exclude_dbs(['postgres'])("exists", function(done) { var objects = []; for (var i of [0, 1, 2, 3, 4, 5, 6, 7, 8]) { var item = new TestObject(); @@ -1304,7 +1304,7 @@ describe('Parse.Query testing', () => { }); }); - it("doesNotExist", function(done) { + it_exclude_dbs(['postgres'])("doesNotExist", function(done) { var objects = []; for (var i of [0, 1, 2, 3, 4, 5, 6, 7, 8]) { var item = new TestObject(); @@ -1330,7 +1330,7 @@ describe('Parse.Query testing', () => { }); }); - it("exists relation", function(done) { + it_exclude_dbs(['postgres'])("exists relation", function(done) { var objects = []; for (var i of [0, 1, 2, 3, 4, 5, 6, 7, 8]) { var container = new Container(); @@ -1359,7 +1359,7 @@ describe('Parse.Query testing', () => { }); }); - it("doesNotExist relation", function(done) { + it_exclude_dbs(['postgres'])("doesNotExist relation", function(done) { var objects = []; for (var i of [0, 1, 2, 3, 4, 5, 6, 7]) { var container = new Container(); @@ -1388,7 +1388,7 @@ describe('Parse.Query testing', () => { }); }); - it("don't include by default", function(done) { + it_exclude_dbs(['postgres'])("don't include by default", function(done) { var child = new TestObject(); var parent = new Container(); child.set("foo", "bar"); @@ -1638,7 +1638,7 @@ describe('Parse.Query testing', () => { }) }); - it('properly fetches nested pointers', (done) =>  { + it_exclude_dbs(['postgres'])('properly fetches nested pointers', (done) =>  { let color = new Parse.Object('Color'); color.set('hex','#133733'); let circle = new Parse.Object('Circle'); @@ -1703,7 +1703,7 @@ describe('Parse.Query testing', () => { }); }); - it("matches query", function(done) { + it_exclude_dbs(['postgres'])("matches query", function(done) { var ParentObject = Parse.Object.extend("ParentObject"); var ChildObject = Parse.Object.extend("ChildObject"); var objects = []; @@ -1742,7 +1742,7 @@ describe('Parse.Query testing', () => { }); }); - it("select query", function(done) { + it_exclude_dbs(['postgres'])("select query", function(done) { var RestaurantObject = Parse.Object.extend("Restaurant"); var PersonObject = Parse.Object.extend("Person"); var objects = [ @@ -1768,7 +1768,7 @@ describe('Parse.Query testing', () => { }); }); - it('$select inside $or', (done) => { + it_exclude_dbs(['postgres'])('$select inside $or', (done) => { var Restaurant = Parse.Object.extend('Restaurant'); var Person = Parse.Object.extend('Person'); var objects = [ @@ -1797,7 +1797,7 @@ describe('Parse.Query testing', () => { }); }); - it("dontSelect query", function(done) { + it_exclude_dbs(['postgres'])("dontSelect query", function(done) { var RestaurantObject = Parse.Object.extend("Restaurant"); var PersonObject = Parse.Object.extend("Person"); var objects = [ @@ -1823,7 +1823,7 @@ describe('Parse.Query testing', () => { }); }); - it("dontSelect query without conditions", function(done) { + it_exclude_dbs(['postgres'])("dontSelect query without conditions", function(done) { const RestaurantObject = Parse.Object.extend("Restaurant"); const PersonObject = Parse.Object.extend("Person"); const objects = [ @@ -1910,7 +1910,7 @@ describe('Parse.Query testing', () => { }); }); - it("or queries", function(done) { + it_exclude_dbs(['postgres'])("or queries", function(done) { var objects = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(function(x) { var object = new Parse.Object('BoxedNumber'); object.set('x', x); @@ -1937,7 +1937,7 @@ describe('Parse.Query testing', () => { }); // This relies on matchesQuery aka the $inQuery operator - it("or complex queries", function(done) { + it_exclude_dbs(['postgres'])("or complex queries", function(done) { var objects = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(function(x) { var child = new Parse.Object('Child'); child.set('x', x); @@ -1966,7 +1966,7 @@ describe('Parse.Query testing', () => { })); }); - it("async methods", function(done) { + it_exclude_dbs(['postgres'])("async methods", function(done) { var saves = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(function(x) { var obj = new Parse.Object("TestObject"); obj.set("x", x + 1); @@ -2003,7 +2003,7 @@ describe('Parse.Query testing', () => { }); }); - it("query.each", function(done) { + it_exclude_dbs(['postgres'])("query.each", function(done) { var TOTAL = 50; var COUNT = 25; @@ -2038,7 +2038,7 @@ describe('Parse.Query testing', () => { }); }); - it("query.each async", function(done) { + it_exclude_dbs(['postgres'])("query.each async", function(done) { var TOTAL = 50; var COUNT = 25; @@ -2245,7 +2245,7 @@ describe('Parse.Query testing', () => { }); }); - it('notEqual with array of pointers', (done) => { + it_exclude_dbs(['postgres'])('notEqual with array of pointers', (done) => { var children = []; var parents = []; var promises = []; @@ -2275,7 +2275,7 @@ describe('Parse.Query testing', () => { }).catch((error) => { console.log(error); }); }); - it('querying for null value', (done) => { + it_exclude_dbs(['postgres'])('querying for null value', (done) => { var obj = new Parse.Object('TestObject'); obj.set('aNull', null); obj.save().then(() => { @@ -2289,7 +2289,7 @@ describe('Parse.Query testing', () => { }) }); - it('query within dictionary', (done) => { + it_exclude_dbs(['postgres'])('query within dictionary', (done) => { var objs = []; var promises = []; for (var i = 0; i < 2; i++) { @@ -2328,7 +2328,7 @@ describe('Parse.Query testing', () => { }); }); - it('query match on array with single object', (done) => { + it_exclude_dbs(['postgres'])('query match on array with single object', (done) => { var target = {__type: 'Pointer', className: 'TestObject', objectId: 'abc123'}; var obj = new Parse.Object('TestObject'); obj.set('someObjs', [target]); @@ -2344,7 +2344,7 @@ describe('Parse.Query testing', () => { }); }); - it('query match on array with multiple objects', (done) => { + it_exclude_dbs(['postgres'])('query match on array with multiple objects', (done) => { var target1 = {__type: 'Pointer', className: 'TestObject', objectId: 'abc'}; var target2 = {__type: 'Pointer', className: 'TestObject', objectId: '123'}; var obj= new Parse.Object('TestObject'); @@ -2362,7 +2362,7 @@ describe('Parse.Query testing', () => { }); // #371 - it('should properly interpret a query', (done) => { + it_exclude_dbs(['postgres'])('should properly interpret a query v1', (done) => { var query = new Parse.Query("C1"); var auxQuery = new Parse.Query("C1"); query.matchesKeyInQuery("A1", "A2", auxQuery); @@ -2377,7 +2377,7 @@ describe('Parse.Query testing', () => { }) }); - it('should properly interpret a query', (done) => { + it_exclude_dbs(['postgres'])('should properly interpret a query v2', (done) => { var user = new Parse.User(); user.set("username", "foo"); user.set("password", "bar"); @@ -2412,11 +2412,9 @@ describe('Parse.Query testing', () => { fail("should not fail"); done(); }); - - }); - it('should find objects with array of pointers', (done) => { + it_exclude_dbs(['postgres'])('should find objects with array of pointers', (done) => { var objects = []; while(objects.length != 5) { var object = new Parse.Object('ContainedObject'); @@ -2455,7 +2453,7 @@ describe('Parse.Query testing', () => { }) }) - it('query with two OR subqueries (regression test #1259)', done => { + it_exclude_dbs(['postgres'])('query with two OR subqueries (regression test #1259)', done => { let relatedObject = new Parse.Object('Class2'); relatedObject.save().then(relatedObject => { let anObject = new Parse.Object('Class1'); @@ -2531,5 +2529,4 @@ describe('Parse.Query testing', () => { } }) }); - }); diff --git a/spec/ParseRelation.spec.js b/spec/ParseRelation.spec.js index 8c1996cd05..e8df9ae3ac 100644 --- a/spec/ParseRelation.spec.js +++ b/spec/ParseRelation.spec.js @@ -6,7 +6,7 @@ var ChildObject = Parse.Object.extend({className: "ChildObject"}); var ParentObject = Parse.Object.extend({className: "ParentObject"}); describe('Parse.Relation testing', () => { - it("simple add and remove relation", (done) => { + it_exclude_dbs(['postgres'])("simple add and remove relation", (done) => { var child = new ChildObject(); child.set("x", 2); var parent = new ParentObject(); @@ -41,7 +41,7 @@ describe('Parse.Relation testing', () => { }); }); - it("query relation without schema", (done) => { + it_exclude_dbs(['postgres'])("query relation without schema", (done) => { var ChildObject = Parse.Object.extend("ChildObject"); var childObjects = []; for (var i = 0; i < 10; i++) { @@ -75,7 +75,7 @@ describe('Parse.Relation testing', () => { })); }); - it("relations are constructed right from query", (done) => { + it_exclude_dbs(['postgres'])("relations are constructed right from query", (done) => { var ChildObject = Parse.Object.extend("ChildObject"); var childObjects = []; @@ -121,7 +121,7 @@ describe('Parse.Relation testing', () => { }); - it("compound add and remove relation", (done) => { + it_exclude_dbs(['postgres'])("compound add and remove relation", (done) => { var ChildObject = Parse.Object.extend("ChildObject"); var childObjects = []; for (var i = 0; i < 10; i++) { @@ -164,7 +164,7 @@ describe('Parse.Relation testing', () => { }); - it("queries with relations", (done) => { + it_exclude_dbs(['postgres'])("queries with relations", (done) => { var ChildObject = Parse.Object.extend("ChildObject"); var childObjects = []; @@ -202,7 +202,7 @@ describe('Parse.Relation testing', () => { }); }); - it("queries on relation fields", (done) => { + it_exclude_dbs(['postgres'])("queries on relation fields", (done) => { var ChildObject = Parse.Object.extend("ChildObject"); var childObjects = []; for (var i = 0; i < 10; i++) { @@ -248,7 +248,7 @@ describe('Parse.Relation testing', () => { }); }); - it("queries on relation fields with multiple containedIn (regression test for #1271)", (done) => { + it_exclude_dbs(['postgres'])("queries on relation fields with multiple containedIn (regression test for #1271)", (done) => { let ChildObject = Parse.Object.extend("ChildObject"); let childObjects = []; for (let i = 0; i < 10; i++) { @@ -296,7 +296,7 @@ describe('Parse.Relation testing', () => { }); }); - it("query on pointer and relation fields with equal", (done) => { + it_exclude_dbs(['postgres'])("query on pointer and relation fields with equal", (done) => { var ChildObject = Parse.Object.extend("ChildObject"); var childObjects = []; for (var i = 0; i < 10; i++) { @@ -334,7 +334,7 @@ describe('Parse.Relation testing', () => { }); }); - it("query on pointer and relation fields with equal bis", (done) => { + it_exclude_dbs(['postgres'])("query on pointer and relation fields with equal bis", (done) => { var ChildObject = Parse.Object.extend("ChildObject"); var childObjects = []; for (var i = 0; i < 10; i++) { @@ -374,7 +374,7 @@ describe('Parse.Relation testing', () => { }); }); - it("or queries on pointer and relation fields", (done) => { + it_exclude_dbs(['postgres'])("or queries on pointer and relation fields", (done) => { var ChildObject = Parse.Object.extend("ChildObject"); var childObjects = []; for (var i = 0; i < 10; i++) { @@ -419,7 +419,7 @@ describe('Parse.Relation testing', () => { }); - it("Get query on relation using un-fetched parent object", (done) => { + it_exclude_dbs(['postgres'])("Get query on relation using un-fetched parent object", (done) => { // Setup data model var Wheel = Parse.Object.extend('Wheel'); var Car = Parse.Object.extend('Car'); @@ -452,7 +452,7 @@ describe('Parse.Relation testing', () => { }); }); - it("Find query on relation using un-fetched parent object", (done) => { + it_exclude_dbs(['postgres'])("Find query on relation using un-fetched parent object", (done) => { // Setup data model var Wheel = Parse.Object.extend('Wheel'); var Car = Parse.Object.extend('Car'); @@ -486,7 +486,7 @@ describe('Parse.Relation testing', () => { }); }); - it('Find objects with a related object using equalTo', (done) => { + it_exclude_dbs(['postgres'])('Find objects with a related object using equalTo', (done) => { // Setup the objects var Card = Parse.Object.extend('Card'); var House = Parse.Object.extend('House'); @@ -506,7 +506,7 @@ describe('Parse.Relation testing', () => { }); }); - it('should properly get related objects with unfetched queries', (done) => { + it_exclude_dbs(['postgres'])('should properly get related objects with unfetched queries', (done) => { let objects = []; let owners = []; let allObjects = []; @@ -575,7 +575,7 @@ describe('Parse.Relation testing', () => { }) }); - it("select query", function(done) { + it_exclude_dbs(['postgres'])("select query", function(done) { var RestaurantObject = Parse.Object.extend("Restaurant"); var PersonObject = Parse.Object.extend("Person"); var OwnerObject = Parse.Object.extend('Owner'); @@ -615,7 +615,7 @@ describe('Parse.Relation testing', () => { }); }); - it("dontSelect query", function(done) { + it_exclude_dbs(['postgres'])("dontSelect query", function(done) { var RestaurantObject = Parse.Object.extend("Restaurant"); var PersonObject = Parse.Object.extend("Person"); var OwnerObject = Parse.Object.extend('Owner'); @@ -657,7 +657,7 @@ describe('Parse.Relation testing', () => { }); }); - it('relations are not bidirectional (regression test for #871)', done => { + it_exclude_dbs(['postgres'])('relations are not bidirectional (regression test for #871)', done => { let PersonObject = Parse.Object.extend("Person"); let p1 = new PersonObject(); let p2 = new PersonObject(); @@ -684,7 +684,7 @@ describe('Parse.Relation testing', () => { }); }); - it('can query roles in Cloud Code (regession test #1489)', done => { + it_exclude_dbs(['postgres'])('can query roles in Cloud Code (regession test #1489)', done => { Parse.Cloud.define('isAdmin', (request, response) => { let query = new Parse.Query(Parse.Role); query.equalTo('name', 'admin'); diff --git a/spec/ParseRole.spec.js b/spec/ParseRole.spec.js index cbbd09c14e..142fc929ae 100644 --- a/spec/ParseRole.spec.js +++ b/spec/ParseRole.spec.js @@ -7,9 +7,7 @@ var Auth = require("../src/Auth").Auth; var Config = require("../src/Config"); describe('Parse Role testing', () => { - - it('Do a bunch of basic role testing', (done) => { - + it_exclude_dbs(['postgres'])('Do a bunch of basic role testing', done => { var user; var role; @@ -78,7 +76,7 @@ describe('Parse Role testing', () => { return role.save({}, { useMasterKey: true }); }; - it("should not recursively load the same role multiple times", (done) => { + it_exclude_dbs(['postgres'])("should not recursively load the same role multiple times", (done) => { var rootRole = "RootRole"; var roleNames = ["FooRole", "BarRole", "BazRole"]; var allRoles = [rootRole].concat(roleNames); @@ -144,7 +142,7 @@ describe('Parse Role testing', () => { }); - it("should recursively load roles", (done) => { + it_exclude_dbs(['postgres'])("should recursively load roles", (done) => { var rolesNames = ["FooRole", "BarRole", "BazRole"]; var roleIds = {}; createTestUser().then( (user) => { @@ -176,7 +174,7 @@ describe('Parse Role testing', () => { }); }); - it("_Role object should not save without name.", (done) => { + it_exclude_dbs(['postgres'])("_Role object should not save without name.", (done) => { var role = new Parse.Role(); role.save(null,{useMasterKey:true}) .then((r) => { @@ -247,7 +245,7 @@ describe('Parse Role testing', () => { }); - it('can create role and query empty users', (done)=> { + it_exclude_dbs(['postgres'])('can create role and query empty users', (done)=> { var roleACL = new Parse.ACL(); roleACL.setPublicReadAccess(true); var role = new Parse.Role('subscribers', roleACL); @@ -267,7 +265,7 @@ describe('Parse Role testing', () => { }); // Based on various scenarios described in issues #827 and #683, - it('should properly handle role permissions on objects', (done) => { + it_exclude_dbs(['postgres'])('should properly handle role permissions on objects', (done) => { var user, user2, user3; var role, role2, role3; var obj, obj2; diff --git a/spec/ParseUser.spec.js b/spec/ParseUser.spec.js index b3486177a8..1dc650b0c2 100644 --- a/spec/ParseUser.spec.js +++ b/spec/ParseUser.spec.js @@ -27,7 +27,6 @@ function verifyACL(user) { } describe('Parse.User testing', () => { - it("user sign up class method", (done) => { Parse.User.signUp("asdf", "zxcv", null, { success: function(user) { @@ -89,7 +88,7 @@ describe('Parse.User testing', () => { }); }); - it('should respect ACL without locking user out', (done) => { + it_exclude_dbs(['postgres'])('should respect ACL without locking user out', (done) => { let user = new Parse.User(); let ACL = new Parse.ACL(); ACL.setPublicReadAccess(false); @@ -138,7 +137,7 @@ describe('Parse.User testing', () => { }) }); - it("user login with files", (done) => { + it_exclude_dbs(['postgres'])("user login with files", (done) => { let file = new Parse.File("yolo.txt", [1,2,3], "text/plain"); file.save().then((file) => { return Parse.User.signUp("asdf", "zxcv", { "file" : file }); @@ -152,30 +151,28 @@ describe('Parse.User testing', () => { }); }); - describe('become', () => { - it('sends token back', done => { - let user = null; - var sessionToken = null; + it_exclude_dbs(['postgres'])('become sends token back', done => { + let user = null; + var sessionToken = null; - Parse.User.signUp('Jason', 'Parse', { 'code': 'red' }).then(newUser => { - user = newUser; - expect(user.get('code'), 'red'); + Parse.User.signUp('Jason', 'Parse', { 'code': 'red' }).then(newUser => { + user = newUser; + expect(user.get('code'), 'red'); - sessionToken = newUser.getSessionToken(); - expect(sessionToken).toBeDefined(); + sessionToken = newUser.getSessionToken(); + expect(sessionToken).toBeDefined(); - return Parse.User.become(sessionToken); - }).then(newUser => { - expect(newUser.id).toEqual(user.id); - expect(newUser.get('username'), 'Jason'); - expect(newUser.get('code'), 'red'); - expect(newUser.getSessionToken()).toEqual(sessionToken); - }).then(() => { - done(); - }, error => { - fail(error); - done(); - }); + return Parse.User.become(sessionToken); + }).then(newUser => { + expect(newUser.id).toEqual(user.id); + expect(newUser.get('username'), 'Jason'); + expect(newUser.get('code'), 'red'); + expect(newUser.getSessionToken()).toEqual(sessionToken); + }).then(() => { + done(); + }, error => { + fail(error); + done(); }); }); @@ -298,7 +295,7 @@ describe('Parse.User testing', () => { }); }); - it("cannot saveAll with non-authed user", (done) => { + it_exclude_dbs(['postgres'])("cannot saveAll with non-authed user", (done) => { var user = new Parse.User(); user.signUp({ "password": "asdf", @@ -491,7 +488,7 @@ describe('Parse.User testing', () => { return promise._thenRunCallbacks(optionsOrCallback); } - it("contained in user array queries", (done) => { + it_exclude_dbs(['postgres'])("contained in user array queries", (done) => { var USERS = 4; var MESSAGES = 5; @@ -586,7 +583,7 @@ describe('Parse.User testing', () => { }); }); - it("count users", (done) => { + it_exclude_dbs(['postgres'])("count users", (done) => { var james = new Parse.User(); james.set("username", "james"); james.set("password", "mypass"); @@ -714,7 +711,7 @@ describe('Parse.User testing', () => { }); }); - it("saving user after browser refresh", (done) => { + it_exclude_dbs(['postgres'])("saving user after browser refresh", (done) => { var _ = Parse._; var id; @@ -862,8 +859,7 @@ describe('Parse.User testing', () => { }); }); - it("user on disk gets updated after save", (done) => { - + it_exclude_dbs(['postgres'])("user on disk gets updated after save", (done) => { var SuperUser = Parse.User.extend({ isSuper: function() { return true; @@ -1007,7 +1003,7 @@ describe('Parse.User testing', () => { } }); - it("log in with provider", (done) => { + it_exclude_dbs(['postgres'])("log in with provider", (done) => { var provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); Parse.User._logInWith("facebook", { @@ -1029,7 +1025,7 @@ describe('Parse.User testing', () => { }); }); - it('returns authData when authed and logged in with provider (regression test for #1498)', done => { + it_exclude_dbs(['postgres'])('returns authData when authed and logged in with provider (regression test for #1498)', done => { Parse.Object.enableSingleInstance(); let provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); @@ -1046,7 +1042,7 @@ describe('Parse.User testing', () => { }); }); - it('log in with provider with files', done => { + it_exclude_dbs(['postgres'])('log in with provider with files', done => { let provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); let file = new Parse.File("yolo.txt", [1, 2, 3], "text/plain"); @@ -1069,7 +1065,7 @@ describe('Parse.User testing', () => { }); }); - it("log in with provider twice", (done) => { + it_exclude_dbs(['postgres'])("log in with provider twice", (done) => { var provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); Parse.User._logInWith("facebook", { @@ -1144,7 +1140,7 @@ describe('Parse.User testing', () => { }); }); - it("login with provider should not call beforeSave trigger", (done) => { + it_exclude_dbs(['postgres'])("login with provider should not call beforeSave trigger", (done) => { var provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); Parse.User._logInWith("facebook", { @@ -1168,7 +1164,7 @@ describe('Parse.User testing', () => { }); }); - it("link with provider", (done) => { + it_exclude_dbs(['postgres'])("link with provider", (done) => { var provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); var user = new Parse.User(); @@ -1201,7 +1197,7 @@ describe('Parse.User testing', () => { // 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_exclude_dbs(['postgres'])("link with provider for already linked user", (done) => { var provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); var user = new Parse.User(); @@ -1308,7 +1304,7 @@ describe('Parse.User testing', () => { }); }); - it("unlink with provider", (done) => { + it_exclude_dbs(['postgres'])("unlink with provider", (done) => { var provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); Parse.User._logInWith("facebook", { @@ -1344,7 +1340,7 @@ describe('Parse.User testing', () => { }); }); - it("unlink and link", (done) => { + it_exclude_dbs(['postgres'])("unlink and link", (done) => { var provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); Parse.User._logInWith("facebook", { @@ -1396,7 +1392,7 @@ describe('Parse.User testing', () => { }); }); - it("link multiple providers", (done) => { + it_exclude_dbs(['postgres'])("link multiple providers", (done) => { var provider = getMockFacebookProvider(); var mockProvider = getMockMyOauthProvider(); Parse.User._registerAuthenticationProvider(provider); @@ -1432,7 +1428,7 @@ describe('Parse.User testing', () => { }); }); - it("link multiple providers and update token", (done) => { + it_exclude_dbs(['postgres'])("link multiple providers and update token", (done) => { var provider = getMockFacebookProvider(); var mockProvider = getMockMyOauthProvider(); Parse.User._registerAuthenticationProvider(provider); @@ -1478,7 +1474,7 @@ describe('Parse.User testing', () => { }); }); - it('should fail linking with existing', (done) => { + it_exclude_dbs(['postgres'])('should fail linking with existing', (done) => { var provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); Parse.User._logInWith("facebook", { @@ -1504,7 +1500,7 @@ describe('Parse.User testing', () => { }); }); - it('should fail linking with existing', (done) => { + it_exclude_dbs(['postgres'])('should fail linking with existing', (done) => { var provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); Parse.User._logInWith("facebook", { @@ -1530,7 +1526,7 @@ describe('Parse.User testing', () => { }); }); - it('should properly error when password is missing', (done) => { + it_exclude_dbs(['postgres'])('should properly error when password is missing', (done) => { var provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); Parse.User._logInWith("facebook", { @@ -1553,7 +1549,7 @@ describe('Parse.User testing', () => { }); }); - it('should have authData in beforeSave and afterSave', (done) => { + it_exclude_dbs(['postgres'])('should have authData in beforeSave and afterSave', (done) => { Parse.Cloud.beforeSave('_User', (request, response) => { let authData = request.object.get('authData'); @@ -1616,7 +1612,7 @@ describe('Parse.User testing', () => { })); }); - it("log in with explicit facebook auth data", (done) => { + it_exclude_dbs(['postgres'])("log in with explicit facebook auth data", (done) => { Parse.FacebookUtils.logIn({ id: "8675309", access_token: "jenny", @@ -1624,7 +1620,7 @@ describe('Parse.User testing', () => { }, expectSuccess({success: done})); }); - it("log in async with explicit facebook auth data", (done) => { + it_exclude_dbs(['postgres'])("log in async with explicit facebook auth data", (done) => { Parse.FacebookUtils.logIn({ id: "8675309", access_token: "jenny", @@ -1637,7 +1633,7 @@ describe('Parse.User testing', () => { }); }); - it("link with explicit facebook auth data", (done) => { + it_exclude_dbs(['postgres'])("link with explicit facebook auth data", (done) => { Parse.User.signUp("mask", "open sesame", null, expectSuccess({ success: function(user) { Parse.FacebookUtils.link(user, { @@ -1652,7 +1648,7 @@ describe('Parse.User testing', () => { })); }); - it("link async with explicit facebook auth data", (done) => { + it_exclude_dbs(['postgres'])("link async with explicit facebook auth data", (done) => { Parse.User.signUp("mask", "open sesame", null, expectSuccess({ success: function(user) { Parse.FacebookUtils.link(user, { @@ -1707,7 +1703,7 @@ describe('Parse.User testing', () => { }); }); - notWorking("querying for users doesn't get session tokens", (done) => { + xit("querying for users doesn't get session tokens", (done) => { Parse.Promise.as().then(function() { return Parse.User.signUp("finn", "human", { foo: "bar" }); @@ -1831,7 +1827,7 @@ describe('Parse.User testing', () => { }); }); - it('unset user email', (done) => { + it_exclude_dbs(['postgres'])('unset user email', (done) => { var user = new Parse.User(); user.set('username', 'test'); user.set('password', 'test'); @@ -1953,7 +1949,7 @@ describe('Parse.User testing', () => { }); }); - it('get session only for current user', (done) => { + it_exclude_dbs(['postgres'])('get session only for current user', (done) => { Parse.Promise.as().then(() => { return Parse.User.signUp("test1", "test", { foo: "bar" }); }).then(() => { @@ -1977,7 +1973,7 @@ describe('Parse.User testing', () => { }); }); - it('delete session by object', (done) => { + it_exclude_dbs(['postgres'])('delete session by object', (done) => { Parse.Promise.as().then(() => { return Parse.User.signUp("test1", "test", { foo: "bar" }); }).then(() => { @@ -2057,7 +2053,7 @@ describe('Parse.User testing', () => { }); }); - it('test parse user become', (done) => { + it_exclude_dbs(['postgres'])('test parse user become', (done) => { var sessionToken = null; Parse.Promise.as().then(function() { return Parse.User.signUp("flessard", "folo",{'foo':1}); @@ -2110,7 +2106,7 @@ describe('Parse.User testing', () => { }); }); - it("session expiresAt correct format", (done) => { + it_exclude_dbs(['postgres'])("session expiresAt correct format", (done) => { Parse.User.signUp("asdf", "zxcv", null, { success: function(user) { request.get({ @@ -2128,7 +2124,7 @@ describe('Parse.User testing', () => { }); }); - it('should cleanup null authData keys (regression test for #935)', (done) => { + it_exclude_dbs(['postgres'])('should cleanup null authData keys (regression test for #935)', (done) => { let database = new Config(Parse.applicationId).database; database.create('_User', { username: 'user', @@ -2258,7 +2254,7 @@ describe('Parse.User testing', () => { }); - it('should fail to become user with expired token', (done) => { + it_exclude_dbs(['postgres'])('should fail to become user with expired token', (done) => { let token; Parse.User.signUp("auser", "somepass", null) .then(user => rp({ @@ -2323,7 +2319,7 @@ describe('Parse.User testing', () => { }); }); - it('should not overwrite username when unlinking facebook user (regression test for #1532)', done => { + it_exclude_dbs(['postgres'])('should not overwrite username when unlinking facebook user (regression test for #1532)', done => { Parse.Object.disableSingleInstance(); var provider = getMockFacebookProvider(); Parse.User._registerAuthenticationProvider(provider); @@ -2343,9 +2339,9 @@ describe('Parse.User testing', () => { done(); }); }, - error: e => { + error: error => { fail('Unexpected failure testing linking'); - fail(error); + fail(JSON.stringify(error)); done(); } })) @@ -2356,7 +2352,7 @@ describe('Parse.User testing', () => { }); }); - it('should revoke sessions when converting anonymous user to "normal" user', done => { + it_exclude_dbs(['postgres'])('should revoke sessions when converting anonymous user to "normal" user', done => { request.post({ url: 'http://localhost:8378/1/classes/_User', headers: { @@ -2385,7 +2381,7 @@ describe('Parse.User testing', () => { }); }); - it('should not revoke session tokens if the server is configures to not revoke session tokens', done => { + it_exclude_dbs(['postgres'])('should not revoke session tokens if the server is configures to not revoke session tokens', done => { reconfigureServer({ revokeSessionOnPasswordReset: false }) .then(() => { request.post({ diff --git a/spec/PointerPermissions.spec.js b/spec/PointerPermissions.spec.js index 4ac5f8c880..ece6d3a17b 100644 --- a/spec/PointerPermissions.spec.js +++ b/spec/PointerPermissions.spec.js @@ -4,7 +4,7 @@ var Schema = require('../src/Controllers/SchemaController'); var Config = require('../src/Config'); describe('Pointer Permissions', () => { - it('should work with find', (done) => { + it_exclude_dbs(['postgres'])('should work with find', (done) => { let config = new Config(Parse.applicationId); let user = new Parse.User(); let user2 = new Parse.User(); @@ -43,7 +43,7 @@ describe('Pointer Permissions', () => { }); - it('should work with write', (done) => { + it_exclude_dbs(['postgres'])('should work with write', (done) => { let config = new Config(Parse.applicationId); let user = new Parse.User(); let user2 = new Parse.User(); @@ -108,7 +108,7 @@ describe('Pointer Permissions', () => { }) }); - it('should let a proper user find', (done) => { + it_exclude_dbs(['postgres'])('should let a proper user find', (done) => { let config = new Config(Parse.applicationId); let user = new Parse.User(); let user2 = new Parse.User(); @@ -168,7 +168,7 @@ describe('Pointer Permissions', () => { }) }); - it('should not allow creating objects', (done) => { + it_exclude_dbs(['postgres'])('should not allow creating objects', (done) => { let config = new Config(Parse.applicationId); let user = new Parse.User(); user.set({ @@ -194,7 +194,7 @@ describe('Pointer Permissions', () => { }) }); - it('should handle multiple writeUserFields', done => { + it_exclude_dbs(['postgres'])('should handle multiple writeUserFields', done => { let config = new Config(Parse.applicationId); let user = new Parse.User(); let user2 = new Parse.User(); @@ -276,7 +276,7 @@ describe('Pointer Permissions', () => { }) }); - it('tests CLP / Pointer Perms / ACL write (PP Locked)', (done) => { + it_exclude_dbs(['postgres'])('tests CLP / Pointer Perms / ACL write (PP Locked)', (done) => { /* tests: CLP: update closed ({}) @@ -323,7 +323,7 @@ describe('Pointer Permissions', () => { }); }); - it('tests CLP / Pointer Perms / ACL write (ACL Locked)', (done) => { + it_exclude_dbs(['postgres'])('tests CLP / Pointer Perms / ACL write (ACL Locked)', (done) => { /* tests: CLP: update closed ({}) @@ -368,7 +368,7 @@ describe('Pointer Permissions', () => { }); }); - it('tests CLP / Pointer Perms / ACL write (ACL/PP OK)', (done) => { + it_exclude_dbs(['postgres'])('tests CLP / Pointer Perms / ACL write (ACL/PP OK)', (done) => { /* tests: CLP: update closed ({}) @@ -413,7 +413,7 @@ describe('Pointer Permissions', () => { }); }); - it('tests CLP / Pointer Perms / ACL read (PP locked)', (done) => { + it_exclude_dbs(['postgres'])('tests CLP / Pointer Perms / ACL read (PP locked)', (done) => { /* tests: CLP: find/get open ({}) @@ -460,7 +460,7 @@ describe('Pointer Permissions', () => { }); }); - it('tests CLP / Pointer Perms / ACL read (PP/ACL OK)', (done) => { + it_exclude_dbs(['postgres'])('tests CLP / Pointer Perms / ACL read (PP/ACL OK)', (done) => { /* tests: CLP: find/get open ({"*": true}) @@ -507,7 +507,7 @@ describe('Pointer Permissions', () => { }); }); - it('tests CLP / Pointer Perms / ACL read (ACL locked)', (done) => { + it_exclude_dbs(['postgres'])('tests CLP / Pointer Perms / ACL read (ACL locked)', (done) => { /* tests: CLP: find/get open ({"*": true}) @@ -552,7 +552,7 @@ describe('Pointer Permissions', () => { }); }); - it('should let master key find objects', (done) => { + it_exclude_dbs(['postgres'])('should let master key find objects', (done) => { let config = new Config(Parse.applicationId); let user = new Parse.User(); let object = new Parse.Object('AnObject'); @@ -582,7 +582,7 @@ describe('Pointer Permissions', () => { }) }); - it('should let master key get objects', (done) => { + it_exclude_dbs(['postgres'])('should let master key get objects', (done) => { let config = new Config(Parse.applicationId); let user = new Parse.User(); let object = new Parse.Object('AnObject'); @@ -614,7 +614,7 @@ describe('Pointer Permissions', () => { }); - it('should let master key update objects', (done) => { + it_exclude_dbs(['postgres'])('should let master key update objects', (done) => { let config = new Config(Parse.applicationId); let user = new Parse.User(); let object = new Parse.Object('AnObject'); @@ -642,7 +642,7 @@ describe('Pointer Permissions', () => { }) }); - it('should let master key delete objects', (done) => { + it_exclude_dbs(['postgres'])('should let master key delete objects', (done) => { let config = new Config(Parse.applicationId); let user = new Parse.User(); let object = new Parse.Object('AnObject'); @@ -690,5 +690,4 @@ describe('Pointer Permissions', () => { done(); }); }) - }); diff --git a/spec/PromiseRouter.spec.js b/spec/PromiseRouter.spec.js index 999325ac4e..5ba68681e4 100644 --- a/spec/PromiseRouter.spec.js +++ b/spec/PromiseRouter.spec.js @@ -1,7 +1,6 @@ var PromiseRouter = require("../src/PromiseRouter").default; describe("PromiseRouter", () => { - it("should properly handle rejects", (done) => { var router = new PromiseRouter(); router.route("GET", "/dummy", (req)=> { @@ -12,7 +11,7 @@ describe("PromiseRouter", () => { }, (req) => { fail("this should not be called"); }); - + router.routes[0].handler({}).then((result) => { console.error(result); fail("this should not be called"); @@ -23,4 +22,4 @@ describe("PromiseRouter", () => { done(); }); }); -}) \ No newline at end of file +}) diff --git a/spec/PublicAPI.spec.js b/spec/PublicAPI.spec.js index 26b54438bb..07853157cc 100644 --- a/spec/PublicAPI.spec.js +++ b/spec/PublicAPI.spec.js @@ -38,7 +38,7 @@ describe("public API", () => { }); describe("public API without publicServerURL", () => { - beforeEach(done => { + beforeEach(done => { reconfigureServer({ appName: 'unused' }) .then(done, fail); }) diff --git a/spec/PurchaseValidation.spec.js b/spec/PurchaseValidation.spec.js index a49374f8c1..cfd776d234 100644 --- a/spec/PurchaseValidation.spec.js +++ b/spec/PurchaseValidation.spec.js @@ -1,7 +1,5 @@ var request = require("request"); - - function createProduct() { const file = new Parse.File("name", { base64: new Buffer("download_file", "utf-8").toString("base64") @@ -9,7 +7,7 @@ function createProduct() { return file.save().then(function(){ var product = new Parse.Object("_Product"); product.set({ - download: file, + download: file, icon: file, title: "a product", subtitle: "a product", @@ -18,21 +16,19 @@ function createProduct() { }) return product.save(); }) - -} +} describe("test validate_receipt endpoint", () => { - beforeEach( done => { createProduct().then(done).fail(function(err){ console.error(err); done(); }) }) - - it("should bypass appstore validation", (done) => { - + + it_exclude_dbs(['postgres'])("should bypass appstore validation", (done) => { + request.post({ headers: { 'X-Parse-Application-Id': 'test', @@ -40,7 +36,7 @@ describe("test validate_receipt endpoint", () => { url: 'http://localhost:8378/1/validate_purchase', json: true, body: { - productIdentifier: "a-product", + productIdentifier: "a-product", receipt: { __type: "Bytes", base64: new Buffer("receipt", "utf-8").toString("base64") @@ -63,7 +59,7 @@ describe("test validate_receipt endpoint", () => { } }); }); - + it("should fail for missing receipt", (done) => { request.post({ headers: { @@ -72,7 +68,7 @@ describe("test validate_receipt endpoint", () => { url: 'http://localhost:8378/1/validate_purchase', json: true, body: { - productIdentifier: "a-product", + productIdentifier: "a-product", bypassAppStoreValidation: true } }, function(err, res, body){ @@ -85,7 +81,7 @@ describe("test validate_receipt endpoint", () => { } }); }); - + it("should fail for missing product identifier", (done) => { request.post({ headers: { @@ -110,9 +106,9 @@ describe("test validate_receipt endpoint", () => { } }); }); - + it("should bypass appstore validation and not find product", (done) => { - + request.post({ headers: { 'X-Parse-Application-Id': 'test', @@ -120,7 +116,7 @@ describe("test validate_receipt endpoint", () => { url: 'http://localhost:8378/1/validate_purchase', json: true, body: { - productIdentifier: "another-product", + productIdentifier: "another-product", receipt: { __type: "Bytes", base64: new Buffer("receipt", "utf-8").toString("base64") @@ -138,9 +134,9 @@ describe("test validate_receipt endpoint", () => { } }); }); - + it("should fail at appstore validation", (done) => { - + request.post({ headers: { 'X-Parse-Application-Id': 'test', @@ -148,7 +144,7 @@ describe("test validate_receipt endpoint", () => { url: 'http://localhost:8378/1/validate_purchase', json: true, body: { - productIdentifier: "a-product", + productIdentifier: "a-product", receipt: { __type: "Bytes", base64: new Buffer("receipt", "utf-8").toString("base64") @@ -164,8 +160,8 @@ describe("test validate_receipt endpoint", () => { done(); }); }); - - it("should not create a _Product", (done) => { + + it_exclude_dbs(['postgres'])("should not create a _Product", (done) => { var product = new Parse.Object("_Product"); product.save().then(function(){ fail("Should not be able to save"); @@ -175,8 +171,8 @@ describe("test validate_receipt endpoint", () => { done(); }) }); - - it("should be able to update a _Product", (done) => { + + it_exclude_dbs(['postgres'])("should be able to update a _Product", (done) => { var query = new Parse.Query("_Product"); query.first().then(function(product){ product.set("title", "a new title"); @@ -190,8 +186,8 @@ describe("test validate_receipt endpoint", () => { done(); }); }); - - it("should not be able to remove a require key in a _Product", (done) => { + + it_exclude_dbs(['postgres'])("should not be able to remove a require key in a _Product", (done) => { var query = new Parse.Query("_Product"); query.first().then(function(product){ product.unset("title"); @@ -205,5 +201,4 @@ describe("test validate_receipt endpoint", () => { done(); }); }); - }); diff --git a/spec/PushController.spec.js b/spec/PushController.spec.js index fca23850a3..344ffcfd85 100644 --- a/spec/PushController.spec.js +++ b/spec/PushController.spec.js @@ -130,7 +130,7 @@ describe('PushController', () => { done(); }); - it('properly increment badges', (done) => { + it_exclude_dbs(['postgres'])('properly increment badges', (done) => { var payload = {data:{ alert: "Hello World!", @@ -190,7 +190,7 @@ describe('PushController', () => { }); - it('properly set badges to 1', (done) => { + it_exclude_dbs(['postgres'])('properly set badges to 1', (done) => { var payload = {data: { alert: "Hello World!", @@ -238,7 +238,7 @@ describe('PushController', () => { }); - it('properly creates _PushStatus', (done) => { + it_exclude_dbs(['postgres'])('properly creates _PushStatus', (done) => { var installations = []; while(installations.length != 10) { @@ -318,7 +318,7 @@ describe('PushController', () => { }); - it('should properly report failures in _PushStatus', (done) => { + it_exclude_dbs(['postgres'])('should properly report failures in _PushStatus', (done) => { var pushAdapter = { send: function(body, installations) { return installations.map((installation) => { @@ -357,7 +357,7 @@ describe('PushController', () => { }) }); - it('should support full RESTQuery for increment', (done) => { + it_exclude_dbs(['postgres'])('should support full RESTQuery for increment', (done) => { var payload = {data: { alert: "Hello World!", badge: 'Increment', diff --git a/spec/PushRouter.spec.js b/spec/PushRouter.spec.js index 9be3137a7a..7b30ecfd45 100644 --- a/spec/PushRouter.spec.js +++ b/spec/PushRouter.spec.js @@ -68,7 +68,7 @@ describe('PushRouter', () => { done(); }); - it('sends a push through REST', (done) => { + it_exclude_dbs(['postgres'])('sends a push through REST', (done) => { request.post({ url: Parse.serverURL+"/push", json: true, diff --git a/spec/RestCreate.spec.js b/spec/RestCreate.spec.js index 0bd51aa683..b6015c5070 100644 --- a/spec/RestCreate.spec.js +++ b/spec/RestCreate.spec.js @@ -11,7 +11,7 @@ var config = new Config('test'); let database = config.database; describe('rest create', () => { - it('handles _id', done => { + it_exclude_dbs(['postgres'])('handles _id', done => { rest.create(config, auth.nobody(config), 'Foo', {}) .then(() => database.adapter.find('Foo', { fields: {} }, {}, {})) .then(results => { @@ -23,7 +23,7 @@ describe('rest create', () => { }); }); - it('handles array, object, date', (done) => { + it_exclude_dbs(['postgres'])('handles array, object, date', (done) => { let now = new Date(); var obj = { array: [1, 2, 3], @@ -47,7 +47,7 @@ describe('rest create', () => { }); }); - it('handles object and subdocument', done => { + it_exclude_dbs(['postgres'])('handles object and subdocument', done => { let obj = { subdoc: {foo: 'bar', wu: 'tan'} }; rest.create(config, auth.nobody(config), 'MyClass', obj) .then(() => database.adapter.find('MyClass', { fields: {} }, {}, {})) @@ -77,7 +77,7 @@ describe('rest create', () => { }); }); - it('handles create on non-existent class when disabled client class creation', (done) => { + it_exclude_dbs(['postgres'])('handles create on non-existent class when disabled client class creation', (done) => { var customConfig = Object.assign({}, config, {allowClientClassCreation: false}); rest.create(customConfig, auth.nobody(customConfig), 'ClientClassCreation', {}) .then(() => { @@ -91,7 +91,7 @@ describe('rest create', () => { }); }); - it('handles create on existent class when disabled client class creation', (done) => { + it_exclude_dbs(['postgres'])('handles create on existent class when disabled client class creation', (done) => { var customConfig = Object.assign({}, config, {allowClientClassCreation: false}); config.database.loadSchema() .then(schema => schema.addClassIfNotExists('ClientClassCreation', {})) @@ -122,7 +122,7 @@ describe('rest create', () => { }); }); - it('handles anonymous user signup', (done) => { + it_exclude_dbs(['postgres'])('handles anonymous user signup', (done) => { var data1 = { authData: { anonymous: { @@ -166,7 +166,7 @@ describe('rest create', () => { }); }); - it('handles anonymous user signup and upgrade to new user', (done) => { + it_exclude_dbs(['postgres'])('handles anonymous user signup and upgrade to new user', (done) => { var data1 = { authData: { anonymous: { @@ -226,7 +226,7 @@ describe('rest create', () => { }) }); - it('test facebook signup and login', (done) => { + it_exclude_dbs(['postgres'])('test facebook signup and login', (done) => { var data = { authData: { facebook: { @@ -259,7 +259,7 @@ describe('rest create', () => { }); }); - it('stores pointers', done => { + it_exclude_dbs(['postgres'])('stores pointers', done => { let obj = { foo: 'bar', aPointer: { @@ -309,7 +309,7 @@ describe('rest create', () => { }); }); - it("test default session length", (done) => { + it_exclude_dbs(['postgres'])("test default session length", (done) => { var user = { username: 'asdf', password: 'zxcv', @@ -342,7 +342,7 @@ describe('rest create', () => { }); }); - it("test specified session length", (done) => { + it_exclude_dbs(['postgres'])("test specified session length", (done) => { var user = { username: 'asdf', password: 'zxcv', @@ -378,7 +378,7 @@ describe('rest create', () => { }); }); - it("can create a session with no expiration", (done) => { + it_exclude_dbs(['postgres'])("can create a session with no expiration", (done) => { var user = { username: 'asdf', password: 'zxcv', diff --git a/spec/RestQuery.spec.js b/spec/RestQuery.spec.js index a0e49b8ee1..e5cc911897 100644 --- a/spec/RestQuery.spec.js +++ b/spec/RestQuery.spec.js @@ -37,42 +37,38 @@ describe('rest query', () => { }); }); - describe('query for user w/ legacy credentials', () => { - var data = { - username: 'blah', - password: 'pass', - sessionToken: 'abc123', - } - describe('without masterKey', () => { - it('has them stripped from results', (done) => { - database.create('_User', data).then(() => { - return rest.find(config, nobody, '_User') - }).then((result) => { - var user = result.results[0]; - expect(user.username).toEqual('blah'); - expect(user.sessionToken).toBeUndefined(); - expect(user.password).toBeUndefined(); - done(); - }); - }); + var data = { + username: 'blah', + password: 'pass', + sessionToken: 'abc123', + } + + it_exclude_dbs(['postgres'])('query for user w/ legacy credentials without masterKey has them stripped from results', done => { + database.create('_User', data).then(() => { + return rest.find(config, nobody, '_User') + }).then((result) => { + var user = result.results[0]; + expect(user.username).toEqual('blah'); + expect(user.sessionToken).toBeUndefined(); + expect(user.password).toBeUndefined(); + done(); }); - describe('with masterKey', () => { - it('has them stripped from results', (done) => { - database.create('_User', data).then(() => { - return rest.find(config, {isMaster: true}, '_User') - }).then((result) => { - var user = result.results[0]; - expect(user.username).toEqual('blah'); - expect(user.sessionToken).toBeUndefined(); - expect(user.password).toBeUndefined(); - done(); - }); - }); + }); + + it_exclude_dbs(['postgres'])('query for user w/ legacy credentials with masterKey has them stripped from results', done => { + database.create('_User', data).then(() => { + return rest.find(config, {isMaster: true}, '_User') + }).then((result) => { + var user = result.results[0]; + expect(user.username).toEqual('blah'); + expect(user.sessionToken).toBeUndefined(); + expect(user.password).toBeUndefined(); + done(); }); }); // Created to test a scenario in AnyPic - it('query with include', (done) => { + it_exclude_dbs(['postgres'])('query with include', (done) => { var photo = { foo: 'bar' }; @@ -131,7 +127,7 @@ describe('rest query', () => { }).catch((error) => { console.log(error); }); }); - it('query non-existent class when disabled client class creation', (done) => { + it_exclude_dbs(['postgres'])('query non-existent class when disabled client class creation', (done) => { var customConfig = Object.assign({}, config, {allowClientClassCreation: false}); rest.find(customConfig, auth.nobody(customConfig), 'ClientClassCreation', {}) .then(() => { @@ -145,7 +141,7 @@ describe('rest query', () => { }); }); - it('query existent class when disabled client class creation', (done) => { + it_exclude_dbs(['postgres'])('query existent class when disabled client class creation', (done) => { var customConfig = Object.assign({}, config, {allowClientClassCreation: false}); config.database.loadSchema() .then(schema => schema.addClassIfNotExists('ClientClassCreation', {})) @@ -218,7 +214,7 @@ describe('rest query', () => { }); }); - it('query with limit = 0 and count = 1', (done) => { + it_exclude_dbs(['postgres'])('query with limit = 0 and count = 1', (done) => { rest.create(config, nobody, 'TestObject', {foo: 'baz'} ).then(() => { return rest.create(config, nobody, @@ -232,5 +228,4 @@ describe('rest query', () => { done(); }); }); - }); diff --git a/spec/Schema.spec.js b/spec/Schema.spec.js index 8ea9bbafeb..0a6b17b3ea 100644 --- a/spec/Schema.spec.js +++ b/spec/Schema.spec.js @@ -95,7 +95,7 @@ describe('SchemaController', () => { }); }); - it('class-level permissions test user', (done) => { + it_exclude_dbs(['postgres'])('class-level permissions test user', (done) => { var user; createTestUser().then((u) => { user = u; @@ -120,7 +120,7 @@ describe('SchemaController', () => { }); }); - it('class-level permissions test get', (done) => { + it_exclude_dbs(['postgres'])('class-level permissions test get', (done) => { var obj; createTestUser() .then(user => { @@ -159,7 +159,7 @@ describe('SchemaController', () => { }); }); - it('can add classes without needing an object', done => { + it_exclude_dbs(['postgres'])('can add classes without needing an object', done => { config.database.loadSchema() .then(schema => schema.addClassIfNotExists('NewClass', { foo: {type: 'String'} @@ -207,7 +207,7 @@ describe('SchemaController', () => { }); }); - it('will resolve class creation races appropriately', done => { + it_exclude_dbs(['postgres'])('will resolve class creation races appropriately', done => { // If two callers race to create the same schema, the response to the // race loser should be the same as if they hadn't been racing. config.database.loadSchema() @@ -384,7 +384,7 @@ describe('SchemaController', () => { }); }); - it('will create classes', done => { + it_exclude_dbs(['postgres'])('will create classes', done => { config.database.loadSchema() .then(schema => schema.addClassIfNotExists('NewClass', { aNumber: {type: 'Number'}, @@ -432,7 +432,7 @@ describe('SchemaController', () => { }); }); - it('creates the default fields for non-custom classes', done => { + it_exclude_dbs(['postgres'])('creates the default fields for non-custom classes', done => { config.database.loadSchema() .then(schema => schema.addClassIfNotExists('_Installation', { foo: {type: 'Number'}, @@ -474,7 +474,7 @@ describe('SchemaController', () => { }); }); - it('creates non-custom classes which include relation field', done => { + it_exclude_dbs(['postgres'])('creates non-custom classes which include relation field', done => { config.database.loadSchema() .then(schema => schema.addClassIfNotExists('_Role', {})) .then(actualSchema => { @@ -503,7 +503,7 @@ describe('SchemaController', () => { }); }); - it('creates non-custom classes which include pointer field', done => { + it_exclude_dbs(['postgres'])('creates non-custom classes which include pointer field', done => { config.database.loadSchema() .then(schema => schema.addClassIfNotExists('_Session', {})) .then(actualSchema => { @@ -548,7 +548,7 @@ describe('SchemaController', () => { }); }); - it('can check if a class exists', done => { + it_exclude_dbs(['postgres'])('can check if a class exists', done => { config.database.loadSchema() .then(schema => { return schema.addClassIfNotExists('NewClass', {}) @@ -613,7 +613,7 @@ describe('SchemaController', () => { }); }); - it('refuses to delete fields that dont exist', done => { + it_exclude_dbs(['postgres'])('refuses to delete fields that dont exist', done => { hasAllPODobject().save() .then(() => config.database.loadSchema()) .then(schema => schema.deleteField('missingField', 'HasAllPOD')) @@ -624,7 +624,7 @@ describe('SchemaController', () => { }); }); - it('drops related collection when deleting relation field', done => { + it_exclude_dbs(['postgres'])('drops related collection when deleting relation field', done => { var obj1 = hasAllPODobject(); obj1.save() .then(savedObj1 => { @@ -655,7 +655,7 @@ describe('SchemaController', () => { }); }); - it('can delete relation field when related _Join collection not exist', done => { + it_exclude_dbs(['postgres'])('can delete relation field when related _Join collection not exist', done => { config.database.loadSchema() .then(schema => { schema.addClassIfNotExists('NewClass', { @@ -701,7 +701,7 @@ describe('SchemaController', () => { }); }); - it('can delete string fields and resave as number field', done => { + it_exclude_dbs(['postgres'])('can delete string fields and resave as number field', done => { Parse.Object.disableSingleInstance(); var obj1 = hasAllPODobject(); var obj2 = hasAllPODobject(); @@ -729,7 +729,7 @@ describe('SchemaController', () => { }); }); - it('can delete pointer fields and resave as string', done => { + it_exclude_dbs(['postgres'])('can delete pointer fields and resave as string', done => { Parse.Object.disableSingleInstance(); var obj1 = new Parse.Object('NewClass'); obj1.save() diff --git a/spec/Uniqueness.spec.js b/spec/Uniqueness.spec.js index 129ec07599..43f130855e 100644 --- a/spec/Uniqueness.spec.js +++ b/spec/Uniqueness.spec.js @@ -26,7 +26,7 @@ describe('Uniqueness', function() { }); }); - it('unique indexing works on pointer fields', done => { + it_exclude_dbs(['postgres'])('unique indexing works on pointer fields', done => { let obj = new Parse.Object('UniquePointer'); obj.save({ string: 'who cares' }) .then(() => obj.save({ ptr: obj })) @@ -52,7 +52,7 @@ describe('Uniqueness', function() { }); }); - it('fails when attempting to ensure uniqueness of fields that are not currently unique', done => { + it_exclude_dbs(['postgres'])('fails when attempting to ensure uniqueness of fields that are not currently unique', done => { let o1 = new Parse.Object('UniqueFail'); o1.set('key', 'val'); let o2 = new Parse.Object('UniqueFail'); @@ -68,7 +68,7 @@ describe('Uniqueness', function() { }); }); - it('can do compound uniqueness', done => { + it_exclude_dbs(['postgres'])('can do compound uniqueness', done => { let config = new Config('test'); config.database.adapter.ensureUniqueness('CompoundUnique', { fields: { k1: { __type: 'String' }, k2: { __type: 'String' } } }, ['k1', 'k2']) .then(() => { diff --git a/spec/ValidationAndPasswordsReset.spec.js b/spec/ValidationAndPasswordsReset.spec.js index f529dcd0a2..9c55748938 100644 --- a/spec/ValidationAndPasswordsReset.spec.js +++ b/spec/ValidationAndPasswordsReset.spec.js @@ -4,7 +4,7 @@ let MockEmailAdapterWithOptions = require('./MockEmailAdapterWithOptions'); let request = require('request'); let Config = require("../src/Config"); -describe("Custom Pages Configuration", () => { +describe("Custom Pages, Email Verification, Password Reset", () => { it("should set the custom pages", (done) => { reconfigureServer({ appName: 'unused', @@ -27,10 +27,8 @@ describe("Custom Pages Configuration", () => { done(); }); }); -}); -describe("Email Verification", () => { - it('sends verification email if email verification is enabled', done => { + it_exclude_dbs(['postgres'])('sends verification email if email verification is enabled', done => { var emailAdapter = { sendVerificationEmail: () => Promise.resolve(), sendPasswordResetEmail: () => Promise.resolve(), @@ -99,7 +97,7 @@ describe("Email Verification", () => { }); }); - it('does send a validation email when updating the email', done => { + it_exclude_dbs(['postgres'])('does send a validation email when updating the email', done => { var emailAdapter = { sendVerificationEmail: () => Promise.resolve(), sendPasswordResetEmail: () => Promise.resolve(), @@ -142,7 +140,7 @@ describe("Email Verification", () => { }); }); - it('does send a validation email with valid verification link when updating the email', done => { + it_exclude_dbs(['postgres'])('does send a validation email with valid verification link when updating the email', done => { var emailAdapter = { sendVerificationEmail: () => Promise.resolve(), sendPasswordResetEmail: () => Promise.resolve(), @@ -189,7 +187,7 @@ describe("Email Verification", () => { }); }); - it('does send with a simple adapter', done => { + it_exclude_dbs(['postgres'])('does send with a simple adapter', done => { var calls = 0; var emailAdapter = { sendMail: function(options){ @@ -240,7 +238,7 @@ describe("Email Verification", () => { }); }); - it('fails if you include an emailAdapter, set verifyUserEmails to false, dont set a publicServerURL, and try to send a password reset email (regression test for #1649)', done => { + it_exclude_dbs(['postgres'])('fails if you include an emailAdapter, set verifyUserEmails to false, dont set a publicServerURL, and try to send a password reset email (regression test for #1649)', done => { reconfigureServer({ appName: 'unused', verifyUserEmails: false, @@ -305,7 +303,7 @@ describe("Email Verification", () => { }); }); - it('receives the app name and user in the adapter', done => { + it_exclude_dbs(['postgres'])('receives the app name and user in the adapter', done => { var emailAdapter = { sendVerificationEmail: options => { expect(options.appName).toEqual('emailing app'); @@ -336,7 +334,7 @@ describe("Email Verification", () => { }); }) - it('when you click the link in the email it sets emailVerified to true and redirects you', done => { + it_exclude_dbs(['postgres'])('when you click the link in the email it sets emailVerified to true and redirects you', done => { var user = new Parse.User(); var emailAdapter = { sendVerificationEmail: options => { @@ -417,7 +415,7 @@ describe("Email Verification", () => { }); }); - it('does not update email verified if you use an invalid token', done => { + it_exclude_dbs(['postgres'])('does not update email verified if you use an invalid token', done => { var user = new Parse.User(); var emailAdapter = { sendVerificationEmail: options => { @@ -455,11 +453,8 @@ describe("Email Verification", () => { }); }); }); -}); -describe("Password Reset", () => { - - it('should send a password reset link', done => { + it_exclude_dbs(['postgres'])('should send a password reset link', done => { var user = new Parse.User(); var emailAdapter = { sendVerificationEmail: () => Promise.resolve(), @@ -524,7 +519,7 @@ describe("Password Reset", () => { }); }); - it('should programatically reset password', done => { + it_exclude_dbs(['postgres'])('should programatically reset password', done => { var user = new Parse.User(); var emailAdapter = { sendVerificationEmail: () => Promise.resolve(), diff --git a/spec/helper.js b/spec/helper.js index 48b5b9ba8e..3880caae5f 100644 --- a/spec/helper.js +++ b/spec/helper.js @@ -202,9 +202,6 @@ function createTestUser(success, error) { } } -// Mark the tests that are known to not work. -function notWorking() {} - // Shims for compatibility with the old qunit tests. function ok(bool, message) { expect(bool).toBeTruthy(message); @@ -303,6 +300,8 @@ function mockFacebook() { return facebook; } + + // This is polluting, but, it makes it way easier to directly port old tests. global.Parse = Parse; global.TestObject = TestObject; @@ -310,7 +309,6 @@ global.Item = Item; global.Container = Container; global.create = create; global.createTestUser = createTestUser; -global.notWorking = notWorking; global.ok = ok; global.equal = equal; global.strictEqual = strictEqual; @@ -323,6 +321,14 @@ global.range = range; global.reconfigureServer = reconfigureServer; global.defaultConfiguration = defaultConfiguration; +global.it_exclude_dbs = excluded => { + if (excluded.includes(process.env.PARSE_SERVER_TEST_DB)) { + return xit; + } else { + return it; + } +} + // LiveQuery test setting require('../src/LiveQuery/PLog').logLevel = 'NONE'; var libraryCache = {}; diff --git a/spec/index.spec.js b/spec/index.spec.js index b368dccb3e..b3374d4b50 100644 --- a/spec/index.spec.js +++ b/spec/index.spec.js @@ -9,7 +9,7 @@ var express = require('express'); const MongoStorageAdapter = require('../src/Adapters/Storage/Mongo/MongoStorageAdapter'); describe('server', () => { - it('requires a master key and app id', done => { + it_exclude_dbs(['postgres'])('requires a master key and app id', done => { reconfigureServer({ appId: undefined }) .catch(error => { expect(error).toEqual('You must provide an appId!'); @@ -25,7 +25,7 @@ describe('server', () => { }); }); - it('support http basic authentication with masterkey', done => { + it_exclude_dbs(['postgres'])('support http basic authentication with masterkey', done => { request.get({ url: 'http://localhost:8378/1/classes/TestObject', headers: { @@ -37,7 +37,7 @@ describe('server', () => { }); }); - it('support http basic authentication with javascriptKey', done => { + it_exclude_dbs(['postgres'])('support http basic authentication with javascriptKey', done => { request.get({ url: 'http://localhost:8378/1/classes/TestObject', headers: { @@ -49,7 +49,7 @@ describe('server', () => { }); }); - it('fails if database is unreachable', done => { + it_exclude_dbs(['postgres'])('fails if database is unreachable', done => { reconfigureServer({ databaseAdapter: new MongoStorageAdapter({ uri: 'mongodb://fake:fake@localhost:43605/drew3' }) }) .catch(() => { //Need to use rest api because saving via JS SDK results in fail() not getting called @@ -70,7 +70,7 @@ describe('server', () => { }); }); - it('can load email adapter via object', done => { + it_exclude_dbs(['postgres'])('can load email adapter via object', done => { reconfigureServer({ appName: 'unused', verifyUserEmails: true, @@ -83,7 +83,7 @@ describe('server', () => { }).then(done, fail); }); - it('can load email adapter via class', done => { + it_exclude_dbs(['postgres'])('can load email adapter via class', done => { reconfigureServer({ appName: 'unused', verifyUserEmails: true, @@ -99,7 +99,7 @@ describe('server', () => { }).then(done, fail); }); - it('can load email adapter via module name', done => { + it_exclude_dbs(['postgres'])('can load email adapter via module name', done => { reconfigureServer({ appName: 'unused', verifyUserEmails: true, @@ -115,7 +115,7 @@ describe('server', () => { }).then(done, fail); }); - it('can load email adapter via only module name', done => { + it_exclude_dbs(['postgres'])('can load email adapter via only module name', done => { reconfigureServer({ appName: 'unused', verifyUserEmails: true, @@ -128,7 +128,7 @@ describe('server', () => { }); }); - it('throws if you initialize email adapter incorrecly', done => { + it_exclude_dbs(['postgres'])('throws if you initialize email adapter incorrecly', done => { reconfigureServer({ appName: 'unused', verifyUserEmails: true, @@ -146,7 +146,7 @@ describe('server', () => { }); }); - it('can report the server version', done => { + it_exclude_dbs(['postgres'])('can report the server version', done => { request.get({ url: 'http://localhost:8378/1/serverInfo', headers: { @@ -160,7 +160,7 @@ describe('server', () => { }) }); - it('can create a parse-server v1', done => { + it_exclude_dbs(['postgres'])('can create a parse-server v1', done => { var parseServer = new ParseServer.default(Object.assign({}, defaultConfiguration, { appId: "aTestApp", @@ -191,7 +191,7 @@ describe('server', () => { ); }); - it('can create a parse-server v2', done => { + it_exclude_dbs(['postgres'])('can create a parse-server v2', done => { let objId; let server let parseServer = ParseServer.ParseServer(Object.assign({}, @@ -227,7 +227,7 @@ describe('server', () => { )); }); - it('has createLiveQueryServer', done => { + it_exclude_dbs(['postgres'])('has createLiveQueryServer', done => { // original implementation through the factory expect(typeof ParseServer.ParseServer.createLiveQueryServer).toEqual('function'); // For import calls @@ -235,14 +235,14 @@ describe('server', () => { done(); }); - it('core adapters are not exposed anymore', done => { + it_exclude_dbs(['postgres'])('core adapters are not exposed anymore', done => { expect(ParseServer.S3Adapter).toThrow(); expect(ParseServer.GCSAdapter).toThrow('GCSAdapter is not provided by parse-server anymore; please install parse-server-gcs-adapter'); expect(ParseServer.FileSystemAdapter).toThrow(); done(); }); - it('properly gives publicServerURL when set', done => { + it_exclude_dbs(['postgres'])('properly gives publicServerURL when set', done => { reconfigureServer({ publicServerURL: 'https://myserver.com/1' }) .then(() => { var config = new Config('test', 'http://localhost:8378/1'); @@ -251,7 +251,7 @@ describe('server', () => { }); }); - it('properly removes trailing slash in mount', done => { + it_exclude_dbs(['postgres'])('properly removes trailing slash in mount', done => { reconfigureServer({}) .then(() => { var config = new Config('test', 'http://localhost:8378/1/'); @@ -260,7 +260,7 @@ describe('server', () => { }); }); - it('should throw when getting invalid mount', done => { + it_exclude_dbs(['postgres'])('should throw when getting invalid mount', done => { reconfigureServer({ publicServerURL: 'blabla:/some' }) .catch(error => { expect(error).toEqual('publicServerURL should be a valid HTTPS URL starting with https://') @@ -268,7 +268,7 @@ describe('server', () => { }) }); - it('fails if the session length is not a number', done => { + it_exclude_dbs(['postgres'])('fails if the session length is not a number', done => { reconfigureServer({ sessionLength: 'test' }) .catch(error => { expect(error).toEqual('Session length must be a valid number.'); @@ -276,7 +276,7 @@ describe('server', () => { }); }); - it('fails if the session length is less than or equal to 0', done => { + it_exclude_dbs(['postgres'])('fails if the session length is less than or equal to 0', done => { reconfigureServer({ sessionLength: '-33' }) .catch(error => { expect(error).toEqual('Session length must be a value greater than 0.'); @@ -288,7 +288,7 @@ describe('server', () => { }); }); - it('ignores the session length when expireInactiveSessions set to false', (done) => { + it_exclude_dbs(['postgres'])('ignores the session length when expireInactiveSessions set to false', (done) => { reconfigureServer({ sessionLength: '-33', expireInactiveSessions: false @@ -300,7 +300,7 @@ describe('server', () => { .then(done); }) - it('fails if you try to set revokeSessionOnPasswordReset to non-boolean', done => { + it_exclude_dbs(['postgres'])('fails if you try to set revokeSessionOnPasswordReset to non-boolean', done => { reconfigureServer({ revokeSessionOnPasswordReset: 'non-bool' }) .catch(done); }); diff --git a/spec/schemas.spec.js b/spec/schemas.spec.js index ad386b114c..e1732156ce 100644 --- a/spec/schemas.spec.js +++ b/spec/schemas.spec.js @@ -154,7 +154,7 @@ describe('schemas', () => { }); }); - it('creates _User schema when server starts', done => { + it_exclude_dbs(['postgres'])('creates _User schema when server starts', done => { request.get({ url: 'http://localhost:8378/1/schemas', json: true, @@ -165,7 +165,7 @@ describe('schemas', () => { }); }); - it('responds with a list of schemas after creating objects', done => { + it_exclude_dbs(['postgres'])('responds with a list of schemas after creating objects', done => { var obj1 = hasAllPODobject(); obj1.save().then(savedObj1 => { var obj2 = new Parse.Object('HasPointersAndRelations'); @@ -188,7 +188,7 @@ describe('schemas', () => { }); }); - it('responds with a single schema', done => { + it_exclude_dbs(['postgres'])('responds with a single schema', done => { var obj = hasAllPODobject(); obj.save().then(() => { request.get({ @@ -202,7 +202,7 @@ describe('schemas', () => { }); }); - it('treats class names case sensitively', done => { + it_exclude_dbs(['postgres'])('treats class names case sensitively', done => { var obj = hasAllPODobject(); obj.save().then(() => { request.get({ @@ -312,7 +312,7 @@ describe('schemas', () => { }); }); - it('responds with all fields when you create a class', done => { + it_exclude_dbs(['postgres'])('responds with all fields when you create a class', done => { request.post({ url: 'http://localhost:8378/1/schemas', headers: masterKeyHeaders, @@ -341,7 +341,7 @@ describe('schemas', () => { }); }); - it('responds with all fields when getting incomplete schema', done => { + it_exclude_dbs(['postgres'])('responds with all fields when getting incomplete schema', done => { config.database.loadSchema() .then(schemaController => schemaController.addClassIfNotExists('_Installation', {}, defaultClassLevelPermissions)) .then(() => { @@ -382,7 +382,7 @@ describe('schemas', () => { }); }); - it('lets you specify class name in both places', done => { + it_exclude_dbs(['postgres'])('lets you specify class name in both places', done => { request.post({ url: 'http://localhost:8378/1/schemas/NewClass', headers: masterKeyHeaders, @@ -457,7 +457,7 @@ describe('schemas', () => { }); }); - it('refuses to put to existing fields, even if it would not be a change', done => { + it_exclude_dbs(['postgres'])('refuses to put to existing fields, even if it would not be a change', done => { var obj = hasAllPODobject(); obj.save() .then(() => { @@ -479,7 +479,7 @@ describe('schemas', () => { }) }); - it('refuses to delete non-existent fields', done => { + it_exclude_dbs(['postgres'])('refuses to delete non-existent fields', done => { var obj = hasAllPODobject(); obj.save() .then(() => { @@ -501,7 +501,7 @@ describe('schemas', () => { }); }); - it('refuses to add a geopoint to a class that already has one', done => { + it_exclude_dbs(['postgres'])('refuses to add a geopoint to a class that already has one', done => { var obj = hasAllPODobject(); obj.save() .then(() => { @@ -547,7 +547,7 @@ describe('schemas', () => { }); }); - it('allows you to delete and add a geopoint in the same request', done => { + it_exclude_dbs(['postgres'])('allows you to delete and add a geopoint in the same request', done => { var obj = new Parse.Object('NewClass'); obj.set('geo1', new Parse.GeoPoint({latitude: 0, longitude: 0})); obj.save() @@ -579,7 +579,7 @@ describe('schemas', () => { }) }); - it('put with no modifications returns all fields', done => { + it_exclude_dbs(['postgres'])('put with no modifications returns all fields', done => { var obj = hasAllPODobject(); obj.save() .then(() => { @@ -595,7 +595,7 @@ describe('schemas', () => { }) }); - it('lets you add fields', done => { + it_exclude_dbs(['postgres'])('lets you add fields', done => { request.post({ url: 'http://localhost:8378/1/schemas/NewClass', headers: masterKeyHeaders, @@ -645,7 +645,7 @@ describe('schemas', () => { }) }); - it('lets you add fields to system schema', done => { + it_exclude_dbs(['postgres'])('lets you add fields to system schema', done => { request.post({ url: 'http://localhost:8378/1/schemas/_User', headers: masterKeyHeaders, @@ -702,7 +702,7 @@ describe('schemas', () => { }) }); - it('lets you delete multiple fields and add fields', done => { + it_exclude_dbs(['postgres'])('lets you delete multiple fields and add fields', done => { var obj1 = hasAllPODobject(); obj1.save() .then(() => { @@ -752,7 +752,7 @@ describe('schemas', () => { }); }); - it('will not delete any fields if the additions are invalid', done => { + it_exclude_dbs(['postgres'])('will not delete any fields if the additions are invalid', done => { var obj = hasAllPODobject(); obj.save() .then(() => { @@ -793,7 +793,7 @@ describe('schemas', () => { }); }); - it('refuses to delete non-empty collection', done => { + it_exclude_dbs(['postgres'])('refuses to delete non-empty collection', done => { var obj = hasAllPODobject(); obj.save() .then(() => { @@ -824,7 +824,7 @@ describe('schemas', () => { }) }); - it('does not fail when deleting nonexistant collections', done => { + it_exclude_dbs(['postgres'])('does not fail when deleting nonexistant collections', done => { request.del({ url: 'http://localhost:8378/1/schemas/Missing', headers: masterKeyHeaders, @@ -836,7 +836,7 @@ describe('schemas', () => { }); }); - it('deletes collections including join tables', done => { + it_exclude_dbs(['postgres'])('deletes collections including join tables', done => { var obj = new Parse.Object('MyClass'); obj.set('data', 'data'); obj.save() @@ -887,7 +887,7 @@ describe('schemas', () => { }); }); - it('deletes schema when actual collection does not exist', done => { + it_exclude_dbs(['postgres'])('deletes schema when actual collection does not exist', done => { request.post({ url: 'http://localhost:8378/1/schemas/NewClassForDelete', headers: masterKeyHeaders, @@ -915,7 +915,7 @@ describe('schemas', () => { }); }); - it('deletes schema when actual collection exists', done => { + it_exclude_dbs(['postgres'])('deletes schema when actual collection exists', done => { request.post({ url: 'http://localhost:8378/1/schemas/NewClassForDelete', headers: masterKeyHeaders, @@ -958,7 +958,7 @@ describe('schemas', () => { }); }); - it('should set/get schema permissions', done => { + it_exclude_dbs(['postgres'])('should set/get schema permissions', done => { request.post({ url: 'http://localhost:8378/1/schemas/AClass', headers: masterKeyHeaders, @@ -1240,7 +1240,7 @@ describe('schemas', () => { }); } - it('validate CLP 1', done => { + it_exclude_dbs(['postgres'])('validate CLP 1', done => { let user = new Parse.User(); user.setUsername('user'); user.setPassword('user'); @@ -1289,7 +1289,7 @@ describe('schemas', () => { }) }); - it('validate CLP 2', done => { + it_exclude_dbs(['postgres'])('validate CLP 2', done => { let user = new Parse.User(); user.setUsername('user'); user.setPassword('user'); @@ -1354,7 +1354,7 @@ describe('schemas', () => { }) }); - it('validate CLP 3', done => { + it_exclude_dbs(['postgres'])('validate CLP 3', done => { let user = new Parse.User(); user.setUsername('user'); user.setPassword('user'); @@ -1412,7 +1412,7 @@ describe('schemas', () => { }); }); - it('validate CLP 4', done => { + it_exclude_dbs(['postgres'])('validate CLP 4', done => { let user = new Parse.User(); user.setUsername('user'); user.setPassword('user'); @@ -1480,7 +1480,7 @@ describe('schemas', () => { }) }); - it('validate CLP 5', done => { + it_exclude_dbs(['postgres'])('validate CLP 5', done => { let user = new Parse.User(); user.setUsername('user'); user.setPassword('user'); @@ -1562,7 +1562,7 @@ describe('schemas', () => { }); }); - it('can login when addFields is false (issue #1355)', (done) => { + it_exclude_dbs(['postgres'])('can login when addFields is false (issue #1355)', (done) => { setPermissionsOnClass('_User', { 'create': {'*': true}, 'addField': {} @@ -1577,7 +1577,7 @@ describe('schemas', () => { }) }) - it('gives correct response when deleting a schema with CLPs (regression test #1919)', done => { + it_exclude_dbs(['postgres'])('gives correct response when deleting a schema with CLPs (regression test #1919)', done => { new Parse.Object('MyClass').save({ data: 'foo'}) .then(obj => obj.destroy()) .then(() => setPermissionsOnClass('MyClass', { find: {}, get: {} }, true)) @@ -1594,7 +1594,7 @@ describe('schemas', () => { }); }); - it("regression test for #1991", done => { + it_exclude_dbs(['postgres'])("regression test for #1991", done => { let user = new Parse.User(); user.setUsername('user'); user.setPassword('user'); diff --git a/src/Adapters/Storage/Mongo/MongoSchemaCollection.js b/src/Adapters/Storage/Mongo/MongoSchemaCollection.js index 274d8c9423..12e0b14a41 100644 --- a/src/Adapters/Storage/Mongo/MongoSchemaCollection.js +++ b/src/Adapters/Storage/Mongo/MongoSchemaCollection.js @@ -72,19 +72,17 @@ function mongoSchemaToParseSchema(mongoSchema) { } function _mongoSchemaQueryFromNameQuery(name: string, query) { - return _mongoSchemaObjectFromNameFields(name, query); -} - -function _mongoSchemaObjectFromNameFields(name: string, fields) { let object = { _id: name }; - if (fields) { - Object.keys(fields).forEach(key => { - object[key] = fields[key]; + if (query) { + Object.keys(query).forEach(key => { + object[key] = query[key]; }); } return object; } + + // Returns a type suitable for inserting into mongo _SCHEMA collection. // Does no validation. That is expected to be done in Parse Server. function parseFieldTypeToMongoFieldType({ type, targetClass }) { @@ -102,33 +100,6 @@ function parseFieldTypeToMongoFieldType({ type, targetClass }) { } } -// Returns { code, error } if invalid, or { result }, an object -// suitable for inserting into _SCHEMA collection, otherwise. -function mongoSchemaFromFieldsAndClassNameAndCLP(fields, className, classLevelPermissions) { - - let mongoObject = { - _id: className, - objectId: 'string', - updatedAt: 'string', - createdAt: 'string' - }; - - for (let fieldName in fields) { - mongoObject[fieldName] = parseFieldTypeToMongoFieldType(fields[fieldName]); - } - - if (typeof classLevelPermissions !== 'undefined') { - mongoObject._metadata = mongoObject._metadata || {}; - if (!classLevelPermissions) { - delete mongoObject._metadata.class_permissions; - } else { - mongoObject._metadata.class_permissions = classLevelPermissions; - } - } - - return mongoObject; -} - class MongoSchemaCollection { _collection: MongoCollection; @@ -156,22 +127,6 @@ class MongoSchemaCollection { return this._collection._mongoCollection.findAndRemove(_mongoSchemaQueryFromNameQuery(name), []); } - // Returns a promise that is expected to resolve with the newly created schema, in Parse format. - // If the class already exists, returns a promise that rejects with DUPLICATE_VALUE as the reason. - addSchema(name: string, fields, classLevelPermissions) { - let mongoSchema = mongoSchemaFromFieldsAndClassNameAndCLP(fields, name, classLevelPermissions); - let mongoObject = _mongoSchemaObjectFromNameFields(name, mongoSchema); - return this._collection.insertOne(mongoObject) - .then(result => mongoSchemaToParseSchema(result.ops[0])) - .catch(error => { - if (error.code === 11000) { //Mongo's duplicate key error - throw new Parse.Error(Parse.Error.DUPLICATE_VALUE, 'Class already exists.'); - } else { - throw error; - } - }); - } - updateSchema(name: string, update) { return this._collection.updateOne(_mongoSchemaQueryFromNameQuery(name), update); } @@ -225,5 +180,6 @@ class MongoSchemaCollection { // Exported for testing reasons and because we haven't moved all mongo schema format // related logic into the database adapter yet. MongoSchemaCollection._TESTmongoSchemaToParseSchema = mongoSchemaToParseSchema +MongoSchemaCollection.parseFieldTypeToMongoFieldType = parseFieldTypeToMongoFieldType export default MongoSchemaCollection diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js index b24ed6b92d..645f1c9c21 100644 --- a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js +++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js @@ -49,6 +49,33 @@ const convertParseSchemaToMongoSchema = ({...schema}) => { return schema; } +// Returns { code, error } if invalid, or { result }, an object +// suitable for inserting into _SCHEMA collection, otherwise. +const mongoSchemaFromFieldsAndClassNameAndCLP = (fields, className, classLevelPermissions) => { + let mongoObject = { + _id: className, + objectId: 'string', + updatedAt: 'string', + createdAt: 'string' + }; + + for (let fieldName in fields) { + mongoObject[fieldName] = MongoSchemaCollection.parseFieldTypeToMongoFieldType(fields[fieldName]); + } + + if (typeof classLevelPermissions !== 'undefined') { + mongoObject._metadata = mongoObject._metadata || {}; + if (!classLevelPermissions) { + delete mongoObject._metadata.class_permissions; + } else { + mongoObject._metadata.class_permissions = classLevelPermissions; + } + } + + return mongoObject; +} + + export class MongoStorageAdapter { // Private _uri: string; @@ -113,8 +140,18 @@ export class MongoStorageAdapter { createClass(className, schema) { schema = convertParseSchemaToMongoSchema(schema); + let mongoObject = mongoSchemaFromFieldsAndClassNameAndCLP(schema.fields, className, schema.classLevelPermissions); + mongoObject._id = className; return this._schemaCollection() - .then(schemaCollection => schemaCollection.addSchema(className, schema.fields, schema.classLevelPermissions)); + .then(schemaCollection => schemaCollection._collection.insertOne(mongoObject)) + .then(result => MongoSchemaCollection._TESTmongoSchemaToParseSchema(result.ops[0])) + .catch(error => { + if (error.code === 11000) { //Mongo's duplicate key error + throw new Parse.Error(Parse.Error.DUPLICATE_VALUE, 'Class already exists.'); + } else { + throw error; + } + }) } addFieldIfNotExists(className, fieldName, type) { diff --git a/src/Adapters/Storage/Mongo/MongoTransform.js b/src/Adapters/Storage/Mongo/MongoTransform.js index 1fff63787e..13279f71a6 100644 --- a/src/Adapters/Storage/Mongo/MongoTransform.js +++ b/src/Adapters/Storage/Mongo/MongoTransform.js @@ -250,11 +250,6 @@ const parseObjectKeyValueToMongoObjectKeyValue = (restKey, restValue, schema) => return {key: restKey, value: value}; } - // Handle update operators. TODO: handle within Parse Server. DB adapter shouldn't see update operators in creates. - if (typeof restValue === 'object' && '__op' in restValue) { - return {key: restKey, value: transformUpdateOperator(restValue, true)}; - } - // Handle normal objects by recursing if (Object.keys(restValue).some(key => key.includes('$') || key.includes('.'))) { throw new Parse.Error(Parse.Error.INVALID_NESTED_KEY, "Nested keys should not contain the '$' or '.' characters"); @@ -264,9 +259,6 @@ const parseObjectKeyValueToMongoObjectKeyValue = (restKey, restValue, schema) => } const parseObjectToMongoObjectForCreate = (className, restCreate, schema) => { - if (className == '_User') { - restCreate = transformAuthData(restCreate); - } restCreate = addLegacyACL(restCreate); let mongoCreate = {} for (let restKey in restCreate) { @@ -295,10 +287,6 @@ const parseObjectToMongoObjectForCreate = (className, restCreate, schema) => { // Main exposed method to help update old objects. const transformUpdate = (className, restUpdate, parseFormatSchema) => { - if (className == '_User') { - restUpdate = transformAuthData(restUpdate); - } - let mongoUpdate = {}; let acl = addLegacyACL(restUpdate)._acl; if (acl) { @@ -331,23 +319,6 @@ const transformUpdate = (className, restUpdate, parseFormatSchema) => { return mongoUpdate; } -function transformAuthData(restObject) { - if (restObject.authData) { - Object.keys(restObject.authData).forEach((provider) => { - let providerData = restObject.authData[provider]; - if (providerData == null) { - restObject[`_auth_data_${provider}`] = { - __op: 'Delete' - } - } else { - restObject[`_auth_data_${provider}`] = providerData; - } - }); - delete restObject.authData; - } - return restObject; -} - // Add the legacy _acl format. const addLegacyACL = restObject => { let restObjectCopy = {...restObject}; diff --git a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js index 1ba25e38d9..ec96ea0fb1 100644 --- a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js +++ b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js @@ -17,7 +17,7 @@ const parseTypeToPostgresType = type => { if (type.contents && type.contents.type === 'String') { return 'text[]'; } else { - throw `no type for ${JSON.stringify(type)} yet`; + return 'jsonb'; } default: throw `no type for ${JSON.stringify(type)} yet`; } @@ -242,9 +242,28 @@ export class PostgresStorageAdapter { case 'Pointer': valuesArray.push(object[fieldName].objectId); break; - default: + case 'Array': + if (['_rperm', '_wperm'].includes(fieldName)) { + valuesArray.push(object[fieldName]); + } else { + valuesArray.push(JSON.stringify(object[fieldName])); + } + break; + case 'Object': + valuesArray.push(object[fieldName]); + break; + case 'String': + valuesArray.push(object[fieldName]); + break; + case 'Number': + valuesArray.push(object[fieldName]); + break; + case 'Boolean': valuesArray.push(object[fieldName]); break; + default: + throw `Type ${schema.fields[fieldName].type} not supported yet`; + break; } }); let columnsPattern = columnsArray.map((col, index) => `$${index + 2}:name`).join(','); @@ -294,12 +313,24 @@ export class PostgresStorageAdapter { updatePatterns.push(`$${index}:name = COALESCE($${index}:name, 0) + $${index + 1}`); values.push(fieldName, fieldValue.amount); index += 2; + } else if (fieldValue.__op === 'Add') { + updatePatterns.push(`$${index}:name = COALESCE($${index}:name, '[]'::jsonb) || $${index + 1}`); + values.push(fieldName, fieldValue.objects); + index += 2; + } else if (fieldValue.__op === 'Remove') { + return Promise.reject(new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, 'Postgres does not support Remove operator.')); + } else if (fieldValue.__op === 'AddUnique') { + return Promise.reject(new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, 'Postgres does not support AddUnique operator')); } else if (fieldName === 'updatedAt') { //TODO: stop special casing this. It should check for __type === 'Date' and use .iso updatePatterns.push(`$${index}:name = $${index + 1}`) values.push(fieldName, new Date(fieldValue)); index += 2; + } else if (typeof fieldValue === 'string') { + updatePatterns.push(`$${index}:name = $${index + 1}`); + values.push(fieldName, fieldValue); + index += 2; } else { - return Promise.reject(new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, `Postgres doesn't support this type of update yet`)); + return Promise.reject(new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, `Postgres doesn't support update ${JSON.stringify(fieldValue)} yet`)); } } @@ -345,6 +376,9 @@ export class PostgresStorageAdapter { if (object[fieldName] === null) { delete object[fieldName]; } + if (object[fieldName] instanceof Date) { + object[fieldName] = { __type: 'Date', iso: object[fieldName].toISOString() }; + } } return object; @@ -363,6 +397,13 @@ export class PostgresStorageAdapter { const constraintPatterns = fieldNames.map((fieldName, index) => `$${index + 3}:name`); const qs = `ALTER TABLE $1:name ADD CONSTRAINT $2:name UNIQUE (${constraintPatterns.join(',')})`; return this._client.query(qs,[className, constraintName, ...fieldNames]) + .catch(error => { + if (error.code === PostgresDuplicateRelationError && error.message.includes(constraintName)) { + // Index already exists. Ignore error. + } else { + throw error; + } + }); } // Executes a count. diff --git a/src/Controllers/DatabaseController.js b/src/Controllers/DatabaseController.js index a42184f4c5..5e5106f783 100644 --- a/src/Controllers/DatabaseController.js +++ b/src/Controllers/DatabaseController.js @@ -238,6 +238,7 @@ DatabaseController.prototype.update = function(className, query, update, { } } update = transformObjectACL(update); + transformAuthData(className, update, schema); if (many) { return this.adapter.updateObjectsByQuery(className, schema, query, update); } else if (upsert) { @@ -399,6 +400,62 @@ DatabaseController.prototype.destroy = function(className, query, { acl } = {}) }); }; +const flattenUpdateOperatorsForCreate = object => { + for (let key in object) { + if (object[key] && object[key].__op) { + switch (object[key].__op) { + case 'Increment': + if (typeof object[key].amount !== 'number') { + throw new Parse.Error(Parse.Error.INVALID_JSON, 'objects to add must be an array'); + } + object[key] = object[key].amount; + break; + case 'Add': + if (!(object[key].objects instanceof Array)) { + throw new Parse.Error(Parse.Error.INVALID_JSON, 'objects to add must be an array'); + } + object[key] = object[key].objects; + break; + case 'AddUnique': + if (!(object[key].objects instanceof Array)) { + throw new Parse.Error(Parse.Error.INVALID_JSON, 'objects to add must be an array'); + } + object[key] = object[key].objects; + break; + case 'Remove': + if (!(object[key].objects instanceof Array)) { + throw new Parse.Error(Parse.Error.INVALID_JSON, 'objects to add must be an array'); + } + object[key] = [] + break; + case 'Delete': + delete object[key]; + break; + default: + throw new Parse.Error(Parse.Error.COMMAND_UNAVAILABLE, `The ${object[key].__op} operator is not supported yet.`); + } + } + } +} + +const transformAuthData = (className, object, schema) => { + if (object.authData && className === '_User') { + Object.keys(object.authData).forEach(provider => { + const providerData = object.authData[provider]; + const fieldName = `_auth_data_${provider}`; + if (providerData == null) { + object[fieldName] = { + __op: 'Delete' + } + } else { + object[fieldName] = providerData; + schema.fields[fieldName] = { type: 'Object' } + } + }); + delete object.authData; + } +} + // Inserts an object into the database. // Returns a promise that resolves successfully iff the object saved. DatabaseController.prototype.create = function(className, object, { acl } = {}) { @@ -420,7 +477,11 @@ DatabaseController.prototype.create = function(className, object, { acl } = {}) .then(() => schemaController.enforceClassExists(className)) .then(() => schemaController.reloadData()) .then(() => schemaController.getOneSchema(className, true)) - .then(schema => this.adapter.createObject(className, SchemaController.convertSchemaToAdapterSchema(schema), object)) + .then(schema => { + transformAuthData(className, object, schema); + flattenUpdateOperatorsForCreate(object); + return this.adapter.createObject(className, SchemaController.convertSchemaToAdapterSchema(schema), object); + }) .then(result => sanitizeDatabaseResult(originalObject, result.ops[0])); }) }; diff --git a/src/Controllers/SchemaController.js b/src/Controllers/SchemaController.js index e1c3af3ed8..e85421f90b 100644 --- a/src/Controllers/SchemaController.js +++ b/src/Controllers/SchemaController.js @@ -288,7 +288,7 @@ class SchemaController { return this.getAllClasses() .then(allSchemas => { allSchemas.forEach(schema => { - this.data[schema.className] = schema.fields; + this.data[schema.className] = injectDefaultSchema(schema).fields; this.perms[schema.className] = schema.classLevelPermissions; }); diff --git a/src/ParseServer.js b/src/ParseServer.js index 5a224fbb62..5c8380018c 100644 --- a/src/ParseServer.js +++ b/src/ParseServer.js @@ -194,23 +194,23 @@ class ParseServer { const databaseController = new DatabaseController(databaseAdapter); const hooksController = new HooksController(appId, databaseController, webhookKey); + // TODO: create indexes on first creation of a _User object. Otherwise it's impossible to + // have a Parse app without it having a _User collection. let userClassPromise = databaseController.loadSchema() .then(schema => schema.enforceClassExists('_User')) - - let usernameUniqueness = userClassPromise .then(() => databaseController.adapter.ensureUniqueness('_User', requiredUserFields, ['username'])) .catch(error => { logger.warn('Unable to ensure uniqueness for usernames: ', error); - return Promise.reject(); + return Promise.reject(error); }); let emailUniqueness = userClassPromise .then(() => databaseController.adapter.ensureUniqueness('_User', requiredUserFields, ['email'])) .catch(error => { logger.warn('Unabled to ensure uniqueness for user email addresses: ', error); - return Promise.reject(); + return Promise.reject(error); }) AppCache.put(appId, {