135 lines
4.4 KiB
TypeScript
135 lines
4.4 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { resolvePostTemplateName, resolveListTemplateName, resolvePageRendererTemplateRoots } from '../../src/main/engine/PageRenderer';
|
|
|
|
describe('resolvePostTemplateName', () => {
|
|
it('returns default single-post when no overrides exist', () => {
|
|
const result = resolvePostTemplateName({});
|
|
expect(result).toBe('single-post');
|
|
});
|
|
|
|
it('returns post-level templateSlug when set', () => {
|
|
const result = resolvePostTemplateName({ templateSlug: 'photo-post' });
|
|
expect(result).toBe('photo-post');
|
|
});
|
|
|
|
it('returns tag-level override when post has no template and tag does', () => {
|
|
const result = resolvePostTemplateName(
|
|
{ tags: ['photography', 'travel'] },
|
|
{ photography: { postTemplateSlug: 'photo-layout' } },
|
|
);
|
|
expect(result).toBe('photo-layout');
|
|
});
|
|
|
|
it('prioritizes post-level over tag-level', () => {
|
|
const result = resolvePostTemplateName(
|
|
{ templateSlug: 'custom-post', tags: ['photography'] },
|
|
{ photography: { postTemplateSlug: 'photo-layout' } },
|
|
);
|
|
expect(result).toBe('custom-post');
|
|
});
|
|
|
|
it('returns category-level override when no post or tag override', () => {
|
|
const result = resolvePostTemplateName(
|
|
{ categories: ['article'] },
|
|
undefined,
|
|
{ article: { postTemplateSlug: 'article-layout' } },
|
|
);
|
|
expect(result).toBe('article-layout');
|
|
});
|
|
|
|
it('prioritizes tag-level over category-level', () => {
|
|
const result = resolvePostTemplateName(
|
|
{ tags: ['featured'], categories: ['article'] },
|
|
{ featured: { postTemplateSlug: 'featured-layout' } },
|
|
{ article: { postTemplateSlug: 'article-layout' } },
|
|
);
|
|
expect(result).toBe('featured-layout');
|
|
});
|
|
|
|
it('skips tags/categories with null postTemplateSlug', () => {
|
|
const result = resolvePostTemplateName(
|
|
{ tags: ['empty'], categories: ['article'] },
|
|
{ empty: { postTemplateSlug: null } },
|
|
{ article: { postTemplateSlug: 'article-layout' } },
|
|
);
|
|
expect(result).toBe('article-layout');
|
|
});
|
|
|
|
it('returns default when all overrides are null/undefined', () => {
|
|
const result = resolvePostTemplateName(
|
|
{ templateSlug: null, tags: ['empty'], categories: ['plain'] },
|
|
{ empty: { postTemplateSlug: null } },
|
|
{ plain: { postTemplateSlug: undefined } },
|
|
);
|
|
expect(result).toBe('single-post');
|
|
});
|
|
|
|
it('uses first matching tag with a template slug', () => {
|
|
const result = resolvePostTemplateName(
|
|
{ tags: ['no-template', 'has-template', 'also-has'] },
|
|
{
|
|
'has-template': { postTemplateSlug: 'first-match' },
|
|
'also-has': { postTemplateSlug: 'second-match' },
|
|
},
|
|
);
|
|
expect(result).toBe('first-match');
|
|
});
|
|
});
|
|
|
|
describe('resolveListTemplateName', () => {
|
|
it('returns default post-list when no overrides exist', () => {
|
|
const result = resolveListTemplateName();
|
|
expect(result).toBe('post-list');
|
|
});
|
|
|
|
it('returns default when no route category', () => {
|
|
const result = resolveListTemplateName(undefined, {
|
|
article: { listTemplateSlug: 'article-list' },
|
|
});
|
|
expect(result).toBe('post-list');
|
|
});
|
|
|
|
it('returns category-level listTemplateSlug', () => {
|
|
const result = resolveListTemplateName('article', {
|
|
article: { listTemplateSlug: 'article-list' },
|
|
});
|
|
expect(result).toBe('article-list');
|
|
});
|
|
|
|
it('returns default when category has no listTemplateSlug', () => {
|
|
const result = resolveListTemplateName('article', {
|
|
article: { listTemplateSlug: undefined },
|
|
});
|
|
expect(result).toBe('post-list');
|
|
});
|
|
|
|
it('returns default when category not in settings', () => {
|
|
const result = resolveListTemplateName('unknown', {
|
|
article: { listTemplateSlug: 'article-list' },
|
|
});
|
|
expect(result).toBe('post-list');
|
|
});
|
|
});
|
|
|
|
describe('resolvePageRendererTemplateRoots with userTemplatesDir', () => {
|
|
it('adds user templates directory first when provided', () => {
|
|
const roots = resolvePageRendererTemplateRoots({
|
|
moduleDir: '/app/dist/main/engine',
|
|
cwd: '/app',
|
|
userTemplatesDir: '/data/project/templates',
|
|
});
|
|
|
|
expect(roots[0]).toBe('/data/project/templates');
|
|
});
|
|
|
|
it('does not add user templates when not provided', () => {
|
|
const roots = resolvePageRendererTemplateRoots({
|
|
moduleDir: '/app/dist/main/engine',
|
|
cwd: '/app',
|
|
});
|
|
|
|
expect(roots).not.toContain(undefined);
|
|
expect(roots.every(r => r.length > 0)).toBe(true);
|
|
});
|
|
});
|