user-groups.test.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. import mongoose from 'mongoose';
  2. import { getInstance } from '../setup-crowi';
  3. describe('UserGroupService', () => {
  4. let crowi;
  5. let User;
  6. let UserGroup;
  7. let UserGroupRelation;
  8. const groupId1 = new mongoose.Types.ObjectId();
  9. const groupId2 = new mongoose.Types.ObjectId();
  10. const groupId3 = new mongoose.Types.ObjectId();
  11. const groupId4 = new mongoose.Types.ObjectId();
  12. const groupId5 = new mongoose.Types.ObjectId();
  13. const groupId6 = new mongoose.Types.ObjectId();
  14. const groupId7 = new mongoose.Types.ObjectId();
  15. const groupId8 = new mongoose.Types.ObjectId();
  16. const groupId9 = new mongoose.Types.ObjectId();
  17. const groupId10 = new mongoose.Types.ObjectId();
  18. const groupId11 = new mongoose.Types.ObjectId();
  19. const groupId12 = new mongoose.Types.ObjectId();
  20. const userId1 = new mongoose.Types.ObjectId();
  21. beforeAll(async() => {
  22. crowi = await getInstance();
  23. User = mongoose.model('User');
  24. UserGroup = mongoose.model('UserGroup');
  25. UserGroupRelation = mongoose.model('UserGroupRelation');
  26. await User.insertMany([
  27. {
  28. _id: userId1, name: 'someone1', username: 'someone1', email: 'someone1@example.com',
  29. },
  30. ]);
  31. // Create Groups
  32. await UserGroup.insertMany([
  33. // No parent
  34. {
  35. _id: groupId1,
  36. name: 'v5_group1',
  37. description: 'description1',
  38. },
  39. // No parent
  40. {
  41. _id: groupId2,
  42. name: 'v5_group2',
  43. description: 'description2',
  44. },
  45. // No parent
  46. {
  47. _id: groupId3,
  48. name: 'v5_group3',
  49. description: 'description3',
  50. },
  51. // No parent
  52. {
  53. _id: groupId4,
  54. name: 'v5_group4',
  55. description: 'description4',
  56. },
  57. // No parent
  58. {
  59. _id: groupId5,
  60. name: 'v5_group5',
  61. description: 'description5',
  62. },
  63. // No parent
  64. {
  65. _id: groupId6,
  66. name: 'v5_group6',
  67. description: 'description6',
  68. },
  69. // No parent
  70. {
  71. _id: groupId7,
  72. name: 'v5_group7',
  73. description: 'description7',
  74. parent: groupId6,
  75. },
  76. // No parent
  77. {
  78. _id: groupId8,
  79. name: 'v5_group8',
  80. description: 'description8',
  81. },
  82. {
  83. _id: groupId9,
  84. name: 'v5_group9',
  85. description: 'description9',
  86. },
  87. {
  88. _id: groupId10,
  89. name: 'v5_group10',
  90. description: 'description10',
  91. parent: groupId9,
  92. },
  93. {
  94. _id: groupId11,
  95. name: 'v5_group11',
  96. description: 'descriptio11',
  97. },
  98. {
  99. _id: groupId12,
  100. name: 'v5_group12',
  101. description: 'description12',
  102. parent: groupId11,
  103. },
  104. ]);
  105. // Create UserGroupRelations
  106. await UserGroupRelation.insertMany([
  107. {
  108. relatedGroup: groupId4,
  109. relatedUser: userId1,
  110. },
  111. {
  112. relatedGroup: groupId6,
  113. relatedUser: userId1,
  114. },
  115. {
  116. relatedGroup: groupId8,
  117. relatedUser: userId1,
  118. },
  119. {
  120. relatedGroup: groupId9,
  121. relatedUser: userId1,
  122. },
  123. {
  124. relatedGroup: groupId10,
  125. relatedUser: userId1,
  126. },
  127. {
  128. relatedGroup: groupId11,
  129. relatedUser: userId1,
  130. },
  131. {
  132. relatedGroup: groupId12,
  133. relatedUser: userId1,
  134. },
  135. ]);
  136. });
  137. /*
  138. * Update UserGroup
  139. */
  140. test('Updated values should be reflected. (name, description, parent)', async() => {
  141. const userGroup2 = await UserGroup.findOne({ _id: groupId2 });
  142. const newGroupName = 'v5_group1_new';
  143. const newGroupDescription = 'description1_new';
  144. const newParentId = userGroup2._id;
  145. const updatedUserGroup = await crowi.userGroupService.updateGroup(groupId1, newGroupName, newGroupDescription, newParentId);
  146. expect(updatedUserGroup.name).toBe(newGroupName);
  147. expect(updatedUserGroup.description).toBe(newGroupDescription);
  148. expect(updatedUserGroup.parent).toStrictEqual(newParentId);
  149. });
  150. test('Should throw an error when trying to set existing group name', async() => {
  151. const userGroup2 = await UserGroup.findOne({ _id: groupId2 });
  152. const result = crowi.userGroupService.updateGroup(groupId1, userGroup2.name);
  153. await expect(result).rejects.toThrow('The group name is already taken');
  154. });
  155. test('Parent should be null when parent group is released', async() => {
  156. const userGroup = await UserGroup.findOne({ _id: groupId3 });
  157. const updatedUserGroup = await crowi.userGroupService.updateGroup(userGroup._id, userGroup.name, userGroup.description, null);
  158. expect(updatedUserGroup.parent).toBeNull();
  159. });
  160. /*
  161. * forceUpdateParents: false
  162. */
  163. test('Should throw an error when users in child group do not exist in parent group', async() => {
  164. const userGroup4 = await UserGroup.findOne({ _id: groupId4, parent: null });
  165. const result = crowi.userGroupService.updateGroup(userGroup4._id, userGroup4.name, userGroup4.description, groupId5);
  166. await expect(result).rejects.toThrow('The parent group does not contain the users in this group.');
  167. });
  168. /*
  169. * forceUpdateParents: true
  170. */
  171. test('User should be included to parent group (2 groups ver)', async() => {
  172. const userGroup4 = await UserGroup.findOne({ _id: groupId4, parent: null });
  173. const userGroup5 = await UserGroup.findOne({ _id: groupId5, parent: null });
  174. // userGroup4 has userId1
  175. const userGroupRelation4BeforeUpdate = await UserGroupRelation.findOne({ relatedGroup: userGroup4, relatedUser: userId1 });
  176. expect(userGroupRelation4BeforeUpdate).not.toBeNull();
  177. // userGroup5 has not userId1
  178. const userGroupRelation5BeforeUpdate = await UserGroupRelation.findOne({ relatedGroup: userGroup5, relatedUser: userId1 });
  179. expect(userGroupRelation5BeforeUpdate).toBeNull();
  180. // update userGroup4's parent with userGroup5 (forceUpdate: true)
  181. const forceUpdateParents = true;
  182. const updatedUserGroup = await crowi.userGroupService.updateGroup(
  183. userGroup4._id, userGroup4.name, userGroup4.description, groupId5, forceUpdateParents,
  184. );
  185. expect(updatedUserGroup.parent).toStrictEqual(groupId5);
  186. // userGroup5 should have userId1
  187. const userGroupRelation5AfterUpdate = await UserGroupRelation.findOne({ relatedGroup: groupId5, relatedUser: userGroupRelation4BeforeUpdate.relatedUser });
  188. expect(userGroupRelation5AfterUpdate).not.toBeNull();
  189. });
  190. test('User should be included to parent group (3 groups ver)', async() => {
  191. const userGroup8 = await UserGroup.findOne({ _id: groupId8, parent: null });
  192. // userGroup7 has not userId1
  193. const userGroupRelation6BeforeUpdate = await UserGroupRelation.findOne({ relatedGroup: groupId6, relatedUser: userId1 });
  194. const userGroupRelation7BeforeUpdate = await UserGroupRelation.findOne({ relatedGroup: groupId7, relatedUser: userId1 });
  195. const userGroupRelation8BeforeUpdate = await UserGroupRelation.findOne({ relatedGroup: groupId8, relatedUser: userId1 });
  196. expect(userGroupRelation6BeforeUpdate).not.toBeNull();
  197. // userGroup7 does not have userId1
  198. expect(userGroupRelation7BeforeUpdate).toBeNull();
  199. expect(userGroupRelation8BeforeUpdate).not.toBeNull();
  200. // update userGroup8's parent with userGroup7 (forceUpdate: true)
  201. const forceUpdateParents = true;
  202. await crowi.userGroupService.updateGroup(
  203. userGroup8._id, userGroup8.name, userGroup8.description, groupId7, forceUpdateParents,
  204. );
  205. const userGroupRelation6AfterUpdate = await UserGroupRelation.findOne({ relatedGroup: groupId6, relatedUser: userId1 });
  206. const userGroupRelation7AfterUpdate = await UserGroupRelation.findOne({ relatedGroup: groupId7, relatedUser: userId1 });
  207. const userGroupRelation8AfterUpdate = await UserGroupRelation.findOne({ relatedGroup: groupId8, relatedUser: userId1 });
  208. expect(userGroupRelation6AfterUpdate).not.toBeNull();
  209. // userGroup7 should have userId1
  210. expect(userGroupRelation7AfterUpdate).not.toBeNull();
  211. expect(userGroupRelation8AfterUpdate).not.toBeNull();
  212. });
  213. test('Should throw an error when trying to choose parent from descendant groups.', async() => {
  214. const userGroup9 = await UserGroup.findOne({ _id: groupId9, parent: null });
  215. const userGroup10 = await UserGroup.findOne({ _id: groupId10, parent: groupId9 });
  216. const userGroupRelation9BeforeUpdate = await UserGroupRelation.findOne({ relatedGroup: userGroup9._id, relatedUser: userId1 });
  217. const userGroupRelation10BeforeUpdate = await UserGroupRelation.findOne({ relatedGroup: userGroup10._id, relatedUser: userId1 });
  218. expect(userGroupRelation9BeforeUpdate).not.toBeNull();
  219. expect(userGroupRelation10BeforeUpdate).not.toBeNull();
  220. const result = crowi.userGroupService.updateGroup(
  221. userGroup9._id, userGroup9.name, userGroup9.description, userGroup10._id,
  222. );
  223. await expect(result).rejects.toThrow('It is not allowed to choose parent from descendant groups.');
  224. });
  225. test('User should be deleted from child groups when the user excluded from the parent group', async() => {
  226. const userGroup11 = await UserGroup.findOne({ _id: groupId11, parent: null });
  227. const userGroup12 = await UserGroup.findOne({ _id: groupId12, parent: groupId11 });
  228. // Both groups have user1
  229. const userGroupRelation11BeforeRemove = await UserGroupRelation.findOne({ relatedGroup: userGroup11._id, relatedUser: userId1 });
  230. const userGroupRelation12BeforeRemove = await UserGroupRelation.findOne({ relatedGroup: userGroup12._id, relatedUser: userId1 });
  231. expect(userGroupRelation11BeforeRemove).not.toBeNull();
  232. expect(userGroupRelation12BeforeRemove).not.toBeNull();
  233. // remove user1 from the parent group
  234. await crowi.userGroupService.removeUserByUsername(
  235. userGroup11._id, 'someone1',
  236. );
  237. // Both groups have not user1
  238. const userGroupRelation11AfterRemove = await UserGroupRelation.findOne({ relatedGroup: userGroup11._id, relatedUser: userId1 });
  239. const userGroupRelation12AfterRemove = await UserGroupRelation.findOne({ relatedGroup: userGroup12._id, relatedUser: userId1 });
  240. await expect(userGroupRelation11AfterRemove).toBeNull();
  241. await expect(userGroupRelation12AfterRemove).toBeNull();
  242. });
  243. });