user-groups.test.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import mongoose from 'mongoose';
  2. import { getInstance } from '../setup-crowi';
  3. describe('UserGroupService', () => {
  4. jest.setTimeout(60000);
  5. let crowi;
  6. let User;
  7. let UserGroup;
  8. let UserGroupRelation;
  9. const groupId1 = new mongoose.Types.ObjectId();
  10. const groupId2 = new mongoose.Types.ObjectId();
  11. const groupId3 = new mongoose.Types.ObjectId();
  12. const groupId4 = new mongoose.Types.ObjectId();
  13. const groupId5 = 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. const user1 = await User.findOne({ username: 'user1' });
  57. const userGroup4 = await UserGroup.findOne({ _id: groupId4 });
  58. // Create UserGroupRelations
  59. await UserGroupRelation.insertMany([
  60. {
  61. relatedGroup: userGroup4,
  62. relatedUser: user1,
  63. },
  64. ]);
  65. });
  66. /*
  67. * Update UserGroup
  68. */
  69. test('Updated values should be reflected. (name, description, parent)', async() => {
  70. const userGroup1 = await UserGroup.findOne({ _id: groupId1 });
  71. const userGroup2 = await UserGroup.findOne({ _id: groupId2 });
  72. const newGroupName = 'v5_group1_new';
  73. const newGroupDescription = 'description1_new';
  74. const newParentId = userGroup2._id;
  75. const updatedUserGroup = await crowi.userGroupService.updateGroup(userGroup1._id, newGroupName, newGroupDescription, newParentId);
  76. expect(updatedUserGroup.name).toBe(newGroupName);
  77. expect(updatedUserGroup.description).toBe(newGroupDescription);
  78. expect(updatedUserGroup.parent).toStrictEqual(newParentId);
  79. });
  80. test('Should throw an error when trying to set existing group name', async() => {
  81. const userGroup1 = await UserGroup.findOne({ _id: groupId1 });
  82. const userGroup2 = await UserGroup.findOne({ _id: groupId2 });
  83. const result = crowi.userGroupService.updateGroup(userGroup1._id, userGroup2.name);
  84. await expect(result).rejects.toThrow('The group name is already taken');
  85. });
  86. test('Parent should be null when parent group is released', async() => {
  87. const userGroup = await UserGroup.findOne({ _id: groupId3 });
  88. const updatedUserGroup = await crowi.userGroupService.updateGroup(userGroup._id, userGroup.name, userGroup.description, null);
  89. expect(updatedUserGroup.parent).toBeNull();
  90. });
  91. // In case that forceUpdateParents is false
  92. test('Should throw an error when users in child group do not include in parent group', async() => {
  93. const userGroup4 = await UserGroup.findOne({ _id: groupId4 });
  94. const userGroup5 = await UserGroup.findOne({ _id: groupId5 });
  95. const result = crowi.userGroupService.updateGroup(userGroup4._id, userGroup4.name, userGroup4.description, userGroup5._id);
  96. await expect(result).rejects.toThrow('The parent group does not contain the users in this group.');
  97. });
  98. // In case that forceUpdateParents is true
  99. test('User should be included to parent group forcibly in case that force update is true', async() => {
  100. const userGroup4 = await UserGroup.findOne({ _id: groupId4 });
  101. const userGroup4Relation = await UserGroupRelation.findOne({ relatedGroup: userGroup4 });
  102. const userGroup5 = await UserGroup.findOne({ _id: groupId5 });
  103. const forceUpdateParents = true;
  104. await crowi.userGroupService.updateGroup(userGroup4._id, userGroup4.name, userGroup4.description, userGroup5._id, forceUpdateParents);
  105. const relatedGroup = await UserGroupRelation.findOne({ relatedGroup: userGroup5._id, relatedUser: userGroup4Relation.relatedUser });
  106. expect(relatedGroup).toBeTruthy();
  107. });
  108. });