Merge pull request #2146 from automatisch/aut-1332-new-2

test(role): write remaining model tests
This commit is contained in:
Ömer Faruk Aydın
2024-10-29 17:45:45 +01:00
committed by GitHub
2 changed files with 104 additions and 11 deletions

View File

@@ -109,17 +109,7 @@ class Role extends Base {
return await this.$query().delete(); return await this.$query().delete();
} }
async $beforeUpdate(opt, queryContext) { async assertNoRoleUserExists() {
await super.$beforeUpdate(opt, queryContext);
await this.preventAlteringAdmin();
}
async $beforeDelete(queryContext) {
await super.$beforeDelete(queryContext);
await this.preventAlteringAdmin();
const userCount = await this.$relatedQuery('users').limit(1).resultSize(); const userCount = await this.$relatedQuery('users').limit(1).resultSize();
const hasUsers = userCount > 0; const hasUsers = userCount > 0;
@@ -135,7 +125,9 @@ class Role extends Base {
type: 'ValidationError', type: 'ValidationError',
}); });
} }
}
async assertNoConfigurationUsage() {
const samlAuthProviderUsingDefaultRole = await SamlAuthProvider.query() const samlAuthProviderUsingDefaultRole = await SamlAuthProvider.query()
.where({ .where({
default_role_id: this.id, default_role_id: this.id,
@@ -157,6 +149,26 @@ class Role extends Base {
}); });
} }
} }
async assertRoleIsNotUsed() {
await this.assertNoRoleUserExists();
await this.assertNoConfigurationUsage();
}
async $beforeUpdate(opt, queryContext) {
await super.$beforeUpdate(opt, queryContext);
await this.preventAlteringAdmin();
}
async $beforeDelete(queryContext) {
await super.$beforeDelete(queryContext);
await this.preventAlteringAdmin();
await this.assertRoleIsNotUsed();
}
} }
export default Role; export default Role;

View File

@@ -5,6 +5,8 @@ import Permission from './permission.js';
import User from './user.js'; import User from './user.js';
import { createRole } from '../../test/factories/role.js'; import { createRole } from '../../test/factories/role.js';
import { createPermission } from '../../test/factories/permission.js'; import { createPermission } from '../../test/factories/permission.js';
import { createUser } from '../../test/factories/user.js';
import { createSamlAuthProvider } from '../../test/factories/saml-auth-provider.ee.js';
describe('Role model', () => { describe('Role model', () => {
it('tableName should return correct name', () => { it('tableName should return correct name', () => {
@@ -203,4 +205,83 @@ describe('Role model', () => {
expect(rolePermissions).toStrictEqual([]); expect(rolePermissions).toStrictEqual([]);
}); });
}); });
describe('assertNoRoleUserExists', () => {
it('should reject with an error when the role has users', async () => {
const role = await createRole({ name: 'User' });
await createUser({ roleId: role.id });
await expect(() => role.assertNoRoleUserExists()).rejects.toThrowError(
`All users must be migrated away from the "User" role.`
);
});
it('should resolve when the role does not have any users', async () => {
const role = await createRole();
expect(await role.assertNoRoleUserExists()).toBe(undefined);
});
});
describe('assertNoConfigurationUsage', () => {
it('should reject with an error when the role is used in configuration', async () => {
const role = await createRole();
await createSamlAuthProvider({ defaultRoleId: role.id });
await expect(() =>
role.assertNoConfigurationUsage()
).rejects.toThrowError(
'samlAuthProvider: You need to change the default role in the SAML configuration before deleting this role.'
);
});
it('should resolve when the role does not have any users', async () => {
const role = await createRole();
expect(await role.assertNoConfigurationUsage()).toBe(undefined);
});
});
it('assertRoleIsNotUsed should call assertNoRoleUserExists and assertNoConfigurationUsage', async () => {
const role = new Role();
const assertNoRoleUserExistsSpy = vi
.spyOn(role, 'assertNoRoleUserExists')
.mockResolvedValue();
const assertNoConfigurationUsageSpy = vi
.spyOn(role, 'assertNoConfigurationUsage')
.mockResolvedValue();
await role.assertRoleIsNotUsed();
expect(assertNoRoleUserExistsSpy).toHaveBeenCalledOnce();
expect(assertNoConfigurationUsageSpy).toHaveBeenCalledOnce();
});
describe('$beforeDelete', () => {
it('should call preventAlteringAdmin', async () => {
const role = await createRole({ name: 'User' });
const preventAlteringAdminSpy = vi
.spyOn(role, 'preventAlteringAdmin')
.mockResolvedValue();
await role.$query().delete();
expect(preventAlteringAdminSpy).toHaveBeenCalledOnce();
});
it('should call assertRoleIsNotUsed', async () => {
const role = await createRole({ name: 'User' });
const assertRoleIsNotUsedSpy = vi
.spyOn(role, 'assertRoleIsNotUsed')
.mockResolvedValue();
await role.$query().delete();
expect(assertRoleIsNotUsedSpy).toHaveBeenCalledOnce();
});
});
}); });