From 7e5ababe66cb0734cca005ac788c52dc744eff8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Wed, 27 Jun 2018 12:09:58 +0100 Subject: [PATCH 1/6] Ensure we can import both user and user stubs to teams --- .../coffee/Features/Referal/ReferalFeatures.coffee | 5 ++--- .../Features/Subscription/SubscriptionLocator.coffee | 5 ++++- .../Features/Subscription/SubscriptionUpdater.coffee | 12 ++++++++++++ .../web/app/coffee/Features/User/UserGetter.coffee | 2 +- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee b/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee index 34651ef1f5..950084130f 100644 --- a/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee +++ b/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee @@ -1,12 +1,11 @@ _ = require("underscore") logger = require('logger-sharelatex') -User = require('../../models/User').User +UserGetter = require('../User/UserGetter') Settings = require "settings-sharelatex" module.exports = ReferalFeatures = getBonusFeatures: (user_id, callback = (error) ->) -> - query = _id: user_id - User.findOne query, (error, user) -> + UserGetter.getUserOrUserStubById user_id, { _id: 1 }, (error, user) -> return callback(error) if error return callback(new Error("user not found #{user_id} for assignBonus")) if !user? logger.log user_id: user_id, refered_user_count: user.refered_user_count, "assigning bonus" diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionLocator.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionLocator.coffee index 33376f504b..ef6693f9b8 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionLocator.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionLocator.coffee @@ -32,4 +32,7 @@ module.exports = Subscription.find {member_ids: user_id}, {_id:1, planCode:1}, callback getGroupsWithEmailInvite: (email, callback) -> - Subscription.find { invited_emails: email }, callback \ No newline at end of file + Subscription.find { invited_emails: email }, callback + + getGroupWithV1Id: (v1TeamId, callback) -> + Subscription.findOne { "overleaf.id": v1TeamId }, callback diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee index 16dc5adf25..3b97702df7 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee @@ -24,6 +24,15 @@ module.exports = SubscriptionUpdater = return callback(err) if err? SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback + addUsersToGroup: (subscriptionId, memberIds, callback)-> + logger.log subscriptionId: subscriptionId, memberIds: memberIds, "adding members into mongo subscription" + searchOps = + _id: new ObjectId(subscriptionId.toString()) + insertOperation = + { $push: { member_ids: { $each: memberIds } } } + + Subscription.findAndModify searchOps, insertOperation, callback + addUserToGroup: (adminUser_id, user_id, callback)-> logger.log adminUser_id:adminUser_id, user_id:user_id, "adding user into mongo subscription" searchOps = @@ -47,6 +56,9 @@ module.exports = SubscriptionUpdater = return callback(err) FeaturesUpdater.refreshFeatures user_id, callback + deleteWithV1Id: (v1TeamId, callback)-> + Subscription.deleteOne { "overleaf.id": v1TeamId }, callback + deleteSubscription: (subscription_id, callback = (error) ->) -> SubscriptionLocator.getSubscription subscription_id, (err, subscription) -> return callback(err) if err? diff --git a/services/web/app/coffee/Features/User/UserGetter.coffee b/services/web/app/coffee/Features/User/UserGetter.coffee index 21969656a0..bd6e8c1fe3 100644 --- a/services/web/app/coffee/Features/User/UserGetter.coffee +++ b/services/web/app/coffee/Features/User/UserGetter.coffee @@ -62,7 +62,7 @@ module.exports = UserGetter = user_ids = user_ids.map (u) -> ObjectId(u.toString()) catch error return callback error - + db.users.find { _id: { $in: user_ids} }, projection, callback getUserOrUserStubById: (user_id, projection, callback = (error, user) ->) -> From 8b8742d60fd2a1723bbd458acc32ff8427277199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Wed, 27 Jun 2018 12:28:22 +0100 Subject: [PATCH 2/6] Fix ReferalFeatures tests --- .../Referal/ReferalFeaturesTests.coffee | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee b/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee index dfa70f8ebe..14eb523f14 100644 --- a/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee +++ b/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee @@ -8,7 +8,7 @@ describe 'ReferalFeatures', -> beforeEach -> @ReferalFeatures = SandboxedModule.require modulePath, requires: - '../../models/User': User: @User = {} + '../User/UserGetter': @UserGetter = {} "settings-sharelatex": @Settings = {} 'logger-sharelatex': log:-> @@ -27,17 +27,17 @@ describe 'ReferalFeatures', -> collaborators: 3 dropbox: false versioning: false - stubbedUser = { - refered_user_count: @refered_user_count, - features:{collaborators:1, dropbox:false, versioning:false} + stubbedUser = { + refered_user_count: @refered_user_count, + features:{collaborators:1, dropbox:false, versioning:false} } - @User.findOne = sinon.stub().callsArgWith 1, null, stubbedUser + @UserGetter.getUserOrUserStubById = sinon.stub().yields null, stubbedUser @ReferalFeatures.getBonusFeatures @user_id, @callback it "should get the users number of refered user", -> - @User.findOne - .calledWith(_id: @user_id) + @UserGetter.getUserOrUserStubById + .calledWith(@user_id, { _id: 1 }) .should.equal true it "should call the callback with the features", -> @@ -51,15 +51,14 @@ describe 'ReferalFeatures', -> collaborators: 3 dropbox: false versioning: false - @User.findOne = sinon.stub().callsArgWith 1, null, { refered_user_count: @refered_user_count } + @UserGetter.getUserOrUserStubById = + sinon.stub().yields null, { refered_user_count: @refered_user_count } @ReferalFeatures.getBonusFeatures @user_id, @callback it "should get the users number of refered user", -> - @User.findOne - .calledWith(_id: @user_id) + @UserGetter.getUserOrUserStubById + .calledWith(@user_id, { _id: 1 }) .should.equal true it "should call the callback with no features", -> @callback.calledWith(null, {}).should.equal true - - From c19fc6d245c70c68e09542e5c0935fe5f6f2e6af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Wed, 27 Jun 2018 12:49:45 +0100 Subject: [PATCH 3/6] Fetch the whole user doc Other attributes are needed to calculate features. --- .../web/app/coffee/Features/Referal/ReferalFeatures.coffee | 2 +- .../web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee b/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee index 950084130f..a25adfc965 100644 --- a/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee +++ b/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee @@ -5,7 +5,7 @@ Settings = require "settings-sharelatex" module.exports = ReferalFeatures = getBonusFeatures: (user_id, callback = (error) ->) -> - UserGetter.getUserOrUserStubById user_id, { _id: 1 }, (error, user) -> + UserGetter.getUserOrUserStubById user_id, null, (error, user) -> return callback(error) if error return callback(new Error("user not found #{user_id} for assignBonus")) if !user? logger.log user_id: user_id, refered_user_count: user.refered_user_count, "assigning bonus" diff --git a/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee b/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee index 14eb523f14..06c86e0af0 100644 --- a/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee +++ b/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee @@ -37,7 +37,7 @@ describe 'ReferalFeatures', -> it "should get the users number of refered user", -> @UserGetter.getUserOrUserStubById - .calledWith(@user_id, { _id: 1 }) + .calledWith(@user_id, null) .should.equal true it "should call the callback with the features", -> @@ -57,7 +57,7 @@ describe 'ReferalFeatures', -> it "should get the users number of refered user", -> @UserGetter.getUserOrUserStubById - .calledWith(@user_id, { _id: 1 }) + .calledWith(@user_id, null) .should.equal true it "should call the callback with no features", -> From 4366a0ea2c74fecc51bd9bd649d17fa660ea1b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Thu, 28 Jun 2018 11:08:20 +0100 Subject: [PATCH 4/6] Remove trailing whitespace --- .../SubscriptionUpdaterTests.coffee | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee b/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee index dd2afad56b..40045ed09b 100644 --- a/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee +++ b/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee @@ -4,16 +4,16 @@ expect = require('chai').expect sinon = require 'sinon' modulePath = "../../../../app/js/Features/Subscription/SubscriptionUpdater" assert = require("chai").assert -ObjectId = require('mongoose').Types.ObjectId +ObjectId = require('mongoose').Types.ObjectId describe "SubscriptionUpdater", -> beforeEach -> - @recurlySubscription = + @recurlySubscription = uuid: "1238uoijdasjhd" plan: plan_code: "kjhsakjds" - @adminUser = + @adminUser = _id: @adminuser_id = "5208dd34438843e2db000007" @otherUserId = "5208dd34438842e2db000005" @allUserIds = ["13213", "dsadas", "djsaiud89"] @@ -36,18 +36,18 @@ describe "SubscriptionUpdater", -> @updateStub = sinon.stub().callsArgWith(2, null) @findAndModifyStub = sinon.stub().callsArgWith(2, null, @subscription) @SubscriptionModel = class - constructor: (opts)-> + constructor: (opts)-> subscription.admin_id = opts.admin_id return subscription @remove: sinon.stub().yields() @SubscriptionModel.update = @updateStub @SubscriptionModel.findAndModify = @findAndModifyStub - @SubscriptionLocator = + @SubscriptionLocator = getUsersSubscription: sinon.stub() getGroupSubscriptionMemberOf:sinon.stub() - - @Settings = + + @Settings = freeTrialPlanCode: "collaborator" defaultPlanCode: "personal" defaultFeatures: { "default": "features" } @@ -99,7 +99,7 @@ describe "SubscriptionUpdater", -> describe "_updateSubscriptionFromRecurly", -> beforeEach -> @FeaturesUpdater.refreshFeatures = sinon.stub().callsArgWith(1) - + it "should update the subscription with token etc when not expired", (done)-> @SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=> @subscription.recurlySubscription_id.should.equal @recurlySubscription.uuid @@ -158,9 +158,9 @@ describe "SubscriptionUpdater", -> it "should add the users id to the group as a set", (done)-> @SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, => - searchOps = + searchOps = admin_id: @adminUser._id - insertOperation = + insertOperation = "$addToSet": {member_ids:@otherUserId} @findAndModifyStub.calledWith(searchOps, insertOperation).should.equal true done() @@ -176,9 +176,9 @@ describe "SubscriptionUpdater", -> it "should pull the users id from the group", (done)-> @SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, => - searchOps = + searchOps = admin_id:@adminUser._id - removeOperation = + removeOperation = "$pull": {member_ids:@otherUserId} @updateStub.calledWith(searchOps, removeOperation).should.equal true done() @@ -199,22 +199,22 @@ describe "SubscriptionUpdater", -> @SubscriptionLocator.getSubscription = sinon.stub().yields(null, @subscription) @FeaturesUpdater.refreshFeatures = sinon.stub().yields() @SubscriptionUpdater.deleteSubscription @subscription_id, done - + it "should look up the subscription", -> @SubscriptionLocator.getSubscription .calledWith(@subscription_id) .should.equal true - + it "should remove the subscription", -> @SubscriptionModel.remove .calledWith({_id: ObjectId(@subscription_id)}) .should.equal true - + it "should downgrade the admin_id", -> @FeaturesUpdater.refreshFeatures .calledWith(@subscription.admin_id) .should.equal true - + it "should downgrade all of the members", -> for user_id in @subscription.member_ids @FeaturesUpdater.refreshFeatures From 193579070c39df4e8b177b87e11a71e7831353f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Thu, 28 Jun 2018 13:25:04 +0100 Subject: [PATCH 5/6] Ensure features are updated for users but not for stubs --- .../Features/Referal/ReferalFeatures.coffee | 5 +-- .../Subscription/SubscriptionUpdater.coffee | 31 ++++++++++--------- .../SubscriptionUpdaterTests.coffee | 1 + 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee b/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee index a25adfc965..34651ef1f5 100644 --- a/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee +++ b/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee @@ -1,11 +1,12 @@ _ = require("underscore") logger = require('logger-sharelatex') -UserGetter = require('../User/UserGetter') +User = require('../../models/User').User Settings = require "settings-sharelatex" module.exports = ReferalFeatures = getBonusFeatures: (user_id, callback = (error) ->) -> - UserGetter.getUserOrUserStubById user_id, null, (error, user) -> + query = _id: user_id + User.findOne query, (error, user) -> return callback(error) if error return callback(new Error("user not found #{user_id} for assignBonus")) if !user? logger.log user_id: user_id, refered_user_count: user.refered_user_count, "assigning bonus" diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee index 3b97702df7..7867db29b9 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee @@ -2,6 +2,7 @@ async = require("async") _ = require("underscore") Subscription = require('../../models/Subscription').Subscription SubscriptionLocator = require("./SubscriptionLocator") +UserGetter = require("../User/UserGetter") PlansLocator = require("./PlansLocator") Settings = require("settings-sharelatex") logger = require("logger-sharelatex") @@ -24,26 +25,26 @@ module.exports = SubscriptionUpdater = return callback(err) if err? SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback - addUsersToGroup: (subscriptionId, memberIds, callback)-> - logger.log subscriptionId: subscriptionId, memberIds: memberIds, "adding members into mongo subscription" + addUserToGroup: (adminUserId, userId, callback)-> + @addUsersToGroup(adminUserId, [userId], callback) + + addUsersToGroup: (adminUserId, memberIds, callback)-> + logger.log adminUserId: adminUserId, memberIds: memberIds, "adding members into mongo subscription" searchOps = - _id: new ObjectId(subscriptionId.toString()) + admin_id: adminUserId insertOperation = { $push: { member_ids: { $each: memberIds } } } - Subscription.findAndModify searchOps, insertOperation, callback + Subscription.findAndModify searchOps, insertOperation, (err, subscription) -> + return callback(err) if err? + + # Only apply features updates to users, not user stubs + UserGetter.getUsers memberIds, { _id: 1 }, (err, users) -> + return callback(err) if err? + + userIds = users.map (u) -> u._id.toString() + async.map userIds, FeaturesUpdater.refreshFeatures, callback - addUserToGroup: (adminUser_id, user_id, callback)-> - logger.log adminUser_id:adminUser_id, user_id:user_id, "adding user into mongo subscription" - searchOps = - admin_id: adminUser_id - insertOperation = - "$addToSet": {member_ids:user_id} - Subscription.findAndModify searchOps, insertOperation, (err, subscription)-> - if err? - logger.err err:err, searchOps:searchOps, insertOperation:insertOperation, "error findy and modify add user to group" - return callback(err) - FeaturesUpdater.refreshFeatures user_id, callback removeUserFromGroup: (adminUser_id, user_id, callback)-> searchOps = diff --git a/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee b/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee index 40045ed09b..31ea6ebb0f 100644 --- a/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee +++ b/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee @@ -64,6 +64,7 @@ describe "SubscriptionUpdater", -> '../../models/Subscription': Subscription:@SubscriptionModel './UserFeaturesUpdater': @UserFeaturesUpdater './SubscriptionLocator': @SubscriptionLocator + '../User/UserGetter': @UserGetter './PlansLocator': @PlansLocator "logger-sharelatex": log:-> 'settings-sharelatex': @Settings From 18ded6061919666979f52cc3527c35649b7bff0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Thu, 28 Jun 2018 15:19:41 +0100 Subject: [PATCH 6/6] Fix unit tests --- .../coffee/Features/User/UserGetter.coffee | 2 +- .../Referal/ReferalFeaturesTests.coffee | 23 +++++++++--------- .../SubscriptionUpdaterTests.coffee | 24 ++++++++++++++----- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/services/web/app/coffee/Features/User/UserGetter.coffee b/services/web/app/coffee/Features/User/UserGetter.coffee index bd6e8c1fe3..21969656a0 100644 --- a/services/web/app/coffee/Features/User/UserGetter.coffee +++ b/services/web/app/coffee/Features/User/UserGetter.coffee @@ -62,7 +62,7 @@ module.exports = UserGetter = user_ids = user_ids.map (u) -> ObjectId(u.toString()) catch error return callback error - + db.users.find { _id: { $in: user_ids} }, projection, callback getUserOrUserStubById: (user_id, projection, callback = (error, user) ->) -> diff --git a/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee b/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee index 06c86e0af0..dfa70f8ebe 100644 --- a/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee +++ b/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee @@ -8,7 +8,7 @@ describe 'ReferalFeatures', -> beforeEach -> @ReferalFeatures = SandboxedModule.require modulePath, requires: - '../User/UserGetter': @UserGetter = {} + '../../models/User': User: @User = {} "settings-sharelatex": @Settings = {} 'logger-sharelatex': log:-> @@ -27,17 +27,17 @@ describe 'ReferalFeatures', -> collaborators: 3 dropbox: false versioning: false - stubbedUser = { - refered_user_count: @refered_user_count, - features:{collaborators:1, dropbox:false, versioning:false} + stubbedUser = { + refered_user_count: @refered_user_count, + features:{collaborators:1, dropbox:false, versioning:false} } - @UserGetter.getUserOrUserStubById = sinon.stub().yields null, stubbedUser + @User.findOne = sinon.stub().callsArgWith 1, null, stubbedUser @ReferalFeatures.getBonusFeatures @user_id, @callback it "should get the users number of refered user", -> - @UserGetter.getUserOrUserStubById - .calledWith(@user_id, null) + @User.findOne + .calledWith(_id: @user_id) .should.equal true it "should call the callback with the features", -> @@ -51,14 +51,15 @@ describe 'ReferalFeatures', -> collaborators: 3 dropbox: false versioning: false - @UserGetter.getUserOrUserStubById = - sinon.stub().yields null, { refered_user_count: @refered_user_count } + @User.findOne = sinon.stub().callsArgWith 1, null, { refered_user_count: @refered_user_count } @ReferalFeatures.getBonusFeatures @user_id, @callback it "should get the users number of refered user", -> - @UserGetter.getUserOrUserStubById - .calledWith(@user_id, null) + @User.findOne + .calledWith(_id: @user_id) .should.equal true it "should call the callback with no features", -> @callback.calledWith(null, {}).should.equal true + + diff --git a/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee b/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee index 31ea6ebb0f..f97ba98ad4 100644 --- a/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee +++ b/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee @@ -58,6 +58,11 @@ describe "SubscriptionUpdater", -> @PlansLocator = findLocalPlanInSettings: sinon.stub().returns({}) + @UserGetter = + getUsers: (memberIds, projection, callback) -> + users = memberIds.map (id) -> { _id: id } + callback(null, users) + @ReferalFeatures = getBonusFeatures: sinon.stub().callsArgWith(1) @Modules = {hooks: {fire: sinon.stub().callsArgWith(2, null, null)}} @SubscriptionUpdater = SandboxedModule.require modulePath, requires: @@ -74,7 +79,6 @@ describe "SubscriptionUpdater", -> describe "syncSubscription", -> beforeEach -> - @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription) @SubscriptionUpdater._updateSubscriptionFromRecurly = sinon.stub().callsArgWith(2) @@ -88,7 +92,6 @@ describe "SubscriptionUpdater", -> done() it "should not call updateFeatures with group subscription if recurly subscription is not expired", (done)-> - @SubscriptionUpdater.syncSubscription @recurlySubscription, @adminUser._id, (err)=> @SubscriptionLocator.getUsersSubscription.calledWith(@adminUser._id).should.equal true @SubscriptionUpdater._updateSubscriptionFromRecurly.called.should.equal true @@ -144,7 +147,6 @@ describe "SubscriptionUpdater", -> done() - describe "_createNewSubscription", -> it "should create a new subscription then update the subscription", (done)-> @SubscriptionUpdater._createNewSubscription @adminUser._id, => @@ -154,15 +156,25 @@ describe "SubscriptionUpdater", -> done() describe "addUserToGroup", -> + beforeEach -> + @SubscriptionUpdater.addUsersToGroup = sinon.stub().yields(null) + + it "delegates to addUsersToGroup", (done)-> + @SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, => + @SubscriptionUpdater.addUsersToGroup + .calledWith(@adminUser._id, [@otherUserId]).should.equal true + done() + + describe "addUsersToGroup", -> beforeEach -> @FeaturesUpdater.refreshFeatures = sinon.stub().callsArgWith(1) - it "should add the users id to the group as a set", (done)-> - @SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, => + it "should add the user ids to the group as a set", (done)-> + @SubscriptionUpdater.addUsersToGroup @adminUser._id, [@otherUserId], => searchOps = admin_id: @adminUser._id insertOperation = - "$addToSet": {member_ids:@otherUserId} + { $push: { member_ids: { $each: [@otherUserId] } } } @findAndModifyStub.calledWith(searchOps, insertOperation).should.equal true done()