@sync-in/server 1.3.9 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +5 -3
  3. package/environment/environment.dist.yaml +2 -0
  4. package/package.json +6 -6
  5. package/server/app.bootstrap.js +9 -0
  6. package/server/app.bootstrap.js.map +1 -1
  7. package/server/app.service.spec.js +44 -19
  8. package/server/app.service.spec.js.map +1 -1
  9. package/server/applications/comments/comments.controller.spec.js +103 -4
  10. package/server/applications/comments/comments.controller.spec.js.map +1 -1
  11. package/server/applications/comments/services/comments-manager.service.spec.js +409 -9
  12. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  13. package/server/applications/files/adapters/files-indexer-mysql.service.spec.js +333 -0
  14. package/server/applications/files/adapters/files-indexer-mysql.service.spec.js.map +1 -0
  15. package/server/applications/files/constants/files.js +0 -23
  16. package/server/applications/files/constants/files.js.map +1 -1
  17. package/server/applications/files/constants/only-office.js +8 -0
  18. package/server/applications/files/constants/only-office.js.map +1 -1
  19. package/server/applications/files/constants/routes.js +6 -1
  20. package/server/applications/files/constants/routes.js.map +1 -1
  21. package/server/applications/files/files-only-office.controller.js +11 -0
  22. package/server/applications/files/files-only-office.controller.js.map +1 -1
  23. package/server/applications/files/files-only-office.controller.spec.js +97 -3
  24. package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
  25. package/server/applications/files/files-tasks.controller.spec.js +91 -1
  26. package/server/applications/files/files-tasks.controller.spec.js.map +1 -1
  27. package/server/applications/files/files.config.js +5 -0
  28. package/server/applications/files/files.config.js.map +1 -1
  29. package/server/applications/files/files.controller.spec.js +268 -46
  30. package/server/applications/files/files.controller.spec.js.map +1 -1
  31. package/server/applications/files/guards/files-only-office.guard.spec.js +77 -1
  32. package/server/applications/files/guards/files-only-office.guard.spec.js.map +1 -1
  33. package/server/applications/files/guards/files-only-office.strategy.js +0 -1
  34. package/server/applications/files/guards/files-only-office.strategy.js.map +1 -1
  35. package/server/applications/files/services/files-only-office-manager.service.js +5 -0
  36. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  37. package/server/applications/links/links.controller.spec.js +91 -58
  38. package/server/applications/links/links.controller.spec.js.map +1 -1
  39. package/server/applications/links/services/links-manager.service.js +4 -6
  40. package/server/applications/links/services/links-manager.service.js.map +1 -1
  41. package/server/applications/links/services/links-manager.service.spec.js +378 -14
  42. package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
  43. package/server/applications/links/services/links-queries.service.js +1 -1
  44. package/server/applications/links/services/links-queries.service.js.map +1 -1
  45. package/server/applications/notifications/notifications.controller.spec.js +56 -1
  46. package/server/applications/notifications/notifications.controller.spec.js.map +1 -1
  47. package/server/applications/notifications/services/notifications-manager.service.spec.js +461 -5
  48. package/server/applications/notifications/services/notifications-manager.service.spec.js.map +1 -1
  49. package/server/applications/shares/services/shares-manager.service.spec.js +590 -14
  50. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  51. package/server/applications/spaces/guards/space.guard.spec.js +153 -18
  52. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  53. package/server/applications/spaces/services/spaces-browser.service.js +7 -7
  54. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  55. package/server/applications/spaces/services/spaces-manager.service.js +17 -17
  56. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  57. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js +120 -0
  58. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js.map +1 -0
  59. package/server/applications/sync/services/sync-clients-manager.service.spec.js +548 -8
  60. package/server/applications/sync/services/sync-clients-manager.service.spec.js.map +1 -1
  61. package/server/applications/sync/services/sync-manager.service.spec.js +837 -5
  62. package/server/applications/sync/services/sync-manager.service.spec.js.map +1 -1
  63. package/server/applications/sync/services/sync-paths-manager.service.spec.js +900 -7
  64. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  65. package/server/applications/sync/utils/routes.js +1 -1
  66. package/server/applications/sync/utils/routes.js.map +1 -1
  67. package/server/applications/users/guards/permissions.guard.js +4 -4
  68. package/server/applications/users/guards/permissions.guard.js.map +1 -1
  69. package/server/applications/users/guards/permissions.guard.spec.js +6 -6
  70. package/server/applications/users/guards/permissions.guard.spec.js.map +1 -1
  71. package/server/applications/users/guards/roles.guard.js +1 -1
  72. package/server/applications/users/guards/roles.guard.js.map +1 -1
  73. package/server/applications/users/models/user.model.js +1 -1
  74. package/server/applications/users/models/user.model.js.map +1 -1
  75. package/server/applications/users/services/admin-users-manager.service.js +22 -24
  76. package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
  77. package/server/applications/users/services/admin-users-manager.service.spec.js +763 -17
  78. package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
  79. package/server/applications/users/services/users-manager.service.js +1 -1
  80. package/server/applications/users/services/users-manager.service.js.map +1 -1
  81. package/server/applications/users/services/users-manager.service.spec.js +938 -49
  82. package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
  83. package/server/applications/webdav/decorators/if-header.decorator.js +4 -1
  84. package/server/applications/webdav/decorators/if-header.decorator.js.map +1 -1
  85. package/server/applications/webdav/filters/webdav.filter.spec.js +77 -0
  86. package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -0
  87. package/server/applications/webdav/guards/webdav-protocol.guard.js +3 -7
  88. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  89. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +580 -0
  90. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -0
  91. package/server/applications/webdav/services/webdav-methods.service.spec.js +1582 -3
  92. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  93. package/server/applications/webdav/services/webdav-spaces.service.spec.js +390 -2
  94. package/server/applications/webdav/services/webdav-spaces.service.spec.js.map +1 -1
  95. package/server/applications/webdav/webdav.controller.js +2 -2
  96. package/server/applications/webdav/webdav.controller.js.map +1 -1
  97. package/server/authentication/guards/auth-basic.guard.js.map +1 -1
  98. package/server/authentication/guards/auth-basic.guard.spec.js +38 -2
  99. package/server/authentication/guards/auth-basic.guard.spec.js.map +1 -1
  100. package/server/authentication/guards/auth-basic.strategy.js +0 -1
  101. package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
  102. package/server/authentication/guards/auth-digest.guard.js +1 -2
  103. package/server/authentication/guards/auth-digest.guard.js.map +1 -1
  104. package/server/authentication/guards/auth-local.guard.js.map +1 -1
  105. package/server/authentication/guards/auth-local.guard.spec.js +7 -5
  106. package/server/authentication/guards/auth-local.guard.spec.js.map +1 -1
  107. package/server/authentication/guards/auth-local.strategy.js +0 -1
  108. package/server/authentication/guards/auth-local.strategy.js.map +1 -1
  109. package/server/authentication/guards/auth-token-access.guard.spec.js +30 -0
  110. package/server/authentication/guards/auth-token-access.guard.spec.js.map +1 -1
  111. package/server/authentication/guards/auth-token-access.strategy.js +0 -1
  112. package/server/authentication/guards/auth-token-access.strategy.js.map +1 -1
  113. package/server/authentication/guards/auth-token-refresh.strategy.js +0 -1
  114. package/server/authentication/guards/auth-token-refresh.strategy.js.map +1 -1
  115. package/server/authentication/services/auth-methods/auth-method-database.service.js +1 -1
  116. package/server/authentication/services/auth-methods/auth-method-database.service.js.map +1 -1
  117. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js +8 -6
  118. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +1 -1
  119. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +2 -2
  120. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  121. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +500 -5
  122. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +1 -1
  123. package/server/configuration/config.loader.js +0 -3
  124. package/server/configuration/config.loader.js.map +1 -1
  125. package/server/infrastructure/context/interceptors/context.interceptor.spec.js +135 -0
  126. package/server/infrastructure/context/interceptors/context.interceptor.spec.js.map +1 -0
  127. package/server/infrastructure/context/services/context-manager.service.spec.js +98 -0
  128. package/server/infrastructure/context/services/context-manager.service.spec.js.map +1 -0
  129. package/server/infrastructure/database/constants.js +0 -1
  130. package/server/infrastructure/database/constants.js.map +1 -1
  131. package/server/infrastructure/database/scripts/seed/usersgroups.js +3 -3
  132. package/server/infrastructure/database/scripts/seed/usersgroups.js.map +1 -1
  133. package/server/infrastructure/mailer/mailer.service.js +20 -19
  134. package/server/infrastructure/mailer/mailer.service.js.map +1 -1
  135. package/server/infrastructure/mailer/mailer.service.spec.js +176 -0
  136. package/server/infrastructure/mailer/mailer.service.spec.js.map +1 -0
  137. package/static/3rdpartylicenses.txt +26 -26
  138. package/static/assets/pdfjs/build/pdf.mjs +1177 -255
  139. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  140. package/static/assets/pdfjs/build/pdf.sandbox.mjs +25 -2
  141. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  142. package/static/assets/pdfjs/build/pdf.worker.mjs +140 -16
  143. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  144. package/static/assets/pdfjs/version +1 -1
  145. package/static/assets/pdfjs/web/debugger.css +31 -0
  146. package/static/assets/pdfjs/web/debugger.mjs +144 -2
  147. package/static/assets/pdfjs/web/images/comment-editButton.svg +6 -1
  148. package/static/assets/pdfjs/web/locale/ach/viewer.ftl +0 -63
  149. package/static/assets/pdfjs/web/locale/af/viewer.ftl +0 -71
  150. package/static/assets/pdfjs/web/locale/an/viewer.ftl +0 -63
  151. package/static/assets/pdfjs/web/locale/ast/viewer.ftl +0 -60
  152. package/static/assets/pdfjs/web/locale/az/viewer.ftl +0 -63
  153. package/static/assets/pdfjs/web/locale/be/viewer.ftl +38 -0
  154. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +0 -37
  155. package/static/assets/pdfjs/web/locale/bn/viewer.ftl +0 -63
  156. package/static/assets/pdfjs/web/locale/bo/viewer.ftl +0 -63
  157. package/static/assets/pdfjs/web/locale/br/viewer.ftl +0 -37
  158. package/static/assets/pdfjs/web/locale/brx/viewer.ftl +0 -63
  159. package/static/assets/pdfjs/web/locale/bs/viewer.ftl +22 -0
  160. package/static/assets/pdfjs/web/locale/ca/viewer.ftl +0 -54
  161. package/static/assets/pdfjs/web/locale/cak/viewer.ftl +0 -54
  162. package/static/assets/pdfjs/web/locale/ckb/viewer.ftl +0 -63
  163. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +38 -0
  164. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +38 -0
  165. package/static/assets/pdfjs/web/locale/da/viewer.ftl +38 -0
  166. package/static/assets/pdfjs/web/locale/de/viewer.ftl +38 -0
  167. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +38 -0
  168. package/static/assets/pdfjs/web/locale/el/viewer.ftl +38 -0
  169. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +38 -0
  170. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +38 -0
  171. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +25 -0
  172. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +38 -0
  173. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +38 -0
  174. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +38 -0
  175. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -6
  176. package/static/assets/pdfjs/web/locale/et/viewer.ftl +0 -57
  177. package/static/assets/pdfjs/web/locale/fa/viewer.ftl +0 -37
  178. package/static/assets/pdfjs/web/locale/ff/viewer.ftl +0 -63
  179. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +38 -0
  180. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +38 -0
  181. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +38 -0
  182. package/static/assets/pdfjs/web/locale/ga-IE/viewer.ftl +0 -71
  183. package/static/assets/pdfjs/web/locale/gd/viewer.ftl +0 -54
  184. package/static/assets/pdfjs/web/locale/gl/viewer.ftl +8 -0
  185. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +38 -0
  186. package/static/assets/pdfjs/web/locale/gu-IN/viewer.ftl +0 -63
  187. package/static/assets/pdfjs/web/locale/he/viewer.ftl +38 -0
  188. package/static/assets/pdfjs/web/locale/hi-IN/viewer.ftl +0 -60
  189. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +38 -0
  190. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +38 -0
  191. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +0 -49
  192. package/static/assets/pdfjs/web/locale/hye/viewer.ftl +0 -60
  193. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +38 -0
  194. package/static/assets/pdfjs/web/locale/is/viewer.ftl +0 -3
  195. package/static/assets/pdfjs/web/locale/it/viewer.ftl +31 -0
  196. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +8 -0
  197. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +48 -10
  198. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +5 -0
  199. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +8 -0
  200. package/static/assets/pdfjs/web/locale/km/viewer.ftl +0 -63
  201. package/static/assets/pdfjs/web/locale/kn/viewer.ftl +0 -71
  202. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -0
  203. package/static/assets/pdfjs/web/locale/lij/viewer.ftl +0 -63
  204. package/static/assets/pdfjs/web/locale/lo/viewer.ftl +0 -54
  205. package/static/assets/pdfjs/web/locale/lt/viewer.ftl +0 -60
  206. package/static/assets/pdfjs/web/locale/ltg/viewer.ftl +0 -63
  207. package/static/assets/pdfjs/web/locale/lv/viewer.ftl +0 -63
  208. package/static/assets/pdfjs/web/locale/meh/viewer.ftl +0 -75
  209. package/static/assets/pdfjs/web/locale/mk/viewer.ftl +0 -63
  210. package/static/assets/pdfjs/web/locale/ml/viewer.ftl +0 -3
  211. package/static/assets/pdfjs/web/locale/mr/viewer.ftl +0 -63
  212. package/static/assets/pdfjs/web/locale/ms/viewer.ftl +0 -63
  213. package/static/assets/pdfjs/web/locale/my/viewer.ftl +0 -71
  214. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +44 -6
  215. package/static/assets/pdfjs/web/locale/ne-NP/viewer.ftl +0 -71
  216. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +38 -0
  217. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +45 -1
  218. package/static/assets/pdfjs/web/locale/oc/viewer.ftl +0 -31
  219. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +38 -0
  220. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -1
  221. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +38 -0
  222. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +355 -1
  223. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +38 -0
  224. package/static/assets/pdfjs/web/locale/sat/viewer.ftl +0 -54
  225. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +0 -38
  226. package/static/assets/pdfjs/web/locale/scn/viewer.ftl +0 -92
  227. package/static/assets/pdfjs/web/locale/sco/viewer.ftl +0 -60
  228. package/static/assets/pdfjs/web/locale/si/viewer.ftl +0 -51
  229. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +38 -0
  230. package/static/assets/pdfjs/web/locale/skr/viewer.ftl +0 -27
  231. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +8 -0
  232. package/static/assets/pdfjs/web/locale/son/viewer.ftl +0 -71
  233. package/static/assets/pdfjs/web/locale/sr/viewer.ftl +0 -33
  234. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +38 -0
  235. package/static/assets/pdfjs/web/locale/szl/viewer.ftl +0 -63
  236. package/static/assets/pdfjs/web/locale/ta/viewer.ftl +0 -63
  237. package/static/assets/pdfjs/web/locale/te/viewer.ftl +0 -60
  238. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +38 -0
  239. package/static/assets/pdfjs/web/locale/tl/viewer.ftl +0 -63
  240. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +40 -2
  241. package/static/assets/pdfjs/web/locale/trs/viewer.ftl +0 -72
  242. package/static/assets/pdfjs/web/locale/ur/viewer.ftl +0 -60
  243. package/static/assets/pdfjs/web/locale/uz/viewer.ftl +0 -71
  244. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +38 -0
  245. package/static/assets/pdfjs/web/locale/wo/viewer.ftl +0 -77
  246. package/static/assets/pdfjs/web/locale/xh/viewer.ftl +0 -71
  247. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +38 -0
  248. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +38 -0
  249. package/static/assets/pdfjs/web/viewer.css +649 -120
  250. package/static/assets/pdfjs/web/viewer.html +19 -0
  251. package/static/assets/pdfjs/web/viewer.mjs +489 -38
  252. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  253. package/static/chunk-22EANI6R.js +1 -0
  254. package/static/{chunk-KFM544CA.js → chunk-2UWN7IQF.js} +1 -1
  255. package/static/{chunk-N3T57OCA.js → chunk-2VSPDSJS.js} +1 -1
  256. package/static/{chunk-HUWQHCUX.js → chunk-34UZ7SYI.js} +1 -1
  257. package/static/{chunk-MWFRZBJD.js → chunk-45UQJGGY.js} +1 -1
  258. package/static/{chunk-LYTD6AJE.js → chunk-5TEXH3LJ.js} +1 -1
  259. package/static/{chunk-4KESSWTF.js → chunk-66FMKVJX.js} +1 -1
  260. package/static/{chunk-XE5YHU5J.js → chunk-BIUNUYZ5.js} +1 -1
  261. package/static/chunk-CK4BY2NX.js +27 -0
  262. package/static/{chunk-QTW62OKJ.js → chunk-CSBDAY77.js} +1 -1
  263. package/static/{chunk-XUZSYWRF.js → chunk-CXXPLBDZ.js} +1 -1
  264. package/static/{chunk-ZTXJC5IC.js → chunk-EILQG525.js} +1 -1
  265. package/static/{chunk-FJFNDK67.js → chunk-ENWABUR4.js} +1 -1
  266. package/static/{chunk-WL65GYD5.js → chunk-FR4AOLYL.js} +4 -4
  267. package/static/chunk-HW2H3ISM.js +559 -0
  268. package/static/{chunk-BW5PQAKK.js → chunk-HYMDGBZL.js} +1 -1
  269. package/static/{chunk-WLPYIJFI.js → chunk-IML5UYQG.js} +1 -1
  270. package/static/{chunk-Z5X7LVMZ.js → chunk-IPSMJHMQ.js} +1 -1
  271. package/static/{chunk-3S4WNZ2T.js → chunk-JVCWYSNP.js} +1 -1
  272. package/static/{chunk-CLSVDV7J.js → chunk-KGPCIUD2.js} +1 -1
  273. package/static/{chunk-O4AQBQBF.js → chunk-KQZJSEM3.js} +1 -1
  274. package/static/{chunk-MK7WZG3F.js → chunk-NPEMJJIU.js} +1 -1
  275. package/static/{chunk-4TEHM3AS.js → chunk-OEFBC4GG.js} +1 -1
  276. package/static/{chunk-O67RFAWU.js → chunk-P734A3XZ.js} +1 -1
  277. package/static/{chunk-SRLMFJ7C.js → chunk-RASR4CK6.js} +1 -1
  278. package/static/{chunk-S5WXHO6D.js → chunk-RFMOUC22.js} +1 -1
  279. package/static/{chunk-TTQ37MUV.js → chunk-RSS6GYNE.js} +1 -1
  280. package/static/{chunk-3FX6ISDY.js → chunk-SBOQGGZX.js} +1 -1
  281. package/static/{chunk-NV2MEIWP.js → chunk-SJAFPXQV.js} +1 -1
  282. package/static/{chunk-PYSFXLMV.js → chunk-XTYGMF2V.js} +1 -1
  283. package/static/{chunk-ZFKCGL6X.js → chunk-YCWMV2YR.js} +1 -1
  284. package/static/{chunk-LB7B5RIV.js → chunk-YGD22MWQ.js} +1 -1
  285. package/static/{chunk-MTRNPGS4.js → chunk-ZC5NIT55.js} +1 -1
  286. package/static/{chunk-SKDQM65G.js → chunk-ZVY37DKS.js} +1 -1
  287. package/static/index.html +2 -2
  288. package/static/main-N5CZRHAO.js +7 -0
  289. package/static/styles-FYUSO6OJ.css +1 -0
  290. package/static/chunk-AY2GOSJ2.js +0 -24
  291. package/static/chunk-RSNLYAN6.js +0 -560
  292. package/static/chunk-ZZ3LHYOY.js +0 -1
  293. package/static/main-RREKR34B.js +0 -10
  294. package/static/styles-3DONJ2Z4.css +0 -1
@@ -7,11 +7,16 @@ Object.defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
9
  const _testing = require("@nestjs/testing");
10
+ const _bcryptjs = /*#__PURE__*/ _interop_require_default(require("bcryptjs"));
11
+ const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
12
+ const _nodestream = require("node:stream");
10
13
  const _authmanagerservice = require("../../../authentication/services/auth-manager.service");
11
- const _image = require("../../../common/image");
14
+ const _functions = require("../../../common/functions");
15
+ const _image = /*#__PURE__*/ _interop_require_wildcard(require("../../../common/image"));
12
16
  const _cacheservice = require("../../../infrastructure/cache/services/cache.service");
13
17
  const _constants = require("../../../infrastructure/database/constants");
14
- const _files = require("../../files/utils/files");
18
+ const _files = /*#__PURE__*/ _interop_require_wildcard(require("../../files/utils/files"));
19
+ const _member = require("../constants/member");
15
20
  const _user = require("../constants/user");
16
21
  const _usermodel = require("../models/user.model");
17
22
  const _test = require("../utils/test");
@@ -19,6 +24,75 @@ const _adminusersmanagerservice = require("./admin-users-manager.service");
19
24
  const _adminusersqueriesservice = require("./admin-users-queries.service");
20
25
  const _usersmanagerservice = require("./users-manager.service");
21
26
  const _usersqueriesservice = require("./users-queries.service");
27
+ function _interop_require_default(obj) {
28
+ return obj && obj.__esModule ? obj : {
29
+ default: obj
30
+ };
31
+ }
32
+ function _getRequireWildcardCache(nodeInterop) {
33
+ if (typeof WeakMap !== "function") return null;
34
+ var cacheBabelInterop = new WeakMap();
35
+ var cacheNodeInterop = new WeakMap();
36
+ return (_getRequireWildcardCache = function(nodeInterop) {
37
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
38
+ })(nodeInterop);
39
+ }
40
+ function _interop_require_wildcard(obj, nodeInterop) {
41
+ if (!nodeInterop && obj && obj.__esModule) {
42
+ return obj;
43
+ }
44
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
45
+ return {
46
+ default: obj
47
+ };
48
+ }
49
+ var cache = _getRequireWildcardCache(nodeInterop);
50
+ if (cache && cache.has(obj)) {
51
+ return cache.get(obj);
52
+ }
53
+ var newObj = {
54
+ __proto__: null
55
+ };
56
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
57
+ for(var key in obj){
58
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
59
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
60
+ if (desc && (desc.get || desc.set)) {
61
+ Object.defineProperty(newObj, key, desc);
62
+ } else {
63
+ newObj[key] = obj[key];
64
+ }
65
+ }
66
+ }
67
+ newObj.default = obj;
68
+ if (cache) {
69
+ cache.set(obj, newObj);
70
+ }
71
+ return newObj;
72
+ }
73
+ jest.mock('../../../common/functions', ()=>{
74
+ const actual = jest.requireActual('../../../common/functions');
75
+ return {
76
+ ...actual,
77
+ comparePassword: jest.fn()
78
+ };
79
+ });
80
+ jest.mock('bcryptjs', ()=>({
81
+ __esModule: true,
82
+ default: {
83
+ hash: jest.fn(()=>Promise.resolve('hashed-password'))
84
+ }
85
+ }));
86
+ jest.mock('../../../common/image', ()=>{
87
+ const actual = jest.requireActual('../../../common/image');
88
+ return {
89
+ ...actual,
90
+ generateAvatar: jest.fn(()=>_nodestream.Readable.from([
91
+ Buffer.from('PNGDATA')
92
+ ])),
93
+ convertImageToBase64: jest.fn(()=>Promise.resolve('BASE64_IMAGE'))
94
+ };
95
+ });
22
96
  describe(_usersmanagerservice.UsersManager.name, ()=>{
23
97
  let usersManager;
24
98
  let adminUsersManager;
@@ -26,6 +100,35 @@ describe(_usersmanagerservice.UsersManager.name, ()=>{
26
100
  let usersQueriesService;
27
101
  let userTest;
28
102
  let deleteUserDto;
103
+ const flush = ()=>new Promise((r)=>setImmediate(r));
104
+ const okStream = (d = 'OK')=>{
105
+ const s = _nodestream.Readable.from([
106
+ Buffer.from(d)
107
+ ]);
108
+ s.truncated = false;
109
+ return s;
110
+ };
111
+ const errStream = (msg = 'err', truncated = false)=>{
112
+ const s = new _nodestream.Readable({
113
+ read () {
114
+ this.destroy(new Error(msg));
115
+ }
116
+ });
117
+ s.truncated = truncated;
118
+ return s;
119
+ };
120
+ const mkReq = (mimetype, stream, user = userTest)=>({
121
+ user,
122
+ file: jest.fn().mockResolvedValue({
123
+ mimetype,
124
+ file: stream
125
+ })
126
+ });
127
+ const ensurePaths = async ()=>{
128
+ if (!await (0, _files.isPathExists)(userTest.homePath)) {
129
+ await userTest.makePaths();
130
+ }
131
+ };
29
132
  beforeAll(async ()=>{
30
133
  const module = await _testing.Test.createTestingModule({
31
134
  providers: [
@@ -54,69 +157,67 @@ describe(_usersmanagerservice.UsersManager.name, ()=>{
54
157
  adminUsersManager = module.get(_adminusersmanagerservice.AdminUsersManager);
55
158
  adminUsersQueries = module.get(_adminusersqueriesservice.AdminUsersQueries);
56
159
  usersQueriesService = module.get(_usersqueriesservice.UsersQueries);
57
- // mocks
58
160
  userTest = new _usermodel.UserModel((0, _test.generateUserTest)(), false);
59
161
  deleteUserDto = {
60
162
  deleteSpace: true
61
163
  };
62
164
  });
165
+ afterEach(()=>jest.restoreAllMocks());
63
166
  afterAll(async ()=>{
64
- // clean created user path
65
167
  await expect(adminUsersManager.deleteUserSpace(userTest.login)).resolves.not.toThrow();
66
168
  });
67
- it('should be defined', ()=>{
68
- expect(usersManager).toBeDefined();
69
- expect(adminUsersManager).toBeDefined();
70
- expect(usersQueriesService).toBeDefined();
71
- expect(userTest).toBeDefined();
72
- });
73
- it('should get the user with|without password', async ()=>{
169
+ it('instances + findUser/me/fromUserId + impersonation', async ()=>{
170
+ expect(usersManager && adminUsersManager && usersQueriesService && userTest).toBeDefined();
74
171
  usersQueriesService.from = jest.fn().mockReturnValue(userTest);
75
- const findUserWithoutPwd = await usersManager.findUser(userTest.login, true);
76
- expect(findUserWithoutPwd).toBeInstanceOf(_usermodel.UserModel);
77
- expect(findUserWithoutPwd.password).toBeUndefined();
78
- const findUserWithPwd = await usersManager.findUser(userTest.login, false);
79
- expect(findUserWithPwd).toBeInstanceOf(_usermodel.UserModel);
80
- expect(findUserWithPwd.password).toBeDefined();
81
- expect(usersQueriesService.from).toHaveBeenCalledTimes(2);
82
- const me = await usersManager.me(userTest);
83
- // check the default value of the findUser function
84
- expect(me).toBeInstanceOf(Object);
85
- expect(me.user.password).toBeUndefined();
86
- expect(await usersManager.me(userTest)).toBeInstanceOf(Object);
172
+ const u1 = await usersManager.findUser(userTest.login, true);
173
+ expect(u1).toBeInstanceOf(_usermodel.UserModel);
174
+ expect(u1.password).toBeUndefined();
175
+ const u2 = await usersManager.findUser(userTest.login, false);
176
+ expect(u2).toBeInstanceOf(_usermodel.UserModel);
177
+ expect(u2.password).toBeDefined();
178
+ const me1 = await usersManager.me(userTest);
179
+ expect(me1.user.password).toBeUndefined();
87
180
  usersQueriesService.from = jest.fn().mockReturnValue(null);
181
+ await expect(usersManager.findUser('unknown')).resolves.toBeNull();
88
182
  await expect(usersManager.me({
89
183
  id: 0
90
184
  })).rejects.toThrow();
91
- expect(usersQueriesService.from).toHaveBeenCalled();
185
+ usersQueriesService.from = jest.fn().mockResolvedValue(null);
186
+ await expect(usersManager.fromUserId(123)).resolves.toBeNull();
187
+ const authUser = new _usermodel.UserModel({
188
+ ...(0, _test.generateUserTest)(),
189
+ id: 42,
190
+ clientId: 'CID',
191
+ impersonatedFromId: 1
192
+ }, true);
193
+ const fromUser = new _usermodel.UserModel({
194
+ ...(0, _test.generateUserTest)(),
195
+ id: 42
196
+ }, true);
197
+ usersQueriesService.from = jest.fn().mockResolvedValue(fromUser);
198
+ const me2 = await usersManager.me(authUser);
199
+ expect(me2.user.impersonated).toBe(true);
200
+ expect(me2.user.clientId).toBe('CID');
92
201
  });
93
- it('should create the user paths', async ()=>{
94
- await expect(userTest.makePaths()).resolves.not.toThrow();
202
+ it('paths + avatars (default/generate) + create/delete user', async ()=>{
203
+ await expect(ensurePaths()).resolves.not.toThrow();
95
204
  expect(await (0, _files.isPathExists)(userTest.filesPath)).toBe(true);
96
- });
97
- it('should get the default user avatar', async ()=>{
98
205
  usersQueriesService.from = jest.fn().mockReturnValueOnce(userTest);
99
- const [path, mime] = await usersManager.getAvatar(userTest.login);
100
- expect((0, _files.fileName)(path)).toBe('avatar.svg');
101
- expect(mime).toBe(_image.svgMimeType);
102
- });
103
- it('should generate the user avatar', async ()=>{
206
+ const [p0, m0] = await usersManager.getAvatar(userTest.login);
207
+ expect((0, _files.fileName)(p0)).toBe('avatar.svg');
208
+ expect(m0).toBe(_image.svgMimeType);
104
209
  usersQueriesService.from = jest.fn().mockReturnValueOnce(null);
105
210
  await expect(usersManager.getAvatar('#', true)).rejects.toThrow('does not exist');
106
211
  usersQueriesService.from = jest.fn().mockReturnValue(userTest);
107
212
  expect(await usersManager.getAvatar(userTest.login, true)).toBeUndefined();
108
- const [path, mime] = await usersManager.getAvatar(userTest.login);
109
- expect((0, _files.fileName)(path)).toBe('avatar.png');
110
- expect(mime).toBe(_image.pngMimeType);
111
- });
112
- it('should create user that does not exist', async ()=>{
213
+ const [p1, m1] = await usersManager.getAvatar(userTest.login);
214
+ expect((0, _files.fileName)(p1)).toBe('avatar.png');
215
+ expect(m1).toBe(_image.pngMimeType);
113
216
  usersQueriesService.checkUserExists = jest.fn().mockReturnValue(undefined);
114
217
  usersQueriesService.createUserOrGuest = jest.fn().mockReturnValue(888);
115
- const user = await adminUsersManager.createUserOrGuest(userTest, _user.USER_ROLE.USER);
116
- expect(user).toBeInstanceOf(_usermodel.UserModel);
117
- expect(await (0, _files.isPathExists)(user.filesPath)).toBe(true);
118
- });
119
- it('should not create an existing user', async ()=>{
218
+ const created = await adminUsersManager.createUserOrGuest(userTest, _user.USER_ROLE.USER);
219
+ expect(created).toBeInstanceOf(_usermodel.UserModel);
220
+ expect(await (0, _files.isPathExists)(created.filesPath)).toBe(true);
120
221
  usersQueriesService.checkUserExists = jest.fn().mockReturnValueOnce({
121
222
  login: userTest.login,
122
223
  email: ''
@@ -130,22 +231,810 @@ describe(_usersmanagerservice.UsersManager.name, ()=>{
130
231
  throw new Error('testing');
131
232
  });
132
233
  await expect(adminUsersManager.createUserOrGuest(userTest, _user.USER_ROLE.USER)).rejects.toThrow();
133
- });
134
- it('should delete user', async ()=>{
135
234
  adminUsersQueries.deleteUser = jest.fn().mockReturnValue(true);
136
235
  await expect(adminUsersManager.deleteUserOrGuest(userTest.id, userTest.login, deleteUserDto)).resolves.not.toThrow();
137
236
  expect(await (0, _files.isPathExists)(userTest.filesPath)).toBe(false);
138
- });
139
- it('should pass even if the user does not exist', async ()=>{
140
237
  adminUsersQueries.deleteUser = jest.fn().mockReturnValue(false);
141
238
  await expect(adminUsersManager.deleteUserOrGuest(userTest.id, userTest.login, deleteUserDto)).resolves.not.toThrow();
142
- });
143
- it('should throw an error on user creation', async ()=>{
144
239
  adminUsersQueries.deleteUser = jest.fn().mockImplementation(()=>{
145
240
  throw new Error('testing');
146
241
  });
147
242
  await expect(adminUsersManager.deleteUserOrGuest(userTest.id, userTest.login, deleteUserDto)).rejects.toThrow();
148
243
  });
244
+ it('logUser branches: forbidden/locked/bad/good', async ()=>{
245
+ const linkUser = new _usermodel.UserModel({
246
+ ...(0, _test.generateUserTest)(),
247
+ role: _user.USER_ROLE.LINK
248
+ }, false);
249
+ await expect(usersManager.logUser(linkUser, 'x', '127.0.0.1')).rejects.toThrow('Account is not allowed');
250
+ const uLocked = new _usermodel.UserModel({
251
+ ...(0, _test.generateUserTest)(),
252
+ isActive: false,
253
+ passwordAttempts: 5
254
+ }, false);
255
+ const errSpy = jest.spyOn(usersManager['logger'], 'error').mockImplementation(()=>undefined);
256
+ const updSpy1 = jest.spyOn(usersManager, 'updateAccesses').mockRejectedValue(new Error('reject-locked'));
257
+ await expect(usersManager.logUser(uLocked, 'pwd', 'ip')).rejects.toThrow('Account locked');
258
+ await flush();
259
+ expect(errSpy).toHaveBeenCalledWith(expect.stringContaining('reject-locked'));
260
+ expect(updSpy1).toHaveBeenCalledWith(uLocked, 'ip', false);
261
+ _functions.comparePassword.mockResolvedValue(false);
262
+ const uBad = new _usermodel.UserModel({
263
+ ...(0, _test.generateUserTest)(),
264
+ isActive: true,
265
+ passwordAttempts: 0
266
+ }, false);
267
+ const errSpy2 = jest.spyOn(usersManager['logger'], 'error').mockImplementation(()=>undefined);
268
+ const updSpy2 = jest.spyOn(usersManager, 'updateAccesses').mockRejectedValue(new Error('reject-auth'));
269
+ const out = await usersManager.logUser(uBad, 'bad', '1.1.1.1');
270
+ expect(out).toBeNull();
271
+ await flush();
272
+ expect(errSpy2).toHaveBeenCalledWith(expect.stringContaining('reject-auth'));
273
+ expect(updSpy2).toHaveBeenCalledWith(uBad, '1.1.1.1', false);
274
+ _functions.comparePassword.mockResolvedValue(true);
275
+ const uGood = new _usermodel.UserModel({
276
+ ...(0, _test.generateUserTest)(),
277
+ isActive: true,
278
+ passwordAttempts: 0
279
+ }, false);
280
+ const updSpy3 = jest.spyOn(usersManager, 'updateAccesses').mockResolvedValue(undefined);
281
+ const pathsSpy = jest.spyOn(uGood, 'makePaths').mockResolvedValue(undefined);
282
+ const out2 = await usersManager.logUser(uGood, 'good', '8.8.8.8');
283
+ expect(out2).toBe(uGood);
284
+ expect(updSpy3).toHaveBeenCalledWith(uGood, '8.8.8.8', true);
285
+ expect(pathsSpy).toHaveBeenCalled();
286
+ });
287
+ it('compareUserPassword + updateLanguage + updatePassword branches', async ()=>{
288
+ usersQueriesService.compareUserPassword = jest.fn().mockResolvedValue(true);
289
+ await expect(usersManager.compareUserPassword(1, 'p')).resolves.toBe(true);
290
+ expect(usersQueriesService.compareUserPassword).toHaveBeenCalledWith(1, 'p');
291
+ usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(false);
292
+ await expect(usersManager.updateLanguage(userTest, {
293
+ language: ''
294
+ })).rejects.toThrow('Unable to update language');
295
+ expect(usersQueriesService.updateUserOrGuest).toHaveBeenCalledWith(userTest.id, {
296
+ language: null
297
+ });
298
+ usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true);
299
+ await expect(usersManager.updateLanguage(userTest, {
300
+ language: 'fr'
301
+ })).resolves.toBeUndefined();
302
+ usersQueriesService.selectUserProperties = jest.fn().mockResolvedValue(null);
303
+ await expect(usersManager.updatePassword(userTest, {
304
+ oldPassword: 'a',
305
+ newPassword: 'b'
306
+ })).rejects.toThrow('Unable to check password');
307
+ usersQueriesService.selectUserProperties = jest.fn().mockResolvedValue({
308
+ password: 'HASH'
309
+ });
310
+ _functions.comparePassword.mockResolvedValue(false);
311
+ await expect(usersManager.updatePassword(userTest, {
312
+ oldPassword: 'a',
313
+ newPassword: 'b'
314
+ })).rejects.toThrow('Password mismatch');
315
+ _functions.comparePassword.mockResolvedValue(true);
316
+ _bcryptjs.default.hash.mockResolvedValue('HASHED');
317
+ usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true);
318
+ await expect(usersManager.updatePassword(userTest, {
319
+ oldPassword: 'a',
320
+ newPassword: 'b'
321
+ })).resolves.toBeUndefined();
322
+ expect(usersQueriesService.updateUserOrGuest).toHaveBeenCalledWith(userTest.id, {
323
+ password: 'HASHED'
324
+ });
325
+ usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(false);
326
+ usersQueriesService.selectUserProperties = jest.fn().mockResolvedValue({
327
+ password: 'HASH'
328
+ });
329
+ _functions.comparePassword.mockResolvedValue(true);
330
+ _bcryptjs.default.hash.mockResolvedValue('HASHED2');
331
+ await expect(usersManager.updatePassword(userTest, {
332
+ oldPassword: 'a',
333
+ newPassword: 'b'
334
+ })).rejects.toThrow('Unable to update password');
335
+ });
336
+ it('updateNotification + updateAccesses branches', async ()=>{
337
+ usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(false);
338
+ await expect(usersManager.updateNotification(userTest, {
339
+ notification: 1
340
+ })).rejects.toThrow('Unable to update notification');
341
+ usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true);
342
+ await expect(usersManager.updateNotification(userTest, {
343
+ notification: 2
344
+ })).resolves.toBeUndefined();
345
+ const prevAccess1 = new Date('2021-01-01T00:00:00Z');
346
+ const u1 = new _usermodel.UserModel({
347
+ ...(0, _test.generateUserTest)(),
348
+ isActive: true,
349
+ passwordAttempts: 3,
350
+ currentIp: '1.2.3.4',
351
+ currentAccess: prevAccess1
352
+ }, false);
353
+ usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true);
354
+ await expect(usersManager.updateAccesses(u1, '5.6.7.8', true)).resolves.toBeUndefined();
355
+ const payload1 = usersQueriesService.updateUserOrGuest.mock.calls[0][1];
356
+ expect(payload1).toMatchObject({
357
+ lastIp: '1.2.3.4',
358
+ currentIp: '5.6.7.8',
359
+ passwordAttempts: 0,
360
+ isActive: true
361
+ });
362
+ expect(payload1.lastAccess).toBe(prevAccess1);
363
+ expect(payload1.currentAccess).toBeInstanceOf(Date);
364
+ const prevAccess2 = new Date('2022-02-02T00:00:00Z');
365
+ const u2 = new _usermodel.UserModel({
366
+ ...(0, _test.generateUserTest)(),
367
+ isActive: true,
368
+ passwordAttempts: _user.USER_MAX_PASSWORD_ATTEMPTS - 1,
369
+ currentIp: 'old.ip',
370
+ currentAccess: prevAccess2
371
+ }, false);
372
+ usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true);
373
+ await expect(usersManager.updateAccesses(u2, 'new.ip', false)).resolves.toBeUndefined();
374
+ const payload2 = usersQueriesService.updateUserOrGuest.mock.calls[0][1];
375
+ expect(payload2.passwordAttempts).toBe(_user.USER_MAX_PASSWORD_ATTEMPTS);
376
+ expect(payload2.isActive).toBe(false);
377
+ expect(payload2.lastAccess).toBe(prevAccess2);
378
+ expect(payload2.lastIp).toBe('old.ip');
379
+ expect(payload2.currentIp).toBe('new.ip');
380
+ expect(payload2.currentAccess).toBeInstanceOf(Date);
381
+ });
382
+ it('avatars advanced: generateIsNotExists, failure branches, base64 fallback', async ()=>{
383
+ await ensurePaths();
384
+ usersManager.findUser = jest.fn().mockResolvedValue({
385
+ getInitials: ()=>'UT'
386
+ });
387
+ const [p, m] = await usersManager.getAvatar(userTest.login, false, true);
388
+ expect((0, _files.fileName)(p)).toBe('avatar.png');
389
+ expect(m).toBe(_image.pngMimeType);
390
+ jest.spyOn(_image, 'generateAvatar').mockImplementation(()=>errStream('gen error'));
391
+ await expect(usersManager.getAvatar(userTest.login, true)).rejects.toThrow('Unable to create avatar');
392
+ usersManager.findUser = jest.fn().mockResolvedValue(null);
393
+ await expect(usersManager.getAvatar(userTest.login, true)).rejects.toThrow('avatar not found');
394
+ const s1 = await usersManager.getAvatarBase64(userTest.login);
395
+ expect(s1).toBe('BASE64_IMAGE');
396
+ _image.convertImageToBase64.mockClear();
397
+ const s2 = await usersManager.getAvatarBase64('non-existent-login');
398
+ expect(s2).toBe('BASE64_IMAGE');
399
+ expect(_image.convertImageToBase64).toHaveBeenCalledWith(expect.stringMatching(/avatar\.svg$/));
400
+ });
401
+ it('updateAvatar branches: mime error, stream error, truncated, move fail, success', async ()=>{
402
+ await ensurePaths();
403
+ await expect(usersManager.updateAvatar(mkReq('text/plain', okStream('X')))).rejects.toThrow('Unsupported file type');
404
+ await expect(usersManager.updateAvatar(mkReq('image/png', errStream('stream error')))).rejects.toThrow('Unable to upload avatar');
405
+ const t = okStream('OK');
406
+ t.truncated = true;
407
+ const mvSpy = jest.spyOn(_files, 'moveFiles').mockResolvedValue(undefined);
408
+ await expect(usersManager.updateAvatar(mkReq('image/png', t))).rejects.toThrow('Image is too large (5MB max)');
409
+ expect(mvSpy).not.toHaveBeenCalled();
410
+ jest.spyOn(_files, 'moveFiles').mockRejectedValue(new Error('mv fail'));
411
+ await expect(usersManager.updateAvatar(mkReq('image/png', okStream()))).rejects.toThrow('Unable to create avatar');
412
+ const mvSpy2 = jest.spyOn(_files, 'moveFiles').mockResolvedValue(undefined);
413
+ await expect(usersManager.updateAvatar(mkReq('image/png', okStream()))).resolves.toBeUndefined();
414
+ const expectedSrc = _nodepath.default.join(userTest.tmpPath, 'avatar.png');
415
+ const expectedDst = _nodepath.default.join(userTest.homePath, 'avatar.png');
416
+ expect(mvSpy2).toHaveBeenCalledWith(expectedSrc, expectedDst, true);
417
+ });
418
+ it('setOnlineStatus + browseGroups + getGroup', async ()=>{
419
+ usersQueriesService.setOnlineStatus = jest.fn().mockRejectedValue(new Error('boom'));
420
+ expect(()=>usersManager.setOnlineStatus({
421
+ id: 1
422
+ }, 1)).not.toThrow();
423
+ usersQueriesService.browseRootGroups = jest.fn().mockResolvedValue([
424
+ {
425
+ id: 1
426
+ }
427
+ ]);
428
+ const root = await usersManager.browseGroups(userTest, '');
429
+ expect(root.parentGroup).toBeUndefined();
430
+ expect(root.members.length).toBe(1);
431
+ usersQueriesService.groupFromName = jest.fn().mockResolvedValue(null);
432
+ await expect(usersManager.browseGroups(userTest, 'unknown')).rejects.toThrow('Group not found');
433
+ const group = {
434
+ id: 42,
435
+ name: 'Team'
436
+ };
437
+ usersQueriesService.groupFromName = jest.fn().mockResolvedValue(group);
438
+ usersQueriesService.browseGroupMembers = jest.fn().mockResolvedValue([
439
+ {
440
+ id: 7
441
+ },
442
+ {
443
+ id: 8
444
+ }
445
+ ]);
446
+ const g2 = await usersManager.browseGroups(userTest, 'Team');
447
+ expect(g2.parentGroup).toEqual(group);
448
+ expect(g2.members).toEqual([
449
+ {
450
+ id: 7
451
+ },
452
+ {
453
+ id: 8
454
+ }
455
+ ]);
456
+ expect(usersQueriesService.browseGroupMembers).toHaveBeenCalledWith(42);
457
+ usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({
458
+ id: 1,
459
+ members: []
460
+ });
461
+ await expect(usersManager.getGroup(userTest, 1)).resolves.toEqual({
462
+ id: 1,
463
+ members: []
464
+ });
465
+ usersQueriesService.getGroup = jest.fn().mockResolvedValue({
466
+ id: 2
467
+ });
468
+ await expect(usersManager.getGroup(userTest, 2, false)).resolves.toEqual({
469
+ id: 2
470
+ });
471
+ usersQueriesService.getGroup = jest.fn().mockResolvedValue(null);
472
+ await expect(usersManager.getGroup(userTest, 3, false)).rejects.toThrow('You are not allowed to do this action');
473
+ });
474
+ it('create/update personal group', async ()=>{
475
+ await expect(usersManager.createPersonalGroup(userTest, {
476
+ name: ''
477
+ })).rejects.toThrow('Group name is missing');
478
+ usersQueriesService.checkGroupNameExists = jest.fn().mockResolvedValue(true);
479
+ await expect(usersManager.createPersonalGroup(userTest, {
480
+ name: 'A'
481
+ })).rejects.toThrow('Name already used');
482
+ usersQueriesService.checkGroupNameExists = jest.fn().mockResolvedValue(false);
483
+ usersQueriesService.createPersonalGroup = jest.fn().mockResolvedValue(10);
484
+ usersQueriesService.clearWhiteListCaches = jest.fn();
485
+ usersManager.getGroup = jest.fn().mockResolvedValue({
486
+ id: 10
487
+ });
488
+ const logSpy = jest.spyOn(usersManager['logger'], 'log').mockImplementation(()=>undefined);
489
+ await expect(usersManager.createPersonalGroup(userTest, {
490
+ name: 'OK'
491
+ })).resolves.toEqual({
492
+ id: 10
493
+ });
494
+ expect(logSpy).toHaveBeenCalled();
495
+ usersQueriesService.createPersonalGroup = jest.fn().mockRejectedValue(new Error('db down'));
496
+ await expect(usersManager.createPersonalGroup(userTest, {
497
+ name: 'OK'
498
+ })).rejects.toThrow('Unable to create group');
499
+ await expect(usersManager.updatePersonalGroup(userTest, 1, {})).rejects.toThrow('No changes to update');
500
+ usersManager.getGroup = jest.fn().mockResolvedValueOnce({
501
+ id: 1,
502
+ type: _member.MEMBER_TYPE.GROUP
503
+ });
504
+ await expect(usersManager.updatePersonalGroup(userTest, 1, {
505
+ name: 'x'
506
+ })).rejects.toThrow('You are not allowed to do this action');
507
+ usersManager.getGroup = jest.fn().mockResolvedValue({
508
+ id: 1,
509
+ type: _member.MEMBER_TYPE.PGROUP
510
+ });
511
+ usersQueriesService.checkGroupNameExists = jest.fn().mockResolvedValue(true);
512
+ await expect(usersManager.updatePersonalGroup(userTest, 1, {
513
+ name: 'dup'
514
+ })).rejects.toThrow('Name already used');
515
+ usersQueriesService.checkGroupNameExists = jest.fn().mockResolvedValue(false);
516
+ usersQueriesService.updateGroup = jest.fn().mockRejectedValue(new Error('oops'));
517
+ await expect(usersManager.updatePersonalGroup(userTest, 1, {
518
+ name: 'ok'
519
+ })).rejects.toThrow('oops');
520
+ usersQueriesService.updateGroup = jest.fn().mockResolvedValue(true);
521
+ usersManager.getGroup = jest.fn().mockResolvedValue({
522
+ id: 1,
523
+ type: _member.MEMBER_TYPE.PGROUP
524
+ });
525
+ await expect(usersManager.updatePersonalGroup(userTest, 1, {
526
+ name: 'ok'
527
+ })).resolves.not.toThrow();
528
+ expect(usersManager.getGroup).toHaveBeenCalledWith(userTest, 1, false, userTest.isAdmin);
529
+ });
530
+ it('addUsersToGroup (GROUP/PGROUP)', async ()=>{
531
+ usersManager.getGroup = jest.fn().mockResolvedValue({
532
+ id: 1,
533
+ type: _member.MEMBER_TYPE.GROUP,
534
+ members: [
535
+ {
536
+ id: 2
537
+ },
538
+ {
539
+ id: 3
540
+ }
541
+ ]
542
+ });
543
+ usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([
544
+ 3,
545
+ 4,
546
+ 5
547
+ ]);
548
+ await expect(usersManager.addUsersToGroup(userTest, 1, [
549
+ 2,
550
+ 3
551
+ ])).rejects.toThrow('No users to add to group');
552
+ usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined);
553
+ await expect(usersManager.addUsersToGroup(userTest, 1, [
554
+ 3,
555
+ 4,
556
+ 5
557
+ ])).resolves.toBeUndefined();
558
+ expect(usersQueriesService.updateGroupMembers).toHaveBeenCalledWith(1, {
559
+ add: [
560
+ {
561
+ id: 4,
562
+ groupRole: _user.USER_GROUP_ROLE.MEMBER
563
+ },
564
+ {
565
+ id: 5,
566
+ groupRole: _user.USER_GROUP_ROLE.MEMBER
567
+ }
568
+ ]
569
+ });
570
+ expect(usersQueriesService.usersWhitelist).toHaveBeenCalledWith(userTest.id, _user.USER_ROLE.USER);
571
+ usersManager.getGroup = jest.fn().mockResolvedValue({
572
+ id: 2,
573
+ type: _member.MEMBER_TYPE.PGROUP,
574
+ members: []
575
+ });
576
+ usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([
577
+ 10,
578
+ 11
579
+ ]);
580
+ usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined);
581
+ await expect(usersManager.addUsersToGroup(userTest, 2, [
582
+ 10,
583
+ 11
584
+ ])).resolves.toBeUndefined();
585
+ expect(usersQueriesService.usersWhitelist).toHaveBeenCalledWith(userTest.id, undefined);
586
+ expect(usersQueriesService.updateGroupMembers).toHaveBeenCalledWith(2, {
587
+ add: [
588
+ {
589
+ id: 10,
590
+ groupRole: _user.USER_GROUP_ROLE.MEMBER
591
+ },
592
+ {
593
+ id: 11,
594
+ groupRole: _user.USER_GROUP_ROLE.MEMBER
595
+ }
596
+ ]
597
+ });
598
+ });
599
+ it('updateUserFromPersonalGroup', async ()=>{
600
+ usersManager.getGroup = jest.fn().mockResolvedValue({
601
+ id: 1,
602
+ type: _member.MEMBER_TYPE.GROUP,
603
+ members: []
604
+ });
605
+ await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, {
606
+ role: 1
607
+ })).rejects.toThrow('You are not allowed to do this action');
608
+ usersManager.getGroup = jest.fn().mockResolvedValue({
609
+ id: 1,
610
+ type: _member.MEMBER_TYPE.PGROUP,
611
+ members: []
612
+ });
613
+ await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, {
614
+ role: 1
615
+ })).rejects.toThrow('User was not found');
616
+ usersManager.getGroup = jest.fn().mockResolvedValue({
617
+ id: 1,
618
+ type: _member.MEMBER_TYPE.PGROUP,
619
+ members: [
620
+ {
621
+ id: 9,
622
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
623
+ },
624
+ {
625
+ id: 10,
626
+ groupRole: _user.USER_GROUP_ROLE.MEMBER
627
+ }
628
+ ]
629
+ });
630
+ await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, {
631
+ role: _user.USER_GROUP_ROLE.MEMBER
632
+ })).rejects.toThrow(/group must have at least one manager/i);
633
+ const spy = jest.spyOn(adminUsersManager, 'updateUserFromGroup').mockResolvedValue(undefined);
634
+ usersManager.getGroup = jest.fn().mockResolvedValue({
635
+ id: 1,
636
+ type: _member.MEMBER_TYPE.PGROUP,
637
+ members: [
638
+ {
639
+ id: 9,
640
+ groupRole: _user.USER_GROUP_ROLE.MEMBER
641
+ },
642
+ {
643
+ id: 10,
644
+ groupRole: _user.USER_GROUP_ROLE.MEMBER
645
+ },
646
+ {
647
+ id: 11,
648
+ groupRole: _user.USER_GROUP_ROLE.MEMBER
649
+ }
650
+ ]
651
+ });
652
+ await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, {
653
+ role: _user.USER_GROUP_ROLE.MANAGER
654
+ })).resolves.toBeUndefined();
655
+ expect(spy).toHaveBeenCalledWith(1, 9, {
656
+ role: 1
657
+ });
658
+ usersManager.getGroup = jest.fn().mockResolvedValue({
659
+ id: 1,
660
+ type: _member.MEMBER_TYPE.PGROUP,
661
+ members: [
662
+ {
663
+ id: 9,
664
+ groupRole: _user.USER_GROUP_ROLE.MEMBER
665
+ }
666
+ ]
667
+ });
668
+ await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, {
669
+ role: _user.USER_GROUP_ROLE.MEMBER
670
+ })).resolves.toBeUndefined();
671
+ spy.mockClear();
672
+ usersManager.getGroup = jest.fn().mockResolvedValue({
673
+ id: 1,
674
+ type: _member.MEMBER_TYPE.PGROUP,
675
+ members: [
676
+ {
677
+ id: 9,
678
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
679
+ },
680
+ {
681
+ id: 10,
682
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
683
+ }
684
+ ]
685
+ });
686
+ await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, {
687
+ role: _user.USER_GROUP_ROLE.MEMBER
688
+ })).resolves.toBeUndefined();
689
+ expect(spy).toHaveBeenCalledWith(1, 9, {
690
+ role: _user.USER_GROUP_ROLE.MEMBER
691
+ });
692
+ spy.mockClear();
693
+ usersManager.getGroup = jest.fn().mockResolvedValue({
694
+ id: 1,
695
+ type: _member.MEMBER_TYPE.PGROUP,
696
+ members: [
697
+ {
698
+ id: 9,
699
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
700
+ },
701
+ {
702
+ id: 10,
703
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
704
+ }
705
+ ]
706
+ });
707
+ await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, {
708
+ role: _user.USER_GROUP_ROLE.MANAGER
709
+ })).resolves.toBeUndefined();
710
+ expect(spy).not.toHaveBeenCalled();
711
+ });
712
+ it('removeUserFromGroup', async ()=>{
713
+ usersManager.getGroup = jest.fn().mockResolvedValue({
714
+ id: 1,
715
+ members: []
716
+ });
717
+ await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).rejects.toThrow('User was not found');
718
+ usersManager.getGroup = jest.fn().mockResolvedValue({
719
+ id: 1,
720
+ type: _member.MEMBER_TYPE.GROUP,
721
+ members: [
722
+ {
723
+ id: 9,
724
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
725
+ }
726
+ ]
727
+ });
728
+ await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).rejects.toThrow('You are not allowed to do this action');
729
+ usersManager.getGroup = jest.fn().mockResolvedValue({
730
+ id: 1,
731
+ type: _member.MEMBER_TYPE.PGROUP,
732
+ members: [
733
+ {
734
+ id: 9,
735
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
736
+ }
737
+ ]
738
+ });
739
+ await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).rejects.toThrow('Group must have at least one manager');
740
+ usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined);
741
+ usersManager.getGroup = jest.fn().mockResolvedValue({
742
+ id: 1,
743
+ type: _member.MEMBER_TYPE.PGROUP,
744
+ members: [
745
+ {
746
+ id: 9,
747
+ groupRole: _user.USER_GROUP_ROLE.MEMBER
748
+ },
749
+ {
750
+ id: 10,
751
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
752
+ }
753
+ ]
754
+ });
755
+ await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).resolves.toBeUndefined();
756
+ expect(usersQueriesService.updateGroupMembers).toHaveBeenCalledWith(1, {
757
+ remove: [
758
+ 9
759
+ ]
760
+ });
761
+ usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined);
762
+ usersManager.getGroup = jest.fn().mockResolvedValue({
763
+ id: 1,
764
+ type: _member.MEMBER_TYPE.PGROUP,
765
+ members: [
766
+ {
767
+ id: 9,
768
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
769
+ },
770
+ {
771
+ id: 10,
772
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
773
+ }
774
+ ]
775
+ });
776
+ await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).resolves.toBeUndefined();
777
+ expect(usersQueriesService.updateGroupMembers).toHaveBeenCalledWith(1, {
778
+ remove: [
779
+ 9
780
+ ]
781
+ });
782
+ });
783
+ it('leave/delete personal group', async ()=>{
784
+ usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue(null);
785
+ await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('You are not allowed to do this action');
786
+ usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({
787
+ id: 1,
788
+ type: _member.MEMBER_TYPE.GROUP,
789
+ members: [
790
+ {
791
+ id: userTest.id
792
+ }
793
+ ]
794
+ });
795
+ await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('You are not allowed to do this action');
796
+ usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({
797
+ id: 1,
798
+ type: _member.MEMBER_TYPE.PGROUP,
799
+ members: []
800
+ });
801
+ await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('User was not found');
802
+ usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({
803
+ id: 1,
804
+ type: _member.MEMBER_TYPE.PGROUP,
805
+ members: [
806
+ {
807
+ id: userTest.id,
808
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
809
+ }
810
+ ]
811
+ });
812
+ await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('Group must have at least one manager');
813
+ usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({
814
+ id: 1,
815
+ type: 2,
816
+ members: [
817
+ {
818
+ id: userTest.id,
819
+ groupRole: _user.USER_GROUP_ROLE.MEMBER
820
+ },
821
+ {
822
+ id: 9,
823
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
824
+ }
825
+ ]
826
+ });
827
+ const lSpy = jest.spyOn(usersManager['logger'], 'log').mockImplementation(()=>undefined);
828
+ usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined);
829
+ await expect(usersManager.leavePersonalGroup(userTest, 1)).resolves.toBeUndefined();
830
+ expect(lSpy).toHaveBeenCalledWith(expect.stringMatching(/has left group/));
831
+ usersQueriesService.updateGroupMembers = jest.fn().mockRejectedValue(new Error('DB'));
832
+ await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('DB');
833
+ usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({
834
+ id: 1,
835
+ type: _member.MEMBER_TYPE.PGROUP,
836
+ members: [
837
+ {
838
+ id: userTest.id,
839
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
840
+ },
841
+ {
842
+ id: 9,
843
+ groupRole: _user.USER_GROUP_ROLE.MANAGER
844
+ }
845
+ ]
846
+ });
847
+ usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined);
848
+ await expect(usersManager.leavePersonalGroup(userTest, 1)).resolves.toBeUndefined();
849
+ usersQueriesService.canDeletePersonalGroup = jest.fn().mockResolvedValue(false);
850
+ await expect(usersManager.deletePersonalGroup(userTest, 7)).rejects.toThrow('You are not allowed to do this action');
851
+ usersQueriesService.canDeletePersonalGroup = jest.fn().mockResolvedValue(true);
852
+ const wSpy = jest.spyOn(usersManager['logger'], 'warn').mockImplementation(()=>undefined);
853
+ usersQueriesService.deletePersonalGroup = jest.fn().mockResolvedValue(false);
854
+ await expect(usersManager.deletePersonalGroup(userTest, 7)).rejects.toThrow('Unable to delete group');
855
+ expect(wSpy).toHaveBeenCalledWith(expect.stringMatching(/does not exist/));
856
+ const lgSpy = jest.spyOn(usersManager['logger'], 'log').mockImplementation(()=>undefined);
857
+ usersQueriesService.deletePersonalGroup = jest.fn().mockResolvedValue(true);
858
+ await expect(usersManager.deletePersonalGroup(userTest, 7)).resolves.toBeUndefined();
859
+ expect(lgSpy).toHaveBeenCalledWith(expect.stringMatching(/was deleted/));
860
+ });
861
+ it('guests + proxies', async ()=>{
862
+ usersQueriesService.listGuests = jest.fn().mockResolvedValue([
863
+ {
864
+ id: 1
865
+ }
866
+ ]);
867
+ await expect(usersManager.listGuests(userTest)).resolves.toEqual([
868
+ {
869
+ id: 1
870
+ }
871
+ ]);
872
+ const checkSpy = jest.spyOn(adminUsersManager, 'checkUser').mockImplementation(()=>undefined);
873
+ usersQueriesService.listGuests = jest.fn().mockResolvedValue({
874
+ id: 9
875
+ });
876
+ await expect(usersManager.getGuest(userTest, 9)).resolves.toEqual({
877
+ id: 9
878
+ });
879
+ expect(checkSpy).toHaveBeenCalled();
880
+ usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([
881
+ userTest.id,
882
+ 100
883
+ ]);
884
+ usersQueriesService.clearWhiteListCaches = jest.fn();
885
+ const createSpy = jest.spyOn(adminUsersManager, 'createUserOrGuest').mockResolvedValue({
886
+ id: 55
887
+ });
888
+ const dto1 = {
889
+ ...userTest,
890
+ managers: [
891
+ 100
892
+ ],
893
+ password: 'x'
894
+ };
895
+ const r = await usersManager.createGuest(userTest, dto1);
896
+ expect(createSpy).toHaveBeenCalled();
897
+ expect(usersQueriesService.clearWhiteListCaches).toHaveBeenCalledWith([
898
+ userTest.id
899
+ ]);
900
+ expect(r).toEqual({
901
+ id: 55
902
+ });
903
+ const args1 = createSpy.mock.calls[0][0];
904
+ expect(args1.managers).toEqual(expect.arrayContaining([
905
+ userTest.id
906
+ ]));
907
+ createSpy.mockClear();
908
+ const dto2 = {
909
+ ...userTest,
910
+ managers: [
911
+ userTest.id,
912
+ 100
913
+ ],
914
+ password: 'y'
915
+ };
916
+ await usersManager.createGuest(userTest, dto2);
917
+ const args2 = createSpy.mock.calls[0][0];
918
+ expect(args2.managers.filter((m)=>m === userTest.id)).toHaveLength(1);
919
+ await expect(usersManager.updateGuest(userTest, 9, {})).rejects.toThrow('No changes to update');
920
+ usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([
921
+ 1
922
+ ]);
923
+ await expect(usersManager.updateGuest(userTest, 9, {
924
+ managers: [
925
+ 2
926
+ ]
927
+ })).rejects.toThrow('Guest must have at least one manager');
928
+ usersQueriesService.isGuestManager = jest.fn().mockResolvedValue(false);
929
+ await expect(usersManager.updateGuest(userTest, 9, {
930
+ email: 'a'
931
+ })).rejects.toThrow('You are not allowed to do this action');
932
+ usersQueriesService.isGuestManager = jest.fn().mockResolvedValue(true);
933
+ jest.spyOn(adminUsersManager, 'updateUserOrGuest').mockResolvedValue({
934
+ managers: [
935
+ {
936
+ id: 999
937
+ }
938
+ ]
939
+ });
940
+ await expect(usersManager.updateGuest(userTest, 9, {
941
+ email: 'a'
942
+ })).resolves.toBeNull();
943
+ jest.spyOn(adminUsersManager, 'updateUserOrGuest').mockResolvedValue({
944
+ managers: [
945
+ {
946
+ id: userTest.id
947
+ }
948
+ ]
949
+ });
950
+ await expect(usersManager.updateGuest(userTest, 9, {
951
+ email: 'a'
952
+ })).resolves.toEqual({
953
+ managers: [
954
+ {
955
+ id: userTest.id
956
+ }
957
+ ]
958
+ });
959
+ usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([
960
+ userTest.id,
961
+ 77
962
+ ]);
963
+ usersQueriesService.isGuestManager = jest.fn().mockResolvedValue(true);
964
+ jest.spyOn(adminUsersManager, 'updateUserOrGuest').mockResolvedValue({
965
+ managers: [
966
+ {
967
+ id: userTest.id
968
+ },
969
+ {
970
+ id: 77
971
+ }
972
+ ]
973
+ });
974
+ await expect(usersManager.updateGuest(userTest, 9, {
975
+ managers: [
976
+ userTest.id,
977
+ 77
978
+ ]
979
+ })).resolves.toEqual({
980
+ managers: [
981
+ {
982
+ id: userTest.id
983
+ },
984
+ {
985
+ id: 77
986
+ }
987
+ ]
988
+ });
989
+ usersQueriesService.isGuestManager = jest.fn().mockResolvedValue(null);
990
+ await expect(usersManager.deleteGuest(userTest, 9)).rejects.toThrow('You are not allowed to do this action');
991
+ usersQueriesService.isGuestManager = jest.fn().mockResolvedValue({
992
+ id: 9,
993
+ login: 'guest'
994
+ });
995
+ const delSpy = jest.spyOn(adminUsersManager, 'deleteUserOrGuest').mockResolvedValue(undefined);
996
+ await expect(usersManager.deleteGuest(userTest, 9)).resolves.toBeUndefined();
997
+ expect(delSpy).toHaveBeenCalledWith(9, 'guest', {
998
+ deleteSpace: true,
999
+ isGuest: true
1000
+ });
1001
+ usersQueriesService.searchUsersOrGroups = jest.fn().mockResolvedValue([
1002
+ {
1003
+ id: 1
1004
+ }
1005
+ ]);
1006
+ await expect(usersManager.searchMembers(userTest, {
1007
+ search: ''
1008
+ })).resolves.toEqual([
1009
+ {
1010
+ id: 1
1011
+ }
1012
+ ]);
1013
+ usersQueriesService.getOnlineUsers = jest.fn().mockResolvedValue([
1014
+ {
1015
+ id: 123
1016
+ }
1017
+ ]);
1018
+ await expect(usersManager.getOnlineUsers([
1019
+ 123
1020
+ ])).resolves.toEqual([
1021
+ {
1022
+ id: 123
1023
+ }
1024
+ ]);
1025
+ expect(usersQueriesService.getOnlineUsers).toHaveBeenCalledWith([
1026
+ 123
1027
+ ]);
1028
+ usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([
1029
+ 10,
1030
+ 11
1031
+ ]);
1032
+ await expect(usersManager.usersWhitelist(userTest.id)).resolves.toEqual([
1033
+ 10,
1034
+ 11
1035
+ ]);
1036
+ expect(usersQueriesService.usersWhitelist).toHaveBeenCalledWith(userTest.id);
1037
+ });
149
1038
  });
150
1039
 
151
1040
  //# sourceMappingURL=users-manager.service.spec.js.map