Files
overleaf-cep/services/web/test/unit/src/UserMembership/UserMembershipViewModel.test.mjs
T
Andrew Rumble beb6f6d484 Merge pull request #29597 from overleaf/ar-last-features-esm-conversion
[web] last features esm conversion

GitOrigin-RevId: a35ab995bf654f1cdfe0e0062d8806761ecccf2d
2025-11-21 09:05:36 +00:00

126 lines
3.9 KiB
JavaScript

import { vi, expect } from 'vitest'
import sinon from 'sinon'
import mongodb from 'mongodb-legacy'
import MongoHelpers from '../../../../app/src/Features/Helpers/Mongo.mjs'
const assertCalledWith = sinon.assert.calledWith
const assertNotCalled = sinon.assert.notCalled
const { isObjectIdInstance, normalizeQuery } = MongoHelpers
const { ObjectId } = mongodb
const modulePath =
'../../../../app/src/Features/UserMembership/UserMembershipViewModel'
describe('UserMembershipViewModel', function () {
beforeEach(async function (ctx) {
ctx.UserGetter = { promises: { getUsers: sinon.stub() } }
vi.doMock('mongodb-legacy', () => ({
default: { ObjectId },
}))
vi.doMock('../../../../app/src/Features/Helpers/Mongo', () => ({
default: { isObjectIdInstance, normalizeQuery },
}))
vi.doMock('../../../../app/src/Features/User/UserGetter', () => ({
default: ctx.UserGetter,
}))
ctx.UserMembershipViewModel = (await import(modulePath)).default
ctx.email = 'mock-email@bar.com'
ctx.user = {
_id: 'mock-user-id',
email: 'mock-email@baz.com',
first_name: 'Name',
lastLoggedIn: '2020-05-20T10:41:11.407Z',
enrollment: {
managedBy: 'mock-group-id',
enrolledAt: new Date(),
sso: {
groupId: 'abc123abc123',
linkedAt: new Date(),
primary: true,
},
},
}
})
describe('build', function () {
it('build email', function (ctx) {
const viewModel = ctx.UserMembershipViewModel.build(ctx.email)
expect(viewModel).to.deep.equal({
email: ctx.email,
invite: true,
last_active_at: null,
last_logged_in_at: null,
first_name: null,
last_name: null,
_id: null,
enrollment: undefined,
})
})
it('build user', function (ctx) {
const viewModel = ctx.UserMembershipViewModel.build(ctx.user)
expect(viewModel).to.deep.equal({
email: ctx.user.email,
invite: false,
last_active_at: ctx.user.lastLoggedIn,
last_logged_in_at: ctx.user.lastLoggedIn,
first_name: ctx.user.first_name,
last_name: null,
_id: ctx.user._id,
enrollment: ctx.user.enrollment,
})
})
})
describe('build async', function () {
beforeEach(function (ctx) {
ctx.UserMembershipViewModel.build = sinon.stub()
})
it('build email', async function (ctx) {
ctx.UserGetter.promises.getUsers.resolves([])
await ctx.UserMembershipViewModel.buildAsync([ctx.email])
assertCalledWith(ctx.UserMembershipViewModel.build, ctx.email)
})
it('build user', async function (ctx) {
ctx.UserGetter.promises.getUsers.resolves([])
await ctx.UserMembershipViewModel.buildAsync([ctx.user])
assertCalledWith(ctx.UserMembershipViewModel.build, ctx.user)
})
it('build user id', async function (ctx) {
const user = {
...ctx.user,
_id: new ObjectId(),
}
ctx.UserGetter.promises.getUsers.resolves([user])
const [viewModel] = await ctx.UserMembershipViewModel.buildAsync([
user._id,
])
assertNotCalled(ctx.UserMembershipViewModel.build)
expect(viewModel._id.toString()).to.equal(user._id.toString())
expect(viewModel.email).to.equal(user.email)
expect(viewModel.first_name).to.equal(user.first_name)
expect(viewModel.invite).to.equal(false)
expect(viewModel.email).to.exist
expect(viewModel.enrollment).to.exist
expect(viewModel.enrollment).to.deep.equal(user.enrollment)
})
it('build user id with error', async function (ctx) {
ctx.UserGetter.promises.getUsers.rejects(new Error('nope'))
const userId = new ObjectId()
const [viewModel] = await ctx.UserMembershipViewModel.buildAsync([userId])
assertNotCalled(ctx.UserMembershipViewModel.build)
expect(viewModel._id).to.equal(userId.toString())
expect(viewModel.email).not.to.exist
})
})
})