Yuki Takei 4 лет назад
Родитель
Сommit
0a805d1f2c

+ 13 - 4
packages/app/src/server/models/user.js

@@ -1,14 +1,15 @@
 /* eslint-disable no-use-before-define */
 import loggerFactory from '~/utils/logger';
 
+const crypto = require('crypto');
+
 const debug = require('debug')('growi:models:user');
+const md5 = require('md5');
 const mongoose = require('mongoose');
 const mongoosePaginate = require('mongoose-paginate-v2');
 const uniqueValidator = require('mongoose-unique-validator');
-const md5 = require('md5');
 
 const ObjectId = mongoose.Schema.Types.ObjectId;
-const crypto = require('crypto');
 
 const { listLocaleIds, migrateDeprecatedLocaleId } = require('~/utils/locale-utils');
 
@@ -393,8 +394,16 @@ module.exports = function(crowi) {
       .sort(sort);
   };
 
-  userSchema.statics.findAdmins = async function() {
-    return this.find({ admin: true });
+  userSchema.statics.findAdmins = async function(option) {
+    const sort = option?.sort ?? { createdAt: -1 };
+
+    let status = option?.status ?? [STATUS_ACTIVE];
+    if (!Array.isArray(status)) {
+      status = [status];
+    }
+
+    return this.find({ admin: true, status: { $in: status } })
+      .sort(sort);
   };
 
   userSchema.statics.findUserByUsername = function(username) {

+ 59 - 18
packages/app/test/integration/models/user.test.js

@@ -8,7 +8,7 @@ describe('User', () => {
   let crowi;
   let User;
 
-  let adminusertest2Id;
+  let adminusertestToBeRemovedId;
 
   beforeAll(async() => {
     crowi = await getInstance();
@@ -23,25 +23,38 @@ describe('User', () => {
         lang: 'en_US',
       },
       {
-        name: 'Admin Example',
+        name: 'Admin Example Active',
         username: 'adminusertest1',
-        email: 'adminusertest@example.com',
+        email: 'adminusertest1@example.com',
         password: 'adminusertestpass',
+        admin: true,
+        status: User.STATUS_ACTIVE,
         lang: 'en_US',
       },
       {
-        name: 'Admin Example to delete',
+        name: 'Admin Example Suspended',
         username: 'adminusertest2',
-        email: 'adminusertest2@example.com',
+        email: 'adminusertes2@example.com',
         password: 'adminusertestpass',
+        admin: true,
+        status: User.STATUS_SUSPENDED,
+        lang: 'en_US',
+      },
+      {
+        name: 'Admin Example to delete',
+        username: 'adminusertestToBeRemoved',
+        email: 'adminusertestToBeRemoved@example.com',
+        password: 'adminusertestpass',
+        admin: true,
+        status: User.STATUS_ACTIVE,
         lang: 'en_US',
       },
     ]);
 
-    // delete adminusertest2
-    const adminusertest2 = await User.findOne({ username: 'adminusertest2' });
-    adminusertest2Id = adminusertest2._id;
-    await adminusertest2.statusDelete();
+    // delete adminusertestToBeRemoved
+    const adminusertestToBeRemoved = await User.findOne({ username: 'adminusertestToBeRemoved' });
+    adminusertestToBeRemovedId = adminusertestToBeRemoved._id;
+    await adminusertestToBeRemoved.statusDelete();
   });
 
   describe('Create and Find.', () => {
@@ -62,18 +75,46 @@ describe('User', () => {
       });
 
     });
+
   });
 
   describe('Delete.', () => {
-    test('adminusertest2 should have correct attributes', async() => {
-      const adminusertest2 = await User.findOne({ _id: adminusertest2Id });
-
-      expect(adminusertest2).toBeInstanceOf(User);
-      expect(adminusertest2.name).toBe('');
-      expect(adminusertest2.password).toBe('');
-      expect(adminusertest2.googleId).toBeNull();
-      expect(adminusertest2.isGravatarEnabled).toBeFalsy();
-      expect(adminusertest2.image).toBeNull();
+
+    describe('Deleted users', () => {
+      test('should have correct attributes', async() => {
+        const adminusertestToBeRemoved = await User.findOne({ _id: adminusertestToBeRemovedId });
+
+        expect(adminusertestToBeRemoved).toBeInstanceOf(User);
+        expect(adminusertestToBeRemoved.name).toBe('');
+        expect(adminusertestToBeRemoved.password).toBe('');
+        expect(adminusertestToBeRemoved.googleId).toBeNull();
+        expect(adminusertestToBeRemoved.isGravatarEnabled).toBeFalsy();
+        expect(adminusertestToBeRemoved.image).toBeNull();
+      });
+    });
+  });
+
+  describe('User.findAdmins', () => {
+    test('should retrieves only active users', async() => {
+      const users = await User.findAdmins();
+      const adminusertestActive = users.find(user => user.username === 'adminusertest1');
+      const adminusertestSuspended = users.find(user => user.username === 'adminusertest2');
+      const adminusertestToBeRemoved = users.find(user => user._id.toString() === adminusertestToBeRemovedId.toString());
+
+      expect(adminusertestActive).toBeInstanceOf(User);
+      expect(adminusertestSuspended).toBeUndefined();
+      expect(adminusertestToBeRemoved).toBeUndefined();
+    });
+
+    test('with \'includesInactive\' option should retrieves suspended users', async() => {
+      const users = await User.findAdmins({ status: [User.STATUS_ACTIVE, User.STATUS_SUSPENDED] });
+      const adminusertestActive = users.find(user => user.username === 'adminusertest1');
+      const adminusertestSuspended = users.find(user => user.username === 'adminusertest2');
+      const adminusertestToBeRemoved = users.find(user => user._id.toString() === adminusertestToBeRemovedId.toString());
+
+      expect(adminusertestActive).toBeInstanceOf(User);
+      expect(adminusertestSuspended).toBeInstanceOf(User);
+      expect(adminusertestToBeRemoved).toBeUndefined();
     });
   });