feat: more work on calendar
This commit is contained in:
@@ -994,6 +994,16 @@ describe('BlogGenerationEngine', () => {
|
||||
expect(await fileExists(path.join(tempDir, 'html', 'obsolete'))).toBe(false);
|
||||
expect(await fileExists(path.join(tempDir, 'html'))).toBe(true);
|
||||
expect(await fileExists(path.join(tempDir, 'html', '2025', '01', '15', 'apply-post', 'index.html'))).toBe(true);
|
||||
|
||||
const calendarJsonRaw = await readFile(path.join(tempDir, 'html', 'calendar.json'), 'utf-8');
|
||||
const calendarJson = JSON.parse(calendarJsonRaw) as {
|
||||
years: Record<string, number>;
|
||||
months: Record<string, number>;
|
||||
days: Record<string, number>;
|
||||
};
|
||||
expect(calendarJson.years['2025']).toBe(1);
|
||||
expect(calendarJson.months['2025-01']).toBe(1);
|
||||
expect(calendarJson.days['2025-01-15']).toBe(1);
|
||||
});
|
||||
|
||||
it('does not report valid pagination routes as extra html content', async () => {
|
||||
|
||||
@@ -357,6 +357,38 @@ describe('PreviewServer', () => {
|
||||
expect(lightboxLoadingImageResponse.headers.get('content-type')).toContain('image/gif');
|
||||
});
|
||||
|
||||
it('serves calendar.json for preview calendar runtime', async () => {
|
||||
tempDir = await mkdtemp(path.join(tmpdir(), 'bds-preview-calendar-'));
|
||||
await mkdir(path.join(tempDir, 'html'), { recursive: true });
|
||||
await writeFile(path.join(tempDir, 'html', 'calendar.json'), JSON.stringify({
|
||||
years: { '2025': 2 },
|
||||
months: { '2025-01': 2 },
|
||||
days: { '2025-01-02': 1, '2025-01-03': 1 },
|
||||
}), 'utf-8');
|
||||
|
||||
server = new PreviewServer({
|
||||
postEngine: makeEngine([makePost()]),
|
||||
settingsEngine: makeSettings(50),
|
||||
getActiveProjectContext: async () => ({ projectId: 'default', dataDir: tempDir ?? undefined }),
|
||||
});
|
||||
|
||||
await server.start(0);
|
||||
|
||||
const response = await fetch(`${server.getBaseUrl()}/calendar.json`);
|
||||
expect(response.status).toBe(200);
|
||||
expect(response.headers.get('content-type')).toContain('application/json');
|
||||
|
||||
const payload = await response.json() as {
|
||||
years: Record<string, number>;
|
||||
months: Record<string, number>;
|
||||
days: Record<string, number>;
|
||||
};
|
||||
|
||||
expect(payload.years['2025']).toBe(2);
|
||||
expect(payload.months['2025-01']).toBe(2);
|
||||
expect(payload.days['2025-01-03']).toBe(1);
|
||||
});
|
||||
|
||||
it('keeps markdown code block html minimal and includes code language metadata', async () => {
|
||||
const postWithCode = makePost({
|
||||
content: '```python\nprint("hello")\n```',
|
||||
|
||||
@@ -52,6 +52,17 @@ describe('Help menu documentation entry', () => {
|
||||
expect(APP_MENU_ACTION_EVENT_MAP.validateSite).toBe('menu:validateSite');
|
||||
});
|
||||
|
||||
it('includes Regenerate Calendar action in Blog menu', () => {
|
||||
const blogGroup = APP_MENU_GROUPS.find((group) => group.label === 'Blog');
|
||||
|
||||
expect(blogGroup).toBeDefined();
|
||||
expect(blogGroup?.items.some((item) => item.action === 'regenerateCalendar')).toBe(true);
|
||||
});
|
||||
|
||||
it('maps Regenerate Calendar to a renderer menu event', () => {
|
||||
expect(APP_MENU_ACTION_EVENT_MAP.regenerateCalendar).toBe('menu:regenerateCalendar');
|
||||
});
|
||||
|
||||
it('includes Edit Preferences action in Edit menu with comma shortcut', () => {
|
||||
const editGroup = APP_MENU_GROUPS.find((group) => group.label === 'Edit');
|
||||
const preferencesItem = editGroup?.items.find((item) => item.action === 'editPreferences');
|
||||
|
||||
Reference in New Issue
Block a user