From 909af1cd6277a9372f04f49f2250f34ac41ee2c1 Mon Sep 17 00:00:00 2001 From: yubonluo Date: Thu, 11 Apr 2024 14:39:42 +0800 Subject: [PATCH] add utils unit tests Signed-off-by: yubonluo --- src/plugins/workspace/server/plugin.ts | 26 +++---- src/plugins/workspace/server/utils.test.ts | 90 +++++++++++++++++++++- src/plugins/workspace/server/utils.ts | 33 +++++++- 3 files changed, 131 insertions(+), 18 deletions(-) diff --git a/src/plugins/workspace/server/plugin.ts b/src/plugins/workspace/server/plugin.ts index 6a0b9d07198a..a614a59611f4 100644 --- a/src/plugins/workspace/server/plugin.ts +++ b/src/plugins/workspace/server/plugin.ts @@ -37,7 +37,11 @@ import { SavedObjectsPermissionControl, SavedObjectsPermissionControlContract, } from './permission_control/client'; -import { stringToArray, updateDashboardAdminStateForRequest } from './utils'; +import { + getApplicationOSDAdminConfig, + getOSDAdminConfig, + updateDashboardAdminStateForRequest, +} from './utils'; import { WorkspaceIdConsumerWrapper } from './saved_objects/workspace_id_consumer_wrapper'; export class WorkspacePlugin implements Plugin { @@ -89,22 +93,12 @@ export class WorkspacePlugin implements Plugin undefined), - applicationConfigClient - .getEntityConfig('opensearchDashboards.dashboardAdmin.users') - .catch(() => undefined), - ]); - - [configGroups, configUsers] = [stringToArray(groupsResult), stringToArray(usersResult)]; + [configGroups, configUsers] = await getApplicationOSDAdminConfig( + { applicationConfig }, + scopeClient + ); } else { - const globalConfig: SharedGlobalConfig = await this.globalConfig$.pipe(first()).toPromise(); - configGroups = (globalConfig.opensearchDashboards.dashboardAdmin.groups || []) as string[]; - configUsers = (globalConfig.opensearchDashboards.dashboardAdmin.users || []) as string[]; + [configGroups, configUsers] = await getOSDAdminConfig(this.globalConfig$); } updateDashboardAdminStateForRequest(request, groups, users, configGroups, configUsers); return toolkit.next(); diff --git a/src/plugins/workspace/server/utils.test.ts b/src/plugins/workspace/server/utils.test.ts index 844e4ca90db2..5f8251224abb 100644 --- a/src/plugins/workspace/server/utils.test.ts +++ b/src/plugins/workspace/server/utils.test.ts @@ -4,14 +4,19 @@ */ import { AuthStatus } from '../../../core/server'; -import { httpServerMock, httpServiceMock } from '../../../core/server/mocks'; +import { coreMock, httpServerMock, httpServiceMock } from '../../../core/server/mocks'; import { generateRandomId, + getApplicationOSDAdminConfig, + getOSDAdminConfig, getPrincipalsFromRequest, stringToArray, updateDashboardAdminStateForRequest, } from './utils'; import { getWorkspaceState } from '../../../core/server/utils'; +import { AppPluginSetupDependencies } from './types'; +import { Observable, of } from 'rxjs'; +import { error } from 'console'; describe('workspace utils', () => { const mockAuth = httpServiceMock.createAuth(); @@ -110,6 +115,16 @@ describe('workspace utils', () => { expect(getWorkspaceState(mockRequest)?.isDashboardAdmin).toBe(false); }); + it('should be not dashboard admin when groups and users are []', () => { + const mockRequest = httpServerMock.createOpenSearchDashboardsRequest(); + const groups: string[] = []; + const users: string[] = []; + const configGroups: string[] = []; + const configUsers: string[] = []; + updateDashboardAdminStateForRequest(mockRequest, groups, users, configGroups, configUsers); + expect(getWorkspaceState(mockRequest)?.isDashboardAdmin).toBe(false); + }); + it('should convert string to array', () => { const jsonString = '["test1","test2"]'; const strToArray = stringToArray(jsonString); @@ -121,4 +136,77 @@ describe('workspace utils', () => { const strToArray = stringToArray(jsonString); expect(strToArray).toStrictEqual([]); }); + + it('should get correct OSD admin config when application config is enabled', async () => { + const applicationConfigMock = { + getConfigurationClient: jest.fn().mockReturnValue({ + getEntityConfig: jest.fn().mockImplementation(async (entity: string) => { + if (entity === 'opensearchDashboards.dashboardAdmin.groups') { + return '["group1", "group2"]'; + } else if (entity === 'opensearchDashboards.dashboardAdmin.users') { + return '["user1", "user2"]'; + } else { + return undefined; + } + }), + }), + registerConfigurationClient: jest.fn().mockResolvedValue({}), + }; + + const mockDependencies: AppPluginSetupDependencies = { + applicationConfig: applicationConfigMock, + }; + const coreStart = coreMock.createInternalStart(); + const scopedClusterClientMock = coreStart.opensearch.client.asScoped(); + const [groups, users] = await getApplicationOSDAdminConfig( + mockDependencies, + scopedClusterClientMock + ); + expect(groups).toEqual(['group1', 'group2']); + expect(users).toEqual(['user1', 'user2']); + }); + + it('should get [] when application config is enabled and not defined ', async () => { + const applicationConfigMock = { + getConfigurationClient: jest.fn().mockReturnValue({ + getEntityConfig: jest.fn().mockImplementation(async (entity: string) => { + throw error; + }), + }), + registerConfigurationClient: jest.fn().mockResolvedValue({}), + }; + + const mockDependencies: AppPluginSetupDependencies = { + applicationConfig: applicationConfigMock, + }; + const coreStart = coreMock.createInternalStart(); + const scopedClusterClientMock = coreStart.opensearch.client.asScoped(); + const [groups, users] = await getApplicationOSDAdminConfig( + mockDependencies, + scopedClusterClientMock + ); + expect(groups).toEqual([]); + expect(users).toEqual([]); + }); + + it('should get correct admin config when admin config is enabled ', async () => { + const globalConfig$: Observable = of({ + opensearchDashboards: { + dashboardAdmin: { + groups: ['group1', 'group2'], + users: ['user1', 'user2'], + }, + }, + }); + const [groups, users] = await getOSDAdminConfig(globalConfig$); + expect(groups).toEqual(['group1', 'group2']); + expect(users).toEqual(['user1', 'user2']); + }); + + it('should get [] when admin config is not enabled', async () => { + const globalConfig$: Observable = of({}); + const [groups, users] = await getOSDAdminConfig(globalConfig$); + expect(groups).toEqual([]); + expect(users).toEqual([]); + }); }); diff --git a/src/plugins/workspace/server/utils.ts b/src/plugins/workspace/server/utils.ts index 633fa9f5e254..a262f1914126 100644 --- a/src/plugins/workspace/server/utils.ts +++ b/src/plugins/workspace/server/utils.ts @@ -4,14 +4,18 @@ */ import crypto from 'crypto'; +import { Observable } from 'rxjs'; +import { first } from 'rxjs/operators'; import { AuthStatus, HttpAuth, + IScopedClusterClient, OpenSearchDashboardsRequest, Principals, PrincipalType, + SharedGlobalConfig, } from '../../../core/server'; -import { AuthInfo } from './types'; +import { AppPluginSetupDependencies, AuthInfo } from './types'; import { updateWorkspaceState } from '../../../core/server/utils'; /** @@ -84,3 +88,30 @@ export const stringToArray = (adminConfig: string | undefined) => { } return adminConfigArray; }; + +export const getApplicationOSDAdminConfig = async ( + { applicationConfig }: AppPluginSetupDependencies, + scopeClient: IScopedClusterClient +) => { + const applicationConfigClient = applicationConfig.getConfigurationClient(scopeClient); + + const [groupsResult, usersResult] = await Promise.all([ + applicationConfigClient + .getEntityConfig('opensearchDashboards.dashboardAdmin.groups') + .catch(() => undefined), + applicationConfigClient + .getEntityConfig('opensearchDashboards.dashboardAdmin.users') + .catch(() => undefined), + ]); + + return [stringToArray(groupsResult), stringToArray(usersResult)]; +}; + +export const getOSDAdminConfig = async (globalConfig$: Observable) => { + const globalConfig = await globalConfig$.pipe(first()).toPromise(); + const groupsResult = (globalConfig.opensearchDashboards?.dashboardAdmin?.groups || + []) as string[]; + const usersResult = (globalConfig.opensearchDashboards?.dashboardAdmin?.users || []) as string[]; + + return [groupsResult, usersResult]; +};