UserFeaturesUpdater.test.mjs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { vi, expect } from 'vitest'
  2. import sinon from 'sinon'
  3. const modulePath =
  4. '../../../../app/src/Features/Subscription/UserFeaturesUpdater'
  5. describe('UserFeaturesUpdater', function () {
  6. beforeEach(async function (ctx) {
  7. ctx.features = {
  8. collaborators: 6,
  9. dropbox: true,
  10. github: true,
  11. gitBridge: true,
  12. versioning: true,
  13. compileTimeout: 180,
  14. compileGroup: 'priority',
  15. references: true,
  16. templates: true,
  17. trackChanges: true,
  18. referencesSearch: true,
  19. zotero: true,
  20. mendeley: true,
  21. symbolPalette: true,
  22. }
  23. ctx.User = {
  24. findByIdAndUpdate: sinon.stub().returns({
  25. exec: sinon.stub().resolves({ features: ctx.features }),
  26. }),
  27. }
  28. vi.doMock('../../../../app/src/models/User', () => ({
  29. User: ctx.User,
  30. }))
  31. vi.doMock('@overleaf/settings', () => ({
  32. default: (ctx.Settings = {}),
  33. }))
  34. ctx.UserFeaturesUpdater = (await import(modulePath)).default
  35. })
  36. describe('updateFeatures', function () {
  37. it('should send the users features', async function (ctx) {
  38. const userId = '5208dd34438842e2db000005'
  39. const update = {
  40. versioning: true,
  41. collaborators: 10,
  42. }
  43. const { features } =
  44. await ctx.UserFeaturesUpdater.promises.updateFeatures(userId, update)
  45. const updateArgs = ctx.User.findByIdAndUpdate.lastCall.args
  46. expect(updateArgs[0]).to.deep.equal(userId)
  47. expect(Object.keys(updateArgs[1]).length).to.equal(3)
  48. expect(updateArgs[1]['features.versioning']).to.equal(update.versioning)
  49. expect(updateArgs[1]['features.collaborators']).to.equal(
  50. update.collaborators
  51. )
  52. expect(updateArgs[1].featuresUpdatedAt instanceof Date).to.be.true
  53. features.should.deep.equal(update)
  54. expect(updateArgs[1].featuresEpoch).to.be.undefined
  55. })
  56. it('should set the featuresEpoch when present', async function (ctx) {
  57. const userId = '5208dd34438842e2db000005'
  58. const update = {
  59. versioning: true,
  60. }
  61. ctx.Settings.featuresEpoch = 'epoch-1'
  62. const { features } =
  63. await ctx.UserFeaturesUpdater.promises.updateFeatures(userId, update)
  64. const updateArgs = ctx.User.findByIdAndUpdate.lastCall.args
  65. expect(updateArgs[0]).to.deep.equal(userId)
  66. expect(Object.keys(updateArgs[1]).length).to.equal(3)
  67. expect(updateArgs[1]['features.versioning']).to.equal(update.versioning)
  68. expect(updateArgs[1].featuresUpdatedAt instanceof Date).to.be.true
  69. features.should.deep.equal(update)
  70. expect(updateArgs[1].featuresEpoch).to.equal('epoch-1')
  71. })
  72. })
  73. describe('overrideFeatures', function () {
  74. it('should send the users features', async function (ctx) {
  75. const userId = '5208dd34438842e2db000005'
  76. const update = Object.assign({}, { mendeley: !ctx.features.mendeley })
  77. const featuresChanged =
  78. await ctx.UserFeaturesUpdater.promises.overrideFeatures(userId, update)
  79. const updateArgs = ctx.User.findByIdAndUpdate.lastCall.args
  80. expect(updateArgs[0]).to.equal(userId)
  81. expect(Object.keys(updateArgs[1]).length).to.equal(2)
  82. expect(updateArgs[1].features).to.deep.equal(update)
  83. expect(updateArgs[1].featuresUpdatedAt instanceof Date).to.be.true
  84. featuresChanged.should.equal(true)
  85. })
  86. })
  87. })