'use strict'; import CMS, { Helpers, KEYS, uid } from '../../../static/cms/js/modules/cms.base'; import jQuery from 'jquery'; import { rewire, resetRewire } from './helpers/rewire'; vi.mock('../../../static/cms/js/modules/loader', async () => { const { lazyMock, registerActual } = await import('./helpers/rewire'); registerActual('loader', await vi.importActual('../../../static/cms/js/modules/loader')); return lazyMock('loader', { showLoader: 'showLoader', hideLoader: 'hideLoader' }); }); var $ = jQuery; var showLoader; var hideLoader; CMS.API.Helpers = Helpers; CMS.KEYS = KEYS; window.CMS = CMS; describe('cms.base.js', function() { fixture.setBase('cms/tests/frontend/unit/fixtures'); // same implementation as in CMS.API.Helpers._isStorageSupported var _isLocalStorageSupported = (function() { var mod = 'modernizr'; try { localStorage.setItem(mod, mod); localStorage.removeItem(mod); return true; } catch { // istanbul ignore next return false; } })(); beforeEach(() => { showLoader = jasmine.createSpy(); hideLoader = jasmine.createSpy(); rewire('showLoader', showLoader); rewire('hideLoader', hideLoader); }); afterEach(() => { resetRewire('showLoader'); resetRewire('hideLoader'); }); it('creates CMS namespace', function() { expect(CMS).toBeDefined(); expect(CMS).toEqual(jasmine.any(Object)); expect(CMS.API).toEqual(jasmine.any(Object)); expect(KEYS).toEqual(jasmine.any(Object)); }); describe('CMS.API', function() { it('exists', function() { expect(CMS.API.Helpers).toEqual(jasmine.any(Object)); // this expectation is here so no one ever forgets to add a test expect(Object.keys(CMS.API.Helpers).length).toEqual(27); }); describe('.reloadBrowser()', function() { /** * @function createFakeWindow * @returns {Object} */ function createFakeWindow() { return { parent: { location: { href: '', reload: jasmine.createSpy() }, CMS: { config: { request: { model: 'model', pk: 'pk' } }, API: {} }, setTimeout: jasmine.createSpy().and.callFake(function(cb, timeout) { expect(timeout).toEqual(0); cb(); }) } }; } /** * @function createWindowSpy * @param {Object} win */ function createWindowSpy(win) { spyOn(CMS.API.Helpers, '_getWindow').and.callFake(function() { return win; }); } it('reloads the browser if no arguments passed', function() { var win = createFakeWindow(); createWindowSpy(win); CMS.API.Helpers.reloadBrowser(); expect(win.parent.location.reload).toHaveBeenCalled(); }); it('redirects the browser to an url if `url` was passed', function() { var win = createFakeWindow(); createWindowSpy(win); CMS.API.Helpers.reloadBrowser('/url'); expect(win.parent.location.href).toEqual('/url'); expect(win.parent.location.reload).not.toHaveBeenCalled(); }); it('uses correct timeout', function() { var win = createFakeWindow(); createWindowSpy(win); win.parent.CMS.config.request.url = '/my-url'; spyOn(CMS.API.Helpers, 'reloadBrowser').and.callThrough(); win.parent.setTimeout = jasmine.createSpy().and.callFake(function(cb, timeout) { expect(timeout).toEqual(50); cb(); }); // for some reason jasmine.Ajax.install() didn't work here // presumably because of window.parent shenanigans. spyOn($, 'ajax').and.callFake(function(opts) { opts.success(''); }); expect(CMS.API.Helpers.reloadBrowser('/new-url', 50, false)).toEqual(undefined); expect($.ajax).not.toHaveBeenCalled(); expect(win.parent.location.href).toEqual('/new-url'); }); }); describe('onPluginSave()', function() { beforeEach(() => { CMS.API.StructureBoard = { invalidateState: jasmine.createSpy() }; }); afterEach(() => { CMS.API.Helpers.dataBridge = null; }); it('invalidates state if the plugin was edited', () => { CMS._instances = [{ options: { plugin_id: 1, type: 'plugin' } }]; CMS.API.Helpers.dataBridge = { plugin_id: '1', action: 'edit' }; CMS.API.Helpers.onPluginSave(); expect(CMS.API.StructureBoard.invalidateState).toHaveBeenCalledWith( 'EDIT', { plugin_id: '1', action: 'edit' } ); }); it('invalidates state if the plugin was added', () => { CMS._instances = []; CMS.API.Helpers.dataBridge = { plugin_id: '1', action: 'add' }; CMS.API.Helpers.onPluginSave(); expect(CMS.API.StructureBoard.invalidateState).toHaveBeenCalledWith( 'ADD', { plugin_id: '1', action: 'add' } ); }); it('invalidates state if the plugin was added', () => { CMS._instances = [{ options: { plugin_id: 1, type: 'generic' } }]; // FrontendEditableMixin issues "change" action, databridge processes it as an // add action CMS.API.Helpers.dataBridge = { plugin_id: '1', action: 'change' }; CMS.API.Helpers.onPluginSave(); expect(CMS.API.StructureBoard.invalidateState).toHaveBeenCalledWith( 'ADD', { plugin_id: '1', action: 'change' } ); }); it('proxies to reloadBrowser', function() { spyOn(CMS.API.Helpers, 'reloadBrowser'); CMS.API.Helpers._isReloading = false; CMS.API.Helpers.onPluginSave(); expect(CMS.API.Helpers.reloadBrowser).toHaveBeenCalledTimes(1); expect(CMS.API.Helpers.reloadBrowser).toHaveBeenCalledWith(null, 300); }); }); describe('.preventSubmit()', function() { beforeEach(function(done) { fixture.load('toolbar_form.html'); $(function() { done(); }); }); afterEach(function() { fixture.cleanup(); }); it('should prevent forms from being submitted when one form is submitted', function() { var submitCallback = jasmine.createSpy().and.returnValue(false); CMS.API.Helpers.preventSubmit(); var form = $('.cms-toolbar #form1'); var input1 = $('input[type=submit]').eq(0); var input2 = $('input[type=submit]').eq(1); form.submit(submitCallback); form.find('input').trigger('click'); expect(input1).toHaveCss({ opacity: '0.5' }); expect(input2).toHaveCss({ opacity: '0.5' }); spyOnEvent(input1, 'click'); spyOnEvent(input2, 'click'); input1.trigger('click'); input2.trigger('click'); expect('click').toHaveBeenPreventedOn(input1); expect('click').toHaveBeenPreventedOn(input2); expect(showLoader).toHaveBeenCalled(); expect(submitCallback).toHaveBeenCalled(); }); }); describe('.csrf()', function() { it('should set csrf token on ajax requests', function() { var token = 'csrf'; var request; jasmine.Ajax.install(); $.ajax('/test'); request = jasmine.Ajax.requests.mostRecent(); expect(request.requestHeaders['X-CSRFToken']).toEqual(undefined); spyOn($, 'ajaxSetup').and.callThrough(); CMS.API.Helpers.csrf(token); expect($.ajaxSetup).toHaveBeenCalled(); expect($.ajaxSetup.calls.count()).toEqual(1); $.ajax('/test'); request = jasmine.Ajax.requests.mostRecent(); expect(request.requestHeaders['X-CSRFToken']).toEqual(token); jasmine.Ajax.uninstall(); }); }); describe('.setSettings()', function() { beforeEach(function() { CMS.API.Helpers._isStorageSupported = true; if (_isLocalStorageSupported) { localStorage.clear(); } jasmine.Ajax.install(); jasmine.Ajax.stubRequest('/my-settings-url').andReturn({ status: 200, contentType: 'text/plain', responseText: '{"serverSetting":true,"version":"same"}' }); jasmine.Ajax.stubRequest('/my-settings-url-with-empty-response').andReturn({ status: 200, contentType: 'text/plain', responseText: '' }); jasmine.Ajax.stubRequest('/my-settings-url').andReturn({ status: 200, contentType: 'text/plain', responseText: '{"serverSetting":true}' }); jasmine.Ajax.stubRequest('/my-broken-settings-url').andReturn({ status: 500, responseText: 'Fail' }); }); afterEach(function() { jasmine.Ajax.uninstall(); }); it('should put settings in localStorage if it is available', function() { if (!_isLocalStorageSupported) { pending('Localstorage is not supported, skipping'); } CMS.config = { settings: {} }; expect(CMS.API.Helpers.setSettings({ mySetting: true })).toEqual({ mySetting: true }); expect(localStorage.getItem('cms_cookie')).toEqual('{"mySetting":true}'); CMS.config.settings = { mySetting: false }; expect(CMS.API.Helpers.setSettings({ anotherSetting: true })).toEqual({ mySetting: false, anotherSetting: true }); expect(localStorage.getItem('cms_cookie')).toEqual('{"mySetting":false,"anotherSetting":true}'); expect(CMS.API.Helpers.setSettings({ mySetting: true })).toEqual({ mySetting: true }); expect(localStorage.getItem('cms_cookie')).toEqual('{"mySetting":true}'); }); it('makes a synchronous request to the session url if localStorage is not available', function() { CMS.API.Helpers._isStorageSupported = false; CMS.config = { urls: { settings: '/my-settings-url' } }; expect(CMS.API.Helpers.setSettings({ mySetting: true })).toEqual({ serverSetting: true }); expect(showLoader.calls.count()).toEqual(1); expect(hideLoader.calls.count()).toEqual(1); }); it('uses default settings if response is empty', function() { CMS.API.Helpers._isStorageSupported = false; CMS.config = { settings: { defaultSetting: true }, urls: { settings: '/my-settings-url-with-empty-response' } }; expect(CMS.API.Helpers.setSettings({ mySetting: true })).toEqual({ defaultSetting: true }); expect(showLoader.calls.count()).toEqual(1); expect(hideLoader.calls.count()).toEqual(1); }); it('makes a synchronous request which can fail', function() { CMS.API.Helpers._isStorageSupported = false; CMS.config = { urls: { settings: '/my-broken-settings-url' } }; CMS.API.Messages = { open: jasmine.createSpy() }; expect(CMS.API.Helpers.setSettings({ mySetting: true })).toEqual({ mySetting: true }); expect(showLoader).toHaveBeenCalled(); expect(hideLoader).not.toHaveBeenCalled(); expect(CMS.API.Messages.open).toHaveBeenCalledWith({ message: 'Fail | 500 error', error: true }); }); }); describe('.getSettings()', function() { beforeEach(function() { CMS.API.Helpers._isStorageSupported = true; if (_isLocalStorageSupported) { localStorage.clear(); } jasmine.Ajax.install(); jasmine.Ajax.stubRequest('/my-settings-url-with-empty-response').andReturn({ status: 200, contentType: 'text/plain', responseText: '' }); jasmine.Ajax.stubRequest('/my-settings-url').andReturn({ status: 200, contentType: 'text/plain', responseText: `{"serverSetting":true,"version":"${__CMS_VERSION__}","edit_off":1}` }); jasmine.Ajax.stubRequest('/my-broken-settings-url').andReturn({ status: 500, responseText: 'Fail' }); }); afterEach(function() { jasmine.Ajax.uninstall(); }); it('should get settings from localStorage', function() { if (!_isLocalStorageSupported) { pending('Localstorage is not supported, skipping'); } localStorage.setItem( 'cms_cookie', JSON.stringify({ version: __CMS_VERSION__, presetSetting: true, edit_off: 1 }) ); CMS.settings = {}; CMS.config = { settings: { version: __CMS_VERSION__ } }; expect(CMS.API.Helpers.getSettings()).toEqual({ presetSetting: true, version: __CMS_VERSION__, edit_off: 1 }); expect(showLoader.calls.count()).toEqual(0); expect(hideLoader.calls.count()).toEqual(0); }); it('should get settings from config if there is a version mismatch', function() { if (!_isLocalStorageSupported) { pending('Localstorage is not supported, skipping'); } localStorage.setItem( 'cms_cookie', JSON.stringify({ version: 'old', presetSetting: true, edit_off: 1 }) ); CMS.settings = {}; CMS.config = { settings: { version: 'new', other_stuff: true } }; expect(CMS.API.Helpers.getSettings()).toEqual({ version: 'new', other_stuff: true }); expect(showLoader.calls.count()).toEqual(0); expect(hideLoader.calls.count()).toEqual(0); }); it('should get settings from localStorage and cms.config if required settings are not there', function() { if (!_isLocalStorageSupported) { pending('Localstorage is not supported, skipping'); } localStorage.setItem('cms_cookie', JSON.stringify({ presetSetting: true })); CMS.settings = {}; CMS.config = { settings: { fromConfig: true } }; expect(CMS.API.Helpers.getSettings()).toEqual({ fromConfig: true }); expect(showLoader.calls.count()).toEqual(0); expect(hideLoader.calls.count()).toEqual(0); }); it('should first set settings from CMS.config is there are no settings in localstorage', function() { if (!_isLocalStorageSupported) { pending('Localstorage is not supported, skipping'); } CMS.settings = {}; CMS.config = { settings: { configSetting: true } }; spyOn(CMS.API.Helpers, 'setSettings').and.callThrough(); expect(CMS.API.Helpers.getSettings()).toEqual({ configSetting: true }); expect(showLoader.calls.count()).toEqual(0); expect(hideLoader.calls.count()).toEqual(0); expect(CMS.API.Helpers.setSettings).toHaveBeenCalled(); }); it('makes a synchronous request to the session url if localStorage is not available', function() { CMS.API.Helpers._isStorageSupported = false; CMS.config = { settings: { version: __CMS_VERSION__ }, urls: { settings: '/my-settings-url' } }; expect(CMS.API.Helpers.getSettings()).toEqual({ version: __CMS_VERSION__, serverSetting: true, edit_off: 1 }); expect(showLoader.calls.count()).toEqual(1); expect(hideLoader.calls.count()).toEqual(1); }); it('uses default settings if response is empty', function() { CMS.API.Helpers._isStorageSupported = false; CMS.config = { settings: { defaultSetting: true }, urls: { settings: '/my-settings-url-with-empty-response' } }; expect(CMS.API.Helpers.getSettings()).toEqual({ defaultSetting: true }); expect(showLoader.calls.count()).toEqual(2); expect(hideLoader.calls.count()).toEqual(2); }); it('makes a synchronous request which can fail', function() { CMS.API.Helpers._isStorageSupported = false; CMS.config = { settings: { test: false }, urls: { settings: '/my-broken-settings-url' } }; CMS.API.Messages = { open: jasmine.createSpy() }; expect(CMS.API.Helpers.getSettings()).toEqual({ test: false }); expect(showLoader).toHaveBeenCalled(); expect(hideLoader).not.toHaveBeenCalled(); expect(CMS.API.Messages.open).toHaveBeenCalledWith({ message: 'Fail | 500 error', error: true }); }); }); describe('.makeURL()', function() { it('outputs the same url when no additional params passed', function() { var url; url = CMS.API.Helpers.makeURL('test'); expect(url).toEqual('test'); url = CMS.API.Helpers.makeURL('https://google.com/'); expect(url).toEqual('https://google.com/'); }); it('outputs new url when additional params passed', function() { var url; url = CMS.API.Helpers.makeURL('test', [['param', '1']]); expect(url).toEqual('test?param=1'); }); it('outputs new url when there are multiple additional params', function() { var url; url = CMS.API.Helpers.makeURL('test', [['param', '1'], ['another', '2']]); expect(url).toEqual('test?param=1&another=2'); url = CMS.API.Helpers.makeURL('test?param=1', [['another', '2']]); expect(url).toEqual('test?param=1&another=2'); url = CMS.API.Helpers.makeURL('test?param=1&another=2', [['different', '3']]); expect(url).toEqual('test?param=1&another=2&different=3'); url = CMS.API.Helpers.makeURL('test?param=1&another=2', [['different', '3']]); expect(url).toEqual('test?param=1&another=2&different=3'); url = CMS.API.Helpers.makeURL('test?param=1&another=2&again=3', [['different', '3']]); expect(url).toEqual('test?param=1&another=2&again=3&different=3'); }); it('replaces param values with new ones if they match', function() { var url; url = CMS.API.Helpers.makeURL('test?param=1&another=2', [['another', '3']]); expect(url).toEqual('test?param=1&another=3'); url = CMS.API.Helpers.makeURL('test?param=1&another=2', [['another', '3'], ['param', '4']]); expect(url).toEqual('test?another=3¶m=4'); }); it('understands hashes in the url', function() { var url; url = CMS.API.Helpers.makeURL('test#hash', [['param', '1'], ['another', '2']]); expect(url).toEqual('test?param=1&another=2#hash'); url = CMS.API.Helpers.makeURL('test#hash#with#hash', [['param', '1'], ['another', '2']]); expect(url).toEqual('test?param=1&another=2#hash#with#hash'); url = CMS.API.Helpers.makeURL('test#', [['param', '1'], ['another', '2']]); expect(url).toEqual('test?param=1&another=2'); url = CMS.API.Helpers.makeURL('test#hash&stuff', [['param', '1'], ['another', '2']]); expect(url).toEqual('test?param=1&another=2#hash&stuff'); url = CMS.API.Helpers.makeURL('test#hash&stuff', []); expect(url).toEqual('test#hash&stuff'); }); }); describe('.secureConfirm()', function() { it('returns true if confirm is prevented', function() { spyOn(window, 'confirm').and.callFake(function(message) { expect(message).toEqual('message'); return false; }); expect(CMS.API.Helpers.secureConfirm('message')).toEqual(true); }); it('returns actual value if confirm is not prevented', function() { jasmine.clock().install(); jasmine.clock().mockDate(); spyOn(window, 'confirm').and.callFake(function() { jasmine.clock().tick(15); return false; }); expect(CMS.API.Helpers.secureConfirm('cms')).toEqual(false); window.confirm.and.callFake(function() { jasmine.clock().tick(15); return true; }); expect(CMS.API.Helpers.secureConfirm('cms')).toEqual(true); jasmine.clock().uninstall(); }); }); describe('.addEventListener()', function() { beforeEach(function(done) { fixture.load('cms_root.html'); $(function() { done(); }); }); afterEach(function() { fixture.cleanup(); }); it('adds an event', function() { CMS._eventRoot = $('#cms-top'); CMS.API.Helpers.addEventListener('my-event', $.noop); expect($('#cms-top')).toHandle('cms-my-event'); }); it('adds multiple events', function() { CMS._eventRoot = $('#cms-top'); CMS.API.Helpers.addEventListener('my-event my-other-event', $.noop); expect($('#cms-top')).toHandle('cms-my-event'); expect($('#cms-top')).toHandle('cms-my-other-event'); }); }); describe('.removeEventListener()', function() { beforeEach(function(done) { fixture.load('cms_root.html'); $(function() { done(); }); }); afterEach(function() { fixture.cleanup(); }); it('removes an event', function() { CMS._eventRoot = $('#cms-top'); CMS.API.Helpers.addEventListener('my-event', $.noop); CMS.API.Helpers.removeEventListener('my-event'); expect($('#cms-top')).not.toHandle('cms-my-event'); }); it('removes an event with correct handler', function() { CMS._eventRoot = $('#cms-top'); var fn = function() { expect(true).toEqual(true); }; CMS.API.Helpers.addEventListener('my-event', $.noop); CMS.API.Helpers.addEventListener('my-event', fn); CMS.API.Helpers.removeEventListener('my-event', $.noop); expect($('#cms-top')).toHandleWith('cms-my-event', fn); expect($('#cms-top')).not.toHandleWith('cms-my-event', $.noop); }); it('removes multiple events', function() { CMS._eventRoot = $('#cms-top'); CMS.API.Helpers.addEventListener('my-event my-other-event', $.noop); CMS.API.Helpers.removeEventListener('my-event my-other-event'); expect($('#cms-top')).not.toHandle('cms-my-event'); expect($('#cms-top')).not.toHandle('cms-my-other-event'); }); }); describe('.dispatchEvent()', function() { beforeEach(function(done) { fixture.load('cms_root.html'); $(function() { done(); }); }); afterEach(function() { fixture.cleanup(); }); it('dispatches an event', function() { CMS._eventRoot = $('#cms-top'); var fn = jasmine.createSpy(); CMS.API.Helpers.addEventListener('my-event', fn); CMS.API.Helpers.dispatchEvent('my-event'); expect(fn).toHaveBeenCalled(); }); it('does not dispatch multiple events', function() { CMS._eventRoot = $('#cms-top'); var fn1 = jasmine.createSpy(); var fn2 = jasmine.createSpy(); CMS.API.Helpers.addEventListener('my-event', fn1); CMS.API.Helpers.addEventListener('my-another-event', fn2); CMS.API.Helpers.dispatchEvent('my-event my-another-event'); expect(fn1).not.toHaveBeenCalled(); expect(fn2).not.toHaveBeenCalled(); }); it('can attach payload to event', function() { CMS._eventRoot = $('#cms-top'); var fn = jasmine.createSpy(); CMS.API.Helpers.addEventListener('my-event', fn); CMS.API.Helpers.dispatchEvent('my-event', { payload: 'djangoCMS' }); expect(fn).toHaveBeenCalledWith(jasmine.any(Object), { payload: 'djangoCMS' }); }); it('returns dispatched event', function() { CMS._eventRoot = $('#cms-top'); var fn = jasmine.createSpy(); CMS.API.Helpers.addEventListener('my-event', fn); expect(CMS.API.Helpers.dispatchEvent('my-event') instanceof $.Event).toEqual(true); }); it('can has namespaces', function() { CMS._eventRoot = $('#cms-top'); var fn = jasmine.createSpy(); CMS.API.Helpers.addEventListener('my-event.namespace', fn); CMS.API.Helpers.dispatchEvent('my-event', { payload: 'djangoCMS' }); expect(fn).toHaveBeenCalledWith(jasmine.any(Object), { payload: 'djangoCMS' }); }); it('can has namespaces the other way', function() { CMS._eventRoot = $('#cms-top'); var fn = jasmine.createSpy(); CMS.API.Helpers.addEventListener('my-event', fn); CMS.API.Helpers.dispatchEvent('my-event.namespace', { payload: 'djangoCMS' }); expect(fn).not.toHaveBeenCalled(); }); }); describe('.preventTouchScrolling()', function() { it('prevents touch move on an element', function() { CMS.API.Helpers.preventTouchScrolling($(document), 'tests'); expect($(document)).toHandle('touchmove'); expect($(document)).toHandle('touchmove.cms.preventscroll.tests'); var event = spyOnEvent(document, 'touchmove'); $(document).trigger('touchmove'); expect(event).toHaveBeenPrevented(); }); }); // depends on the previous one describe('.allowTouchScrolling()', function() { it('allows touch move on an element', function() { expect($(document)).toHandle('touchmove'); expect($(document)).toHandle('touchmove.cms.preventscroll.tests'); CMS.API.Helpers.allowTouchScrolling($(document), 'tests'); var event = spyOnEvent(document, 'touchmove'); $(document).trigger('touchmove'); expect(event).not.toHaveBeenPrevented(); }); }); describe('._getWindow()', function() { it('returns window', function() { expect(CMS.API.Helpers._getWindow()).toEqual(window); }); }); describe('.uid()', function() { it('returns a number', function() { expect(uid()).toEqual(jasmine.any(Number)); }); it('returns always different ids', function() { expect(uid()).not.toBe(uid()); }); }); describe('.updateUrlWithPath()', function() { it('supports query strings', function() { spyOn(CMS.API.Helpers, '_getWindow').and.returnValue({ location: { pathname: '/de/', search: '?language=en' } }); expect(CMS.API.Helpers.updateUrlWithPath('/')).toEqual('/?cms_path=%2Fde%2F%3Flanguage%3Den'); }); it('sets additional params on urls that have no query string yet', function() { spyOn(CMS.API.Helpers, '_getWindow').and.returnValue({ location: { pathname: '/de/', search: '' } }); expect(CMS.API.Helpers.updateUrlWithPath('/admin/app/model/1/change/', [['_popup', 1]])).toEqual( '/admin/app/model/1/change/?cms_path=%2Fde%2F&_popup=1' ); }); it('sets additional params on urls that already have a query string', function() { spyOn(CMS.API.Helpers, '_getWindow').and.returnValue({ location: { pathname: '/de/', search: '' } }); expect( CMS.API.Helpers.updateUrlWithPath('/admin/app/model/1/change/?language=en', [['_popup', 1]]) ).toEqual('/admin/app/model/1/change/?language=en&cms_path=%2Fde%2F&_popup=1'); }); }); describe('.setColorScheme() and .getColorScheme()', function() { it('allows setting of dark color scheme', function() { CMS.API.Helpers.setColorScheme('dark'); expect(CMS.API.Helpers.getColorScheme()).toEqual('dark'); }); it('allows setting of light color scheme', function() { CMS.API.Helpers.setColorScheme('light'); expect(CMS.API.Helpers.getColorScheme()).toEqual('light'); }); it('allows setting of system color scheme', function() { CMS.API.Helpers.setColorScheme('auto'); expect(CMS.API.Helpers.getColorScheme()).toEqual('auto'); }); }); }); });