From 9708f009798fd870598517b600d7394714982878 Mon Sep 17 00:00:00 2001 From: Martin Machacek Date: Fri, 3 Apr 2026 10:56:32 +0200 Subject: [PATCH] Migrates 'external connection list' to Zod. Closes #6904 --- .../connection/connection-list.spec.ts | 23 +++++++++++++++---- .../commands/connection/connection-list.ts | 8 +++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/m365/external/commands/connection/connection-list.spec.ts b/src/m365/external/commands/connection/connection-list.spec.ts index eba42f84aa2..5f5dedcfe51 100644 --- a/src/m365/external/commands/connection/connection-list.spec.ts +++ b/src/m365/external/commands/connection/connection-list.spec.ts @@ -10,12 +10,16 @@ import { pid } from '../../../../utils/pid.js'; import { session } from '../../../../utils/session.js'; import { sinonUtil } from '../../../../utils/sinonUtil.js'; import commands from '../../commands.js'; -import command from './connection-list.js'; +import command, { options } from './connection-list.js'; +import { CommandInfo } from '../../../../cli/CommandInfo.js'; +import { cli } from '../../../../cli/cli.js'; describe(commands.CONNECTION_LIST, () => { let log: string[]; let logger: Logger; let loggerLogSpy: sinon.SinonSpy; + let commandInfo: CommandInfo; + let commandOptionsSchema: typeof options; const externalConnections: { value: ExternalConnectors.ExternalConnection[] } = { value: [ @@ -39,6 +43,8 @@ describe(commands.CONNECTION_LIST, () => { sinon.stub(pid, 'getProcessName').returns(''); sinon.stub(session, 'getId').returns(''); auth.connection.active = true; + commandInfo = cli.getCommandInfo(command); + commandOptionsSchema = commandInfo.command.getSchemaToParse() as typeof options; }); beforeEach(() => { @@ -85,14 +91,23 @@ describe(commands.CONNECTION_LIST, () => { assert.deepStrictEqual(command.defaultProperties(), ['id', 'name', 'state']); }); + it('passes validation with no options', () => { + const actual = commandOptionsSchema.safeParse({}); + assert.strictEqual(actual.success, true); + }); + + it('fails validation with unknown options', () => { + const actual = commandOptionsSchema.safeParse({ option: "value" }); + assert.strictEqual(actual.success, false); + }); + it('correctly handles error', async () => { sinon.stub(request, 'get').callsFake(() => { throw 'An error has occurred'; }); await assert.rejects(command.action(logger, { - options: { - } + options: commandOptionsSchema.parse({}) }), new CommandError('An error has occurred')); }); @@ -105,7 +120,7 @@ describe(commands.CONNECTION_LIST, () => { throw 'Invalid request'; }); - await command.action(logger, { options: { debug: true } } as any); + await command.action(logger, { options: commandOptionsSchema.parse({ debug: true }) }); assert(loggerLogSpy.calledWith(externalConnections.value)); }); }); diff --git a/src/m365/external/commands/connection/connection-list.ts b/src/m365/external/commands/connection/connection-list.ts index aa64627b765..3534b7be139 100644 --- a/src/m365/external/commands/connection/connection-list.ts +++ b/src/m365/external/commands/connection/connection-list.ts @@ -2,6 +2,10 @@ import { Logger } from '../../../../cli/Logger.js'; import { odata } from '../../../../utils/odata.js'; import GraphCommand from '../../../base/GraphCommand.js'; import commands from '../../commands.js'; +import { z } from 'zod'; +import { globalOptionsZod } from '../../../../Command.js'; + +export const options = z.strictObject({ ...globalOptionsZod.shape }); class ExternalConnectionListCommand extends GraphCommand { public get name(): string { @@ -16,6 +20,10 @@ class ExternalConnectionListCommand extends GraphCommand { return [commands.EXTERNALCONNECTION_LIST]; } + public get schema(): z.ZodType | undefined { + return options; + } + public defaultProperties(): string[] | undefined { return ['id', 'name', 'state']; }