mirror of
https://github.com/mediacms-io/mediacms.git
synced 2026-01-20 07:12:58 -05:00
feat: frontend unit tests
This commit is contained in:
189
frontend/tests/utils/settings/config.test.ts
Normal file
189
frontend/tests/utils/settings/config.test.ts
Normal file
@@ -0,0 +1,189 @@
|
||||
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=');
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user