73 lines
3.2 KiB
TypeScript
73 lines
3.2 KiB
TypeScript
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();
|
|
});
|
|
});
|