import { describe, expect, it, vi } from 'vitest'; import { dispatchPluginWorkspaceCommand, type PluginWorkspaceDispatchDependencies, } from '@/pages/Plugins/plugin-workspace-controller'; import type { PluginWorkspaceCommand } from '@/pages/Plugins/plugin-workspace-model'; function dependencies() { return { marketplace: { acquire: vi.fn().mockResolvedValue(undefined), remove: vi.fn().mockResolvedValue(undefined), install: vi.fn().mockResolvedValue(undefined), installBeta: vi.fn().mockResolvedValue(undefined), update: vi.fn().mockResolvedValue(undefined), uninstall: vi.fn().mockResolvedValue(undefined), }, device: { setEnabled: vi.fn().mockResolvedValue(undefined), uninstall: vi.fn().mockResolvedValue(undefined), }, project: { setEnabled: vi.fn().mockResolvedValue(undefined), }, loginReturnPath: '/project-config/plugins?scope=all&source=official&state=available', navigate: vi.fn(), openSettings: vi.fn(), } satisfies PluginWorkspaceDispatchDependencies; } describe('plugin workspace controller', () => { it('dispatches every command to exactly one existing authority action', async () => { const deps = dependencies(); const commands = [ { kind: 'acquire', pluginId: 'a' }, { kind: 'reacquire', pluginId: 'b' }, { kind: 'remove_from_library', pluginId: 'c' }, { kind: 'install_stable', pluginId: 'd' }, { kind: 'install_beta', pluginId: 'e' }, { kind: 'update_official', pluginId: 'f' }, { kind: 'remove_official_device_package', pluginId: 'g' }, { kind: 'enable_project', projectId: 'project-a', pluginId: 'h' }, { kind: 'disable_project', projectId: 'project-a', pluginId: 'i' }, { kind: 'enable_local', packageId: 'j' }, { kind: 'disable_local', packageId: 'k' }, { kind: 'remove_local', packageId: 'l' }, { kind: 'sign_in' }, { kind: 'open_agent_assignment', projectId: 'project-a', pluginId: 'm' }, { kind: 'open_settings', projectId: 'project-a', pluginId: 'n' }, ] satisfies readonly PluginWorkspaceCommand[]; for (const command of commands) await dispatchPluginWorkspaceCommand(command, deps); expect(deps.marketplace.acquire.mock.calls).toEqual([['a'], ['b']]); expect(deps.marketplace.remove).toHaveBeenCalledExactlyOnceWith('c'); expect(deps.marketplace.install).toHaveBeenCalledExactlyOnceWith('d'); expect(deps.marketplace.installBeta).toHaveBeenCalledExactlyOnceWith('e'); expect(deps.marketplace.update).toHaveBeenCalledExactlyOnceWith('f'); expect(deps.marketplace.uninstall).toHaveBeenCalledExactlyOnceWith('g'); expect(deps.project.setEnabled.mock.calls).toEqual([ ['project-a', 'h', true], ['project-a', 'i', false], ]); expect(deps.device.setEnabled.mock.calls).toEqual([['j', true], ['k', false]]); expect(deps.device.uninstall).toHaveBeenCalledExactlyOnceWith('l'); expect(deps.navigate.mock.calls).toEqual([ ['/login', { state: { from: '/project-config/plugins?scope=all&source=official&state=available' } }], ['/project-config'], ]); expect(deps.openSettings).toHaveBeenCalledExactlyOnceWith(); }); });