SubscriptionTests.coffee 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. expect = require('chai').expect
  2. async = require("async")
  3. User = require "./helpers/User"
  4. {Subscription} = require "../../../app/js/models/Subscription"
  5. {Institution} = require "../../../app/js/models/Institution"
  6. SubscriptionViewModelBuilder = require "../../../app/js/Features/Subscription/SubscriptionViewModelBuilder"
  7. MockRecurlyApi = require "./helpers/MockRecurlyApi"
  8. MockV1Api = require "./helpers/MockV1Api"
  9. describe 'Subscriptions', ->
  10. describe 'dashboard', ->
  11. before (done) ->
  12. @user = new User()
  13. @user.ensureUserExists done
  14. describe 'when the user has no subscription', ->
  15. before (done) ->
  16. SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel @user, (error, @data) =>
  17. return done(error) if error?
  18. done()
  19. it 'should return no personalSubscription', ->
  20. expect(@data.personalSubscription).to.equal null
  21. it 'should return no memberGroupSubscriptions', ->
  22. expect(@data.memberGroupSubscriptions).to.deep.equal []
  23. it 'should return no v1Subscriptions', ->
  24. expect(@data.v1Subscriptions).to.deep.equal {}
  25. describe 'when the user has a subscription with recurly', ->
  26. before (done) ->
  27. MockRecurlyApi.accounts['mock-account-id'] = @accounts = {
  28. hosted_login_token: 'mock-login-token'
  29. }
  30. MockRecurlyApi.subscriptions['mock-subscription-id'] = @subscription = {
  31. plan_code: 'collaborator',
  32. tax_in_cents: 100,
  33. tax_rate: 0.2,
  34. unit_amount_in_cents: 500,
  35. currency: 'GBP',
  36. current_period_ends_at: new Date(2018,4,5),
  37. state: 'active',
  38. account_id: 'mock-account-id',
  39. trial_ends_at: new Date(2018, 6, 7)
  40. }
  41. Subscription.create {
  42. admin_id: @user._id,
  43. manager_ids: [@user._id],
  44. recurlySubscription_id: 'mock-subscription-id',
  45. planCode: 'collaborator'
  46. }, (error) =>
  47. return done(error) if error?
  48. SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel @user, (error, @data) =>
  49. return done(error) if error?
  50. done()
  51. return
  52. after (done) ->
  53. MockRecurlyApi.accounts = {}
  54. MockRecurlyApi.subscriptions = {}
  55. Subscription.remove {
  56. admin_id: @user._id
  57. }, done
  58. return
  59. it 'should return a personalSubscription with populated recurly data', ->
  60. subscription = @data.personalSubscription
  61. expect(subscription).to.exist
  62. expect(subscription.planCode).to.equal 'collaborator'
  63. expect(subscription.recurly).to.exist
  64. expect(subscription.recurly).to.deep.equal {
  65. "billingDetailsLink": "https://test.recurly.com/account/billing_info/edit?ht=mock-login-token"
  66. "currency": "GBP"
  67. "nextPaymentDueAt": "5th May 2018"
  68. "price": "£6.00"
  69. "state": "active"
  70. "tax": 100
  71. "taxRate": 0.2
  72. "trial_ends_at": new Date(2018, 6, 7),
  73. "trialEndsAtFormatted": "7th July 2018"
  74. }
  75. it 'should return no memberGroupSubscriptions', ->
  76. expect(@data.memberGroupSubscriptions).to.deep.equal []
  77. describe 'when the user has a subscription without recurly', ->
  78. before (done) ->
  79. Subscription.create {
  80. admin_id: @user._id,
  81. manager_ids: [@user._id],
  82. planCode: 'collaborator'
  83. }, (error) =>
  84. return done(error) if error?
  85. SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel @user, (error, @data) =>
  86. return done(error) if error?
  87. done()
  88. return
  89. after (done) ->
  90. Subscription.remove {
  91. admin_id: @user._id
  92. }, done
  93. return
  94. it 'should return a personalSubscription with no recurly data', ->
  95. subscription = @data.personalSubscription
  96. expect(subscription).to.exist
  97. expect(subscription.planCode).to.equal 'collaborator'
  98. expect(subscription.recurly).to.not.exist
  99. it 'should return no memberGroupSubscriptions', ->
  100. expect(@data.memberGroupSubscriptions).to.deep.equal []
  101. describe 'when the user is a member of a group subscription', ->
  102. before (done) ->
  103. @owner1 = new User()
  104. @owner2 = new User()
  105. async.series [
  106. (cb) => @owner1.ensureUserExists cb
  107. (cb) => @owner2.ensureUserExists cb
  108. (cb) => Subscription.create {
  109. admin_id: @owner1._id,
  110. manager_ids: [@owner1._id],
  111. planCode: 'collaborator',
  112. groupPlan: true,
  113. member_ids: [@user._id]
  114. }, cb
  115. (cb) => Subscription.create {
  116. admin_id: @owner2._id,
  117. manager_ids: [@owner2._id],
  118. planCode: 'collaborator',
  119. groupPlan: true,
  120. member_ids: [@user._id]
  121. }, cb
  122. ], (error) =>
  123. return done(error) if error?
  124. SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel @user, (error, @data) =>
  125. return done(error) if error?
  126. done()
  127. return
  128. after (done) ->
  129. Subscription.remove {
  130. admin_id: @owner1._id
  131. }, (error) =>
  132. return done(error) if error?
  133. Subscription.remove {
  134. admin_id: @owner2._id
  135. }, done
  136. return
  137. it 'should return no personalSubscription', ->
  138. expect(@data.personalSubscription).to.equal null
  139. it 'should return the two memberGroupSubscriptions', ->
  140. expect(@data.memberGroupSubscriptions.length).to.equal 2
  141. expect(
  142. # Mongoose populates the admin_id with the user
  143. @data.memberGroupSubscriptions[0].admin_id._id.toString()
  144. ).to.equal @owner1._id
  145. expect(
  146. @data.memberGroupSubscriptions[1].admin_id._id.toString()
  147. ).to.equal @owner2._id
  148. describe 'when the user is a manager of a group subscription', ->
  149. before (done) ->
  150. @owner1 = new User()
  151. @owner2 = new User()
  152. async.series [
  153. (cb) => @owner1.ensureUserExists cb
  154. (cb) => @owner2.ensureUserExists cb
  155. (cb) => Subscription.create {
  156. admin_id: @owner1._id,
  157. manager_ids: [@owner1._id, @user._id],
  158. planCode: 'collaborator',
  159. groupPlan: true
  160. }, cb
  161. ], (error) =>
  162. return done(error) if error?
  163. SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel @user, (error, @data) =>
  164. return done(error) if error?
  165. done()
  166. return
  167. after (done) ->
  168. Subscription.remove {
  169. admin_id: @owner1._id
  170. }, done
  171. return
  172. it 'should return no personalSubscription', ->
  173. expect(@data.personalSubscription).to.equal null
  174. it 'should return the managedGroupSubscriptions', ->
  175. expect(@data.managedGroupSubscriptions.length).to.equal 1
  176. subscription = @data.managedGroupSubscriptions[0]
  177. expect(
  178. # Mongoose populates the admin_id with the user
  179. subscription.admin_id._id.toString()
  180. ).to.equal @owner1._id
  181. expect(subscription.groupPlan).to.equal true
  182. describe 'when the user is a manager of an institution', ->
  183. before (done) ->
  184. @v1Id = MockV1Api.nextV1Id()
  185. async.series [
  186. (cb) =>
  187. Institution.create({
  188. v1Id: @v1Id,
  189. managerIds: [@user._id]
  190. }, cb)
  191. ], (error) =>
  192. return done(error) if error?
  193. SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel @user, (error, @data) =>
  194. return done(error) if error?
  195. done()
  196. return
  197. after (done) ->
  198. Institution.remove {
  199. v1Id: @v1Id
  200. }, done
  201. return
  202. it 'should return the managedInstitutions', ->
  203. expect(@data.managedInstitutions.length).to.equal 1
  204. institution = @data.managedInstitutions[0]
  205. expect(institution.v1Id).to.equal @v1Id
  206. expect(institution.name).to.equal "Institution #{@v1Id}"
  207. describe 'when the user is a member of an affiliation', ->
  208. before (done) ->
  209. v1Id = MockV1Api.nextV1Id()
  210. MockV1Api.setUser v1Id, {
  211. subscription: {}
  212. }
  213. MockV1Api.setAffiliations [{
  214. email: 'confirmed-affiliation-email@stanford.example.edu'
  215. institution: { name: 'Stanford', licence: 'pro_plus', confirmed: true }
  216. }, {
  217. email: 'unconfirmed-affiliation-email@harvard.example.edu'
  218. institution: { name: 'Harvard', licence: 'pro_plus', confirmed: true }
  219. }, {
  220. email: 'confirmed-affiliation-email@mit.example.edu'
  221. institution: { name: 'MIT', licence: 'pro_plus', confirmed: false }
  222. }]
  223. async.series [
  224. (cb) =>
  225. @user.setV1Id v1Id, cb
  226. (cb) =>
  227. @user.addEmail 'unconfirmed-affiliation-email@harvard.example.edu', cb
  228. (cb) =>
  229. @user.addEmail 'confirmed-affiliation-email@stanford.example.edu', cb
  230. (cb) =>
  231. @user.confirmEmail 'confirmed-affiliation-email@stanford.example.edu', cb
  232. (cb) =>
  233. @user.addEmail 'confirmed-affiliation-email@mit.example.edu', cb
  234. (cb) =>
  235. @user.confirmEmail 'confirmed-affiliation-email@mit.example.edu', cb
  236. ], (error) =>
  237. return done(error) if error?
  238. SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel @user, (error, @data) =>
  239. return done(error) if error?
  240. done()
  241. it 'should return only the affilations with confirmed institutions, and confirmed emails', ->
  242. expect(@data.confirmedMemberInstitutions).to.deep.equal [
  243. { name: 'Stanford', licence: 'pro_plus', confirmed: true }
  244. ]
  245. describe 'when the user has a v1 subscription', ->
  246. before (done) ->
  247. MockV1Api.setUser v1Id = MockV1Api.nextV1Id(), {
  248. subscription: @subscription = {
  249. trial: false,
  250. has_plan: true,
  251. teams: [{
  252. id: 56,
  253. name: 'Test team'
  254. }]
  255. }
  256. }
  257. @user.setV1Id v1Id, (error) =>
  258. return done(error) if error?
  259. SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel @user, (error, @data) =>
  260. return done(error) if error?
  261. done()
  262. it 'should return no personalSubscription', ->
  263. expect(@data.personalSubscription).to.equal null
  264. it 'should return no memberGroupSubscriptions', ->
  265. expect(@data.memberGroupSubscriptions).to.deep.equal []
  266. it 'should return a v1Subscriptions', ->
  267. expect(@data.v1Subscriptions).to.deep.equal @subscription