UserMembershipViewModel.test.mjs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import { vi, expect } from 'vitest'
  2. import sinon from 'sinon'
  3. import mongodb from 'mongodb-legacy'
  4. import MongoHelpers from '../../../../app/src/Features/Helpers/Mongo.mjs'
  5. const assertCalledWith = sinon.assert.calledWith
  6. const assertNotCalled = sinon.assert.notCalled
  7. const { isObjectIdInstance, normalizeQuery } = MongoHelpers
  8. const { ObjectId } = mongodb
  9. const modulePath =
  10. '../../../../app/src/Features/UserMembership/UserMembershipViewModel'
  11. describe('UserMembershipViewModel', function () {
  12. beforeEach(async function (ctx) {
  13. ctx.UserGetter = { promises: { getUsers: sinon.stub() } }
  14. vi.doMock('mongodb-legacy', () => ({
  15. default: { ObjectId },
  16. }))
  17. vi.doMock('../../../../app/src/Features/Helpers/Mongo', () => ({
  18. default: { isObjectIdInstance, normalizeQuery },
  19. }))
  20. vi.doMock('../../../../app/src/Features/User/UserGetter', () => ({
  21. default: ctx.UserGetter,
  22. }))
  23. ctx.UserMembershipViewModel = (await import(modulePath)).default
  24. ctx.email = 'mock-email@bar.com'
  25. ctx.user = {
  26. _id: 'mock-user-id',
  27. email: 'mock-email@baz.com',
  28. first_name: 'Name',
  29. lastLoggedIn: '2020-05-20T10:41:11.407Z',
  30. enrollment: {
  31. managedBy: 'mock-group-id',
  32. enrolledAt: new Date(),
  33. sso: {
  34. groupId: 'abc123abc123',
  35. linkedAt: new Date(),
  36. primary: true,
  37. },
  38. },
  39. }
  40. })
  41. describe('build', function () {
  42. it('build email', function (ctx) {
  43. const viewModel = ctx.UserMembershipViewModel.build(ctx.email)
  44. expect(viewModel).to.deep.equal({
  45. email: ctx.email,
  46. invite: true,
  47. last_active_at: null,
  48. last_logged_in_at: null,
  49. first_name: null,
  50. last_name: null,
  51. _id: null,
  52. enrollment: undefined,
  53. })
  54. })
  55. it('build user', function (ctx) {
  56. const viewModel = ctx.UserMembershipViewModel.build(ctx.user)
  57. expect(viewModel).to.deep.equal({
  58. email: ctx.user.email,
  59. invite: false,
  60. last_active_at: ctx.user.lastLoggedIn,
  61. last_logged_in_at: ctx.user.lastLoggedIn,
  62. first_name: ctx.user.first_name,
  63. last_name: null,
  64. _id: ctx.user._id,
  65. enrollment: ctx.user.enrollment,
  66. })
  67. })
  68. })
  69. describe('build async', function () {
  70. beforeEach(function (ctx) {
  71. ctx.UserMembershipViewModel.build = sinon.stub()
  72. })
  73. it('build email', async function (ctx) {
  74. ctx.UserGetter.promises.getUsers.resolves([])
  75. await ctx.UserMembershipViewModel.buildAsync([ctx.email])
  76. assertCalledWith(ctx.UserMembershipViewModel.build, ctx.email)
  77. })
  78. it('build user', async function (ctx) {
  79. ctx.UserGetter.promises.getUsers.resolves([])
  80. await ctx.UserMembershipViewModel.buildAsync([ctx.user])
  81. assertCalledWith(ctx.UserMembershipViewModel.build, ctx.user)
  82. })
  83. it('build user id', async function (ctx) {
  84. const user = {
  85. ...ctx.user,
  86. _id: new ObjectId(),
  87. }
  88. ctx.UserGetter.promises.getUsers.resolves([user])
  89. const [viewModel] = await ctx.UserMembershipViewModel.buildAsync([
  90. user._id,
  91. ])
  92. assertNotCalled(ctx.UserMembershipViewModel.build)
  93. expect(viewModel._id.toString()).to.equal(user._id.toString())
  94. expect(viewModel.email).to.equal(user.email)
  95. expect(viewModel.first_name).to.equal(user.first_name)
  96. expect(viewModel.invite).to.equal(false)
  97. expect(viewModel.email).to.exist
  98. expect(viewModel.enrollment).to.exist
  99. expect(viewModel.enrollment).to.deep.equal(user.enrollment)
  100. })
  101. it('build user id with error', async function (ctx) {
  102. ctx.UserGetter.promises.getUsers.rejects(new Error('nope'))
  103. const userId = new ObjectId()
  104. const [viewModel] = await ctx.UserMembershipViewModel.buildAsync([userId])
  105. assertNotCalled(ctx.UserMembershipViewModel.build)
  106. expect(viewModel._id).to.equal(userId.toString())
  107. expect(viewModel.email).not.to.exist
  108. })
  109. })
  110. })