external-user-group-relation.integ.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import mongoose from 'mongoose';
  2. import ExternalUserGroup from './external-user-group';
  3. import ExternalUserGroupRelation from './external-user-group-relation';
  4. // TODO: use actual user model after ~/server/models/user.js becomes importable in vitest
  5. // ref: https://github.com/vitest-dev/vitest/issues/846
  6. const userSchema = new mongoose.Schema({
  7. name: { type: String },
  8. username: { type: String, required: true, unique: true },
  9. email: { type: String, unique: true, sparse: true },
  10. }, {
  11. timestamps: true,
  12. });
  13. const User = mongoose.model('User', userSchema);
  14. describe('ExternalUserGroupRelation model', () => {
  15. let user1;
  16. const userId1 = new mongoose.Types.ObjectId();
  17. let user2;
  18. const userId2 = new mongoose.Types.ObjectId();
  19. const groupId1 = new mongoose.Types.ObjectId();
  20. const groupId2 = new mongoose.Types.ObjectId();
  21. const groupId3 = new mongoose.Types.ObjectId();
  22. beforeAll(async() => {
  23. user1 = await User.create({
  24. _id: userId1, name: 'user1', username: 'user1', email: 'user1@example.com',
  25. });
  26. user2 = await User.create({
  27. _id: userId2, name: 'user2', username: 'user2', email: 'user2@example.com',
  28. });
  29. await ExternalUserGroup.insertMany([
  30. {
  31. _id: groupId1, name: 'test group 1', externalId: 'testExternalId', provider: 'testProvider',
  32. },
  33. {
  34. _id: groupId2, name: 'test group 2', externalId: 'testExternalId2', provider: 'testProvider',
  35. },
  36. {
  37. _id: groupId3, name: 'test group 3', externalId: 'testExternalId3', provider: 'testProvider',
  38. },
  39. ]);
  40. });
  41. afterEach(async() => {
  42. await ExternalUserGroupRelation.deleteMany();
  43. });
  44. describe('createRelations', () => {
  45. it('creates relation for user', async() => {
  46. await ExternalUserGroupRelation.createRelations([groupId1, groupId2], user1);
  47. const relations = await ExternalUserGroupRelation.find();
  48. const idCombinations = relations.map((relation) => {
  49. return [relation.relatedGroup, relation.relatedUser];
  50. });
  51. expect(idCombinations).toStrictEqual([[groupId1, userId1], [groupId2, userId1]]);
  52. });
  53. });
  54. describe('removeAllInvalidRelations', () => {
  55. beforeAll(async() => {
  56. const nonExistentGroupId1 = new mongoose.Types.ObjectId();
  57. const nonExistentGroupId2 = new mongoose.Types.ObjectId();
  58. await ExternalUserGroupRelation.createRelations([nonExistentGroupId1, nonExistentGroupId2], user1);
  59. });
  60. it('removes invalid relations', async() => {
  61. const relationsBeforeRemoval = await ExternalUserGroupRelation.find();
  62. expect(relationsBeforeRemoval.length).not.toBe(0);
  63. await ExternalUserGroupRelation.removeAllInvalidRelations();
  64. const relationsAfterRemoval = await ExternalUserGroupRelation.find();
  65. expect(relationsAfterRemoval.length).toBe(0);
  66. });
  67. });
  68. describe('findAllUserIdsForUserGroups', () => {
  69. beforeAll(async() => {
  70. await ExternalUserGroupRelation.createRelations([groupId1, groupId2], user1);
  71. await ExternalUserGroupRelation.create({ relatedGroup: groupId3, relatedUser: user2._id });
  72. });
  73. it('finds all unique user ids for specified user groups', async() => {
  74. const userIds = await ExternalUserGroupRelation.findAllUserIdsForUserGroups([groupId1, groupId2, groupId3]);
  75. expect(userIds).toStrictEqual([userId1.toString(), user2._id.toString()]);
  76. });
  77. });
  78. describe('findAllUserGroupIdsRelatedToUser', () => {
  79. beforeAll(async() => {
  80. await ExternalUserGroupRelation.createRelations([groupId1, groupId2], user1);
  81. await ExternalUserGroupRelation.create({ relatedGroup: groupId3, relatedUser: user2._id });
  82. });
  83. it('finds all group ids related to user', async() => {
  84. const groupIds = await ExternalUserGroupRelation.findAllUserGroupIdsRelatedToUser(user1);
  85. expect(groupIds).toStrictEqual([groupId1, groupId2]);
  86. const groupIds2 = await ExternalUserGroupRelation.findAllUserGroupIdsRelatedToUser(user2);
  87. expect(groupIds2).toStrictEqual([groupId3]);
  88. });
  89. });
  90. describe('findAllGroupsForUser', () => {
  91. beforeAll(async() => {
  92. await ExternalUserGroupRelation.createRelations([groupId1, groupId2], user1);
  93. await ExternalUserGroupRelation.create({ relatedGroup: groupId3, relatedUser: user2._id });
  94. });
  95. it('finds all groups related to user', async() => {
  96. const groups = await ExternalUserGroupRelation.findAllGroupsForUser(user1);
  97. const groupIds = groups.map(group => group._id);
  98. expect(groupIds).toStrictEqual([groupId1, groupId2]);
  99. const groups2 = await ExternalUserGroupRelation.findAllGroupsForUser(user2);
  100. const groupIds2 = groups2.map(group => group._id);
  101. expect(groupIds2).toStrictEqual([groupId3]);
  102. });
  103. });
  104. });