File size: 3,038 Bytes
84aa3bf | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | /**
* @license
* Copyright 2026 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import { describe, it, expect, vi, beforeEach } from 'vitest';
import type { CommandContext } from './types.js';
import {
DisableExtensionCommand,
UninstallExtensionCommand,
} from './extensions.js';
import { ExtensionManager } from '../../config/extension-manager.js';
const mockGetErrorMessage = vi.hoisted(() => vi.fn());
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
const actual =
await importOriginal<typeof import('@google/gemini-cli-core')>();
return {
...actual,
getErrorMessage: mockGetErrorMessage,
};
});
vi.mock('../../config/extension-manager.js', () => {
class MockExtensionManager {
disableExtension = vi.fn(async () => undefined);
uninstallExtension = vi.fn(async () => undefined);
getExtensions = vi.fn(() => []);
}
return {
ExtensionManager: MockExtensionManager,
inferInstallMetadata: vi.fn(),
};
});
type TestExtensionManager = InstanceType<typeof ExtensionManager> & {
disableExtension: ReturnType<typeof vi.fn>;
uninstallExtension: ReturnType<typeof vi.fn>;
getExtensions: ReturnType<typeof vi.fn>;
};
function createExtensionManager(): TestExtensionManager {
return new ExtensionManager({} as never) as TestExtensionManager;
}
function createContext(extensionLoader: unknown): CommandContext {
return {
agentContext: {
config: {
getExtensionLoader: vi.fn().mockReturnValue(extensionLoader),
},
} as unknown as CommandContext['agentContext'],
settings: {} as CommandContext['settings'],
sendMessage: vi.fn().mockResolvedValue(undefined),
};
}
describe('ACP extensions error paths', () => {
beforeEach(() => {
vi.clearAllMocks();
mockGetErrorMessage.mockImplementation((error: unknown) =>
error instanceof Error ? error.message : String(error),
);
});
it('returns error when disabling fails', async () => {
const command = new DisableExtensionCommand();
const extensionManager = createExtensionManager();
extensionManager.disableExtension.mockRejectedValue(
new Error('Extension not found.'),
);
const context = createContext(extensionManager);
const result = await command.execute(context, ['missing-ext']);
expect(result).toEqual({
name: 'extensions disable',
data: 'Failed to disable "missing-ext": Extension not found.',
});
});
it('returns error when uninstalling a non-existent extension', async () => {
const command = new UninstallExtensionCommand();
const extensionManager = createExtensionManager();
extensionManager.uninstallExtension.mockRejectedValue(
new Error('Extension not found.'),
);
const context = createContext(extensionManager);
const result = await command.execute(context, ['non-existent-ext']);
expect(result).toEqual({
name: 'extensions uninstall',
data: 'Failed to uninstall extension "non-existent-ext": Extension not found.',
});
});
});
|