From 91121c4a61bb338140b78ea1129f10c8bc20b4ce Mon Sep 17 00:00:00 2001 From: Rahul Pidde <206018639+cx-rahul-pidde@users.noreply.github.com> Date: Wed, 5 Nov 2025 18:03:02 +0530 Subject: [PATCH 1/3] Added new function to get license info is standalone is enabled --- src/main/wrapper/CxConstants.ts | 1 + src/main/wrapper/CxWrapper.ts | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/main/wrapper/CxConstants.ts b/src/main/wrapper/CxConstants.ts index 7c40bc12..289d5236 100644 --- a/src/main/wrapper/CxConstants.ts +++ b/src/main/wrapper/CxConstants.ts @@ -116,6 +116,7 @@ export enum CxConstants { CMD_LEARN_MORE = "learn-more", IDE_SCANS_KEY = "scan.config.plugins.ideScans", AI_GUIDED_REMEDIATION_KEY = "scan.config.plugins.aiGuidedRemediation", + STANDALONE_KEY = "scan.config.plugins.standalone", AI_MCP_SERVER_KEY = "scan.config.plugins.aiMcpServer", TELEMETRY = "telemetry", SUB_CMD_TELEMETRY_AI = "ai", diff --git a/src/main/wrapper/CxWrapper.ts b/src/main/wrapper/CxWrapper.ts index 67ded66c..32580c9a 100644 --- a/src/main/wrapper/CxWrapper.ts +++ b/src/main/wrapper/CxWrapper.ts @@ -466,6 +466,16 @@ export class CxWrapper { return value?.toLowerCase() === "true"; } + async standaloneEnabled(): Promise { + const commands: string[] = [CxConstants.CMD_UTILS, CxConstants.SUB_CMD_TENANT]; + commands.push(...this.initializeCommands(false)); + + const exec = new ExecutionService(); + const output = await exec.executeMapTenantOutputCommands(this.config.pathToExecutable, commands); + + const value = getTrimmedMapValue(output, CxConstants.STANDALONE_KEY); + return value?.toLowerCase() === "true"; + } async aiMcpServerEnabled(): Promise { const commands: string[] = [CxConstants.CMD_UTILS, CxConstants.SUB_CMD_TENANT]; From d093b39d7d3571d34d0a1b7008a4e45c734ca8f2 Mon Sep 17 00:00:00 2001 From: Rahul Pidde <206018639+cx-rahul-pidde@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:56:02 +0530 Subject: [PATCH 2/3] added cxone assist logic --- src/main/wrapper/CxConstants.ts | 1 + src/main/wrapper/CxWrapper.ts | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/wrapper/CxConstants.ts b/src/main/wrapper/CxConstants.ts index 289d5236..623f1946 100644 --- a/src/main/wrapper/CxConstants.ts +++ b/src/main/wrapper/CxConstants.ts @@ -117,6 +117,7 @@ export enum CxConstants { IDE_SCANS_KEY = "scan.config.plugins.ideScans", AI_GUIDED_REMEDIATION_KEY = "scan.config.plugins.aiGuidedRemediation", STANDALONE_KEY = "scan.config.plugins.standalone", + ASSIST_KEY = "scan.config.plugins.cxoneassist", AI_MCP_SERVER_KEY = "scan.config.plugins.aiMcpServer", TELEMETRY = "telemetry", SUB_CMD_TELEMETRY_AI = "ai", diff --git a/src/main/wrapper/CxWrapper.ts b/src/main/wrapper/CxWrapper.ts index 32580c9a..b487fca1 100644 --- a/src/main/wrapper/CxWrapper.ts +++ b/src/main/wrapper/CxWrapper.ts @@ -477,6 +477,17 @@ export class CxWrapper { return value?.toLowerCase() === "true"; } + async cxOneAssistEnabled(): Promise { + const commands: string[] = [CxConstants.CMD_UTILS, CxConstants.SUB_CMD_TENANT]; + commands.push(...this.initializeCommands(false)); + + const exec = new ExecutionService(); + const output = await exec.executeMapTenantOutputCommands(this.config.pathToExecutable, commands); + + const value = getTrimmedMapValue(output, CxConstants.ASSIST_KEY); + return value?.toLowerCase() === "true"; + } + async aiMcpServerEnabled(): Promise { const commands: string[] = [CxConstants.CMD_UTILS, CxConstants.SUB_CMD_TENANT]; commands.push(...this.initializeCommands(false)); From 748031c73ce5dbf9a0b1754dd250b0ee077b33ee Mon Sep 17 00:00:00 2001 From: Rahul Pidde <206018639+cx-rahul-pidde@users.noreply.github.com> Date: Mon, 17 Nov 2025 18:27:34 +0530 Subject: [PATCH 3/3] added test cases --- src/tests/AssistEnabledTest.test.ts | 52 ++++++++++++++++++++++++ src/tests/StandaloneEnabledTest.test.ts | 53 +++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 src/tests/AssistEnabledTest.test.ts create mode 100644 src/tests/StandaloneEnabledTest.test.ts diff --git a/src/tests/AssistEnabledTest.test.ts b/src/tests/AssistEnabledTest.test.ts new file mode 100644 index 00000000..00eb5cc7 --- /dev/null +++ b/src/tests/AssistEnabledTest.test.ts @@ -0,0 +1,52 @@ +import { CxWrapper } from '../main/wrapper/CxWrapper'; +import { BaseTest } from './BaseTest'; +import { ExecutionService } from '../main/wrapper/ExecutionService'; +import { CxConstants } from '../main/wrapper/CxConstants'; + +describe('cxOneAssistEnabled tenant setting', () => { + const baseConfig = new BaseTest(); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + it('returns true when assist key value is true (lowercase)', async () => { + jest.spyOn(ExecutionService.prototype, 'executeMapTenantOutputCommands') + .mockResolvedValue(new Map([[CxConstants.ASSIST_KEY, 'true']])); + const wrapper = new CxWrapper(baseConfig); + const enabled = await wrapper.cxOneAssistEnabled(); + expect(enabled).toBe(true); + }); + + it('returns true when assist key value is TRUE (uppercase)', async () => { + jest.spyOn(ExecutionService.prototype, 'executeMapTenantOutputCommands') + .mockResolvedValue(new Map([[CxConstants.ASSIST_KEY, 'TRUE']])); + const wrapper = new CxWrapper(baseConfig); + const enabled = await wrapper.cxOneAssistEnabled(); + expect(enabled).toBe(true); + }); + + it('returns false when assist key value is false', async () => { + jest.spyOn(ExecutionService.prototype, 'executeMapTenantOutputCommands') + .mockResolvedValue(new Map([[CxConstants.ASSIST_KEY, 'false']])); + const wrapper = new CxWrapper(baseConfig); + const enabled = await wrapper.cxOneAssistEnabled(); + expect(enabled).toBe(false); + }); + + it('returns false when assist key is missing', async () => { + jest.spyOn(ExecutionService.prototype, 'executeMapTenantOutputCommands') + .mockResolvedValue(new Map([[CxConstants.IDE_SCANS_KEY, 'true']])); + const wrapper = new CxWrapper(baseConfig); + const enabled = await wrapper.cxOneAssistEnabled(); + expect(enabled).toBe(false); + }); + + it('trims whitespace around key/value before evaluating', async () => { + jest.spyOn(ExecutionService.prototype, 'executeMapTenantOutputCommands') + .mockResolvedValue(new Map([[` ${CxConstants.ASSIST_KEY} `, ' true ']])); + const wrapper = new CxWrapper(baseConfig); + const enabled = await wrapper.cxOneAssistEnabled(); + expect(enabled).toBe(true); + }); +}); diff --git a/src/tests/StandaloneEnabledTest.test.ts b/src/tests/StandaloneEnabledTest.test.ts new file mode 100644 index 00000000..0153d442 --- /dev/null +++ b/src/tests/StandaloneEnabledTest.test.ts @@ -0,0 +1,53 @@ +import { CxWrapper } from '../main/wrapper/CxWrapper'; +import { BaseTest } from './BaseTest'; +import { ExecutionService } from '../main/wrapper/ExecutionService'; +import { CxConstants } from '../main/wrapper/CxConstants'; + +describe('standaloneEnabled tenant setting', () => { + const baseConfig = new BaseTest(); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + it('returns true when standalone tenant flag is true (lowercase)', async () => { + jest.spyOn(ExecutionService.prototype, 'executeMapTenantOutputCommands') + .mockResolvedValue(new Map([[CxConstants.STANDALONE_KEY, 'true']])); + const wrapper = new CxWrapper(baseConfig); + const enabled = await wrapper.standaloneEnabled(); + expect(enabled).toBe(true); + }); + + it('returns true when standalone tenant flag is TRUE (uppercase)', async () => { + jest.spyOn(ExecutionService.prototype, 'executeMapTenantOutputCommands') + .mockResolvedValue(new Map([[CxConstants.STANDALONE_KEY, 'TRUE']])); + const wrapper = new CxWrapper(baseConfig); + const enabled = await wrapper.standaloneEnabled(); + expect(enabled).toBe(true); + }); + + it('returns false when standalone tenant flag is false', async () => { + jest.spyOn(ExecutionService.prototype, 'executeMapTenantOutputCommands') + .mockResolvedValue(new Map([[CxConstants.STANDALONE_KEY, 'false']])); + const wrapper = new CxWrapper(baseConfig); + const enabled = await wrapper.standaloneEnabled(); + expect(enabled).toBe(false); + }); + + it('returns false when standalone tenant flag key is missing', async () => { + jest.spyOn(ExecutionService.prototype, 'executeMapTenantOutputCommands') + .mockResolvedValue(new Map([[CxConstants.IDE_SCANS_KEY, 'true']])); + const wrapper = new CxWrapper(baseConfig); + const enabled = await wrapper.standaloneEnabled(); + expect(enabled).toBe(false); + }); + + it('trims whitespace around key and value before evaluating', async () => { + // Simulate raw output map entries with leading/trailing spaces + jest.spyOn(ExecutionService.prototype, 'executeMapTenantOutputCommands') + .mockResolvedValue(new Map([[` ${CxConstants.STANDALONE_KEY} `, ' true ']])); + const wrapper = new CxWrapper(baseConfig); + const enabled = await wrapper.standaloneEnabled(); + expect(enabled).toBe(true); + }); +});