diff --git a/packages/edge/src/__tests__/commands/edge/drivers/delete.test.ts b/packages/edge/src/__tests__/commands/edge/drivers/delete.test.ts deleted file mode 100644 index c10a2c19..00000000 --- a/packages/edge/src/__tests__/commands/edge/drivers/delete.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { DriversEndpoint } from '@smartthings/core-sdk' - -import DriversDeleteCommand from '../../../../commands/edge/drivers/delete.js' -import { chooseDriver } from '../../../../lib/commands/drivers-util.js' - - -jest.mock('../../../../../src/lib/commands/drivers-util') - -describe('DriversDeleteCommand', () => { - const chooseDriverMock = jest.mocked(chooseDriver).mockResolvedValue('chosen-driver-id') - const apiDriversDeleteSpy = jest.spyOn(DriversEndpoint.prototype, 'delete').mockImplementation() - - it('deletes driver', async () => { - await expect(DriversDeleteCommand.run(['cmd-line-driver-id'])).resolves.not.toThrow() - - expect(chooseDriverMock).toHaveBeenCalledTimes(1) - expect(chooseDriverMock).toHaveBeenCalledWith(expect.any(DriversDeleteCommand), - 'Select a driver to delete.', 'cmd-line-driver-id') - - expect(apiDriversDeleteSpy).toHaveBeenCalledTimes(1) - expect(apiDriversDeleteSpy).toHaveBeenCalledWith('chosen-driver-id') - }) -}) diff --git a/packages/edge/src/commands/edge/drivers/delete.ts b/packages/edge/src/commands/edge/drivers/delete.ts deleted file mode 100644 index d1c43b2d..00000000 --- a/packages/edge/src/commands/edge/drivers/delete.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { EdgeCommand } from '../../../lib/edge-command.js' -import { chooseDriver } from '../../../lib/commands/drivers-util.js' - - -export default class DriversDeleteCommand extends EdgeCommand { - static description = 'delete an edge driver' + - this.apiDocsURL('deleteDriver') - - static flags = EdgeCommand.flags - - static args = [{ - name: 'id', - description: 'driver UUID', - }] - - async run(): Promise { - const id = await chooseDriver(this, 'Select a driver to delete.', this.args.id) - await this.client.drivers.delete(id) - this.log(`Driver ${id} deleted.`) - } -} diff --git a/src/__tests__/commands/edge/drivers/delete.test.ts b/src/__tests__/commands/edge/drivers/delete.test.ts new file mode 100644 index 00000000..9550676e --- /dev/null +++ b/src/__tests__/commands/edge/drivers/delete.test.ts @@ -0,0 +1,74 @@ +import { jest } from '@jest/globals' + +import type { ArgumentsCamelCase, Argv } from 'yargs' + +import type { DriversEndpoint } from '@smartthings/core-sdk' + +import type { CommandArgs } from '../../../../commands/edge/drivers/delete.js' +import type { APICommand, APICommandFlags } from '../../../../lib/command/api-command.js' +import type { chooseDriver } from '../../../../lib/command/util/drivers-choose.js' +import { apiCommandMocks } from '../../../test-lib/api-command-mock.js' +import { buildArgvMock } from '../../../test-lib/builder-mock.js' + + +const { apiCommandMock, apiCommandBuilderMock, apiDocsURLMock } = apiCommandMocks('../../../..') + +const chooseDriverMock = jest.fn().mockResolvedValue('chosen-driver-id') +jest.unstable_mockModule('../../../../lib/command/util/drivers-choose.js', () => ({ + chooseDriver: chooseDriverMock, +})) + +const consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(() => { /* do nothing */ }) + + +const { default: cmd } = await import('../../../../commands/edge/drivers/delete.js') + + +test('builder', () => { + const { + yargsMock, + positionalMock, + optionMock, + exampleMock, + epilogMock, + argvMock, + } = buildArgvMock() + + apiCommandBuilderMock.mockReturnValue(argvMock) + + const builder = cmd.builder as (yargs: Argv) => Argv + expect(builder(yargsMock)).toBe(argvMock) + + expect(apiCommandBuilderMock).toHaveBeenCalledExactlyOnceWith(yargsMock) + + expect(positionalMock).toHaveBeenCalledTimes(1) + expect(optionMock).toHaveBeenCalledTimes(0) + expect(exampleMock).toHaveBeenCalledTimes(1) + expect(apiDocsURLMock).toHaveBeenCalledTimes(1) + expect(epilogMock).toHaveBeenCalledTimes(1) +}) + +test('handler', async () => { + const apiDriversDeleteMock = jest.fn() + const command = { + client: { + drivers: { + delete: apiDriversDeleteMock, + }, + }, + } as unknown as APICommand + apiCommandMock.mockResolvedValue(command) + + const inputArgv = { + profile: 'default', + id: 'cmd-line-id', + } as ArgumentsCamelCase + + await expect(cmd.handler(inputArgv)).resolves.not.toThrow() + + expect(apiCommandMock).toHaveBeenCalledExactlyOnceWith(inputArgv) + expect(chooseDriverMock) + .toHaveBeenCalledExactlyOnceWith(command, 'cmd-line-id', { promptMessage: 'Select a driver to delete.' }) + expect(apiDriversDeleteMock).toHaveBeenCalledExactlyOnceWith('chosen-driver-id') + expect(consoleLogSpy).toHaveBeenCalledExactlyOnceWith('Driver chosen-driver-id deleted.') +}) diff --git a/src/__tests__/commands/edge/drivers/install.test.ts b/src/__tests__/commands/edge/drivers/install.test.ts index d5f5c44e..13972acb 100644 --- a/src/__tests__/commands/edge/drivers/install.test.ts +++ b/src/__tests__/commands/edge/drivers/install.test.ts @@ -2,17 +2,17 @@ import { jest } from '@jest/globals' import type { ArgumentsCamelCase, Argv } from 'yargs' -import { EnrolledChannel, HubdevicesEndpoint } from '@smartthings/core-sdk' +import type { EnrolledChannel, HubdevicesEndpoint } from '@smartthings/core-sdk' -import { CommandArgs } from '../../../../commands/edge/drivers/install.js' +import type { CommandArgs } from '../../../../commands/edge/drivers/install.js' import type { APICommand, APICommandFlags } from '../../../../lib/command/api-command.js' import type { selectFromList } from '../../../../lib/command/select.js' import type { chooseDriverFromChannelFn } from '../../../../lib/command/util/drivers-choose.js' +import type { DriverChannelDetailsWithName } from '../../../../lib/command/util/edge-drivers.js' import type { chooseHub } from '../../../../lib/command/util/hubs-choose.js' +import type { ChooseFunction } from '../../../../lib/command/util/util-util.js' import { apiCommandMocks } from '../../../test-lib/api-command-mock.js' import { buildArgvMock } from '../../../test-lib/builder-mock.js' -import { ChooseFunction } from '../../../../lib/command/util/util-util.js' -import { DriverChannelDetailsWithName } from '../../../../lib/command/util/edge-drivers.js' const { apiCommandMock, apiCommandBuilderMock, apiDocsURLMock } = apiCommandMocks('../../../..') diff --git a/src/commands/edge/drivers/delete.ts b/src/commands/edge/drivers/delete.ts new file mode 100644 index 00000000..28e50712 --- /dev/null +++ b/src/commands/edge/drivers/delete.ts @@ -0,0 +1,38 @@ +import { type ArgumentsCamelCase, type Argv, type CommandModule } from 'yargs' + +import { apiCommand, apiCommandBuilder, type APICommandFlags, apiDocsURL } from '../../../lib/command/api-command.js' +import { chooseDriver } from '../../../lib/command/util/drivers-choose.js' + + +export type CommandArgs = + & APICommandFlags + & { + id?: string + } + +const command = 'edge:drivers:delete [id]' + +const describe = 'delete an edge driver' + +const builder = (yargs: Argv): Argv => + apiCommandBuilder(yargs) + .positional('driver-id', { describe: 'id of driver to delete', type: 'string' }) + .example([ + ['$0 edge:drivers:delete', 'prompt for a driver and delete it'], + [ + '$0 edge:drivers:delete e61b9758-dfd5-4256-8a68-e411e38572b6', + 'delete the specified driver', + ], + ]) + .epilog(apiDocsURL('deleteDriver')) + +const handler = async (argv: ArgumentsCamelCase): Promise => { + const command = await apiCommand(argv) + + const id = await chooseDriver(command, argv.id, { promptMessage: 'Select a driver to delete.' }) + await command.client.drivers.delete(id) + console.log(`Driver ${id} deleted.`) +} + +const cmd: CommandModule = { command, describe, builder, handler } +export default cmd diff --git a/src/commands/index.ts b/src/commands/index.ts index 584e8ffa..bcbe24ee 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -68,6 +68,7 @@ import edgeChannelsInvitesDeleteCommand from './edge/channels/invites/delete.js' import edgeChannelsUnassignCommand from './edge/channels/unassign.js' import edgeDriversCommand from './edge/drivers.js' import edgeDriversDefaultCommand from './edge/drivers/default.js' +import edgeDriversDeleteCommand from './edge/drivers/delete.js' import edgeDriversDevicesCommand from './edge/drivers/devices.js' import edgeDriversInstallCommand from './edge/drivers/install.js' import edgeDriversInstalledCommand from './edge/drivers/installed.js' @@ -193,6 +194,7 @@ export const commands: CommandModule[] = [ edgeChannelsUnassignCommand, edgeDriversCommand, edgeDriversDefaultCommand, + edgeDriversDeleteCommand, edgeDriversDevicesCommand, edgeDriversInstallCommand, edgeDriversInstalledCommand,