dashy/tests/unit/config-helpers.test.js
2026-03-08 16:33:24 +00:00

128 lines
3.6 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import {
makePageName,
makePageSlug,
formatConfigPath,
componentVisibility,
getCustomKeyShortcuts,
} from '@/utils/ConfigHelpers';
describe('ConfigHelpers - makePageName', () => {
it('converts page name to lowercase', () => {
expect(makePageName('My Page')).toBe('my-page');
});
it('replaces spaces with hyphens', () => {
expect(makePageName('Multiple Word Page')).toBe('multiple-word-page');
});
it('removes .yml extension', () => {
expect(makePageName('config.yml')).toBe('config');
});
it('removes special characters', () => {
expect(makePageName('Page!@#$Name')).toBe('pagename');
});
it('handles undefined input', () => {
expect(makePageName(undefined)).toBe('unnamed-page');
});
it('handles null input', () => {
expect(makePageName(null)).toBe('unnamed-page');
});
it('handles empty string', () => {
expect(makePageName('')).toBe('unnamed-page');
});
});
describe('ConfigHelpers - makePageSlug', () => {
it('creates correct slug format', () => {
expect(makePageSlug('My Page', 'home')).toBe('/home/my-page');
});
it('handles page names with special chars', () => {
expect(makePageSlug('Config! Page', 'admin')).toBe('/admin/config-page');
});
});
describe('ConfigHelpers - formatConfigPath', () => {
it('leaves http URLs unchanged', () => {
const url = 'https://example.com/config.yml';
expect(formatConfigPath(url)).toBe(url);
});
it('adds leading slash to relative paths', () => {
expect(formatConfigPath('config.yml')).toBe('/config.yml');
});
it('keeps absolute paths unchanged', () => {
expect(formatConfigPath('/config.yml')).toBe('/config.yml');
});
});
describe('ConfigHelpers - componentVisibility', () => {
it('returns all visible by default when no config', () => {
const result = componentVisibility({});
expect(result.pageTitle).toBe(true);
expect(result.navigation).toBe(true);
expect(result.searchBar).toBe(true);
expect(result.settings).toBe(true);
expect(result.footer).toBe(true);
});
it('hides components based on config', () => {
const appConfig = {
hideComponents: {
hideHeading: true,
hideNav: true,
},
};
const result = componentVisibility(appConfig);
expect(result.pageTitle).toBe(false);
expect(result.navigation).toBe(false);
expect(result.searchBar).toBe(true);
});
it('handles partial config correctly', () => {
const appConfig = {
hideComponents: {
hideFooter: true,
},
};
const result = componentVisibility(appConfig);
expect(result.footer).toBe(false);
expect(result.pageTitle).toBe(true);
});
});
describe('ConfigHelpers - getCustomKeyShortcuts', () => {
it('extracts hotkeys from sections', () => {
const sections = [
{
items: [
{ hotkey: 1, url: 'https://example.com' },
{ url: 'https://example.org' },
],
},
];
const result = getCustomKeyShortcuts(sections);
expect(result).toHaveLength(1);
expect(result[0]).toEqual({ hotkey: 1, url: 'https://example.com' });
});
it('returns empty array when no hotkeys', () => {
const sections = [{ items: [{ url: 'https://example.com' }] }];
expect(getCustomKeyShortcuts(sections)).toEqual([]);
});
it('flattens hotkeys from multiple sections', () => {
const sections = [
{ items: [{ hotkey: 1, url: 'https://a.com' }] },
{ items: [{ hotkey: 2, url: 'https://b.com' }] },
];
const result = getCustomKeyShortcuts(sections);
expect(result).toHaveLength(2);
});
});