user-groups.test.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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 userId1 = new mongoose.Types.ObjectId();
  14. beforeAll(async() => {
  15. crowi = await getInstance();
  16. User = mongoose.model('User');
  17. UserGroup = mongoose.model('UserGroup');
  18. UserGroupRelation = mongoose.model('UserGroupRelation');
  19. // Create Users
  20. await User.insertMany([
  21. { name: 'user1', username: 'user1', email: 'user-group-test1@example.com' },
  22. ]);
  23. // Create Groups
  24. await UserGroup.insertMany([
  25. // No parent
  26. {
  27. _id: groupId1,
  28. name: 'v5_group1',
  29. description: 'description1',
  30. },
  31. // No parent
  32. {
  33. _id: groupId2,
  34. name: 'v5_group2',
  35. description: 'description2',
  36. },
  37. // No parent
  38. {
  39. _id: groupId3,
  40. name: 'v5_group3',
  41. description: 'description3',
  42. },
  43. // No parent
  44. {
  45. _id: groupId4,
  46. name: 'v5_group4',
  47. description: 'description4',
  48. },
  49. // No parent
  50. {
  51. _id: groupId5,
  52. name: 'v5_group5',
  53. description: 'description5',
  54. },
  55. ]);
  56. // Create UserGroupRelations
  57. await UserGroupRelation.insertMany([
  58. {
  59. relatedGroup: groupId4,
  60. relatedUser: userId1,
  61. },
  62. ]);
  63. });
  64. /*
  65. * Update UserGroup
  66. */
  67. test('Updated values should be reflected. (name, description, parent)', async() => {
  68. const userGroup1 = await UserGroup.findOne({ _id: groupId1 });
  69. const userGroup2 = await UserGroup.findOne({ _id: groupId2 });
  70. const newGroupName = 'v5_group1_new';
  71. const newGroupDescription = 'description1_new';
  72. const newParentId = userGroup2._id;
  73. const updatedUserGroup = await crowi.userGroupService.updateGroup(userGroup1._id, newGroupName, newGroupDescription, newParentId);
  74. expect(updatedUserGroup.name).toBe(newGroupName);
  75. expect(updatedUserGroup.description).toBe(newGroupDescription);
  76. expect(updatedUserGroup.parent).toStrictEqual(newParentId);
  77. });
  78. test('Should throw an error when trying to set existing group name', async() => {
  79. const userGroup1 = await UserGroup.findOne({ _id: groupId1 });
  80. const userGroup2 = await UserGroup.findOne({ _id: groupId2 });
  81. const result = crowi.userGroupService.updateGroup(userGroup1._id, userGroup2.name);
  82. await expect(result).rejects.toThrow('The group name is already taken');
  83. });
  84. test('Parent should be null when parent group is released', async() => {
  85. const userGroup = await UserGroup.findOne({ _id: groupId3 });
  86. const updatedUserGroup = await crowi.userGroupService.updateGroup(userGroup._id, userGroup.name, userGroup.description, null);
  87. expect(updatedUserGroup.parent).toBeNull();
  88. });
  89. // In case that forceUpdateParents is false
  90. test('Should throw an error when users in child group do not exist in parent group', async() => {
  91. const userGroup4 = await UserGroup.findOne({ _id: groupId4 });
  92. const userGroup5 = await UserGroup.findOne({ _id: groupId5 });
  93. const result = crowi.userGroupService.updateGroup(userGroup4._id, userGroup4.name, userGroup4.description, userGroup5._id);
  94. await expect(result).rejects.toThrow('The parent group does not contain the users in this group.');
  95. });
  96. // In case that forceUpdateParents is true
  97. test('User should be included to parent group in case that force update is true', async() => {
  98. const userGroup4 = await UserGroup.findOne({ _id: groupId4 });
  99. const userGroup4Relation = await UserGroupRelation.findOne({ relatedGroup: userGroup4, relatedUser: userId1 });
  100. const userGroup5 = await UserGroup.findOne({ _id: groupId5 });
  101. const forceUpdateParents = true;
  102. const updatedUserGroup = await crowi.userGroupService.updateGroup(
  103. userGroup4._id, userGroup4.name, userGroup4.description, userGroup5._id, forceUpdateParents,
  104. );
  105. const relatedGroup = await UserGroupRelation.findOne({ relatedGroup: userGroup5._id, relatedUser: userGroup4Relation.relatedUser });
  106. expect(updatedUserGroup.parent).toStrictEqual(userGroup5._id);
  107. expect(relatedGroup).toBeTruthy();
  108. });
  109. });