|
|
|
@@ -10,6 +10,8 @@ import { jest } from '@jest/globals';
|
|
|
|
|
import { ModuleMocker } from 'jest-mock';
|
|
|
|
|
import { Test } from '@nestjs/testing';
|
|
|
|
|
import * as lolex from '@sinonjs/fake-timers';
|
|
|
|
|
import type { TestingModule } from '@nestjs/testing';
|
|
|
|
|
import type { MockFunctionMetadata } from 'jest-mock';
|
|
|
|
|
import { GlobalModule } from '@/GlobalModule.js';
|
|
|
|
|
import { RoleService } from '@/core/RoleService.js';
|
|
|
|
|
import {
|
|
|
|
@@ -31,8 +33,6 @@ import { secureRndstr } from '@/misc/secure-rndstr.js';
|
|
|
|
|
import { NotificationService } from '@/core/NotificationService.js';
|
|
|
|
|
import { RoleCondFormulaValue } from '@/models/Role.js';
|
|
|
|
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
|
|
|
|
import type { TestingModule } from '@nestjs/testing';
|
|
|
|
|
import type { MockFunctionMetadata } from 'jest-mock';
|
|
|
|
|
|
|
|
|
|
const moduleMocker = new ModuleMocker(global);
|
|
|
|
|
|
|
|
|
@@ -277,9 +277,9 @@ describe('RoleService', () => {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
describe('getModeratorIds', () => {
|
|
|
|
|
test('includeAdmins = false, excludeExpire = false', async () => {
|
|
|
|
|
const [adminUser1, adminUser2, modeUser1, modeUser2, normalUser1, normalUser2] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser(), createUser(), createUser(),
|
|
|
|
|
test('includeAdmins = false, includeRoot = false, excludeExpire = false', async () => {
|
|
|
|
|
const [adminUser1, adminUser2, modeUser1, modeUser2, normalUser1, normalUser2, rootUser] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser(), createUser(), createUser(), createUser({ isRoot: true }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const role1 = await createRole({ name: 'admin', isAdministrator: true });
|
|
|
|
@@ -295,13 +295,17 @@ describe('RoleService', () => {
|
|
|
|
|
assignRole({ userId: normalUser2.id, roleId: role3.id, expiresAt: new Date(Date.now() - 1000) }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const result = await roleService.getModeratorIds(false, false);
|
|
|
|
|
const result = await roleService.getModeratorIds({
|
|
|
|
|
includeAdmins: false,
|
|
|
|
|
includeRoot: false,
|
|
|
|
|
excludeExpire: false,
|
|
|
|
|
});
|
|
|
|
|
expect(result).toEqual([modeUser1.id, modeUser2.id]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('includeAdmins = false, excludeExpire = true', async () => {
|
|
|
|
|
const [adminUser1, adminUser2, modeUser1, modeUser2, normalUser1, normalUser2] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser(), createUser(), createUser(),
|
|
|
|
|
test('includeAdmins = false, includeRoot = false, excludeExpire = true', async () => {
|
|
|
|
|
const [adminUser1, adminUser2, modeUser1, modeUser2, normalUser1, normalUser2, rootUser] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser(), createUser(), createUser(), createUser({ isRoot: true }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const role1 = await createRole({ name: 'admin', isAdministrator: true });
|
|
|
|
@@ -317,13 +321,17 @@ describe('RoleService', () => {
|
|
|
|
|
assignRole({ userId: normalUser2.id, roleId: role3.id, expiresAt: new Date(Date.now() - 1000) }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const result = await roleService.getModeratorIds(false, true);
|
|
|
|
|
const result = await roleService.getModeratorIds({
|
|
|
|
|
includeAdmins: false,
|
|
|
|
|
includeRoot: false,
|
|
|
|
|
excludeExpire: true,
|
|
|
|
|
});
|
|
|
|
|
expect(result).toEqual([modeUser1.id]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('includeAdmins = true, excludeExpire = false', async () => {
|
|
|
|
|
const [adminUser1, adminUser2, modeUser1, modeUser2, normalUser1, normalUser2] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser(), createUser(), createUser(),
|
|
|
|
|
test('includeAdmins = true, includeRoot = false, excludeExpire = false', async () => {
|
|
|
|
|
const [adminUser1, adminUser2, modeUser1, modeUser2, normalUser1, normalUser2, rootUser] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser(), createUser(), createUser(), createUser({ isRoot: true }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const role1 = await createRole({ name: 'admin', isAdministrator: true });
|
|
|
|
@@ -339,13 +347,17 @@ describe('RoleService', () => {
|
|
|
|
|
assignRole({ userId: normalUser2.id, roleId: role3.id, expiresAt: new Date(Date.now() - 1000) }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const result = await roleService.getModeratorIds(true, false);
|
|
|
|
|
const result = await roleService.getModeratorIds({
|
|
|
|
|
includeAdmins: true,
|
|
|
|
|
includeRoot: false,
|
|
|
|
|
excludeExpire: false,
|
|
|
|
|
});
|
|
|
|
|
expect(result).toEqual([adminUser1.id, adminUser2.id, modeUser1.id, modeUser2.id]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('includeAdmins = true, excludeExpire = true', async () => {
|
|
|
|
|
const [adminUser1, adminUser2, modeUser1, modeUser2, normalUser1, normalUser2] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser(), createUser(), createUser(),
|
|
|
|
|
test('includeAdmins = true, includeRoot = false, excludeExpire = true', async () => {
|
|
|
|
|
const [adminUser1, adminUser2, modeUser1, modeUser2, normalUser1, normalUser2, rootUser] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser(), createUser(), createUser(), createUser({ isRoot: true }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const role1 = await createRole({ name: 'admin', isAdministrator: true });
|
|
|
|
@@ -361,9 +373,137 @@ describe('RoleService', () => {
|
|
|
|
|
assignRole({ userId: normalUser2.id, roleId: role3.id, expiresAt: new Date(Date.now() - 1000) }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const result = await roleService.getModeratorIds(true, true);
|
|
|
|
|
const result = await roleService.getModeratorIds({
|
|
|
|
|
includeAdmins: true,
|
|
|
|
|
includeRoot: false,
|
|
|
|
|
excludeExpire: true,
|
|
|
|
|
});
|
|
|
|
|
expect(result).toEqual([adminUser1.id, modeUser1.id]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('includeAdmins = false, includeRoot = true, excludeExpire = false', async () => {
|
|
|
|
|
const [adminUser1, adminUser2, modeUser1, modeUser2, normalUser1, normalUser2, rootUser] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser(), createUser(), createUser(), createUser({ isRoot: true }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const role1 = await createRole({ name: 'admin', isAdministrator: true });
|
|
|
|
|
const role2 = await createRole({ name: 'moderator', isModerator: true });
|
|
|
|
|
const role3 = await createRole({ name: 'normal' });
|
|
|
|
|
|
|
|
|
|
await Promise.all([
|
|
|
|
|
assignRole({ userId: adminUser1.id, roleId: role1.id }),
|
|
|
|
|
assignRole({ userId: adminUser2.id, roleId: role1.id, expiresAt: new Date(Date.now() - 1000) }),
|
|
|
|
|
assignRole({ userId: modeUser1.id, roleId: role2.id }),
|
|
|
|
|
assignRole({ userId: modeUser2.id, roleId: role2.id, expiresAt: new Date(Date.now() - 1000) }),
|
|
|
|
|
assignRole({ userId: normalUser1.id, roleId: role3.id }),
|
|
|
|
|
assignRole({ userId: normalUser2.id, roleId: role3.id, expiresAt: new Date(Date.now() - 1000) }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const result = await roleService.getModeratorIds({
|
|
|
|
|
includeAdmins: false,
|
|
|
|
|
includeRoot: true,
|
|
|
|
|
excludeExpire: false,
|
|
|
|
|
});
|
|
|
|
|
expect(result).toEqual([rootUser.id]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('includeAdmins = false, includeRoot = true, excludeExpire = false', async () => {
|
|
|
|
|
const [adminUser1, adminUser2, modeUser1, modeUser2, normalUser1, normalUser2, rootUser] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser(), createUser(), createUser(), createUser({ isRoot: true }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const role1 = await createRole({ name: 'admin', isAdministrator: true });
|
|
|
|
|
const role2 = await createRole({ name: 'moderator', isModerator: true });
|
|
|
|
|
const role3 = await createRole({ name: 'normal' });
|
|
|
|
|
|
|
|
|
|
await Promise.all([
|
|
|
|
|
assignRole({ userId: adminUser1.id, roleId: role1.id }),
|
|
|
|
|
assignRole({ userId: adminUser2.id, roleId: role1.id, expiresAt: new Date(Date.now() - 1000) }),
|
|
|
|
|
assignRole({ userId: modeUser1.id, roleId: role2.id }),
|
|
|
|
|
assignRole({ userId: modeUser2.id, roleId: role2.id, expiresAt: new Date(Date.now() - 1000) }),
|
|
|
|
|
assignRole({ userId: normalUser1.id, roleId: role3.id }),
|
|
|
|
|
assignRole({ userId: normalUser2.id, roleId: role3.id, expiresAt: new Date(Date.now() - 1000) }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const result = await roleService.getModeratorIds({
|
|
|
|
|
includeAdmins: false,
|
|
|
|
|
includeRoot: true,
|
|
|
|
|
excludeExpire: false,
|
|
|
|
|
});
|
|
|
|
|
expect(result).toEqual([rootUser.id]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('root has moderator role', async () => {
|
|
|
|
|
const [adminUser1, modeUser1, normalUser1, rootUser] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser({ isRoot: true }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const role1 = await createRole({ name: 'admin', isAdministrator: true });
|
|
|
|
|
const role2 = await createRole({ name: 'moderator', isModerator: true });
|
|
|
|
|
const role3 = await createRole({ name: 'normal' });
|
|
|
|
|
|
|
|
|
|
await Promise.all([
|
|
|
|
|
assignRole({ userId: adminUser1.id, roleId: role1.id }),
|
|
|
|
|
assignRole({ userId: modeUser1.id, roleId: role2.id }),
|
|
|
|
|
assignRole({ userId: rootUser.id, roleId: role2.id }),
|
|
|
|
|
assignRole({ userId: normalUser1.id, roleId: role3.id }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const result = await roleService.getModeratorIds({
|
|
|
|
|
includeAdmins: false,
|
|
|
|
|
includeRoot: true,
|
|
|
|
|
excludeExpire: false,
|
|
|
|
|
});
|
|
|
|
|
expect(result).toEqual([modeUser1.id, rootUser.id]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('root has administrator role', async () => {
|
|
|
|
|
const [adminUser1, modeUser1, normalUser1, rootUser] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser({ isRoot: true }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const role1 = await createRole({ name: 'admin', isAdministrator: true });
|
|
|
|
|
const role2 = await createRole({ name: 'moderator', isModerator: true });
|
|
|
|
|
const role3 = await createRole({ name: 'normal' });
|
|
|
|
|
|
|
|
|
|
await Promise.all([
|
|
|
|
|
assignRole({ userId: adminUser1.id, roleId: role1.id }),
|
|
|
|
|
assignRole({ userId: rootUser.id, roleId: role1.id }),
|
|
|
|
|
assignRole({ userId: modeUser1.id, roleId: role2.id }),
|
|
|
|
|
assignRole({ userId: normalUser1.id, roleId: role3.id }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const result = await roleService.getModeratorIds({
|
|
|
|
|
includeAdmins: true,
|
|
|
|
|
includeRoot: true,
|
|
|
|
|
excludeExpire: false,
|
|
|
|
|
});
|
|
|
|
|
expect(result).toEqual([adminUser1.id, modeUser1.id, rootUser.id]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('root has moderator role(expire)', async () => {
|
|
|
|
|
const [adminUser1, modeUser1, normalUser1, rootUser] = await Promise.all([
|
|
|
|
|
createUser(), createUser(), createUser(), createUser({ isRoot: true }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const role1 = await createRole({ name: 'admin', isAdministrator: true });
|
|
|
|
|
const role2 = await createRole({ name: 'moderator', isModerator: true });
|
|
|
|
|
const role3 = await createRole({ name: 'normal' });
|
|
|
|
|
|
|
|
|
|
await Promise.all([
|
|
|
|
|
assignRole({ userId: adminUser1.id, roleId: role1.id }),
|
|
|
|
|
assignRole({ userId: modeUser1.id, roleId: role2.id, expiresAt: new Date(Date.now() - 1000) }),
|
|
|
|
|
assignRole({ userId: rootUser.id, roleId: role2.id, expiresAt: new Date(Date.now() - 1000) }),
|
|
|
|
|
assignRole({ userId: normalUser1.id, roleId: role3.id }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const result = await roleService.getModeratorIds({
|
|
|
|
|
includeAdmins: false,
|
|
|
|
|
includeRoot: true,
|
|
|
|
|
excludeExpire: true,
|
|
|
|
|
});
|
|
|
|
|
expect(result).toEqual([rootUser.id]);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
describe('conditional role', () => {
|
|
|
|
|