2024-03-18 13:58:05 +01:00
|
|
|
import dbInit, { type ITestDb } from '../../test/e2e/helpers/database-init';
|
2023-09-19 16:15:27 +02:00
|
|
|
import getLogger from '../../test/fixtures/no-logger';
|
2024-03-18 13:58:05 +01:00
|
|
|
import type { PermissionRef } from '../services/access-service';
|
|
|
|
import type { AccessStore } from './access-store';
|
2024-01-17 14:33:03 +01:00
|
|
|
import { BadDataError } from '../error';
|
2023-09-19 16:15:27 +02:00
|
|
|
|
2024-01-12 10:25:59 +01:00
|
|
|
let db: ITestDb;
|
2023-09-19 16:15:27 +02:00
|
|
|
|
|
|
|
beforeAll(async () => {
|
|
|
|
db = await dbInit('access_store_serial', getLogger);
|
|
|
|
});
|
|
|
|
|
|
|
|
afterAll(async () => {
|
|
|
|
if (db) {
|
|
|
|
await db.destroy();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Helper function to make the test cases more readable
|
|
|
|
const args = (permissions: PermissionRef[], expectations?: PermissionRef[]) => {
|
|
|
|
if (expectations) {
|
|
|
|
return [permissions, expectations];
|
|
|
|
} else {
|
|
|
|
return [permissions];
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
test('resolvePermissions returns empty list if undefined', async () => {
|
|
|
|
const access = db.stores.accessStore as AccessStore;
|
|
|
|
const result = await access.resolvePermissions(
|
|
|
|
undefined as unknown as PermissionRef[],
|
|
|
|
);
|
|
|
|
expect(result).toStrictEqual([]);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('resolvePermissions returns empty list if empty list', async () => {
|
|
|
|
const access = db.stores.accessStore as AccessStore;
|
|
|
|
const result = await access.resolvePermissions([] as PermissionRef[]);
|
|
|
|
expect(result).toStrictEqual([]);
|
|
|
|
});
|
|
|
|
|
|
|
|
test.each([
|
2023-11-27 12:12:09 +01:00
|
|
|
args([{ name: 'CREATE_CONTEXT_FIELD' }]),
|
|
|
|
args([{ name: 'CREATE_FEATURE', environment: 'development' }]),
|
2023-09-19 16:15:27 +02:00
|
|
|
args([
|
2023-11-27 12:12:09 +01:00
|
|
|
{ name: 'CREATE_CONTEXT_FIELD' },
|
|
|
|
{ name: 'CREATE_FEATURE', environment: 'development' },
|
2023-09-19 16:15:27 +02:00
|
|
|
]),
|
|
|
|
])(
|
2023-11-27 12:12:09 +01:00
|
|
|
'resolvePermissions with permission names (%o) will return the list unmodified',
|
2023-09-19 16:15:27 +02:00
|
|
|
async (permissions) => {
|
|
|
|
const access = db.stores.accessStore as AccessStore;
|
|
|
|
const result = await access.resolvePermissions(permissions);
|
|
|
|
expect(result).toStrictEqual(permissions);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
test.each([
|
2023-11-27 12:12:09 +01:00
|
|
|
args([{ id: 1 }], [{ id: 1, name: 'ADMIN' }]),
|
2023-09-19 16:15:27 +02:00
|
|
|
args(
|
2023-11-27 12:12:09 +01:00
|
|
|
[{ id: 4, environment: 'development' }],
|
|
|
|
[{ id: 4, name: 'CREATE_ADDON', environment: 'development' }],
|
2023-09-19 16:15:27 +02:00
|
|
|
),
|
|
|
|
args(
|
|
|
|
[
|
2023-11-27 12:12:09 +01:00
|
|
|
{ id: 1, environment: 'development' },
|
|
|
|
{ id: 2, name: 'ignore this name' },
|
2023-09-19 16:15:27 +02:00
|
|
|
],
|
|
|
|
[
|
2023-11-27 12:12:09 +01:00
|
|
|
{ id: 1, name: 'ADMIN', environment: 'development' },
|
|
|
|
{ id: 2, name: 'ignore this name' },
|
2023-09-19 16:15:27 +02:00
|
|
|
],
|
|
|
|
),
|
|
|
|
])(
|
2023-11-27 12:12:09 +01:00
|
|
|
'resolvePermissions with only permission ids (%o) will resolve to named permissions without an id',
|
2023-09-19 16:15:27 +02:00
|
|
|
async (permissions, expected) => {
|
|
|
|
const access = db.stores.accessStore as AccessStore;
|
|
|
|
const result = await access.resolvePermissions(permissions);
|
|
|
|
expect(result).toStrictEqual(expected);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
test.each([
|
|
|
|
args(
|
|
|
|
[
|
|
|
|
{ name: 'CREATE_CONTEXT_FIELD' },
|
|
|
|
{ id: 3 },
|
|
|
|
{ name: 'CREATE_FEATURE', environment: 'development' },
|
|
|
|
{ id: 15, environment: 'development' },
|
|
|
|
{ name: 'UPDATE_FEATURE', environment: 'development' },
|
|
|
|
],
|
|
|
|
[
|
2023-11-27 12:12:09 +01:00
|
|
|
{ name: 'CREATE_CONTEXT_FIELD' },
|
|
|
|
{ id: 3, name: 'CREATE_STRATEGY' },
|
|
|
|
{ name: 'CREATE_FEATURE', environment: 'development' },
|
|
|
|
{ id: 15, name: 'UPDATE_STRATEGY', environment: 'development' },
|
|
|
|
{ name: 'UPDATE_FEATURE', environment: 'development' },
|
2023-09-19 16:15:27 +02:00
|
|
|
],
|
|
|
|
),
|
|
|
|
])(
|
2023-11-27 12:12:09 +01:00
|
|
|
'resolvePermissions mixed ids and names (%o) will inject the names where they are missing',
|
2023-09-19 16:15:27 +02:00
|
|
|
async (permissions, expected) => {
|
|
|
|
const access = db.stores.accessStore as AccessStore;
|
|
|
|
const result = await access.resolvePermissions(permissions);
|
|
|
|
expect(result).toStrictEqual(expected);
|
|
|
|
},
|
|
|
|
);
|
2023-12-12 14:46:23 +01:00
|
|
|
|
|
|
|
describe('addAccessToProject', () => {
|
|
|
|
test.each(['roles', 'groups', 'users'])(
|
|
|
|
'should throw a bad data error if there is invalid data in the %s property of the addAccessToProject payload',
|
|
|
|
async (property) => {
|
|
|
|
const access = db.stores.accessStore as AccessStore;
|
|
|
|
|
|
|
|
const payload = {
|
|
|
|
roles: [4, 5],
|
|
|
|
groups: [],
|
|
|
|
users: [],
|
|
|
|
[property]: [123456789],
|
|
|
|
};
|
|
|
|
|
|
|
|
await expect(() =>
|
|
|
|
access.addAccessToProject(
|
|
|
|
payload.roles,
|
|
|
|
payload.groups,
|
|
|
|
payload.users,
|
|
|
|
'projectId',
|
|
|
|
'createdBy',
|
|
|
|
),
|
|
|
|
).rejects.toThrow(BadDataError);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
});
|