mirror of
https://github.com/overleaf/overleaf.git
synced 2025-01-28 23:02:23 +00:00
Merge pull request #888 from sharelatex/ta-v1-subscription-check-fix
Don't Regard v1 Teams as Paid Subscriptions
This commit is contained in:
commit
d432b6799f
6 changed files with 29 additions and 68 deletions
|
@ -189,10 +189,10 @@ module.exports = ProjectController =
|
||||||
return cb(null, projects: [], tags: [], noConnection: true)
|
return cb(null, projects: [], tags: [], noConnection: true)
|
||||||
return cb(error, projects[0]) # hooks.fire returns an array of results, only need first
|
return cb(error, projects[0]) # hooks.fire returns an array of results, only need first
|
||||||
hasSubscription: (cb)->
|
hasSubscription: (cb)->
|
||||||
LimitationsManager.userHasSubscriptionOrIsGroupMember currentUser, (error, hasSub) ->
|
LimitationsManager.hasPaidSubscription currentUser, (error, hasPaidSubscription) ->
|
||||||
if error? and error instanceof V1ConnectionError
|
if error? and error instanceof V1ConnectionError
|
||||||
return cb(null, true)
|
return cb(null, true)
|
||||||
return cb(error, hasSub)
|
return cb(error, hasPaidSubscription)
|
||||||
user: (cb) ->
|
user: (cb) ->
|
||||||
User.findById user_id, "featureSwitches overleaf awareOfV2 features", cb
|
User.findById user_id, "featureSwitches overleaf awareOfV2 features", cb
|
||||||
}, (err, results)->
|
}, (err, results)->
|
||||||
|
|
|
@ -33,12 +33,12 @@ module.exports = LimitationsManager =
|
||||||
else
|
else
|
||||||
callback null, false
|
callback null, false
|
||||||
|
|
||||||
userHasSubscriptionOrIsGroupMember: (user, callback = (err, hasSubscriptionOrIsMember)->) ->
|
hasPaidSubscription: (user, callback = (err, hasSubscriptionOrIsMember)->) ->
|
||||||
@userHasV2Subscription user, (err, hasSubscription, subscription)=>
|
@userHasV2Subscription user, (err, hasSubscription, subscription)=>
|
||||||
return callback(err) if err?
|
return callback(err) if err?
|
||||||
@userIsMemberOfGroupSubscription user, (err, isMember)=>
|
@userIsMemberOfGroupSubscription user, (err, isMember)=>
|
||||||
return callback(err) if err?
|
return callback(err) if err?
|
||||||
@userHasV1SubscriptionOrTeam user, (err, hasV1Subscription)=>
|
@userHasV1Subscription user, (err, hasV1Subscription)=>
|
||||||
return callback(err) if err?
|
return callback(err) if err?
|
||||||
logger.log {user_id:user._id, isMember, hasSubscription, hasV1Subscription}, "checking if user has subscription or is group member"
|
logger.log {user_id:user._id, isMember, hasSubscription, hasV1Subscription}, "checking if user has subscription or is group member"
|
||||||
callback err, isMember or hasSubscription or hasV1Subscription, subscription
|
callback err, isMember or hasSubscription or hasV1Subscription, subscription
|
||||||
|
@ -72,16 +72,6 @@ module.exports = LimitationsManager =
|
||||||
logger.log {user_id: user._id, v1Subscription}, '[userHasV1Subscription]'
|
logger.log {user_id: user._id, v1Subscription}, '[userHasV1Subscription]'
|
||||||
callback err, !!v1Subscription?.has_subscription
|
callback err, !!v1Subscription?.has_subscription
|
||||||
|
|
||||||
userHasV1SubscriptionOrTeam: (user, callback = (error, hasV1Subscription) ->) ->
|
|
||||||
V1SubscriptionManager.getSubscriptionsFromV1 user._id, (err, v1Subscription = {}) ->
|
|
||||||
return callback(err) if err?
|
|
||||||
hasV1Subscription = false
|
|
||||||
if v1Subscription.has_subscription
|
|
||||||
hasV1Subscription = true
|
|
||||||
if (v1Subscription.teams or []).length > 0
|
|
||||||
hasV1Subscription = true
|
|
||||||
return callback null, hasV1Subscription
|
|
||||||
|
|
||||||
teamHasReachedMemberLimit: (subscription) ->
|
teamHasReachedMemberLimit: (subscription) ->
|
||||||
currentTotal = (subscription.member_ids or []).length +
|
currentTotal = (subscription.member_ids or []).length +
|
||||||
(subscription.teamInvites or []).length +
|
(subscription.teamInvites or []).length +
|
||||||
|
|
|
@ -90,22 +90,22 @@ module.exports = SubscriptionController =
|
||||||
|
|
||||||
userSubscriptionPage: (req, res, next) ->
|
userSubscriptionPage: (req, res, next) ->
|
||||||
user = AuthenticationController.getSessionUser(req)
|
user = AuthenticationController.getSessionUser(req)
|
||||||
LimitationsManager.userHasSubscriptionOrIsGroupMember user, (err, hasSubOrIsGroupMember, subscription)->
|
LimitationsManager.hasPaidSubscription user, (err, hasPaidSubscription, subscription)->
|
||||||
return next(err) if err?
|
return next(err) if err?
|
||||||
groupLicenceInviteUrl = SubscriptionDomainHandler.getDomainLicencePage(user)
|
groupLicenceInviteUrl = SubscriptionDomainHandler.getDomainLicencePage(user)
|
||||||
if subscription?.customAccount
|
if subscription?.customAccount
|
||||||
logger.log user: user, "redirecting to custom account page"
|
logger.log user: user, "redirecting to custom account page"
|
||||||
res.redirect "/user/subscription/custom_account"
|
res.redirect "/user/subscription/custom_account"
|
||||||
else if groupLicenceInviteUrl? and !hasSubOrIsGroupMember
|
else if groupLicenceInviteUrl? and !hasPaidSubscription
|
||||||
logger.log user:user, "redirecting to group subscription invite page"
|
logger.log user:user, "redirecting to group subscription invite page"
|
||||||
res.redirect groupLicenceInviteUrl
|
res.redirect groupLicenceInviteUrl
|
||||||
else if !hasSubOrIsGroupMember
|
else if !hasPaidSubscription
|
||||||
logger.log user: user, "redirecting to plans"
|
logger.log user: user, "redirecting to plans"
|
||||||
res.redirect "/user/subscription/plans"
|
res.redirect "/user/subscription/plans"
|
||||||
else
|
else
|
||||||
SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel user, (error, subscription, groupSubscriptions, billingDetailsLink, v1Subscriptions) ->
|
SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel user, (error, subscription, groupSubscriptions, billingDetailsLink, v1Subscriptions) ->
|
||||||
return next(error) if error?
|
return next(error) if error?
|
||||||
logger.log {user, subscription, hasSubOrIsGroupMember, groupSubscriptions, billingDetailsLink, v1Subscriptions}, "showing subscription dashboard"
|
logger.log {user, subscription, hasPaidSubscription, groupSubscriptions, billingDetailsLink, v1Subscriptions}, "showing subscription dashboard"
|
||||||
plans = SubscriptionViewModelBuilder.buildViewModel()
|
plans = SubscriptionViewModelBuilder.buildViewModel()
|
||||||
res.render "subscriptions/dashboard",
|
res.render "subscriptions/dashboard",
|
||||||
title: "your_subscription"
|
title: "your_subscription"
|
||||||
|
@ -122,7 +122,7 @@ module.exports = SubscriptionController =
|
||||||
|
|
||||||
userCustomSubscriptionPage: (req, res, next)->
|
userCustomSubscriptionPage: (req, res, next)->
|
||||||
user = AuthenticationController.getSessionUser(req)
|
user = AuthenticationController.getSessionUser(req)
|
||||||
LimitationsManager.userHasSubscriptionOrIsGroupMember user, (err, hasSubOrIsGroupMember, subscription)->
|
LimitationsManager.hasPaidSubscription user, (err, hasPaidSubscription, subscription)->
|
||||||
return next(err) if err?
|
return next(err) if err?
|
||||||
if !subscription?
|
if !subscription?
|
||||||
err = new Error("subscription null for custom account, user:#{user?._id}")
|
err = new Error("subscription null for custom account, user:#{user?._id}")
|
||||||
|
|
|
@ -36,7 +36,7 @@ describe "ProjectController", ->
|
||||||
@SubscriptionLocator =
|
@SubscriptionLocator =
|
||||||
getUsersSubscription: sinon.stub()
|
getUsersSubscription: sinon.stub()
|
||||||
@LimitationsManager =
|
@LimitationsManager =
|
||||||
userHasSubscriptionOrIsGroupMember: sinon.stub()
|
hasPaidSubscription: sinon.stub()
|
||||||
@TagsHandler =
|
@TagsHandler =
|
||||||
getAllTags: sinon.stub()
|
getAllTags: sinon.stub()
|
||||||
@NotificationsHandler =
|
@NotificationsHandler =
|
||||||
|
@ -283,7 +283,7 @@ describe "ProjectController", ->
|
||||||
@UserModel.findById = (id, fields, callback) =>
|
@UserModel.findById = (id, fields, callback) =>
|
||||||
callback null, @users[id]
|
callback null, @users[id]
|
||||||
|
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, false)
|
@LimitationsManager.hasPaidSubscription.callsArgWith(1, null, false)
|
||||||
@TagsHandler.getAllTags.callsArgWith(1, null, @tags, {})
|
@TagsHandler.getAllTags.callsArgWith(1, null, @tags, {})
|
||||||
@NotificationsHandler.getUserNotifications = sinon.stub().callsArgWith(1, null, @notifications, {})
|
@NotificationsHandler.getUserNotifications = sinon.stub().callsArgWith(1, null, @notifications, {})
|
||||||
@ProjectGetter.findAllUsersProjects.callsArgWith(2, null, @allProjects)
|
@ProjectGetter.findAllUsersProjects.callsArgWith(2, null, @allProjects)
|
||||||
|
@ -327,7 +327,7 @@ describe "ProjectController", ->
|
||||||
@ProjectController.projectListPage @req, @res
|
@ProjectController.projectListPage @req, @res
|
||||||
|
|
||||||
it 'should send hasSubscription == true when there is a subscription', (done) ->
|
it 'should send hasSubscription == true when there is a subscription', (done) ->
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember = sinon.stub().callsArgWith(1, null, true)
|
@LimitationsManager.hasPaidSubscription = sinon.stub().callsArgWith(1, null, true)
|
||||||
@res.render = (pageName, opts)=>
|
@res.render = (pageName, opts)=>
|
||||||
opts.hasSubscription.should.equal true
|
opts.hasSubscription.should.equal true
|
||||||
done()
|
done()
|
||||||
|
@ -447,7 +447,7 @@ describe "ProjectController", ->
|
||||||
@UserModel.findById = (id, fields, callback) =>
|
@UserModel.findById = (id, fields, callback) =>
|
||||||
callback null, @users[id]
|
callback null, @users[id]
|
||||||
|
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, false)
|
@LimitationsManager.hasPaidSubscription.callsArgWith(1, null, false)
|
||||||
@TagsHandler.getAllTags.callsArgWith(1, null, @tags, {})
|
@TagsHandler.getAllTags.callsArgWith(1, null, @tags, {})
|
||||||
@NotificationsHandler.getUserNotifications = sinon.stub().callsArgWith(1, null, @notifications, {})
|
@NotificationsHandler.getUserNotifications = sinon.stub().callsArgWith(1, null, @notifications, {})
|
||||||
@ProjectGetter.findAllUsersProjects.callsArgWith(2, null, @allProjects)
|
@ProjectGetter.findAllUsersProjects.callsArgWith(2, null, @allProjects)
|
||||||
|
|
|
@ -248,32 +248,32 @@ describe "LimitationsManager", ->
|
||||||
retSubscriptions.should.equal subscriptions
|
retSubscriptions.should.equal subscriptions
|
||||||
done()
|
done()
|
||||||
|
|
||||||
describe "userHasSubscriptionOrIsGroupMember", ->
|
describe "hasPaidSubscription", ->
|
||||||
beforeEach ->
|
beforeEach ->
|
||||||
@LimitationsManager.userIsMemberOfGroupSubscription = sinon.stub().yields(null, false)
|
@LimitationsManager.userIsMemberOfGroupSubscription = sinon.stub().yields(null, false)
|
||||||
@LimitationsManager.userHasV2Subscription = sinon.stub().yields(null, false)
|
@LimitationsManager.userHasV2Subscription = sinon.stub().yields(null, false)
|
||||||
@LimitationsManager.userHasV1SubscriptionOrTeam = sinon.stub().yields(null, false)
|
@LimitationsManager.userHasV1Subscription = sinon.stub().yields(null, false)
|
||||||
|
|
||||||
it "should return true if userIsMemberOfGroupSubscription", (done)->
|
it "should return true if userIsMemberOfGroupSubscription", (done)->
|
||||||
@LimitationsManager.userIsMemberOfGroupSubscription = sinon.stub().yields(null, true)
|
@LimitationsManager.userIsMemberOfGroupSubscription = sinon.stub().yields(null, true)
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember @user, (err, hasSubOrIsGroupMember)->
|
@LimitationsManager.hasPaidSubscription @user, (err, hasSubOrIsGroupMember)->
|
||||||
hasSubOrIsGroupMember.should.equal true
|
hasSubOrIsGroupMember.should.equal true
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it "should return true if userHasV2Subscription", (done)->
|
it "should return true if userHasV2Subscription", (done)->
|
||||||
@LimitationsManager.userHasV2Subscription = sinon.stub().yields(null, true)
|
@LimitationsManager.userHasV2Subscription = sinon.stub().yields(null, true)
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember @user, (err, hasSubOrIsGroupMember)->
|
@LimitationsManager.hasPaidSubscription @user, (err, hasSubOrIsGroupMember)->
|
||||||
hasSubOrIsGroupMember.should.equal true
|
hasSubOrIsGroupMember.should.equal true
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it "should return true if userHasV1SubscriptionOrTeam", (done)->
|
it "should return true if userHasV1Subscription", (done)->
|
||||||
@LimitationsManager.userHasV1SubscriptionOrTeam = sinon.stub().yields(null, true)
|
@LimitationsManager.userHasV1Subscription= sinon.stub().yields(null, true)
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember @user, (err, hasSubOrIsGroupMember)->
|
@LimitationsManager.hasPaidSubscription @user, (err, hasSubOrIsGroupMember)->
|
||||||
hasSubOrIsGroupMember.should.equal true
|
hasSubOrIsGroupMember.should.equal true
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it "should return false if none are true", (done)->
|
it "should return false if none are true", (done)->
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember @user, (err, hasSubOrIsGroupMember)->
|
@LimitationsManager.hasPaidSubscription @user, (err, hasSubOrIsGroupMember)->
|
||||||
hasSubOrIsGroupMember.should.equal false
|
hasSubOrIsGroupMember.should.equal false
|
||||||
done()
|
done()
|
||||||
|
|
||||||
|
@ -351,32 +351,3 @@ describe "LimitationsManager", ->
|
||||||
@V1SubscriptionManager.getSubscriptionsFromV1.calledWith(@user_id).should.equal true
|
@V1SubscriptionManager.getSubscriptionsFromV1.calledWith(@user_id).should.equal true
|
||||||
result.should.equal false
|
result.should.equal false
|
||||||
done()
|
done()
|
||||||
|
|
||||||
describe 'userHasV1SubscriptionOrTeam', ->
|
|
||||||
it 'should return true if v1 returns has_subscription = true', (done) ->
|
|
||||||
@V1SubscriptionManager.getSubscriptionsFromV1 = sinon.stub().yields(null, { has_subscription: true })
|
|
||||||
@LimitationsManager.userHasV1SubscriptionOrTeam @user, (error, result) =>
|
|
||||||
@V1SubscriptionManager.getSubscriptionsFromV1.calledWith(@user_id).should.equal true
|
|
||||||
result.should.equal true
|
|
||||||
done()
|
|
||||||
|
|
||||||
it 'should return true if v1 returns some teams', (done) ->
|
|
||||||
@V1SubscriptionManager.getSubscriptionsFromV1 = sinon.stub().yields(null, { teams: ['mock-team'] })
|
|
||||||
@LimitationsManager.userHasV1SubscriptionOrTeam @user, (error, result) =>
|
|
||||||
@V1SubscriptionManager.getSubscriptionsFromV1.calledWith(@user_id).should.equal true
|
|
||||||
result.should.equal true
|
|
||||||
done()
|
|
||||||
|
|
||||||
it 'should return false if v1 returns has_subscription = false and no teams', (done) ->
|
|
||||||
@V1SubscriptionManager.getSubscriptionsFromV1 = sinon.stub().yields(null, { has_subscription: false, teams: [] })
|
|
||||||
@LimitationsManager.userHasV1SubscriptionOrTeam @user, (error, result) =>
|
|
||||||
@V1SubscriptionManager.getSubscriptionsFromV1.calledWith(@user_id).should.equal true
|
|
||||||
result.should.equal false
|
|
||||||
done()
|
|
||||||
|
|
||||||
it 'should return false if v1 returns nothing', (done) ->
|
|
||||||
@V1SubscriptionManager.getSubscriptionsFromV1 = sinon.stub().yields(null, null)
|
|
||||||
@LimitationsManager.userHasV1SubscriptionOrTeam @user, (error, result) =>
|
|
||||||
@V1SubscriptionManager.getSubscriptionsFromV1.calledWith(@user_id).should.equal true
|
|
||||||
result.should.equal false
|
|
||||||
done()
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ describe "SubscriptionController", ->
|
||||||
findLocalPlanInSettings: sinon.stub()
|
findLocalPlanInSettings: sinon.stub()
|
||||||
|
|
||||||
@LimitationsManager =
|
@LimitationsManager =
|
||||||
userHasSubscriptionOrIsGroupMember: sinon.stub()
|
hasPaidSubscription: sinon.stub()
|
||||||
userHasV1OrV2Subscription : sinon.stub()
|
userHasV1OrV2Subscription : sinon.stub()
|
||||||
userHasV2Subscription: sinon.stub()
|
userHasV2Subscription: sinon.stub()
|
||||||
|
|
||||||
|
@ -226,7 +226,7 @@ describe "SubscriptionController", ->
|
||||||
describe "with a user without a subscription", ->
|
describe "with a user without a subscription", ->
|
||||||
beforeEach (done) ->
|
beforeEach (done) ->
|
||||||
@res.callback = done
|
@res.callback = done
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, false)
|
@LimitationsManager.hasPaidSubscription.callsArgWith(1, null, false)
|
||||||
@SubscriptionController.userSubscriptionPage @req, @res
|
@SubscriptionController.userSubscriptionPage @req, @res
|
||||||
|
|
||||||
it "should redirect to the plans page", ->
|
it "should redirect to the plans page", ->
|
||||||
|
@ -241,7 +241,7 @@ describe "SubscriptionController", ->
|
||||||
describe "without an existing subscription", ->
|
describe "without an existing subscription", ->
|
||||||
beforeEach (done)->
|
beforeEach (done)->
|
||||||
@res.callback = done
|
@res.callback = done
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, false)
|
@LimitationsManager.hasPaidSubscription.callsArgWith(1, null, false)
|
||||||
@SubscriptionController.userSubscriptionPage @req, @res
|
@SubscriptionController.userSubscriptionPage @req, @res
|
||||||
|
|
||||||
it "should redirect to the group invite url", ->
|
it "should redirect to the group invite url", ->
|
||||||
|
@ -253,7 +253,7 @@ describe "SubscriptionController", ->
|
||||||
@res.callback = done
|
@res.callback = done
|
||||||
@settings.apis.recurly.subdomain = 'test'
|
@settings.apis.recurly.subdomain = 'test'
|
||||||
@userSub = {account: {hosted_login_token: 'abcd'}}
|
@userSub = {account: {hosted_login_token: 'abcd'}}
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember
|
@LimitationsManager.hasPaidSubscription
|
||||||
.callsArgWith(1, null, true, {})
|
.callsArgWith(1, null, true, {})
|
||||||
@SubscriptionController.userSubscriptionPage @req, @res
|
@SubscriptionController.userSubscriptionPage @req, @res
|
||||||
|
|
||||||
|
@ -265,7 +265,7 @@ describe "SubscriptionController", ->
|
||||||
beforeEach (done) ->
|
beforeEach (done) ->
|
||||||
@res.callback = done
|
@res.callback = done
|
||||||
@SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel.callsArgWith(1, null, @activeRecurlySubscription)
|
@SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel.callsArgWith(1, null, @activeRecurlySubscription)
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, true, {})
|
@LimitationsManager.hasPaidSubscription.callsArgWith(1, null, true, {})
|
||||||
@SubscriptionController.userSubscriptionPage @req, @res
|
@SubscriptionController.userSubscriptionPage @req, @res
|
||||||
|
|
||||||
it "should render the dashboard", (done)->
|
it "should render the dashboard", (done)->
|
||||||
|
@ -280,7 +280,7 @@ describe "SubscriptionController", ->
|
||||||
beforeEach (done) ->
|
beforeEach (done) ->
|
||||||
@res.callback = done
|
@res.callback = done
|
||||||
@SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel.callsArgWith(1, null, @activeRecurlySubscription)
|
@SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel.callsArgWith(1, null, @activeRecurlySubscription)
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, true, {})
|
@LimitationsManager.hasPaidSubscription.callsArgWith(1, null, true, {})
|
||||||
@SubscriptionController.userSubscriptionPage @req, @res
|
@SubscriptionController.userSubscriptionPage @req, @res
|
||||||
|
|
||||||
it "should render the dashboard", ->
|
it "should render the dashboard", ->
|
||||||
|
@ -292,7 +292,7 @@ describe "SubscriptionController", ->
|
||||||
|
|
||||||
describe "when its a custom subscription which is non recurly", ->
|
describe "when its a custom subscription which is non recurly", ->
|
||||||
beforeEach ()->
|
beforeEach ()->
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, true, {customAccount:true})
|
@LimitationsManager.hasPaidSubscription.callsArgWith(1, null, true, {customAccount:true})
|
||||||
@SubscriptionController.userSubscriptionPage @req, @res
|
@SubscriptionController.userSubscriptionPage @req, @res
|
||||||
|
|
||||||
it "should redirect to /user/subscription/custom_account", ->
|
it "should redirect to /user/subscription/custom_account", ->
|
||||||
|
@ -301,7 +301,7 @@ describe "SubscriptionController", ->
|
||||||
describe "userCustomSubscriptionPage", ->
|
describe "userCustomSubscriptionPage", ->
|
||||||
beforeEach (done) ->
|
beforeEach (done) ->
|
||||||
@res.callback = done
|
@res.callback = done
|
||||||
@LimitationsManager.userHasSubscriptionOrIsGroupMember.callsArgWith(1, null, true, {})
|
@LimitationsManager.hasPaidSubscription.callsArgWith(1, null, true, {})
|
||||||
@SubscriptionController.userCustomSubscriptionPage @req, @res
|
@SubscriptionController.userCustomSubscriptionPage @req, @res
|
||||||
|
|
||||||
it "should render the page", (done)->
|
it "should render the page", (done)->
|
||||||
|
|
Loading…
Reference in a new issue