mirror of
https://github.com/mediacms-io/mediacms.git
synced 2026-01-20 15:22:58 -05:00
190 lines
8.1 KiB
TypeScript
190 lines
8.1 KiB
TypeScript
import { config } from '../../../src/static/js/utils/settings/config';
|
|
|
|
describe('utils/settings', () => {
|
|
describe('config', () => {
|
|
const baseGlobal = {
|
|
profileId: 'john',
|
|
site: {
|
|
id: 'my-site',
|
|
url: 'https://example.com/',
|
|
api: 'https://example.com/api/',
|
|
title: 'Example',
|
|
theme: { mode: 'dark', switch: { enabled: true, position: 'sidebar' } },
|
|
logo: {
|
|
lightMode: { img: '/img/light.png', svg: '/img/light.svg' },
|
|
darkMode: { img: '/img/dark.png', svg: '/img/dark.svg' },
|
|
},
|
|
devEnv: false,
|
|
useRoundedCorners: true,
|
|
version: '2.0.0',
|
|
taxonomies: {
|
|
tags: { enabled: true, title: 'Topic Tags' },
|
|
categories: { enabled: false, title: 'Kinds' },
|
|
},
|
|
pages: {
|
|
latest: { enabled: true, title: 'Recent uploads' },
|
|
featured: { enabled: true, title: 'Featured picks' },
|
|
recommended: { enabled: false, title: 'You may like' },
|
|
},
|
|
userPages: {
|
|
members: { enabled: true, title: 'People' },
|
|
liked: { enabled: true, title: 'Favorites' },
|
|
history: { enabled: true, title: 'Watched' },
|
|
},
|
|
},
|
|
url: {
|
|
home: '/',
|
|
admin: '/admin',
|
|
error404: '/404',
|
|
latestMedia: '/latest',
|
|
featuredMedia: '/featured',
|
|
recommendedMedia: '/recommended',
|
|
signin: '/signin',
|
|
signout: '/signout',
|
|
register: '/register',
|
|
changePassword: '/password',
|
|
members: '/members',
|
|
search: '/search',
|
|
likedMedia: '/liked',
|
|
history: '/history',
|
|
addMedia: '/add',
|
|
editChannel: '/edit/channel',
|
|
editProfile: '/edit/profile',
|
|
tags: '/tags',
|
|
categories: '/categories',
|
|
manageMedia: '/manage/media',
|
|
manageUsers: '/manage/users',
|
|
manageComments: '/manage/comments',
|
|
},
|
|
api: {
|
|
media: 'v1/media/',
|
|
playlists: 'v1/playlists',
|
|
members: 'v1/users',
|
|
liked: 'v1/user/liked',
|
|
history: 'v1/user/history',
|
|
tags: 'v1/tags',
|
|
categories: 'v1/categories',
|
|
manage_media: 'v1/manage/media',
|
|
manage_users: 'v1/manage/users',
|
|
manage_comments: 'v1/manage/comments',
|
|
search: 'v1/search',
|
|
},
|
|
contents: {
|
|
notifications: {
|
|
messages: {
|
|
addToLiked: 'Yay',
|
|
removeFromLiked: 'Oops',
|
|
addToDisliked: 'nay',
|
|
removeFromDisliked: 'ok',
|
|
},
|
|
},
|
|
},
|
|
pages: {
|
|
home: { sections: { latest: { title: 'Latest T' } } },
|
|
search: { advancedFilters: true },
|
|
media: { categoriesWithTitle: true, hideViews: true, related: { initialSize: 5 } },
|
|
profile: { htmlInDescription: true, includeHistory: true, includeLikedMedia: true },
|
|
},
|
|
features: {
|
|
mediaItem: { hideAuthor: true, hideViews: false, hideDate: true },
|
|
media: {
|
|
actions: {
|
|
like: true,
|
|
dislike: true,
|
|
report: true,
|
|
comment: true,
|
|
comment_mention: true,
|
|
download: true,
|
|
save: true,
|
|
share: true,
|
|
},
|
|
shareOptions: ['embed', 'email', 'invalid'],
|
|
},
|
|
playlists: { mediaTypes: ['audio'] },
|
|
sideBar: { hideHomeLink: false, hideTagsLink: true, hideCategoriesLink: false },
|
|
embeddedVideo: { initialDimensions: { width: 640, height: 360 } },
|
|
headerBar: { hideLogin: false, hideRegister: true },
|
|
},
|
|
user: {
|
|
is: { anonymous: false, admin: true },
|
|
name: ' John ',
|
|
username: ' john ',
|
|
thumbnail: ' /img/j.png ',
|
|
can: {
|
|
changePassword: true,
|
|
deleteProfile: true,
|
|
addComment: true,
|
|
mentionComment: true,
|
|
deleteComment: true,
|
|
editMedia: true,
|
|
deleteMedia: true,
|
|
editSubtitle: true,
|
|
manageMedia: true,
|
|
manageUsers: true,
|
|
manageComments: true,
|
|
contactUser: true,
|
|
canSeeMembersPage: true,
|
|
usersNeedsToBeApproved: false,
|
|
addMedia: true,
|
|
editProfile: true,
|
|
readComment: true,
|
|
},
|
|
pages: { about: '/u/john/about ', media: '/u/john ', playlists: '/u/john/playlists ' },
|
|
},
|
|
} as const;
|
|
|
|
test('merges enabled pages and passes titles into options.pages.home sections', () => {
|
|
const cfg = config(baseGlobal);
|
|
expect(cfg.enabled.pages.latest).toStrictEqual({ enabled: true, title: 'Recent uploads' });
|
|
expect(cfg.enabled.pages.featured).toStrictEqual({ enabled: true, title: 'Featured picks' });
|
|
expect(cfg.enabled.pages.recommended).toStrictEqual({ enabled: false, title: 'You may like' });
|
|
expect(cfg.enabled.pages.members).toStrictEqual({ enabled: true, title: 'People' });
|
|
expect(cfg.options.pages.home.sections.latest.title).toBe('Latest T');
|
|
expect(cfg.options.pages.home.sections.featured.title).toBe('Featured picks');
|
|
});
|
|
|
|
test('produces api endpoints based on site.api and api endpoints', () => {
|
|
const cfg = config(baseGlobal);
|
|
expect(cfg.api.media).toBe('https://example.com/api/v1/media/');
|
|
expect(cfg.api.user.liked).toBe('https://example.com/api/v1/user/liked');
|
|
expect(cfg.api.search.query).toBe('https://example.com/api/v1/search?q=');
|
|
});
|
|
|
|
test('member and url manage links reflect user and feature flags', () => {
|
|
const cfg = config(baseGlobal);
|
|
expect(cfg.member.is).toStrictEqual({ admin: true, anonymous: false });
|
|
expect(cfg.member.can).toMatchObject({
|
|
manageMedia: true,
|
|
manageUsers: true,
|
|
manageComments: true,
|
|
likeMedia: true,
|
|
});
|
|
expect(cfg.url.manage.media).toBe('/manage/media');
|
|
expect(cfg.url.signout).toBe('/signout');
|
|
// admin visible
|
|
expect(cfg.url.admin).toBe('/admin');
|
|
});
|
|
|
|
test('theme and site defaults propagate correctly', () => {
|
|
const cfg = config(baseGlobal);
|
|
expect(cfg.theme.mode).toBe('dark');
|
|
expect(cfg.theme.switch.position).toBe('sidebar');
|
|
expect(cfg.theme.logo.darkMode.img).toBe('/img/dark.png');
|
|
expect(cfg.site.id).toBe('my-site');
|
|
expect(cfg.site.version).toBe('2.0.0');
|
|
});
|
|
|
|
test('memoizes and returns the same object instance on repeated calls', () => {
|
|
const first = config(baseGlobal);
|
|
const second = config(baseGlobal);
|
|
expect(second).toBe(first);
|
|
});
|
|
|
|
test('url profile paths use site.url when not in dev env', () => {
|
|
const cfg = config(baseGlobal);
|
|
expect(cfg.url.profile.media).toBe('https://example.com/user/john');
|
|
expect(cfg.url.embed).toBe('https://example.com/embed?m=');
|
|
});
|
|
});
|
|
});
|