feat: first cut at menu editor

This commit is contained in:
2026-02-21 19:51:34 +01:00
parent f371dbd2b2
commit 76c3a8368e
37 changed files with 2148 additions and 4 deletions

View File

@@ -136,6 +136,12 @@ const mockTagEngine = {
searchTags: vi.fn(),
};
const mockMenuEngine = {
setProjectContext: vi.fn(),
getMenu: vi.fn(),
saveMenu: vi.fn(),
};
const mockPostMediaEngine = {
on: vi.fn(),
setProjectContext: vi.fn(),
@@ -245,6 +251,10 @@ vi.mock('../../src/main/engine/TagEngine', () => ({
getTagEngine: vi.fn(() => mockTagEngine),
}));
vi.mock('../../src/main/engine/MenuEngine', () => ({
getMenuEngine: vi.fn(() => mockMenuEngine),
}));
vi.mock('../../src/main/engine/PostMediaEngine', () => ({
getPostMediaEngine: vi.fn(() => mockPostMediaEngine),
}));
@@ -1252,6 +1262,51 @@ describe('IPC Handlers', () => {
});
});
// ============ Menu Handlers ============
describe('Menu Handlers', () => {
describe('menu:get', () => {
it('loads menu for active project context', async () => {
const activeProject = createMockProject({ id: 'project-42', dataPath: '/custom/data' });
const menuDocument = {
items: [
{ id: 'home', title: 'Home', kind: 'page', pageSlug: 'home', children: [] },
],
};
mockProjectEngine.getActiveProject.mockResolvedValue(activeProject);
mockProjectEngine.getDataDir.mockReturnValue('/resolved/project-data');
mockMenuEngine.getMenu.mockResolvedValue(menuDocument);
const result = await invokeHandler('menu:get');
expect(mockMenuEngine.setProjectContext).toHaveBeenCalledWith('project-42', '/resolved/project-data');
expect(mockMenuEngine.getMenu).toHaveBeenCalled();
expect(result).toEqual(menuDocument);
});
});
describe('menu:save', () => {
it('saves menu for active project context', async () => {
const activeProject = createMockProject({ id: 'project-24', dataPath: '/custom/data' });
const menuDocument = {
items: [
{ id: 'docs', title: 'Docs', kind: 'submenu', children: [] },
],
};
mockProjectEngine.getActiveProject.mockResolvedValue(activeProject);
mockProjectEngine.getDataDir.mockReturnValue('/resolved/project-data');
mockMenuEngine.saveMenu.mockResolvedValue(menuDocument);
const result = await invokeHandler('menu:save', menuDocument);
expect(mockMenuEngine.setProjectContext).toHaveBeenCalledWith('project-24', '/resolved/project-data');
expect(mockMenuEngine.saveMenu).toHaveBeenCalledWith(menuDocument);
expect(result).toEqual(menuDocument);
});
});
});
// ============ Task Handlers ============
describe('Task Handlers', () => {
describe('tasks:getAll', () => {