Files
halo-dark-mode-plugin/third-party/darkreader/tests/unit/utils/validation.tests.ts
T

215 lines
7.1 KiB
TypeScript

import {DEFAULT_SETTINGS, DEFAULT_THEME} from '../../../src/defaults';
import type {Theme, UserSettings} from '../../../src/definitions';
import {ThemeEngine} from '../../../src/generators/theme-engines';
import {AutomationMode} from '../../../src/utils/automation';
import {validateSettings, validateTheme} from '../../../src/utils/validation';
test('Settings Validation', () => {
const defaultTheme = JSON.parse(JSON.stringify(DEFAULT_THEME));
let themeValidation = validateTheme(defaultTheme);
expect(themeValidation.errors).toEqual([]);
expect(defaultTheme).toEqual(DEFAULT_THEME);
const partTheme = {
brightness: 125,
contrast: -50,
};
themeValidation = validateTheme(partTheme as any);
expect(themeValidation.errors.length).toBe(1);
expect(partTheme).toEqual({
brightness: 125,
contrast: DEFAULT_THEME.contrast,
});
const wonkyTheme = {
mode: 'dark',
brightness: 250,
contrast: -50,
grayscale: false,
sepia: 105,
useFont: 'ok',
fontFamily: '',
textStroke: 2,
engine: 'dymanic',
stylesheet: 3,
darkSchemeBackgroundColor: 'red',
darkSchemeTextColor: '#abc12x',
lightSchemeBackgroundColor: '',
lightSchemeTextColor: '#ffffff00',
scrollbarColor: false,
selectionColor: 'green',
styleSystemControls: null as boolean | null,
lightColorScheme: '',
darkColorScheme: false,
immediateModify: 1,
};
themeValidation = validateTheme(wonkyTheme as any);
expect(themeValidation.errors.length).toBeGreaterThan(0);
expect(wonkyTheme as any).toEqual(DEFAULT_THEME);
const defaultSet = JSON.parse(JSON.stringify(DEFAULT_SETTINGS));
let validation = validateSettings(defaultSet);
expect(validation.errors).toEqual([]);
expect(defaultSet).toEqual(DEFAULT_SETTINGS);
const wonkySet = {
schemeVersion: 'x',
enabled: '',
fetchNews: null as boolean | null,
theme: {
mode: 'dark',
brightness: 250,
contrast: -50,
grayscale: false,
sepia: 105,
useFont: 'ok',
fontFamily: '',
textStroke: 2,
engine: 'dymanic',
stylesheet: 3,
darkSchemeBackgroundColor: 'red',
darkSchemeTextColor: '#abc12x',
lightSchemeBackgroundColor: '',
lightSchemeTextColor: '#ffffff00',
scrollbarColor: false,
selectionColor: 'green',
styleSystemControls: null as boolean | null,
lightColorScheme: '',
darkColorScheme: false,
immediateModify: 1,
},
presets: [
{id: '', name: 'P1', urls: ['a.com'], theme: {brightness: 100}},
{id: 'p2', name: '', urls: ['a.com'], theme: {brightness: 100}},
{id: 'p3', name: 'P3', urls: [], theme: {brightness: 100}},
{id: 'p4', name: 'P4', urls: ['a.com'], theme: {brightness: -50}},
{id: 'p5', name: 'P5', urls: ['a.com'], theme: {brightness: 100}},
{id: 'p6', urls: ['a.com'], theme: {brightness: 100}},
{id: 'p7', name: 'P7', urls: ['a.com'], theme: null},
null,
],
customThemes: [
{url: [] as any[], theme: {brightness: 100}},
{url: [''], theme: {brightness: 100}},
{url: ['a.com'], theme: {brightness: 100}},
{url: ['a.com'], theme: {brightness: -50}},
{url: ['a.com']},
{url: ['a.com'], theme: null},
null,
],
disabledFor: ['a.com', '', 'b.com'],
enabledFor: {0: 'a.com', 1: 'b.com'},
enabledByDefault: true,
changeBrowserTheme: 1,
syncSettings: null as boolean | null,
syncSitesFixes: 0,
automation: {
enabled: false,
behavior: 'OnOff',
mode: '',
},
time: {
activation: '10:00PM',
deactivation: '19:00',
},
location: {
latitude: 59,
longitude: '5.3',
},
previewNewDesign: '',
previewNewestDesign: 2,
enableForPDF: null as boolean | null,
enableForProtectedPages: 'ok',
enableContextMenus: 'yes',
detectDarkTheme: 'no',
};
validation = validateSettings(wonkySet as any);
expect(validation.errors.length).toBeGreaterThan(0);
expect(wonkySet as any).toEqual({
...DEFAULT_SETTINGS,
disabledFor: ['a.com', 'b.com'],
presets: [{id: 'p5', name: 'P5', urls: ['a.com'], theme: {brightness: 100}}],
customThemes: [{url: ['a.com'], theme: {brightness: 100}}],
});
const nullishSet = {
theme: null as any,
presets: null as any,
customThemes: null as any,
time: null as any,
location: null as any,
};
validation = validateSettings(nullishSet);
expect(validation.errors.length).toBe(5);
expect(nullishSet).toEqual({
theme: DEFAULT_THEME,
presets: DEFAULT_SETTINGS.presets,
customThemes: DEFAULT_SETTINGS.customThemes,
time: DEFAULT_SETTINGS.time,
location: DEFAULT_SETTINGS.location,
});
const validSet: UserSettings = {
schemeVersion: 2,
enabled: true,
fetchNews: true,
theme: {
mode: 0,
brightness: 125,
contrast: 50,
grayscale: 25,
sepia: 5,
useFont: true,
fontFamily: 'Comic Sans',
textStroke: 0.5,
engine: ThemeEngine.dynamicTheme,
stylesheet: '.x { color: red; }',
darkSchemeBackgroundColor: '#abcdef',
darkSchemeTextColor: '#abc123',
lightSchemeBackgroundColor: '#ff0000',
lightSchemeTextColor: '#ffffff',
scrollbarColor: '',
selectionColor: 'auto',
styleSystemControls: false,
lightColorScheme: 'Lightness',
darkColorScheme: 'Darkness',
immediateModify: true,
},
presets: [
{id: 'p5', name: 'P5', urls: ['a.com'], theme: {brightness: 100} as Theme},
],
customThemes: [
{url: ['a.com'], theme: {brightness: 100} as Theme},
],
disabledFor: ['a.com', 'b.com'],
enabledFor: ['c.com'],
enabledByDefault: false,
changeBrowserTheme: true,
syncSettings: false,
syncSitesFixes: true,
automation: {
enabled: true,
mode: AutomationMode.LOCATION,
behavior: 'OnOff',
},
time: {
activation: '18:00',
deactivation: '7:00',
},
location: {
latitude: 59,
longitude: 53,
},
previewNewDesign: true,
previewNewestDesign: false,
enableForPDF: false,
enableForProtectedPages: true,
enableContextMenus: true,
detectDarkTheme: true,
};
const validSetCopy = JSON.parse(JSON.stringify(validSet));
validation = validateSettings(validSet);
expect(validation.errors).toEqual([]);
expect(validSet).toEqual(validSetCopy);
});