diff --git a/spec/Schema.spec.js b/spec/Schema.spec.js index bb612a4a..d0e50953 100644 --- a/spec/Schema.spec.js +++ b/spec/Schema.spec.js @@ -1,3 +1,5 @@ +'use strict'; + var Config = require('../src/Config'); var Schema = require('../src/Schema'); var dd = require('deep-diff'); @@ -512,24 +514,31 @@ describe('Schema', () => { it('drops related collection when deleting relation field', done => { var obj1 = hasAllPODobject(); obj1.save() - .then(savedObj1 => { - var obj2 = new Parse.Object('HasPointersAndRelations'); - obj2.set('aPointer', savedObj1); - var relation = obj2.relation('aRelation'); - relation.add(obj1); - return obj2.save(); - }) - .then(() => { - config.database.adapter.database.collection('test__Join:aRelation:HasPointersAndRelations', { strict: true }, (err, coll) => { - expect(err).toEqual(null); - config.database.loadSchema() - .then(schema => schema.deleteField('aRelation', 'HasPointersAndRelations', config.database)) - .then(() => config.database.adapter.database.collection('test__Join:aRelation:HasPointersAndRelations', { strict: true }, (err, coll) => { - expect(err).not.toEqual(null); - done(); - })); + .then(savedObj1 => { + var obj2 = new Parse.Object('HasPointersAndRelations'); + obj2.set('aPointer', savedObj1); + var relation = obj2.relation('aRelation'); + relation.add(obj1); + return obj2.save(); + }) + .then(() => config.database.collectionExists('_Join:aRelation:HasPointersAndRelations')) + .then(exists => { + if (!exists) { + fail('Relation collection should exist after save.'); + } + }) + .then(() => config.database.loadSchema()) + .then(schema => schema.deleteField('aRelation', 'HasPointersAndRelations', config.database)) + .then(() => config.database.collectionExists('_Join:aRelation:HasPointersAndRelations')) + .then(exists => { + if (exists) { + fail('Relation collection should not exist after deleting relation field.'); + } + done(); + }, error => { + fail(error); + done(); }); - }) }); it('can delete string fields and resave as number field', done => { diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js index 86f56ea9..742420c5 100644 --- a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js +++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js @@ -30,8 +30,12 @@ export class MongoStorageAdapter { }); } - dropCollection(name: string) { - return this.connect.then(() => this.collection(name).then(collection => collection.drop())); + collectionExists(name: string) { + return this.connect().then(() => { + return this.database.listCollections({ name: name }).toArray(); + }).then(collections => { + return collections.length > 0; + }); } dropCollection(name: string) { diff --git a/src/Controllers/DatabaseController.js b/src/Controllers/DatabaseController.js index 96c33931..99ed5648 100644 --- a/src/Controllers/DatabaseController.js +++ b/src/Controllers/DatabaseController.js @@ -38,6 +38,10 @@ DatabaseController.prototype.collection = function(className) { return this.rawCollection(className); }; +DatabaseController.prototype.collectionExists = function(className) { + return this.adapter.collectionExists(this.collectionPrefix + className); +}; + DatabaseController.prototype.rawCollection = function(className) { return this.adapter.collection(this.collectionPrefix + className); };