From 406568c78cfa7730f290f3ab2d594e418f57c379 Mon Sep 17 00:00:00 2001 From: hugo Date: Tue, 17 Feb 2026 20:11:28 +0100 Subject: [PATCH] fix: fixed the language thing and handling of project settings --- src/main/engine/PreviewServer.ts | 6 ++++++ src/main/ipc/handlers.ts | 3 +++ tests/engine/PreviewServer.test.ts | 28 ++++++++++++++++++++++++++++ tests/ipc/handlers.test.ts | 15 +++++++++++++++ 4 files changed, 52 insertions(+) diff --git a/src/main/engine/PreviewServer.ts b/src/main/engine/PreviewServer.ts index 03c7c19..73d57d2 100644 --- a/src/main/engine/PreviewServer.ts +++ b/src/main/engine/PreviewServer.ts @@ -25,6 +25,8 @@ interface PostEngineContract { interface MetaEngineContract { getProjectMetadata: () => Promise; setProjectContext: (projectId: string, dataDir?: string) => void; + isInitialized?: () => boolean; + syncOnStartup?: () => Promise; } interface PreviewServerDependencies { @@ -421,6 +423,10 @@ export class PreviewServer { this.mediaEngine.setProjectContext?.(context.projectId, context.dataDir, context.dataDir); this.settingsEngine.setProjectContext(context.projectId, context.dataDir); + if (this.settingsEngine.isInitialized && this.settingsEngine.syncOnStartup && !this.settingsEngine.isInitialized()) { + await this.settingsEngine.syncOnStartup(); + } + const metadata = await this.settingsEngine.getProjectMetadata(); const maxPostsPerPage = clampMaxPostsPerPage(metadata?.maxPostsPerPage); const htmlRewriteContext = await this.buildHtmlRewriteContext(); diff --git a/src/main/ipc/handlers.ts b/src/main/ipc/handlers.ts index 89a582d..11ece84 100644 --- a/src/main/ipc/handlers.ts +++ b/src/main/ipc/handlers.ts @@ -810,6 +810,9 @@ export function registerIpcHandlers(): void { safeHandle('meta:getProjectMetadata', async () => { const engine = getMetaEngine(); + if (!engine.isInitialized()) { + await engine.syncOnStartup(); + } return engine.getProjectMetadata(); }); diff --git a/tests/engine/PreviewServer.test.ts b/tests/engine/PreviewServer.test.ts index f65097f..b0b3272 100644 --- a/tests/engine/PreviewServer.test.ts +++ b/tests/engine/PreviewServer.test.ts @@ -359,6 +359,34 @@ describe('PreviewServer', () => { expect(html).toContain(''); }); + it('initializes metadata before reading language when supported by settings engine', async () => { + let initialized = false; + + server = new PreviewServer({ + postEngine: makeEngine([makePost()]), + settingsEngine: { + setProjectContext: vi.fn(), + isInitialized: vi.fn(() => initialized), + syncOnStartup: vi.fn(async () => { + initialized = true; + }), + async getProjectMetadata() { + return initialized + ? { name: 'My Great Blog', mainLanguage: 'fr', maxPostsPerPage: 50 } + : null; + }, + } as any, + getActiveProjectContext: async () => ({ projectId: 'default' }), + }); + + await server.start(0); + + const response = await fetch(`${server.getBaseUrl()}/`); + expect(response.status).toBe(200); + const html = await response.text(); + expect(html).toContain(''); + }); + it('falls back to active project name in page title when metadata is unavailable', async () => { server = new PreviewServer({ postEngine: makeEngine([makePost()]), diff --git a/tests/ipc/handlers.test.ts b/tests/ipc/handlers.test.ts index efa24aa..3255f8d 100644 --- a/tests/ipc/handlers.test.ts +++ b/tests/ipc/handlers.test.ts @@ -106,6 +106,7 @@ const mockProjectEngine = { const mockMetaEngine = { on: vi.fn(), setProjectContext: vi.fn(), + isInitialized: vi.fn(), syncOnStartup: vi.fn(), getTags: vi.fn(), getCategories: vi.fn(), @@ -1166,6 +1167,7 @@ describe('IPC Handlers', () => { describe('meta:getProjectMetadata', () => { it('should return project metadata', async () => { const metadata = { name: 'Test Blog', description: 'A test blog', mainLanguage: 'de' }; + mockMetaEngine.isInitialized.mockReturnValue(true); mockMetaEngine.getProjectMetadata.mockResolvedValue(metadata); const result = await invokeHandler('meta:getProjectMetadata'); @@ -1173,6 +1175,19 @@ describe('IPC Handlers', () => { expect(mockMetaEngine.getProjectMetadata).toHaveBeenCalled(); expect(result).toEqual(metadata); }); + + it('should sync metadata before reading when engine is not initialized', async () => { + const metadata = { name: 'Test Blog', mainLanguage: 'de', defaultAuthor: 'Max' }; + mockMetaEngine.isInitialized.mockReturnValue(false); + mockMetaEngine.syncOnStartup.mockResolvedValue(undefined); + mockMetaEngine.getProjectMetadata.mockResolvedValue(metadata); + + const result = await invokeHandler('meta:getProjectMetadata'); + + expect(mockMetaEngine.syncOnStartup).toHaveBeenCalled(); + expect(mockMetaEngine.getProjectMetadata).toHaveBeenCalled(); + expect(result).toEqual(metadata); + }); }); describe('meta:setProjectMetadata', () => {