241 lines
6.3 KiB
TypeScript
241 lines
6.3 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest';
|
|
import { dispatchAssistantAction } from '../../../src/renderer/navigation/assistantActionDispatcher';
|
|
|
|
describe('assistantActionDispatcher', () => {
|
|
it('opens a post from action payload', () => {
|
|
const setSelectedPost = vi.fn();
|
|
const openTab = vi.fn();
|
|
const setActiveView = vi.fn();
|
|
|
|
const result = dispatchAssistantAction(
|
|
{
|
|
action: 'openPost',
|
|
payload: { postId: 'post-123' },
|
|
},
|
|
{
|
|
setSelectedPost,
|
|
setSelectedMedia: vi.fn(),
|
|
openTab,
|
|
setActiveView,
|
|
toggleSidebar: vi.fn(),
|
|
togglePanel: vi.fn(),
|
|
toggleAssistantSidebar: vi.fn(),
|
|
},
|
|
);
|
|
|
|
expect(result.handled).toBe(true);
|
|
expect(setActiveView).toHaveBeenCalledWith('posts');
|
|
expect(setSelectedPost).toHaveBeenCalledWith('post-123');
|
|
expect(openTab).toHaveBeenCalledWith({ type: 'post', id: 'post-123', isTransient: false });
|
|
});
|
|
|
|
it('opens media from action payload', () => {
|
|
const setSelectedMedia = vi.fn();
|
|
const openTab = vi.fn();
|
|
const setActiveView = vi.fn();
|
|
|
|
const result = dispatchAssistantAction(
|
|
{
|
|
action: 'openMedia',
|
|
payload: { mediaId: 'media-321' },
|
|
},
|
|
{
|
|
setSelectedPost: vi.fn(),
|
|
setSelectedMedia,
|
|
openTab,
|
|
setActiveView,
|
|
toggleSidebar: vi.fn(),
|
|
togglePanel: vi.fn(),
|
|
toggleAssistantSidebar: vi.fn(),
|
|
},
|
|
);
|
|
|
|
expect(result.handled).toBe(true);
|
|
expect(setActiveView).toHaveBeenCalledWith('media');
|
|
expect(setSelectedMedia).toHaveBeenCalledWith('media-321');
|
|
expect(openTab).toHaveBeenCalledWith({ type: 'media', id: 'media-321', isTransient: false });
|
|
});
|
|
|
|
it('switches sidebar view', () => {
|
|
const setActiveView = vi.fn();
|
|
|
|
const result = dispatchAssistantAction(
|
|
{
|
|
action: 'switchView',
|
|
payload: { view: 'tags' },
|
|
},
|
|
{
|
|
setSelectedPost: vi.fn(),
|
|
setSelectedMedia: vi.fn(),
|
|
openTab: vi.fn(),
|
|
setActiveView,
|
|
toggleSidebar: vi.fn(),
|
|
togglePanel: vi.fn(),
|
|
toggleAssistantSidebar: vi.fn(),
|
|
},
|
|
);
|
|
|
|
expect(result.handled).toBe(true);
|
|
expect(setActiveView).toHaveBeenCalledWith('tags');
|
|
});
|
|
|
|
it('supports setActiveView action alias for protocol compatibility', () => {
|
|
const setActiveView = vi.fn();
|
|
|
|
const result = dispatchAssistantAction(
|
|
{
|
|
action: 'setActiveView',
|
|
payload: { view: 'chat' },
|
|
},
|
|
{
|
|
setSelectedPost: vi.fn(),
|
|
setSelectedMedia: vi.fn(),
|
|
openTab: vi.fn(),
|
|
setActiveView,
|
|
toggleSidebar: vi.fn(),
|
|
togglePanel: vi.fn(),
|
|
toggleAssistantSidebar: vi.fn(),
|
|
},
|
|
);
|
|
|
|
expect(result.handled).toBe(true);
|
|
expect(setActiveView).toHaveBeenCalledWith('chat');
|
|
});
|
|
|
|
it('supports openPanel action alias for protocol compatibility', () => {
|
|
const togglePanel = vi.fn();
|
|
|
|
const result = dispatchAssistantAction(
|
|
{
|
|
action: 'openPanel',
|
|
},
|
|
{
|
|
setSelectedPost: vi.fn(),
|
|
setSelectedMedia: vi.fn(),
|
|
openTab: vi.fn(),
|
|
setActiveView: vi.fn(),
|
|
toggleSidebar: vi.fn(),
|
|
togglePanel,
|
|
toggleAssistantSidebar: vi.fn(),
|
|
},
|
|
);
|
|
|
|
expect(result.handled).toBe(true);
|
|
expect(togglePanel).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it('rejects switchView payload when view is invalid', () => {
|
|
const setActiveView = vi.fn();
|
|
|
|
const result = dispatchAssistantAction(
|
|
{
|
|
action: 'switchView',
|
|
payload: { view: 'not-a-view' },
|
|
},
|
|
{
|
|
setSelectedPost: vi.fn(),
|
|
setSelectedMedia: vi.fn(),
|
|
openTab: vi.fn(),
|
|
setActiveView,
|
|
toggleSidebar: vi.fn(),
|
|
togglePanel: vi.fn(),
|
|
toggleAssistantSidebar: vi.fn(),
|
|
},
|
|
);
|
|
|
|
expect(result.handled).toBe(false);
|
|
expect(result.error).toContain('Invalid payload');
|
|
expect(setActiveView).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('opens chat tab for openChat action', () => {
|
|
const setActiveView = vi.fn();
|
|
const openTab = vi.fn();
|
|
|
|
const result = dispatchAssistantAction(
|
|
{
|
|
action: 'openChat',
|
|
payload: { conversationId: 'conversation-42' },
|
|
},
|
|
{
|
|
setSelectedPost: vi.fn(),
|
|
setSelectedMedia: vi.fn(),
|
|
openTab,
|
|
setActiveView,
|
|
toggleSidebar: vi.fn(),
|
|
togglePanel: vi.fn(),
|
|
toggleAssistantSidebar: vi.fn(),
|
|
},
|
|
);
|
|
|
|
expect(result.handled).toBe(true);
|
|
expect(setActiveView).toHaveBeenCalledWith('chat');
|
|
expect(openTab).toHaveBeenCalledWith({ type: 'chat', id: 'conversation-42', isTransient: false });
|
|
});
|
|
|
|
it('opens settings tab for openSettings action', () => {
|
|
const setActiveView = vi.fn();
|
|
const openTab = vi.fn();
|
|
|
|
const result = dispatchAssistantAction(
|
|
{
|
|
action: 'openSettings',
|
|
},
|
|
{
|
|
setSelectedPost: vi.fn(),
|
|
setSelectedMedia: vi.fn(),
|
|
openTab,
|
|
setActiveView,
|
|
toggleSidebar: vi.fn(),
|
|
togglePanel: vi.fn(),
|
|
toggleAssistantSidebar: vi.fn(),
|
|
},
|
|
);
|
|
|
|
expect(result.handled).toBe(true);
|
|
expect(setActiveView).toHaveBeenCalledWith('settings');
|
|
expect(openTab).toHaveBeenCalledWith({ type: 'settings', id: 'settings', isTransient: false });
|
|
});
|
|
|
|
it('rejects invalid payload for openChat action', () => {
|
|
const result = dispatchAssistantAction(
|
|
{
|
|
action: 'openChat',
|
|
payload: {},
|
|
},
|
|
{
|
|
setSelectedPost: vi.fn(),
|
|
setSelectedMedia: vi.fn(),
|
|
openTab: vi.fn(),
|
|
setActiveView: vi.fn(),
|
|
toggleSidebar: vi.fn(),
|
|
togglePanel: vi.fn(),
|
|
toggleAssistantSidebar: vi.fn(),
|
|
},
|
|
);
|
|
|
|
expect(result.handled).toBe(false);
|
|
expect(result.error).toContain('Invalid payload');
|
|
});
|
|
|
|
it('returns an error for unknown actions', () => {
|
|
const result = dispatchAssistantAction(
|
|
{
|
|
action: 'doesNotExist',
|
|
},
|
|
{
|
|
setSelectedPost: vi.fn(),
|
|
setSelectedMedia: vi.fn(),
|
|
openTab: vi.fn(),
|
|
setActiveView: vi.fn(),
|
|
toggleSidebar: vi.fn(),
|
|
togglePanel: vi.fn(),
|
|
toggleAssistantSidebar: vi.fn(),
|
|
},
|
|
);
|
|
|
|
expect(result.handled).toBe(false);
|
|
expect(result.error).toContain('Unsupported action');
|
|
});
|
|
});
|