user-groups.test.ts 4.5 KB

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