RemoveUserFromSharedVault.spec.ts 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. import {
  2. Uuid,
  3. Timestamps,
  4. Result,
  5. NotificationPayload,
  6. SharedVaultUserPermission,
  7. SharedVaultUser,
  8. } from '@standardnotes/domain-core'
  9. import { SharedVault } from '../../../SharedVault/SharedVault'
  10. import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
  11. import { SharedVaultUserRepositoryInterface } from '../../../SharedVault/User/SharedVaultUserRepositoryInterface'
  12. import { RemoveUserFromSharedVault } from './RemoveUserFromSharedVault'
  13. import { AddNotificationForUser } from '../../Messaging/AddNotificationForUser/AddNotificationForUser'
  14. import { DomainEventFactoryInterface } from '../../../Event/DomainEventFactoryInterface'
  15. import { DomainEventInterface, DomainEventPublisherInterface } from '@standardnotes/domain-events'
  16. describe('RemoveUserFromSharedVault', () => {
  17. let sharedVaultRepository: SharedVaultRepositoryInterface
  18. let sharedVaultUserRepository: SharedVaultUserRepositoryInterface
  19. let addNotificationForUser: AddNotificationForUser
  20. let sharedVault: SharedVault
  21. let sharedVaultUser: SharedVaultUser
  22. let domainEventFactory: DomainEventFactoryInterface
  23. let domainEventPublisher: DomainEventPublisherInterface
  24. const createUseCase = () =>
  25. new RemoveUserFromSharedVault(
  26. sharedVaultUserRepository,
  27. sharedVaultRepository,
  28. addNotificationForUser,
  29. domainEventFactory,
  30. domainEventPublisher,
  31. )
  32. beforeEach(() => {
  33. sharedVault = SharedVault.create({
  34. fileUploadBytesUsed: 2,
  35. userUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
  36. timestamps: Timestamps.create(123, 123).getValue(),
  37. }).getValue()
  38. sharedVaultRepository = {} as jest.Mocked<SharedVaultRepositoryInterface>
  39. sharedVaultRepository.findByUuid = jest.fn().mockResolvedValue(sharedVault)
  40. sharedVaultRepository.remove = jest.fn()
  41. sharedVaultUser = SharedVaultUser.create({
  42. permission: SharedVaultUserPermission.create(SharedVaultUserPermission.PERMISSIONS.Read).getValue(),
  43. sharedVaultUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
  44. userUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
  45. timestamps: Timestamps.create(123, 123).getValue(),
  46. }).getValue()
  47. sharedVaultUserRepository = {} as jest.Mocked<SharedVaultUserRepositoryInterface>
  48. sharedVaultUserRepository.findByUserUuidAndSharedVaultUuid = jest.fn().mockResolvedValue(sharedVaultUser)
  49. sharedVaultUserRepository.remove = jest.fn()
  50. addNotificationForUser = {} as jest.Mocked<AddNotificationForUser>
  51. addNotificationForUser.execute = jest.fn().mockReturnValue(Result.ok())
  52. domainEventFactory = {} as jest.Mocked<DomainEventFactoryInterface>
  53. domainEventFactory.createUserRemovedFromSharedVaultEvent = jest
  54. .fn()
  55. .mockReturnValue({} as jest.Mocked<DomainEventInterface>)
  56. domainEventPublisher = {} as jest.Mocked<DomainEventPublisherInterface>
  57. domainEventPublisher.publish = jest.fn()
  58. })
  59. it('should remove user from shared vault', async () => {
  60. const useCase = createUseCase()
  61. const result = await useCase.execute({
  62. originatorUuid: '00000000-0000-0000-0000-000000000000',
  63. sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
  64. userUuid: '00000000-0000-0000-0000-000000000001',
  65. })
  66. expect(result.isFailed()).toBeFalsy()
  67. expect(sharedVaultUserRepository.remove).toHaveBeenCalledWith(sharedVaultUser)
  68. })
  69. it('should return error when shared vault is not found', async () => {
  70. sharedVaultRepository.findByUuid = jest.fn().mockResolvedValue(null)
  71. const useCase = createUseCase()
  72. const result = await useCase.execute({
  73. originatorUuid: '00000000-0000-0000-0000-000000000000',
  74. sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
  75. userUuid: '00000000-0000-0000-0000-000000000001',
  76. })
  77. expect(result.isFailed()).toBe(true)
  78. expect(result.getError()).toBe('Shared vault not found')
  79. })
  80. it('should return error when shared vault user is not found', async () => {
  81. sharedVaultUserRepository.findByUserUuidAndSharedVaultUuid = jest.fn().mockResolvedValue(null)
  82. const useCase = createUseCase()
  83. const result = await useCase.execute({
  84. originatorUuid: '00000000-0000-0000-0000-000000000000',
  85. sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
  86. userUuid: '00000000-0000-0000-0000-000000000001',
  87. })
  88. expect(result.isFailed()).toBe(true)
  89. expect(result.getError()).toBe('User is not a member of the shared vault')
  90. })
  91. it('should return error when user is not owner of shared vault', async () => {
  92. sharedVault = SharedVault.create({
  93. fileUploadBytesUsed: 2,
  94. userUuid: Uuid.create('00000000-0000-0000-0000-000000000002').getValue(),
  95. timestamps: Timestamps.create(123, 123).getValue(),
  96. }).getValue()
  97. sharedVaultRepository.findByUuid = jest.fn().mockResolvedValue(sharedVault)
  98. const useCase = createUseCase()
  99. const result = await useCase.execute({
  100. originatorUuid: '00000000-0000-0000-0000-000000000000',
  101. sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
  102. userUuid: '00000000-0000-0000-0000-000000000001',
  103. })
  104. expect(result.isFailed()).toBe(true)
  105. expect(result.getError()).toBe('Only owner can remove other users from shared vault')
  106. })
  107. it('should remove shared vault user if user is owner and is being force removed', async () => {
  108. sharedVault = SharedVault.create({
  109. fileUploadBytesUsed: 2,
  110. userUuid: Uuid.create('00000000-0000-0000-0000-000000000002').getValue(),
  111. timestamps: Timestamps.create(123, 123).getValue(),
  112. }).getValue()
  113. sharedVaultRepository.findByUuid = jest.fn().mockResolvedValue(sharedVault)
  114. const useCase = createUseCase()
  115. await useCase.execute({
  116. originatorUuid: '00000000-0000-0000-0000-000000000002',
  117. sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
  118. userUuid: '00000000-0000-0000-0000-000000000001',
  119. forceRemoveOwner: true,
  120. })
  121. expect(sharedVaultUserRepository.remove).toHaveBeenCalledWith(sharedVaultUser)
  122. })
  123. it('should return error when user is owner of shared vault', async () => {
  124. const useCase = createUseCase()
  125. const result = await useCase.execute({
  126. originatorUuid: '00000000-0000-0000-0000-000000000000',
  127. sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
  128. userUuid: '00000000-0000-0000-0000-000000000000',
  129. })
  130. expect(result.isFailed()).toBe(true)
  131. expect(result.getError()).toBe('Owner cannot be removed from shared vault')
  132. })
  133. it('should return error if shared vault uuid is invalid', async () => {
  134. const useCase = createUseCase()
  135. const result = await useCase.execute({
  136. originatorUuid: '00000000-0000-0000-0000-000000000000',
  137. sharedVaultUuid: 'invalid',
  138. userUuid: '00000000-0000-0000-0000-000000000001',
  139. })
  140. expect(result.isFailed()).toBe(true)
  141. expect(result.getError()).toBe('Given value is not a valid uuid: invalid')
  142. })
  143. it('should return error if user uuid is invalid', async () => {
  144. const useCase = createUseCase()
  145. const result = await useCase.execute({
  146. originatorUuid: '00000000-0000-0000-0000-000000000000',
  147. sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
  148. userUuid: 'invalid',
  149. })
  150. expect(result.isFailed()).toBe(true)
  151. expect(result.getError()).toBe('Given value is not a valid uuid: invalid')
  152. })
  153. it('should return error if originator uuid is invalid', async () => {
  154. const useCase = createUseCase()
  155. const result = await useCase.execute({
  156. originatorUuid: 'invalid',
  157. sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
  158. userUuid: '00000000-0000-0000-0000-000000000001',
  159. })
  160. expect(result.isFailed()).toBe(true)
  161. expect(result.getError()).toBe('Given value is not a valid uuid: invalid')
  162. })
  163. it('should add notification for user', async () => {
  164. const useCase = createUseCase()
  165. await useCase.execute({
  166. originatorUuid: '00000000-0000-0000-0000-000000000000',
  167. sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
  168. userUuid: '00000000-0000-0000-0000-000000000001',
  169. })
  170. expect(addNotificationForUser.execute).toHaveBeenCalled()
  171. })
  172. it('should return error if notification could not be added', async () => {
  173. addNotificationForUser.execute = jest.fn().mockResolvedValue(Result.fail('Could not add notification'))
  174. const useCase = createUseCase()
  175. const result = await useCase.execute({
  176. originatorUuid: '00000000-0000-0000-0000-000000000000',
  177. sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
  178. userUuid: '00000000-0000-0000-0000-000000000001',
  179. })
  180. expect(result.isFailed()).toBe(true)
  181. })
  182. it('should return error if notification payload could not be created', async () => {
  183. const mock = jest.spyOn(NotificationPayload, 'create')
  184. mock.mockReturnValue(Result.fail('Oops'))
  185. const useCase = createUseCase()
  186. const result = await useCase.execute({
  187. originatorUuid: '00000000-0000-0000-0000-000000000000',
  188. sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
  189. userUuid: '00000000-0000-0000-0000-000000000001',
  190. })
  191. expect(result.isFailed()).toBe(true)
  192. expect(result.getError()).toBe('Oops')
  193. })
  194. })