CreateSharedVault.spec.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { TimerInterface } from '@standardnotes/time'
  2. import { Result, RoleName } from '@standardnotes/domain-core'
  3. import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
  4. import { AddUserToSharedVault } from '../AddUserToSharedVault/AddUserToSharedVault'
  5. import { CreateSharedVault } from './CreateSharedVault'
  6. import { SharedVault } from '../../../SharedVault/SharedVault'
  7. describe('CreateSharedVault', () => {
  8. let addUserToSharedVault: AddUserToSharedVault
  9. let sharedVaultRepository: SharedVaultRepositoryInterface
  10. let timer: TimerInterface
  11. const createUseCase = () => new CreateSharedVault(addUserToSharedVault, sharedVaultRepository, timer)
  12. beforeEach(() => {
  13. addUserToSharedVault = {} as jest.Mocked<AddUserToSharedVault>
  14. addUserToSharedVault.execute = jest.fn().mockResolvedValue(Result.ok())
  15. sharedVaultRepository = {} as jest.Mocked<SharedVaultRepositoryInterface>
  16. sharedVaultRepository.save = jest.fn()
  17. timer = {} as jest.Mocked<TimerInterface>
  18. timer.getTimestampInMicroseconds = jest.fn().mockReturnValue(123456789)
  19. })
  20. it('should return a failure result if the user uuid is invalid', async () => {
  21. const useCase = createUseCase()
  22. const result = await useCase.execute({
  23. userUuid: 'invalid-uuid',
  24. userRoleNames: [RoleName.NAMES.ProUser],
  25. })
  26. expect(result.isFailed()).toBe(true)
  27. expect(result.getError()).toBe('Given value is not a valid uuid: invalid-uuid')
  28. })
  29. it('should return a failure result if the user role names are empty', async () => {
  30. const useCase = createUseCase()
  31. const result = await useCase.execute({
  32. userUuid: '00000000-0000-0000-0000-000000000000',
  33. userRoleNames: [],
  34. })
  35. expect(result.isFailed()).toBe(true)
  36. expect(result.getError()).toBe('Given value is empty: ')
  37. })
  38. it('should return a failure result if the shared vault could not be created', async () => {
  39. const useCase = createUseCase()
  40. const mockSharedVault = jest.spyOn(SharedVault, 'create')
  41. mockSharedVault.mockImplementation(() => {
  42. return Result.fail('Oops')
  43. })
  44. const result = await useCase.execute({
  45. userUuid: '00000000-0000-0000-0000-000000000000',
  46. userRoleNames: [RoleName.NAMES.ProUser],
  47. })
  48. expect(result.isFailed()).toBe(true)
  49. expect(result.getError()).toBe('Oops')
  50. mockSharedVault.mockRestore()
  51. })
  52. it('should return a failure result if the user could not be added to the shared vault', async () => {
  53. const useCase = createUseCase()
  54. addUserToSharedVault.execute = jest.fn().mockResolvedValue(Result.fail('Oops'))
  55. const result = await useCase.execute({
  56. userUuid: '00000000-0000-0000-0000-000000000000',
  57. userRoleNames: [RoleName.NAMES.ProUser],
  58. })
  59. expect(result.isFailed()).toBe(true)
  60. expect(result.getError()).toBe('Oops')
  61. })
  62. it('should create a shared vault', async () => {
  63. const useCase = createUseCase()
  64. await useCase.execute({
  65. userUuid: '00000000-0000-0000-0000-000000000000',
  66. userRoleNames: [RoleName.NAMES.ProUser],
  67. })
  68. expect(addUserToSharedVault.execute).toHaveBeenCalledWith({
  69. sharedVaultUuid: expect.any(String),
  70. userUuid: '00000000-0000-0000-0000-000000000000',
  71. permission: 'admin',
  72. skipSharedVaultExistenceCheck: true,
  73. })
  74. expect(sharedVaultRepository.save).toHaveBeenCalled()
  75. })
  76. it('should return a failure result if a plus user has reached the limit of shared vaults', async () => {
  77. const useCase = createUseCase()
  78. sharedVaultRepository.countByUserUuid = jest.fn().mockResolvedValue(3)
  79. const result = await useCase.execute({
  80. userUuid: '00000000-0000-0000-0000-000000000000',
  81. userRoleNames: [RoleName.NAMES.PlusUser],
  82. })
  83. expect(result.isFailed()).toBe(true)
  84. expect(result.getError()).toBe('You have reached the limit of shared vaults for your account.')
  85. })
  86. it('should return a failure result if a core user has reached the limit of shared vaults', async () => {
  87. const useCase = createUseCase()
  88. sharedVaultRepository.countByUserUuid = jest.fn().mockResolvedValue(1)
  89. const result = await useCase.execute({
  90. userUuid: '00000000-0000-0000-0000-000000000000',
  91. userRoleNames: [RoleName.NAMES.CoreUser],
  92. })
  93. expect(result.isFailed()).toBe(true)
  94. expect(result.getError()).toBe('You have reached the limit of shared vaults for your account.')
  95. })
  96. })