diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index 62e24f343a..f47d2eedf0 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/services/web/app/coffee/Features/Project/ProjectController.coffee @@ -10,6 +10,7 @@ Project = require('../../models/Project').Project User = require('../../models/User').User TagsHandler = require("../Tags/TagsHandler") SubscriptionLocator = require("../Subscription/SubscriptionLocator") +LimitationsManager = require("../Subscription/LimitationsManager") _ = require("underscore") Settings = require("settings-sharelatex") SecurityManager = require("../../managers/SecurityManager") @@ -123,8 +124,8 @@ module.exports = ProjectController = TagsHandler.getAllTags user_id, cb projects: (cb)-> Project.findAllUsersProjects user_id, 'name lastUpdated publicAccesLevel archived owner_ref', cb - subscription: (cb)-> - SubscriptionLocator.getUsersSubscription user_id, cb + hasSubscription: (cb)-> + LimitationsManager.userHasSubscriptionOrIsGroupMember req.session.user, cb }, (err, results)-> if err? logger.err err:err, "error getting data for project list page" @@ -140,7 +141,7 @@ module.exports = ProjectController = priority_title: true projects: projects tags: tags - hasSubscription: !!results.subscription + hasSubscription: results.hasSubscription } if Settings?.algolia?.app_id? and Settings?.algolia?.read_only_api_key? diff --git a/services/web/app/coffee/Features/Subscription/LimitationsManager.coffee b/services/web/app/coffee/Features/Subscription/LimitationsManager.coffee index 17b3ee66fc..a9bca83a9b 100644 --- a/services/web/app/coffee/Features/Subscription/LimitationsManager.coffee +++ b/services/web/app/coffee/Features/Subscription/LimitationsManager.coffee @@ -29,11 +29,13 @@ module.exports = else callback null, true - userHasSubscriptionOrFreeTrial: (user, callback = (err, hasSubscriptionOrTrial, subscription)->) -> - @userHasSubscription user, (err, hasSubscription, subscription)=> - @userHasFreeTrial user, (err, hasFreeTrial)=> - logger.log user_id:user._id, subscription:subscription, hasFreeTrial:hasFreeTrial, hasSubscription:hasSubscription, "checking if user has subscription or free trial" - callback err, hasFreeTrial or hasSubscription, subscription + userHasSubscriptionOrIsGroupMember: (user, callback = (err, hasSubscriptionOrIsMember)->) -> + @userHasSubscription user, (err, hasSubscription)=> + return callback(err) if err? + @userIsMemberOfGroupSubscription user, (err, isMember)=> + return callback(err) if err? + logger.log user_id:user._id, isMember:isMember, hasSubscription:hasSubscription, "checking if user has subscription or is group member" + callback err, isMember or hasSubscription userHasSubscription: (user, callback = (err, hasSubscription, subscription)->) -> logger.log user_id:user._id, "checking if user has subscription" @@ -43,11 +45,12 @@ module.exports = hasValidSubscription = subscription? and subscription.recurlySubscription_id? logger.log user:user, hasValidSubscription:hasValidSubscription, subscription:subscription, "checking if user has subscription" callback err, hasValidSubscription, subscription - - userHasFreeTrial: (user, callback = (err, hasFreeTrial, subscription)->) -> - logger.log user_id:user._id, "checking if user has free trial" - SubscriptionLocator.getUsersSubscription user, (err, subscription)-> - callback err, subscription? and subscription.freeTrial? and subscription.freeTrial.expiresAt?, subscription + + userIsMemberOfGroupSubscription: (user, callback = (error, isMember, subscriptions) ->) -> + logger.log user_id: user._ud, "checking is user is member of subscription groups" + SubscriptionLocator.getMemberSubscriptions user._id, (err, subscriptions = []) -> + return callback(err) if err? + callback err, subscriptions.length > 0, subscriptions hasGroupMembersLimitReached: (user_id, callback)-> SubscriptionLocator.getUsersSubscription user_id, (err, subscription)-> diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee index 5ea4eeb90b..1f1b83e167 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee @@ -64,19 +64,20 @@ module.exports = SubscriptionController = userSubscriptionPage: (req, res, next) -> SecurityManager.getCurrentUser req, (error, user) => return next(error) if error? - LimitationsManager.userHasSubscriptionOrFreeTrial user, (err, hasSubOrFreeTrial)-> - if !hasSubOrFreeTrial + LimitationsManager.userHasSubscriptionOrIsGroupMember user, (err, hasSubOrIsGroupMember)-> + if !hasSubOrIsGroupMember logger.log user: user, "redirecting to plans" res.redirect "/user/subscription/plans" else - SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel user, (error, subscription) -> + SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel user, (error, subscription, groups) -> return next(error) if error? - logger.log user: user, subscription:subscription, hasSubOrFreeTrial:hasSubOrFreeTrial, "showing subscription dashboard" + logger.log user: user, subscription:subscription, hasSubOrIsGroupMember:hasSubOrIsGroupMember, "showing subscription dashboard" plans = SubscriptionViewModelBuilder.buildViewModel() res.render "subscriptions/dashboard", title: "your_subscription" plans: plans subscription: subscription + groups: groups subscriptionTabActive: true diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionLocator.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionLocator.coffee index b761ee8252..a4521bd8f4 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionLocator.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionLocator.coffee @@ -12,3 +12,6 @@ module.exports = logger.log user_id:user_id, "getting users subscription" Subscription.findOne admin_id:user_id, callback + getMemberSubscriptions: (user_id, callback) -> + logger.log user_id: user_id, "getting users group subscriptions" + Subscription.find(member_ids: user_id).populate("admin_id").exec callback \ No newline at end of file diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionViewModelBuilder.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionViewModelBuilder.coffee index 340863a405..4e3291e24b 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionViewModelBuilder.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionViewModelBuilder.coffee @@ -8,32 +8,25 @@ _ = require("underscore") module.exports = - buildUsersSubscriptionViewModel: (user, callback) -> - SubscriptionLocator.getUsersSubscription user, (err, subscription)-> - LimitationsManager.userHasFreeTrial user, (err, hasFreeTrial)-> - LimitationsManager.userHasSubscription user, (err, hasSubscription)-> - if hasSubscription - return callback(error) if error? - plan = PlansLocator.findLocalPlanInSettings(subscription.planCode) - RecurlyWrapper.getSubscription subscription.recurlySubscription_id, (err, recurlySubscription)-> - callback null, - name: plan.name - nextPaymentDueAt: SubscriptionFormatters.formatDate(recurlySubscription.current_period_ends_at) - state: recurlySubscription.state - price: SubscriptionFormatters.formatPrice recurlySubscription.unit_amount_in_cents - planCode: subscription.planCode - groupPlan: subscription.groupPlan - else if hasFreeTrial - plan = PlansLocator.findLocalPlanInSettings(subscription.freeTrial.planCode) - callback null, - name: plan.name - state: "free-trial" - planCode: plan.planCode - groupPlan: subscription.groupPlan - expiresAt: SubscriptionFormatters.formatDate(subscription.freeTrial.expiresAt) - else - callback "User has no subscription" - + buildUsersSubscriptionViewModel: (user, callback = (error, subscription, groups) ->) -> + SubscriptionLocator.getUsersSubscription user, (err, subscription) -> + return callback(err) if err? + SubscriptionLocator.getMemberSubscriptions user, (err, memberSubscriptions = []) -> + return callback(err) if err? + if subscription? + return callback(error) if error? + plan = PlansLocator.findLocalPlanInSettings(subscription.planCode) + RecurlyWrapper.getSubscription subscription.recurlySubscription_id, (err, recurlySubscription)-> + callback null, { + name: plan.name + nextPaymentDueAt: SubscriptionFormatters.formatDate(recurlySubscription.current_period_ends_at) + state: recurlySubscription.state + price: SubscriptionFormatters.formatPrice recurlySubscription.unit_amount_in_cents + planCode: subscription.planCode + groupPlan: subscription.groupPlan + }, memberSubscriptions + else + callback null, null, memberSubscriptions buildViewModel : -> plans = Settings.plans diff --git a/services/web/app/views/subscriptions/dashboard.jade b/services/web/app/views/subscriptions/dashboard.jade index 39bb5087d1..2d6f085aba 100644 --- a/services/web/app/views/subscriptions/dashboard.jade +++ b/services/web/app/views/subscriptions/dashboard.jade @@ -35,48 +35,54 @@ block content .card .page-header h1 #{translate("your_subscription")} - case subscription.state - when "free-trial" - p #{translate("on_free_trial_expiring_at", {expiresAt:"#{subscription.expiresAt}"})} - p #{translate("choose_a_plan_below")} - when "active" - p #{translate("currently_subscribed_to_plan", {planName:"#{subscription.name}"})} - a(href, ng-click="changePlan = true") #{translate("change_plan")}. - p #{translate("next_payment_of_x_collectected_on_y", {paymentAmmount:"#{subscription.price}", collectionDate:"#{subscription.nextPaymentDueAt}"})} - p.pull-right + -if (subscription) + case subscription.state + when "free-trial" + p !{translate("on_free_trial_expiring_at", {expiresAt:"" + subscription.expiresAt + ""})} + p !{translate("choose_a_plan_below")} + when "active" + p !{translate("currently_subscribed_to_plan", {planName:"" + subscription.name + ""})} + a(href, ng-click="changePlan = true") !{translate("change_plan")}. + p !{translate("next_payment_of_x_collectected_on_y", {paymentAmmount:"" + subscription.price + "", collectionDate:"" + subscription.nextPaymentDueAt + ""})} + p.pull-right - p: form(action="/user/subscription/cancel",method="post") - input(type="hidden", name="_csrf", value=csrfToken) - a(href="/user/subscription/billing-details/edit").btn.btn-info #{translate("update_your_billing_details")} - |   - input(type="submit", value="Cancel your subscription").btn.btn-primary#cancelSubscription - when "canceled" - p #{translate("currently_subscribed_to_plan", {planName:"#{subscription.name}"})} - p #{translate("subscription_canceled_and_terminate_on_x", {terminateDate:"#{subscription.nextPaymentDueAt}"})} - p: form(action="/user/subscription/reactivate",method="post") - input(type="hidden", name="_csrf", value=csrfToken) - input(type="submit",value="Reactivate your subscription").btn.btn-success - when "expired" - p #{translate("your_subscription_has_expired")} - a(href="/user/subscription/plans") #{translate("create_new_subscription")} - default - p #{translate("problem_with_subscription_contact_us")} + p: form(action="/user/subscription/cancel",method="post") + input(type="hidden", name="_csrf", value=csrfToken) + a(href="/user/subscription/billing-details/edit").btn.btn-info #{translate("update_your_billing_details")} + |   + input(type="submit", value="Cancel your subscription").btn.btn-primary#cancelSubscription + when "canceled" + p !{translate("currently_subscribed_to_plan", {planName:"" + subscription.name + ""})} + p !{translate("subscription_canceled_and_terminate_on_x", {terminateDate:"" + subscription.nextPaymentDueAt + ""})} + p: form(action="/user/subscription/reactivate",method="post") + input(type="hidden", name="_csrf", value=csrfToken) + input(type="submit",value="Reactivate your subscription").btn.btn-success + when "expired" + p !{translate("your_subscription_has_expired")} + a(href="/user/subscription/plans") !{translate("create_new_subscription")} + default + p !{translate("problem_with_subscription_contact_us")} - -if(subscription.groupPlan) - a(href="/subscription/group").btn.btn-success #{translate("manage_group")} + -if(subscription.groupPlan) + a(href="/subscription/group").btn.btn-success !{translate("manage_group")} - div(ng-show="changePlan", ng-cloak) + div(ng-show="changePlan", ng-cloak) + hr + h2 !{translate("change_plan")} + p: table.table + tr + th !{translate("name")} + th !{translate("price")} + th + mixin printPlans(plans.studentAccounts) + mixin printPlans(plans.individualMonthlyPlans) + mixin printPlans(plans.individualAnnualPlans) + + -if (subscription && groups.length > 0) hr - h2 #{translate("change_plan")} - p: table.table - tr - th #{translate("name")} - th #{translate("price")} - th - mixin printPlans(plans.studentAccounts) - mixin printPlans(plans.individualMonthlyPlans) - mixin printPlans(plans.individualAnnualPlans) - + + each groupSubscription in groups + p !{translate("member_of_group_subscription", {admin_email: "" + groupSubscription.admin_id.email + ""})} script(type="text/javascript"). $('#cancelSubscription').on("click", function() { diff --git a/services/web/app/views/subscriptions/group_admin.jade b/services/web/app/views/subscriptions/group_admin.jade index ca3dec0478..07afd244f9 100644 --- a/services/web/app/views/subscriptions/group_admin.jade +++ b/services/web/app/views/subscriptions/group_admin.jade @@ -8,7 +8,7 @@ block content .card(ng-controller="GroupMembersController") .page-header .pull-right(ng-cloak) - small(ng-show="selectedUsers.length == 0") #{translate("you_have_added_x_of_group_size_y", {addedUsersSize:"{{ users.length }}", groupSize:"{{ groupSize }}"})} + small(ng-show="selectedUsers.length == 0") !{translate("you_have_added_x_of_group_size_y", {addedUsersSize:"{{ users.length }}", groupSize:"{{ groupSize }}"})} a.btn.btn-danger( href, ng-show="selectedUsers.length > 0" diff --git a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee index 2d79478688..617aa3ba42 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee @@ -29,6 +29,8 @@ describe "ProjectController", -> createBasicProject: sinon.stub().callsArgWith(2, null, {_id:@project_id}) @SubscriptionLocator = getUsersSubscription: sinon.stub() + @LimitationsManager = + userHasSubscriptionOrIsGroupMember: sinon.stub() @TagsHandler = getAllTags: sinon.stub() @ProjectModel = @@ -50,6 +52,7 @@ describe "ProjectController", -> "./ProjectCreationHandler": @ProjectCreationHandler "../Editor/EditorController": @EditorController "../Subscription/SubscriptionLocator": @SubscriptionLocator + "../Subscription/LimitationsManager": @LimitationsManager "../Tags/TagsHandler":@TagsHandler '../../models/Project': Project:@ProjectModel "../../models/User":User:@UserModel @@ -199,7 +202,7 @@ describe "ProjectController", -> fields.should.equal 'first_name last_name' callback null, @users[id] - @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, {}) + @LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, false) @TagsHandler.getAllTags.callsArgWith(1, null, @tags, {}) @ProjectModel.findAllUsersProjects.callsArgWith(2, null, @projects, @collabertions, @readOnly) diff --git a/services/web/test/UnitTests/coffee/Subscription/LimitationsManagerTests.coffee b/services/web/test/UnitTests/coffee/Subscription/LimitationsManagerTests.coffee index a3f965faca..f12bf06a87 100644 --- a/services/web/test/UnitTests/coffee/Subscription/LimitationsManagerTests.coffee +++ b/services/web/test/UnitTests/coffee/Subscription/LimitationsManagerTests.coffee @@ -126,87 +126,60 @@ describe "LimitationsManager", -> it "should return the subscription", (done)-> stubbedSubscription = {freeTrial:{}, token:""} @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, stubbedSubscription) - @LimitationsManager.userHasSubscription @user, (err, hasSubOrFreeTrial, subscription)-> + @LimitationsManager.userHasSubscription @user, (err, hasSubOrIsGroupMember, subscription)-> subscription.should.deep.equal stubbedSubscription done() - - describe "userHasFreeTrial", -> + + describe "userIsMemberOfGroupSubscription", -> beforeEach -> - @SubscriptionLocator.getUsersSubscription = sinon.stub() + @SubscriptionLocator.getMemberSubscriptions = sinon.stub() - it "should return true if the free trial is set", (done)-> - @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, freeTrial:{expiresAt : "1234"}) - @LimitationsManager.userHasFreeTrial @user, (err, hasFreeTrial)-> - hasFreeTrial.should.equal true + it "should return false if there are no groups subcriptions", (done)-> + @SubscriptionLocator.getMemberSubscriptions.callsArgWith(1, null, []) + @LimitationsManager.userIsMemberOfGroupSubscription @user, (err, isMember)-> + isMember.should.equal false done() - it "should return false if the free trial is not set", (done)-> - @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, {freeTrial:{}}) - @LimitationsManager.userHasFreeTrial @user, (err, hasFreeTrial)-> - hasFreeTrial.should.equal false + it "should return true if there are no groups subcriptions", (done)-> + @SubscriptionLocator.getMemberSubscriptions.callsArgWith(1, null, subscriptions = ["mock-subscription"]) + @LimitationsManager.userIsMemberOfGroupSubscription @user, (err, isMember, retSubscriptions)-> + isMember.should.equal true + retSubscriptions.should.equal subscriptions done() - it "should return false if the free trial is not there", (done)-> - @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, {}) - @LimitationsManager.userHasFreeTrial @user, (err, hasFreeTrial)-> - hasFreeTrial.should.equal false - done() - - it "should return false if the free trial is undefined", (done)-> - @SubscriptionLocator.getUsersSubscription.callsArgWith(1) - @LimitationsManager.userHasFreeTrial @user, (err, hasFreeTrial)-> - hasFreeTrial.should.equal false - done() - - it "should return the subscription", (done)-> - stubbedSubscription = {freeTrial:{}, token:""} - @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, stubbedSubscription) - @LimitationsManager.userHasFreeTrial @user, (err, hasSubOrFreeTrial, subscription)-> - subscription.should.deep.equal stubbedSubscription - done() - - describe "userHasSubscriptionOrFreeTrial", -> + describe "userHasSubscriptionOrIsGroupMember", -> beforeEach -> - @hasFreeTrial = true - @hasSubscription = true - @LimitationsManager.userHasFreeTrial = sinon.stub().callsArgWith(1, null, @hasFreeTrial) - @LimitationsManager.userHasSubscription = sinon.stub().callsArgWith(1, null, @hasSubscription) + @LimitationsManager.userIsMemberOfGroupSubscription = sinon.stub() + @LimitationsManager.userHasSubscription = sinon.stub() it "should return true if both are true", (done)-> - @hasFreeTrial = true - @hasSubscription = true - @LimitationsManager.userHasSubscriptionOrFreeTrial @user, (err, hasSubOrFreeTrial)-> - hasSubOrFreeTrial.should.equal true + @LimitationsManager.userIsMemberOfGroupSubscription.callsArgWith(1, null, true) + @LimitationsManager.userHasSubscription.callsArgWith(1, null, true) + @LimitationsManager.userHasSubscriptionOrIsGroupMember @user, (err, hasSubOrIsGroupMember)-> + hasSubOrIsGroupMember.should.equal true done() it "should return true if one is true", (done)-> - @hasFreeTrial = false - @hasSubscription = true - @LimitationsManager.userHasSubscriptionOrFreeTrial @user, (err, hasSubOrFreeTrial)-> - hasSubOrFreeTrial.should.equal true + @LimitationsManager.userIsMemberOfGroupSubscription.callsArgWith(1, null, true) + @LimitationsManager.userHasSubscription.callsArgWith(1, null, false) + @LimitationsManager.userHasSubscriptionOrIsGroupMember @user, (err, hasSubOrIsGroupMember)-> + hasSubOrIsGroupMember.should.equal true done() it "should return true if other is true", (done)-> - @hasFreeTrial = true - @hasSubscription = false - @LimitationsManager.userHasSubscriptionOrFreeTrial @user, (err, hasSubOrFreeTrial)-> - hasSubOrFreeTrial.should.equal true + @LimitationsManager.userIsMemberOfGroupSubscription.callsArgWith(1, null, false) + @LimitationsManager.userHasSubscription.callsArgWith(1, null, true) + @LimitationsManager.userHasSubscriptionOrIsGroupMember @user, (err, hasSubOrIsGroupMember)-> + hasSubOrIsGroupMember.should.equal true done() it "should return false if both are false", (done)-> - @hasSubscription = false - @hasFreeTrial = false - @LimitationsManager.userHasSubscriptionOrFreeTrial @user, (err, hasSubOrFreeTrial)-> - hasSubOrFreeTrial.should.equal true + @LimitationsManager.userIsMemberOfGroupSubscription.callsArgWith(1, null, false) + @LimitationsManager.userHasSubscription.callsArgWith(1, null, false) + @LimitationsManager.userHasSubscriptionOrIsGroupMember @user, (err, hasSubOrIsGroupMember)-> + hasSubOrIsGroupMember.should.equal false done() - - it "should return the subscription", (done)-> - stubbedSubscription = {freeTrial:{}, token:""} - @LimitationsManager.userHasSubscription = sinon.stub().callsArgWith(1, null, null, stubbedSubscription) - @LimitationsManager.userHasSubscriptionOrFreeTrial @user, (err, hasSubOrFreeTrial, subscription)-> - subscription.should.deep.equal stubbedSubscription - done() - + describe "hasGroupMembersLimitReached", -> beforeEach -> diff --git a/services/web/test/UnitTests/coffee/Subscription/SubscriptionControllerTests.coffee b/services/web/test/UnitTests/coffee/Subscription/SubscriptionControllerTests.coffee index 78bb13c617..c8474a04ba 100644 --- a/services/web/test/UnitTests/coffee/Subscription/SubscriptionControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Subscription/SubscriptionControllerTests.coffee @@ -38,7 +38,7 @@ describe "Subscription controller sanboxed", -> findLocalPlanInSettings: sinon.stub() @LimitationsManager = - userHasSubscriptionOrFreeTrial: sinon.stub() + userHasSubscriptionOrIsGroupMember: sinon.stub() userHasSubscription : sinon.stub() @RecurlyWrapper = @@ -140,7 +140,7 @@ describe "Subscription controller sanboxed", -> describe "with a user without a subscription", -> beforeEach (done) -> @res.callback = done - @LimitationsManager.userHasSubscriptionOrFreeTrial.callsArgWith(1, null, false) + @LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, false) @SubscriptionController.userSubscriptionPage @req, @res it "should redirect to the plans page", -> @@ -151,7 +151,7 @@ describe "Subscription controller sanboxed", -> beforeEach (done) -> @res.callback = done @SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel.callsArgWith(1, null, @activeRecurlySubscription) - @LimitationsManager.userHasSubscriptionOrFreeTrial.callsArgWith(1, null, true) + @LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, true) @SubscriptionController.userSubscriptionPage @req, @res it "should render the dashboard", (done)-> @@ -166,7 +166,7 @@ describe "Subscription controller sanboxed", -> beforeEach (done) -> @res.callback = done @SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel.callsArgWith(1, null, @activeRecurlySubscription) - @LimitationsManager.userHasSubscriptionOrFreeTrial.callsArgWith(1, null, true) + @LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, true) @SubscriptionController.userSubscriptionPage @req, @res it "should render the dashboard", -> diff --git a/services/web/test/UnitTests/coffee/Subscription/SubscriptionLocatorTests.coffee b/services/web/test/UnitTests/coffee/Subscription/SubscriptionLocatorTests.coffee index 6b305ff9d2..4dbbba5a8c 100644 --- a/services/web/test/UnitTests/coffee/Subscription/SubscriptionLocatorTests.coffee +++ b/services/web/test/UnitTests/coffee/Subscription/SubscriptionLocatorTests.coffee @@ -14,6 +14,7 @@ describe "Subscription Locator Tests", -> @subscription = {hello:"world"} @Subscription = findOne: sinon.stub() + find: sinon.stub() @SubscriptionLocator = SandboxedModule.require modulePath, requires: '../../models/Subscription': Subscription:@Subscription "logger-sharelatex": log:->