2014-02-12 05:23:40 -05:00
|
|
|
SandboxedModule = require('sandboxed-module')
|
|
|
|
assert = require('assert')
|
|
|
|
require('chai').should()
|
|
|
|
sinon = require('sinon')
|
|
|
|
modulePath = require('path').join __dirname, '../../../../app/js/Features/Referal/ReferalAllocator.js'
|
|
|
|
|
|
|
|
describe 'Referal allocator', ->
|
|
|
|
|
|
|
|
beforeEach ->
|
|
|
|
@ReferalAllocator = SandboxedModule.require modulePath, requires:
|
|
|
|
'../../models/User': User: @User = {}
|
|
|
|
"../Subscription/SubscriptionLocator": @SubscriptionLocator = {}
|
|
|
|
"settings-sharelatex": @Settings = {}
|
|
|
|
'logger-sharelatex':
|
|
|
|
log:->
|
|
|
|
err:->
|
|
|
|
@callback = sinon.stub()
|
|
|
|
@referal_id = "referal-id-123"
|
|
|
|
@referal_medium = "twitter"
|
|
|
|
@user_id = "user-id-123"
|
|
|
|
@new_user_id = "new-user-id-123"
|
|
|
|
|
|
|
|
describe "allocate", ->
|
|
|
|
describe "when the referal was a bonus referal", ->
|
|
|
|
beforeEach ->
|
|
|
|
@referal_source = "bonus"
|
|
|
|
@User.update = sinon.stub().callsArgWith 3, null
|
|
|
|
@User.findOne = sinon.stub().callsArgWith 1, null, { _id: @user_id }
|
|
|
|
@ReferalAllocator.assignBonus = sinon.stub().callsArg 1
|
|
|
|
@ReferalAllocator.allocate @referal_id, @new_user_id, @referal_source, @referal_medium, @callback
|
|
|
|
|
|
|
|
it 'should update the referring user with the refered users id', ->
|
|
|
|
@User.update.calledWith({
|
|
|
|
"referal_id":@referal_id
|
|
|
|
}, {
|
|
|
|
$push:
|
|
|
|
refered_users: @new_user_id
|
|
|
|
$inc:
|
|
|
|
refered_user_count: 1
|
|
|
|
}).should.equal true
|
|
|
|
|
|
|
|
it "find the referring users id", ->
|
|
|
|
@User.findOne
|
|
|
|
.calledWith( referal_id: @referal_id )
|
|
|
|
.should.equal true
|
|
|
|
|
|
|
|
it "shoudl assign the user their bonus", ->
|
|
|
|
@ReferalAllocator.assignBonus
|
|
|
|
.calledWith(@user_id)
|
|
|
|
.should.equal true
|
|
|
|
|
|
|
|
it "should call the callback", ->
|
|
|
|
@callback.called.should.equal true
|
|
|
|
|
|
|
|
describe "when the referal is not a bonus referal", ->
|
|
|
|
beforeEach ->
|
|
|
|
@referal_source = "public_share"
|
|
|
|
@User.update = sinon.stub().callsArgWith 3, null
|
|
|
|
@User.findOne = sinon.stub().callsArgWith 1, null, { _id: @user_id }
|
|
|
|
@ReferalAllocator.assignBonus = sinon.stub().callsArg 1
|
|
|
|
@ReferalAllocator.allocate @referal_id, @new_user_id, @referal_source, @referal_medium, @callback
|
|
|
|
|
|
|
|
it 'should not update the referring user with the refered users id', ->
|
|
|
|
@User.update.called.should.equal false
|
|
|
|
|
|
|
|
it "find the referring users id", ->
|
|
|
|
@User.findOne
|
|
|
|
.calledWith( referal_id: @referal_id )
|
|
|
|
.should.equal true
|
|
|
|
|
|
|
|
it "should not assign the user a bonus", ->
|
|
|
|
@ReferalAllocator.assignBonus.called.should.equal false
|
|
|
|
|
|
|
|
it "should call the callback", ->
|
|
|
|
@callback.called.should.equal true
|
|
|
|
|
|
|
|
describe "assignBonus", ->
|
|
|
|
describe "when user does not have a subscription", ->
|
|
|
|
beforeEach ->
|
|
|
|
@refered_user_count = 3
|
|
|
|
@Settings.bonus_features =
|
|
|
|
"3":
|
|
|
|
collaborators: 3
|
|
|
|
dropbox: false
|
|
|
|
versioning: false
|
2015-10-05 07:30:03 -04:00
|
|
|
stubbedUser = {
|
|
|
|
refered_user_count: @refered_user_count,
|
|
|
|
features:{collaborators:1, dropbox:false, versioning:false}
|
|
|
|
}
|
|
|
|
|
|
|
|
@User.findOne = sinon.stub().callsArgWith 1, null,stubbedUser
|
2014-02-12 05:23:40 -05:00
|
|
|
@User.update = sinon.stub().callsArgWith 2, null
|
|
|
|
@SubscriptionLocator.getUsersSubscription = sinon.stub().callsArgWith 1, null, null
|
|
|
|
@ReferalAllocator.assignBonus @user_id, @callback
|
|
|
|
|
|
|
|
it "should get the users subscription", ->
|
|
|
|
@SubscriptionLocator.getUsersSubscription
|
|
|
|
.calledWith(@user_id)
|
|
|
|
.should.equal true
|
|
|
|
|
|
|
|
it "should get the users number of refered user", ->
|
|
|
|
@User.findOne
|
|
|
|
.calledWith(_id: @user_id)
|
|
|
|
.should.equal true
|
|
|
|
|
|
|
|
it "should update the user to bonus features", ->
|
|
|
|
@User.update
|
|
|
|
.calledWith({
|
|
|
|
_id: @user_id
|
|
|
|
}, {
|
|
|
|
$set:
|
|
|
|
features:
|
|
|
|
@Settings.bonus_features[@refered_user_count.toString()]
|
|
|
|
})
|
|
|
|
.should.equal true
|
|
|
|
|
|
|
|
it "should call the callback", ->
|
|
|
|
@callback.called.should.equal true
|
|
|
|
|
|
|
|
describe "when user does not have a recurlySubscription_id", ->
|
|
|
|
beforeEach ->
|
2015-10-05 07:30:03 -04:00
|
|
|
@refered_user_count = 4
|
2014-02-12 05:23:40 -05:00
|
|
|
@Settings.bonus_features =
|
2015-10-05 07:30:03 -04:00
|
|
|
"2":
|
|
|
|
collaborators: 2
|
|
|
|
dropbox: false
|
|
|
|
versioning: false
|
|
|
|
"5":
|
|
|
|
collaborators: 5
|
|
|
|
dropbox: true
|
|
|
|
versioning: false
|
2014-02-12 05:23:40 -05:00
|
|
|
"3":
|
|
|
|
collaborators: 3
|
|
|
|
dropbox: false
|
|
|
|
versioning: false
|
2015-10-05 07:30:03 -04:00
|
|
|
stubbedUser = { refered_user_count: @refered_user_count, features:{collaborators:1, dropbox:false, versioning:false} }
|
|
|
|
@User.findOne = sinon.stub().callsArgWith 1, null, stubbedUser
|
2014-02-12 05:23:40 -05:00
|
|
|
@User.update = sinon.stub().callsArgWith 2, null
|
|
|
|
@SubscriptionLocator.getUsersSubscription = sinon.stub().callsArgWith 1, null, {}
|
|
|
|
@ReferalAllocator.assignBonus @user_id, @callback
|
|
|
|
|
|
|
|
it "should get the users subscription", ->
|
|
|
|
@SubscriptionLocator.getUsersSubscription
|
|
|
|
.calledWith(@user_id)
|
|
|
|
.should.equal true
|
|
|
|
|
|
|
|
it "should get the users number of refered user", ->
|
|
|
|
@User.findOne
|
|
|
|
.calledWith(_id: @user_id)
|
|
|
|
.should.equal true
|
|
|
|
|
2015-10-05 07:30:03 -04:00
|
|
|
it "should update the user to bonus features with the closest level", ->
|
2014-02-12 05:23:40 -05:00
|
|
|
@User.update
|
|
|
|
.calledWith({
|
|
|
|
_id: @user_id
|
|
|
|
}, {
|
|
|
|
$set:
|
|
|
|
features:
|
2015-10-05 07:30:03 -04:00
|
|
|
@Settings.bonus_features["3"]
|
2014-02-12 05:23:40 -05:00
|
|
|
})
|
|
|
|
.should.equal true
|
|
|
|
|
|
|
|
it "should call the callback", ->
|
|
|
|
@callback.called.should.equal true
|
|
|
|
|
2015-10-05 07:30:03 -04:00
|
|
|
describe "when the user has better features already", ->
|
|
|
|
|
2014-02-12 05:23:40 -05:00
|
|
|
beforeEach ->
|
|
|
|
@refered_user_count = 3
|
2015-10-05 07:30:03 -04:00
|
|
|
@stubbedUser =
|
|
|
|
refered_user_count:4
|
|
|
|
features:
|
|
|
|
collaborators:3
|
|
|
|
dropbox:false
|
|
|
|
versioning:false
|
2014-02-12 05:23:40 -05:00
|
|
|
@Settings.bonus_features =
|
|
|
|
"4":
|
2015-10-05 07:30:03 -04:00
|
|
|
collaborators: 10
|
|
|
|
dropbox: true
|
|
|
|
versioning: false
|
|
|
|
|
|
|
|
@User.findOne = sinon.stub().callsArgWith 1, null, @stubbedUser
|
|
|
|
@User.update = sinon.stub().callsArgWith 2, null
|
|
|
|
@SubscriptionLocator.getUsersSubscription = sinon.stub().callsArgWith 1, null,null
|
|
|
|
|
|
|
|
it "should not set in in mongo when the feature is better", (done)->
|
|
|
|
@ReferalAllocator.assignBonus @user_id, =>
|
|
|
|
@User.update.calledWith({_id: @user_id }, {$set: features:{dropbox:true, versioning:false, collaborators:10} }).should.equal true
|
|
|
|
done()
|
|
|
|
|
|
|
|
it "should not overright if the user has -1 users", (done)->
|
|
|
|
@stubbedUser.features.collaborators = -1
|
|
|
|
@ReferalAllocator.assignBonus @user_id, =>
|
|
|
|
@User.update.calledWith({_id: @user_id }, {$set: features:{dropbox:true, versioning:false} }).should.equal true
|
|
|
|
done()
|
|
|
|
|
|
|
|
describe "when the user is not at a bonus level", ->
|
|
|
|
beforeEach ->
|
|
|
|
@refered_user_count = 0
|
|
|
|
@Settings.bonus_features =
|
|
|
|
"1":
|
2014-02-12 05:23:40 -05:00
|
|
|
collaborators: 3
|
|
|
|
dropbox: false
|
|
|
|
versioning: false
|
|
|
|
@User.findOne = sinon.stub().callsArgWith 1, null, { refered_user_count: @refered_user_count }
|
|
|
|
@User.update = sinon.stub().callsArgWith 2, null
|
|
|
|
@SubscriptionLocator.getUsersSubscription = sinon.stub().callsArgWith 1, null, {}
|
|
|
|
@ReferalAllocator.assignBonus @user_id, @callback
|
|
|
|
|
|
|
|
it "should get the users subscription", ->
|
|
|
|
@SubscriptionLocator.getUsersSubscription
|
|
|
|
.calledWith(@user_id)
|
|
|
|
.should.equal true
|
|
|
|
|
|
|
|
it "should get the users number of refered user", ->
|
|
|
|
@User.findOne
|
|
|
|
.calledWith(_id: @user_id)
|
|
|
|
.should.equal true
|
|
|
|
|
|
|
|
it "should not update the user to bonus features", ->
|
|
|
|
@User.update.called.should.equal false
|
|
|
|
|
|
|
|
it "should call the callback", ->
|
|
|
|
@callback.called.should.equal true
|
|
|
|
|
|
|
|
describe "when user has a subscription", ->
|
|
|
|
beforeEach ->
|
|
|
|
@refered_user_count = 3
|
|
|
|
@Settings.bonus_features =
|
|
|
|
"3":
|
|
|
|
collaborators: 3
|
|
|
|
dropbox: false
|
|
|
|
versioning: false
|
|
|
|
@User.findOne = sinon.stub().callsArgWith 1, null, { refered_user_count: @refered_user_count }
|
|
|
|
@User.update = sinon.stub().callsArgWith 2, null
|
|
|
|
@SubscriptionLocator.getUsersSubscription = sinon.stub().callsArgWith 1, null, { planCode: "collaborator" }
|
|
|
|
@ReferalAllocator.assignBonus @user_id, @callback
|
|
|
|
|
|
|
|
it "should get the users subscription", ->
|
|
|
|
@SubscriptionLocator.getUsersSubscription
|
|
|
|
.calledWith(@user_id)
|
|
|
|
.should.equal true
|
|
|
|
|
|
|
|
it "should not get the users number of refered user", ->
|
|
|
|
@User.findOne.called.should.equal false
|
|
|
|
|
|
|
|
it "should not update the user to bonus features", ->
|
|
|
|
@User.update.called.should.equal false
|
|
|
|
|
|
|
|
it "should call the callback", ->
|
|
|
|
@callback.called.should.equal true
|