1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-05 17:53:12 +02:00

test: add remaining steps and tests

This commit is contained in:
Nuno Góis 2023-11-23 13:44:20 +00:00
parent 3354bb167d
commit 931c102e42
No known key found for this signature in database
GPG Key ID: 71ECC689F1091765
4 changed files with 1018 additions and 1 deletions

View File

@ -85,6 +85,131 @@ SELECT * FROM (VALUES
WHERE NOT EXISTS (
SELECT 1 FROM permissions WHERE permission = new_permissions.permission
);
-- STEP 9: Update the assign_unleash_permission_to_role function
CREATE OR REPLACE FUNCTION assign_unleash_permission_to_role(permission_name text, role_name text) returns void as
$$
declare
var_role_id int;
var_permission text;
BEGIN
var_role_id := (SELECT r.id FROM roles r WHERE r.name = role_name);
var_permission := (SELECT p.permission FROM permissions p WHERE p.permission = permission_name);
IF NOT EXISTS (
SELECT 1
FROM role_permission AS rp
WHERE rp.role_id = var_role_id AND rp.permission = var_permission
) THEN
INSERT INTO role_permission(role_id, permission) VALUES (var_role_id, var_permission);
END IF;
END
$$ language plpgsql;
-- STEP 10: Create a new assign_unleash_permission_to_role_for_all_environments function
CREATE OR REPLACE FUNCTION assign_unleash_permission_to_role_for_all_environments(permission_name text, role_name text) returns void as
$$
declare
var_role_id int;
var_permission text;
BEGIN
var_role_id := (SELECT id FROM roles r WHERE r.name = role_name);
var_permission := (SELECT p.permission FROM permissions p WHERE p.permission = permission_name);
INSERT INTO role_permission (role_id, permission, environment)
SELECT var_role_id, var_permission, e.name
FROM environments e
WHERE NOT EXISTS (
SELECT 1
FROM role_permission rp
WHERE rp.role_id = var_role_id
AND rp.permission = var_permission
AND rp.environment = e.name
);
END;
$$ LANGUAGE plpgsql;
-- STEP 11: Ensure the default roles exist
INSERT INTO roles (name, description, type)
SELECT * FROM (VALUES
('Admin', 'Users with the root admin role have superuser access to Unleash and can perform any operation within the Unleash platform.', 'root'),
('Editor', 'Users with the root editor role have access to most features in Unleash, but can not manage users and roles in the root scope. Editors will be added as project owners when creating projects and get superuser rights within the context of these projects. Users with the editor role will also get access to most permissions on the default project by default.', 'root'),
('Viewer', 'Users with the root viewer role can only read root resources in Unleash. Viewers can be added to specific projects as project members. Users with the viewer role may not view API tokens.', 'root'),
('Owner', 'Users with the project owner role have full control over the project, and can add and manage other users within the project context, manage feature toggles within the project, and control advanced project features like archiving and deleting the project.', 'project'),
('Member', 'Users with the project member role are allowed to view, create, and update feature toggles within a project, but have limited permissions in regards to managing the project''s user access and can not archive or delete the project.', 'project')
) AS new_roles(name, description)
WHERE NOT EXISTS (
SELECT 1 FROM roles WHERE name = new_roles.name
);
-- STEP 12: Ensure the default roles have the correct permissions
SELECT assign_unleash_permission_to_role('ADMIN', 'Admin');
SELECT assign_unleash_permission_to_role('CREATE_FEATURE', 'Editor');
SELECT assign_unleash_permission_to_role('CREATE_STRATEGY', 'Editor');
SELECT assign_unleash_permission_to_role('CREATE_ADDON', 'Editor');
SELECT assign_unleash_permission_to_role('DELETE_ADDON', 'Editor');
SELECT assign_unleash_permission_to_role('UPDATE_ADDON', 'Editor');
SELECT assign_unleash_permission_to_role('UPDATE_FEATURE', 'Editor');
SELECT assign_unleash_permission_to_role('DELETE_FEATURE', 'Editor');
SELECT assign_unleash_permission_to_role('UPDATE_APPLICATION', 'Editor');
SELECT assign_unleash_permission_to_role('UPDATE_TAG_TYPE', 'Editor');
SELECT assign_unleash_permission_to_role('DELETE_TAG_TYPE', 'Editor');
SELECT assign_unleash_permission_to_role('CREATE_PROJECT', 'Editor');
SELECT assign_unleash_permission_to_role('UPDATE_PROJECT', 'Editor');
SELECT assign_unleash_permission_to_role('DELETE_PROJECT', 'Editor');
SELECT assign_unleash_permission_to_role('UPDATE_STRATEGY', 'Editor');
SELECT assign_unleash_permission_to_role('DELETE_STRATEGY', 'Editor');
SELECT assign_unleash_permission_to_role('UPDATE_CONTEXT_FIELD', 'Editor');
SELECT assign_unleash_permission_to_role('CREATE_CONTEXT_FIELD', 'Editor');
SELECT assign_unleash_permission_to_role('DELETE_CONTEXT_FIELD', 'Editor');
SELECT assign_unleash_permission_to_role('UPDATE_FEATURE_VARIANTS', 'Editor');
SELECT assign_unleash_permission_to_role_for_all_environments('CREATE_FEATURE_STRATEGY', 'Editor');
SELECT assign_unleash_permission_to_role_for_all_environments('UPDATE_FEATURE_STRATEGY', 'Editor');
SELECT assign_unleash_permission_to_role_for_all_environments('DELETE_FEATURE_STRATEGY', 'Editor');
SELECT assign_unleash_permission_to_role_for_all_environments('UPDATE_FEATURE_ENVIRONMENT', 'Editor');
SELECT assign_unleash_permission_to_role_for_all_environments('UPDATE_FEATURE_ENVIRONMENT_VARIANTS', 'Editor');
SELECT assign_unleash_permission_to_role('MOVE_FEATURE_TOGGLE', 'Editor');
SELECT assign_unleash_permission_to_role('CREATE_SEGMENT', 'Editor');
SELECT assign_unleash_permission_to_role('UPDATE_SEGMENT', 'Editor');
SELECT assign_unleash_permission_to_role('DELETE_SEGMENT', 'Editor');
SELECT assign_unleash_permission_to_role('READ_PROJECT_API_TOKEN', 'Editor');
SELECT assign_unleash_permission_to_role('CREATE_PROJECT_API_TOKEN', 'Editor');
SELECT assign_unleash_permission_to_role('DELETE_PROJECT_API_TOKEN', 'Editor');
SELECT assign_unleash_permission_to_role('READ_CLIENT_API_TOKEN', 'Editor');
SELECT assign_unleash_permission_to_role('READ_FRONTEND_API_TOKEN', 'Editor');
SELECT assign_unleash_permission_to_role('CREATE_TAG_TYPE', 'Editor');
SELECT assign_unleash_permission_to_role('CREATE_FEATURE', 'Owner');
SELECT assign_unleash_permission_to_role('UPDATE_FEATURE', 'Owner');
SELECT assign_unleash_permission_to_role('DELETE_FEATURE', 'Owner');
SELECT assign_unleash_permission_to_role('UPDATE_PROJECT', 'Owner');
SELECT assign_unleash_permission_to_role('DELETE_PROJECT', 'Owner');
SELECT assign_unleash_permission_to_role('UPDATE_FEATURE_VARIANTS', 'Owner');
SELECT assign_unleash_permission_to_role_for_all_environments('CREATE_FEATURE_STRATEGY', 'Owner');
SELECT assign_unleash_permission_to_role_for_all_environments('UPDATE_FEATURE_STRATEGY', 'Owner');
SELECT assign_unleash_permission_to_role_for_all_environments('DELETE_FEATURE_STRATEGY', 'Owner');
SELECT assign_unleash_permission_to_role_for_all_environments('UPDATE_FEATURE_ENVIRONMENT', 'Owner');
SELECT assign_unleash_permission_to_role_for_all_environments('UPDATE_FEATURE_ENVIRONMENT_VARIANTS', 'Owner');
SELECT assign_unleash_permission_to_role('MOVE_FEATURE_TOGGLE', 'Owner');
SELECT assign_unleash_permission_to_role('READ_PROJECT_API_TOKEN', 'Owner');
SELECT assign_unleash_permission_to_role('CREATE_PROJECT_API_TOKEN', 'Owner');
SELECT assign_unleash_permission_to_role('DELETE_PROJECT_API_TOKEN', 'Owner');
SELECT assign_unleash_permission_to_role('UPDATE_FEATURE_DEPENDENCY', 'Owner');
SELECT assign_unleash_permission_to_role('CREATE_FEATURE', 'Member');
SELECT assign_unleash_permission_to_role('UPDATE_FEATURE', 'Member');
SELECT assign_unleash_permission_to_role('DELETE_FEATURE', 'Member');
SELECT assign_unleash_permission_to_role('UPDATE_FEATURE_VARIANTS', 'Member');
SELECT assign_unleash_permission_to_role_for_all_environments('CREATE_FEATURE_STRATEGY', 'Member');
SELECT assign_unleash_permission_to_role_for_all_environments('UPDATE_FEATURE_STRATEGY', 'Member');
SELECT assign_unleash_permission_to_role_for_all_environments('DELETE_FEATURE_STRATEGY', 'Member');
SELECT assign_unleash_permission_to_role_for_all_environments('UPDATE_FEATURE_ENVIRONMENT', 'Member');
SELECT assign_unleash_permission_to_role_for_all_environments('UPDATE_FEATURE_ENVIRONMENT_VARIANTS', 'Member');
SELECT assign_unleash_permission_to_role('READ_PROJECT_API_TOKEN', 'Member');
SELECT assign_unleash_permission_to_role('CREATE_PROJECT_API_TOKEN', 'Member');
SELECT assign_unleash_permission_to_role('DELETE_PROJECT_API_TOKEN', 'Member');
SELECT assign_unleash_permission_to_role('UPDATE_FEATURE_DEPENDENCY', 'Member');
`,
cb
);

View File

@ -0,0 +1,736 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Drop permission id migration correctly assigns permissions by name 1`] = `
[
{
"display_name": "A test permission",
"permission": "TEST_PERMISSION_1",
"type": "root",
},
{
"display_name": "A test permission",
"permission": "TEST_PERMISSION_2",
"type": "root",
},
{
"display_name": "A test permission",
"permission": "TEST_PERMISSION_3",
"type": "root",
},
{
"display_name": "A test permission",
"permission": "TEST_PERMISSION_4",
"type": "root",
},
{
"display_name": "Admin",
"permission": "ADMIN",
"type": "root",
},
{
"display_name": "Create feature toggles",
"permission": "CREATE_FEATURE",
"type": "project",
},
{
"display_name": "Create activation strategies",
"permission": "CREATE_STRATEGY",
"type": "root",
},
{
"display_name": "Create addons",
"permission": "CREATE_ADDON",
"type": "root",
},
{
"display_name": "Delete addons",
"permission": "DELETE_ADDON",
"type": "root",
},
{
"display_name": "Update addons",
"permission": "UPDATE_ADDON",
"type": "root",
},
{
"display_name": "Update feature toggles",
"permission": "UPDATE_FEATURE",
"type": "project",
},
{
"display_name": "Delete feature toggles",
"permission": "DELETE_FEATURE",
"type": "project",
},
{
"display_name": "Update applications",
"permission": "UPDATE_APPLICATION",
"type": "root",
},
{
"display_name": "Update tag types",
"permission": "UPDATE_TAG_TYPE",
"type": "root",
},
{
"display_name": "Delete tag types",
"permission": "DELETE_TAG_TYPE",
"type": "root",
},
{
"display_name": "Create projects",
"permission": "CREATE_PROJECT",
"type": "root",
},
{
"display_name": "Update project",
"permission": "UPDATE_PROJECT",
"type": "project",
},
{
"display_name": "Delete project",
"permission": "DELETE_PROJECT",
"type": "project",
},
{
"display_name": "Update strategies",
"permission": "UPDATE_STRATEGY",
"type": "root",
},
{
"display_name": "Delete strategies",
"permission": "DELETE_STRATEGY",
"type": "root",
},
{
"display_name": "Update context fields",
"permission": "UPDATE_CONTEXT_FIELD",
"type": "root",
},
{
"display_name": "Create context fields",
"permission": "CREATE_CONTEXT_FIELD",
"type": "root",
},
{
"display_name": "Delete context fields",
"permission": "DELETE_CONTEXT_FIELD",
"type": "root",
},
{
"display_name": "Read roles",
"permission": "READ_ROLE",
"type": "root",
},
{
"display_name": "Create activation strategies",
"permission": "CREATE_FEATURE_STRATEGY",
"type": "environment",
},
{
"display_name": "Update activation strategies",
"permission": "UPDATE_FEATURE_STRATEGY",
"type": "environment",
},
{
"display_name": "Delete activation strategies",
"permission": "DELETE_FEATURE_STRATEGY",
"type": "environment",
},
{
"display_name": "Create CLIENT API tokens",
"permission": "CREATE_CLIENT_API_TOKEN",
"type": "root",
},
{
"display_name": "Create/edit variants",
"permission": "UPDATE_FEATURE_VARIANTS",
"type": "project",
},
{
"display_name": "Change feature toggle project",
"permission": "MOVE_FEATURE_TOGGLE",
"type": "project",
},
{
"display_name": "Create segments",
"permission": "CREATE_SEGMENT",
"type": "root",
},
{
"display_name": "Edit segments",
"permission": "UPDATE_SEGMENT",
"type": "root",
},
{
"display_name": "Delete segments",
"permission": "DELETE_SEGMENT",
"type": "root",
},
{
"display_name": "Read api tokens for a specific project",
"permission": "READ_PROJECT_API_TOKEN",
"type": "project",
},
{
"display_name": "Create api tokens for a specific project",
"permission": "CREATE_PROJECT_API_TOKEN",
"type": "project",
},
{
"display_name": "Delete api tokens for a specific project",
"permission": "DELETE_PROJECT_API_TOKEN",
"type": "project",
},
{
"display_name": "Update variants",
"permission": "UPDATE_FEATURE_ENVIRONMENT_VARIANTS",
"type": "environment",
},
{
"display_name": "Enable/disable toggles",
"permission": "UPDATE_FEATURE_ENVIRONMENT",
"type": "environment",
},
{
"display_name": "Apply change requests",
"permission": "APPLY_CHANGE_REQUEST",
"type": "environment",
},
{
"display_name": "Update CLIENT API tokens",
"permission": "UPDATE_CLIENT_API_TOKEN",
"type": "root",
},
{
"display_name": "Create/edit project segment",
"permission": "UPDATE_PROJECT_SEGMENT",
"type": "project",
},
{
"display_name": "Skip change request process",
"permission": "SKIP_CHANGE_REQUEST",
"type": "environment",
},
{
"display_name": "Delete CLIENT API tokens",
"permission": "DELETE_CLIENT_API_TOKEN",
"type": "root",
},
{
"display_name": "Read CLIENT API tokens",
"permission": "READ_CLIENT_API_TOKEN",
"type": "root",
},
{
"display_name": "Approve/Reject change requests",
"permission": "APPROVE_CHANGE_REQUEST",
"type": "environment",
},
{
"display_name": "Create FRONTEND API tokens",
"permission": "CREATE_FRONTEND_API_TOKEN",
"type": "root",
},
{
"display_name": "Update FRONTEND API tokens",
"permission": "UPDATE_FRONTEND_API_TOKEN",
"type": "root",
},
{
"display_name": "Delete FRONTEND API tokens",
"permission": "DELETE_FRONTEND_API_TOKEN",
"type": "root",
},
{
"display_name": "Read FRONTEND API tokens",
"permission": "READ_FRONTEND_API_TOKEN",
"type": "root",
},
{
"display_name": "Update feature dependency",
"permission": "UPDATE_FEATURE_DEPENDENCY",
"type": "project",
},
{
"display_name": "Create tag types",
"permission": "CREATE_TAG_TYPE",
"type": "root",
},
]
`;
exports[`Drop permission id migration correctly assigns permissions by name 2`] = `
[
{
"environment": null,
"permission": "ADMIN",
"role_id": 6,
},
{
"environment": null,
"permission": "CREATE_FEATURE",
"role_id": 7,
},
{
"environment": null,
"permission": "CREATE_STRATEGY",
"role_id": 7,
},
{
"environment": null,
"permission": "CREATE_ADDON",
"role_id": 7,
},
{
"environment": null,
"permission": "DELETE_ADDON",
"role_id": 7,
},
{
"environment": null,
"permission": "UPDATE_ADDON",
"role_id": 7,
},
{
"environment": null,
"permission": "UPDATE_FEATURE",
"role_id": 7,
},
{
"environment": null,
"permission": "DELETE_FEATURE",
"role_id": 7,
},
{
"environment": null,
"permission": "UPDATE_APPLICATION",
"role_id": 7,
},
{
"environment": null,
"permission": "UPDATE_TAG_TYPE",
"role_id": 7,
},
{
"environment": null,
"permission": "DELETE_TAG_TYPE",
"role_id": 7,
},
{
"environment": null,
"permission": "CREATE_PROJECT",
"role_id": 7,
},
{
"environment": null,
"permission": "UPDATE_PROJECT",
"role_id": 7,
},
{
"environment": null,
"permission": "DELETE_PROJECT",
"role_id": 7,
},
{
"environment": null,
"permission": "UPDATE_STRATEGY",
"role_id": 7,
},
{
"environment": null,
"permission": "DELETE_STRATEGY",
"role_id": 7,
},
{
"environment": null,
"permission": "UPDATE_CONTEXT_FIELD",
"role_id": 7,
},
{
"environment": null,
"permission": "CREATE_CONTEXT_FIELD",
"role_id": 7,
},
{
"environment": null,
"permission": "DELETE_CONTEXT_FIELD",
"role_id": 7,
},
{
"environment": null,
"permission": "UPDATE_FEATURE_VARIANTS",
"role_id": 7,
},
{
"environment": "default",
"permission": "CREATE_FEATURE_STRATEGY",
"role_id": 7,
},
{
"environment": "development",
"permission": "CREATE_FEATURE_STRATEGY",
"role_id": 7,
},
{
"environment": "production",
"permission": "CREATE_FEATURE_STRATEGY",
"role_id": 7,
},
{
"environment": "default",
"permission": "UPDATE_FEATURE_STRATEGY",
"role_id": 7,
},
{
"environment": "development",
"permission": "UPDATE_FEATURE_STRATEGY",
"role_id": 7,
},
{
"environment": "production",
"permission": "UPDATE_FEATURE_STRATEGY",
"role_id": 7,
},
{
"environment": "default",
"permission": "DELETE_FEATURE_STRATEGY",
"role_id": 7,
},
{
"environment": "development",
"permission": "DELETE_FEATURE_STRATEGY",
"role_id": 7,
},
{
"environment": "production",
"permission": "DELETE_FEATURE_STRATEGY",
"role_id": 7,
},
{
"environment": "default",
"permission": "UPDATE_FEATURE_ENVIRONMENT",
"role_id": 7,
},
{
"environment": "development",
"permission": "UPDATE_FEATURE_ENVIRONMENT",
"role_id": 7,
},
{
"environment": "production",
"permission": "UPDATE_FEATURE_ENVIRONMENT",
"role_id": 7,
},
{
"environment": "default",
"permission": "UPDATE_FEATURE_ENVIRONMENT_VARIANTS",
"role_id": 7,
},
{
"environment": "development",
"permission": "UPDATE_FEATURE_ENVIRONMENT_VARIANTS",
"role_id": 7,
},
{
"environment": "production",
"permission": "UPDATE_FEATURE_ENVIRONMENT_VARIANTS",
"role_id": 7,
},
{
"environment": null,
"permission": "MOVE_FEATURE_TOGGLE",
"role_id": 7,
},
{
"environment": null,
"permission": "CREATE_SEGMENT",
"role_id": 7,
},
{
"environment": null,
"permission": "UPDATE_SEGMENT",
"role_id": 7,
},
{
"environment": null,
"permission": "DELETE_SEGMENT",
"role_id": 7,
},
{
"environment": null,
"permission": "READ_PROJECT_API_TOKEN",
"role_id": 7,
},
{
"environment": null,
"permission": "CREATE_PROJECT_API_TOKEN",
"role_id": 7,
},
{
"environment": null,
"permission": "DELETE_PROJECT_API_TOKEN",
"role_id": 7,
},
{
"environment": null,
"permission": "READ_CLIENT_API_TOKEN",
"role_id": 7,
},
{
"environment": null,
"permission": "READ_FRONTEND_API_TOKEN",
"role_id": 7,
},
{
"environment": null,
"permission": "CREATE_TAG_TYPE",
"role_id": 7,
},
{
"environment": null,
"permission": "CREATE_FEATURE",
"role_id": 9,
},
{
"environment": null,
"permission": "UPDATE_FEATURE",
"role_id": 9,
},
{
"environment": null,
"permission": "DELETE_FEATURE",
"role_id": 9,
},
{
"environment": null,
"permission": "UPDATE_PROJECT",
"role_id": 9,
},
{
"environment": null,
"permission": "DELETE_PROJECT",
"role_id": 9,
},
{
"environment": null,
"permission": "UPDATE_FEATURE_VARIANTS",
"role_id": 9,
},
{
"environment": "default",
"permission": "CREATE_FEATURE_STRATEGY",
"role_id": 9,
},
{
"environment": "development",
"permission": "CREATE_FEATURE_STRATEGY",
"role_id": 9,
},
{
"environment": "production",
"permission": "CREATE_FEATURE_STRATEGY",
"role_id": 9,
},
{
"environment": "default",
"permission": "UPDATE_FEATURE_STRATEGY",
"role_id": 9,
},
{
"environment": "development",
"permission": "UPDATE_FEATURE_STRATEGY",
"role_id": 9,
},
{
"environment": "production",
"permission": "UPDATE_FEATURE_STRATEGY",
"role_id": 9,
},
{
"environment": "default",
"permission": "DELETE_FEATURE_STRATEGY",
"role_id": 9,
},
{
"environment": "development",
"permission": "DELETE_FEATURE_STRATEGY",
"role_id": 9,
},
{
"environment": "production",
"permission": "DELETE_FEATURE_STRATEGY",
"role_id": 9,
},
{
"environment": "default",
"permission": "UPDATE_FEATURE_ENVIRONMENT",
"role_id": 9,
},
{
"environment": "development",
"permission": "UPDATE_FEATURE_ENVIRONMENT",
"role_id": 9,
},
{
"environment": "production",
"permission": "UPDATE_FEATURE_ENVIRONMENT",
"role_id": 9,
},
{
"environment": "default",
"permission": "UPDATE_FEATURE_ENVIRONMENT_VARIANTS",
"role_id": 9,
},
{
"environment": "development",
"permission": "UPDATE_FEATURE_ENVIRONMENT_VARIANTS",
"role_id": 9,
},
{
"environment": "production",
"permission": "UPDATE_FEATURE_ENVIRONMENT_VARIANTS",
"role_id": 9,
},
{
"environment": null,
"permission": "MOVE_FEATURE_TOGGLE",
"role_id": 9,
},
{
"environment": null,
"permission": "READ_PROJECT_API_TOKEN",
"role_id": 9,
},
{
"environment": null,
"permission": "CREATE_PROJECT_API_TOKEN",
"role_id": 9,
},
{
"environment": null,
"permission": "DELETE_PROJECT_API_TOKEN",
"role_id": 9,
},
{
"environment": null,
"permission": "UPDATE_FEATURE_DEPENDENCY",
"role_id": 9,
},
{
"environment": null,
"permission": "CREATE_FEATURE",
"role_id": 10,
},
{
"environment": null,
"permission": "UPDATE_FEATURE",
"role_id": 10,
},
{
"environment": null,
"permission": "DELETE_FEATURE",
"role_id": 10,
},
{
"environment": null,
"permission": "UPDATE_FEATURE_VARIANTS",
"role_id": 10,
},
{
"environment": "default",
"permission": "CREATE_FEATURE_STRATEGY",
"role_id": 10,
},
{
"environment": "development",
"permission": "CREATE_FEATURE_STRATEGY",
"role_id": 10,
},
{
"environment": "production",
"permission": "CREATE_FEATURE_STRATEGY",
"role_id": 10,
},
{
"environment": "default",
"permission": "UPDATE_FEATURE_STRATEGY",
"role_id": 10,
},
{
"environment": "development",
"permission": "UPDATE_FEATURE_STRATEGY",
"role_id": 10,
},
{
"environment": "production",
"permission": "UPDATE_FEATURE_STRATEGY",
"role_id": 10,
},
{
"environment": "default",
"permission": "DELETE_FEATURE_STRATEGY",
"role_id": 10,
},
{
"environment": "development",
"permission": "DELETE_FEATURE_STRATEGY",
"role_id": 10,
},
{
"environment": "production",
"permission": "DELETE_FEATURE_STRATEGY",
"role_id": 10,
},
{
"environment": "default",
"permission": "UPDATE_FEATURE_ENVIRONMENT",
"role_id": 10,
},
{
"environment": "development",
"permission": "UPDATE_FEATURE_ENVIRONMENT",
"role_id": 10,
},
{
"environment": "production",
"permission": "UPDATE_FEATURE_ENVIRONMENT",
"role_id": 10,
},
{
"environment": "default",
"permission": "UPDATE_FEATURE_ENVIRONMENT_VARIANTS",
"role_id": 10,
},
{
"environment": "development",
"permission": "UPDATE_FEATURE_ENVIRONMENT_VARIANTS",
"role_id": 10,
},
{
"environment": "production",
"permission": "UPDATE_FEATURE_ENVIRONMENT_VARIANTS",
"role_id": 10,
},
{
"environment": null,
"permission": "READ_PROJECT_API_TOKEN",
"role_id": 10,
},
{
"environment": null,
"permission": "CREATE_PROJECT_API_TOKEN",
"role_id": 10,
},
{
"environment": null,
"permission": "DELETE_PROJECT_API_TOKEN",
"role_id": 10,
},
{
"environment": null,
"permission": "UPDATE_FEATURE_DEPENDENCY",
"role_id": 10,
},
]
`;

View File

@ -48,7 +48,7 @@ test('Dedupe permissions migration correctly dedupes permissions', async () => {
const client = new Client(config.db);
await client.connect();
await client.query(`
DELETE FROM "dedupe_permissions_test"."role_permission";
DELETE FROM "dedupe_permissions_test"."roles";
INSERT INTO "dedupe_permissions_test"."roles" (id, name, description, type) VALUES (101, 'Role 1', 'A test role', 'custom');
INSERT INTO "dedupe_permissions_test"."roles" (id, name, description, type) VALUES (102, 'Role 2', 'A test role', 'custom');

View File

@ -0,0 +1,156 @@
import { getDbConfig } from './helpers/database-config';
import { createTestConfig } from '../config/test-config';
import { getInstance } from 'db-migrate';
import { log } from 'db-migrate-shared';
import { Client } from 'pg';
import { IDBOption } from 'lib/types';
log.setLogLevel('error');
async function initSchema(db: IDBOption): Promise<void> {
const client = new Client(db);
await client.connect();
await client.query(`DROP SCHEMA IF EXISTS ${db.schema} CASCADE`);
await client.query(`CREATE SCHEMA IF NOT EXISTS ${db.schema}`);
await client.end();
}
test('Drop permission id migration correctly assigns permissions by name', async () => {
jest.setTimeout(15000);
const config = createTestConfig({
db: {
...getDbConfig(),
pool: { min: 1, max: 4 },
schema: 'drop_permission_id_test',
ssl: false,
},
});
await initSchema(config.db);
const e2e = {
...config.db,
connectionTimeoutMillis: 2000,
};
// disable Intellij/WebStorm from setting verbose CLI argument to db-migrator
process.argv = process.argv.filter((it) => !it.includes('--verbose'));
const dbm = getInstance(true, {
cwd: `${__dirname}/../../`, // relative to src/test/e2e
config: { e2e },
env: 'e2e',
});
// Run all migrations up to, and including, this one, the last one before the drop permission id migration
await dbm.up('20231122121456-dedupe-any-duplicate-permissions.js');
// Set up the test data
const client = new Client(config.db);
await client.connect();
await client.query(`
DELETE FROM "drop_permission_id_test"."roles";
INSERT INTO "drop_permission_id_test"."roles" (id, name, description, type) VALUES (101, 'Role 1', 'A test role', 'custom');
`);
await client.query(`
DELETE FROM "drop_permission_id_test"."permissions";
INSERT INTO "drop_permission_id_test"."permissions" (id, permission, display_name, type) VALUES (101, 'TEST_PERMISSION_1', 'A test permission', 'root');
INSERT INTO "drop_permission_id_test"."permissions" (id, permission, display_name, type) VALUES (102, 'TEST_PERMISSION_2', 'A test permission', 'root');
INSERT INTO "drop_permission_id_test"."permissions" (id, permission, display_name, type) VALUES (103, 'TEST_PERMISSION_3', 'A test permission', 'root');
INSERT INTO "drop_permission_id_test"."permissions" (id, permission, display_name, type) VALUES (104, 'TEST_PERMISSION_4', 'A test permission', 'root');
`);
await client.query(`
DELETE FROM "drop_permission_id_test"."role_permission";
INSERT INTO "drop_permission_id_test"."role_permission" (role_id, permission_id) VALUES (101, 101);
INSERT INTO "drop_permission_id_test"."role_permission" (role_id, permission_id) VALUES (101, 102);
INSERT INTO "drop_permission_id_test"."role_permission" (role_id, permission_id) VALUES (101, 103);
INSERT INTO "drop_permission_id_test"."role_permission" (role_id, permission_id) VALUES (101, 104);
`);
// Run the drop permissions id migration
await dbm.up('20231122122634-drop-permissions-id.js');
// Check the results
const { rows: resultsPermissions } = await client.query(`
SELECT * FROM "drop_permission_id_test"."permissions" ORDER BY created_at;
`);
const { rows: resultsRolePermission } = await client.query(`
SELECT * FROM "drop_permission_id_test"."role_permission" WHERE role_id = 101 ORDER BY created_at;
`);
expect('id' in resultsPermissions[0]).toEqual(false);
expect(
resultsPermissions.map(({ permission, display_name, type }) => ({
permission,
display_name,
type,
})),
).toMatchSnapshot();
expect('permission_id' in resultsRolePermission[0]).toEqual(false);
expect('permission' in resultsRolePermission[0]).toEqual(true);
expect(resultsRolePermission.length).toEqual(4);
expect(
resultsRolePermission.map(({ role_id, permission }) => ({
role_id,
permission,
})),
).toEqual([
{ role_id: 101, permission: 'TEST_PERMISSION_1' },
{ role_id: 101, permission: 'TEST_PERMISSION_2' },
{ role_id: 101, permission: 'TEST_PERMISSION_3' },
{ role_id: 101, permission: 'TEST_PERMISSION_4' },
]);
// Check the results that ensure the default roles exist and have the correct permissions
const { rows: resultsRoles } = await client.query(`
SELECT name, description, type FROM "drop_permission_id_test"."roles" WHERE id != 101 ORDER BY created_at;
`);
const { rows: resultsDefaultRolePermissions } = await client.query(`
SELECT role_id, environment, permission FROM "drop_permission_id_test"."role_permission" WHERE role_id != 101 ORDER BY created_at;
`);
expect(resultsRoles.length).toEqual(5);
expect(resultsRoles).toEqual([
{
name: 'Admin',
description:
'Users with the root admin role have superuser access to Unleash and can perform any operation within the Unleash platform.',
type: 'root',
},
{
name: 'Editor',
description:
'Users with the root editor role have access to most features in Unleash, but can not manage users and roles in the root scope. Editors will be added as project owners when creating projects and get superuser rights within the context of these projects. Users with the editor role will also get access to most permissions on the default project by default.',
type: 'root',
},
{
name: 'Viewer',
description:
'Users with the root viewer role can only read root resources in Unleash. Viewers can be added to specific projects as project members. Users with the viewer role may not view API tokens.',
type: 'root',
},
{
name: 'Owner',
description:
'Users with the project owner role have full control over the project, and can add and manage other users within the project context, manage feature toggles within the project, and control advanced project features like archiving and deleting the project.',
type: 'project',
},
{
name: 'Member',
description:
"Users with the project member role are allowed to view, create, and update feature toggles within a project, but have limited permissions in regards to managing the project's user access and can not archive or delete the project.",
type: 'project',
},
]);
expect(resultsDefaultRolePermissions).toMatchSnapshot();
await client.end();
await dbm.reset();
});