test: update appearance config tests to include 'enabled' property and improve theme validation

This commit is contained in:
juancarmore 2025-09-29 22:03:47 +02:00
parent 5b44cc72f8
commit e418735322
2 changed files with 95 additions and 37 deletions

View File

@ -1,7 +1,7 @@
import { afterEach, beforeAll, describe, expect, it } from '@jest/globals';
import { container } from '../../../../src/config/dependency-injector.config.js';
import { MeetStorageService } from '../../../../src/services/index.js';
import { MeetRoomThemeMode } from '../../../../src/typings/ce/index.js';
import { MeetAppearanceConfig, MeetRoomThemeMode } from '../../../../src/typings/ce/index.js';
import { expectValidationError } from '../../../helpers/assertion-helpers.js';
import {
getRoomsAppearanceConfig,
@ -25,7 +25,8 @@ describe('Rooms Appearance Config API Tests', () => {
appearance: {
themes: [
{
name: 'Custom Theme',
name: 'custom',
enabled: true,
baseTheme: MeetRoomThemeMode.DARK,
backgroundColor: '#121212',
primaryColor: '#bb86fc',
@ -50,7 +51,8 @@ describe('Rooms Appearance Config API Tests', () => {
appearance: {
themes: [
{
name: 'Minimal Theme',
name: 'default',
enabled: true,
baseTheme: MeetRoomThemeMode.LIGHT
}
]
@ -71,9 +73,11 @@ describe('Rooms Appearance Config API Tests', () => {
appearance: {
themes: [
{
name: 'Initial Theme',
name: 'initial',
enabled: true,
baseTheme: MeetRoomThemeMode.LIGHT,
primaryColor: '#1976d2'
primaryColor: '#1976d2',
backgroundColor: '#ffffff'
}
]
}
@ -86,11 +90,12 @@ describe('Rooms Appearance Config API Tests', () => {
expect(response.status).toBe(200);
expect(response.body).toEqual(initialConfig);
const newConfig = {
const newConfig: { appearance: MeetAppearanceConfig } = {
appearance: {
themes: [
{
name: 'New Theme',
name: 'new',
enabled: false,
baseTheme: MeetRoomThemeMode.DARK,
primaryColor: '#bb86fc'
}
@ -103,6 +108,10 @@ describe('Rooms Appearance Config API Tests', () => {
response = await getRoomsAppearanceConfig();
expect(response.status).toBe(200);
newConfig.appearance.themes[0] = {
...newConfig.appearance.themes[0],
backgroundColor: '#ffffff'
};
expect(response.body).toEqual(newConfig);
});
});
@ -124,10 +133,12 @@ describe('Rooms Appearance Config API Tests', () => {
themes: [
{
name: 'Theme 1',
enabled: true,
baseTheme: MeetRoomThemeMode.LIGHT
},
{
name: 'Theme 2',
enabled: true,
baseTheme: MeetRoomThemeMode.DARK
}
]
@ -143,6 +154,7 @@ describe('Rooms Appearance Config API Tests', () => {
themes: [
{
name: '',
enabled: true,
baseTheme: MeetRoomThemeMode.LIGHT
}
]
@ -157,7 +169,8 @@ describe('Rooms Appearance Config API Tests', () => {
appearance: {
themes: [
{
name: 'This is a very long theme name that exceeds fifty characters',
name: 'a'.repeat(51),
enabled: true,
baseTheme: MeetRoomThemeMode.LIGHT
}
]
@ -167,6 +180,53 @@ describe('Rooms Appearance Config API Tests', () => {
expectValidationError(response, 'appearance.themes.0.name', 'Theme name cannot exceed 50 characters');
});
it('should reject when theme name has invalid characters', async () => {
const invalidNames = [
'Corporate Blue', // Uppercase and spaces
'dark-mode-2024!', // Exclamation mark
'theme.corporate', // Dot
'Dark_Mode', // Uppercase
'theme 1', // Space
'thème-français' // Accents
];
for (const name of invalidNames) {
const response = await updateRoomsAppearanceConfig({
appearance: {
themes: [
{
name: name,
enabled: true,
baseTheme: MeetRoomThemeMode.LIGHT
}
]
}
});
expectValidationError(
response,
'appearance.themes.0.name',
'Theme name can only contain lowercase letters, numbers, hyphens and underscores'
);
}
});
it('should reject when enabled is not a boolean', async () => {
const response = await updateRoomsAppearanceConfig({
appearance: {
themes: [
{
name: 'Valid Name',
enabled: 'yes',
baseTheme: MeetRoomThemeMode.LIGHT
}
]
}
});
expectValidationError(response, 'appearance.themes.0.enabled', 'Expected boolean, received string');
});
it('should reject when baseTheme is not a valid enum value', async () => {
const response = await updateRoomsAppearanceConfig({
appearance: {
@ -245,7 +305,8 @@ describe('Rooms Appearance Config API Tests', () => {
appearance: {
themes: [
{
name: 'Short Hex Theme',
name: 'custom',
enabled: true,
baseTheme: MeetRoomThemeMode.LIGHT,
backgroundColor: '#fff',
primaryColor: '#000',
@ -259,11 +320,12 @@ describe('Rooms Appearance Config API Tests', () => {
expect(response.status).toBe(200);
});
it('should reject when name or baseTheme are not provided', async () => {
it('should reject when name, enabled or baseTheme are not provided', async () => {
let response = await updateRoomsAppearanceConfig({
appearance: {
themes: [
{
enabled: true,
baseTheme: MeetRoomThemeMode.LIGHT
}
]
@ -275,7 +337,20 @@ describe('Rooms Appearance Config API Tests', () => {
appearance: {
themes: [
{
name: 'Missing Base Theme'
name: 'Missing Enabled',
baseTheme: MeetRoomThemeMode.LIGHT
}
]
}
});
expectValidationError(response, 'appearance.themes.0.enabled', 'Required');
response = await updateRoomsAppearanceConfig({
appearance: {
themes: [
{
name: 'Missing Base Theme',
enabled: true
}
]
}
@ -303,11 +378,11 @@ describe('Rooms Appearance Config API Tests', () => {
});
describe('Get rooms appearance config', () => {
it('should return 404 when no appearance config is set', async () => {
it('should return an empty array when no appearance config is set', async () => {
const response = await getRoomsAppearanceConfig();
expect(response.status).toBe(404);
expect(response.body.message).toBe('Rooms appearance config not defined');
expect(response.status).toBe(200);
expect(response.body).toEqual({ appearance: { themes: [] } });
});
it('should return rooms appearance config when one is set', async () => {
@ -315,7 +390,8 @@ describe('Rooms Appearance Config API Tests', () => {
appearance: {
themes: [
{
name: 'Test Theme',
name: 'custom',
enabled: true,
baseTheme: MeetRoomThemeMode.DARK,
primaryColor: '#bb86fc'
}

View File

@ -1,4 +1,4 @@
import { afterAll, beforeAll, describe, expect, it } from '@jest/globals';
import { beforeAll, describe, expect, it } from '@jest/globals';
import { Express } from 'express';
import request from 'supertest';
import { container } from '../../../../src/config/dependency-injector.config.js';
@ -6,7 +6,7 @@ import INTERNAL_CONFIG from '../../../../src/config/internal-config.js';
import { MEET_INITIAL_API_KEY } from '../../../../src/environment.js';
import { MeetStorageService } from '../../../../src/services/index.js';
import { AuthMode, AuthType, MeetRoomThemeMode } from '../../../../src/typings/ce/index.js';
import { loginUser, startTestServer, updateRoomsAppearanceConfig } from '../../../helpers/request-helpers.js';
import { loginUser, startTestServer } from '../../../helpers/request-helpers.js';
const CONFIG_PATH = `${INTERNAL_CONFIG.INTERNAL_API_BASE_PATH_V1}/config`;
@ -119,7 +119,8 @@ describe('Global Config API Security Tests', () => {
appearance: {
themes: [
{
name: 'Default Theme',
name: 'default',
enabled: true,
baseTheme: MeetRoomThemeMode.DARK
}
]
@ -151,25 +152,6 @@ describe('Global Config API Security Tests', () => {
});
describe('Get Rooms Appearance Config Tests', () => {
const appearanceConfig = {
appearance: {
themes: [
{
name: 'Default Theme',
baseTheme: MeetRoomThemeMode.DARK
}
]
}
};
beforeAll(async () => {
await updateRoomsAppearanceConfig(appearanceConfig);
});
afterAll(async () => {
await restoreGlobalConfig();
});
it('should fail when request includes API key', async () => {
const response = await request(app)
.get(`${CONFIG_PATH}/rooms/appearance`)