mediawiki-skins-Vector/tests/jest/skins.vector.js/disableNightModeIfGadget.test.js
Steph Toyofuku 84be3de748 Minor fixes to gadget disable logic
Two small changes per comments on
https://gerrit.wikimedia.org/r/c/mediawiki/skins/Vector/+/1036766:
* remove both night mode classes in a single function call
* slightly rework alterDisableLink logic to account for the possibility
that the message is empty when we check it

Bug: T365083
Change-Id: I1633df85e768b7da2f1f542fb793089f34bcc6b7
2024-05-30 16:48:55 -07:00

152 lines
4 KiB
JavaScript

const {
isNightModeGadgetEnabled,
disableNightModeForGadget,
alterDisableLink,
alterExclusionMessage
} = require( '../../../resources/skins.vector.js/disableNightModeIfGadget.js' );
describe( 'isNightModeGadgetEnabled', () => {
beforeEach( () => {
// https://github.com/wikimedia/mw-node-qunit/pull/38
mw.loader.getState = () => null;
} );
it( 'should return false if no gadgets are installed', () => {
expect( isNightModeGadgetEnabled() ).toBeFalsy();
} );
it( 'should return false if the gadgets are installed but not enabled', () => {
// https://github.com/wikimedia/mw-node-qunit/pull/38
mw.loader.getState = () => 'registered';
expect( isNightModeGadgetEnabled() ).toBeFalsy();
} );
it( 'should return true if the gadgets are enabled', () => {
// https://github.com/wikimedia/mw-node-qunit/pull/38
mw.loader.getState = () => 'ready';
expect( isNightModeGadgetEnabled() ).toBeTruthy();
} );
} );
describe( 'disableNightModeForGadget', () => {
beforeEach( () => {
document.documentElement.classList.remove( 'skin-theme-clientpref--excluded' );
document.documentElement.classList.remove( 'skin-theme-clientpref-night' );
document.documentElement.classList.remove( 'skin-theme-clientpref-os' );
} );
it( 'should disable night mode', () => {
document.documentElement.classList.add( 'skin-theme-clientpref-night' );
disableNightModeForGadget();
expect( document.documentElement.classList.contains( 'skin-theme-clientpref-night' ) ).toBeFalsy();
} );
it( 'should disable automatic mode', () => {
document.documentElement.classList.add( 'skin-theme-clientpref-os' );
disableNightModeForGadget();
expect( document.documentElement.classList.contains( 'skin-theme-clientpref-os' ) ).toBeFalsy();
} );
it( 'should add the excluded class', () => {
disableNightModeForGadget();
expect( document.documentElement.classList.contains( 'skin-theme-clientpref--excluded' ) ).toBeTruthy();
} );
} );
describe( 'alterDisableLink', () => {
afterEach( () => {
jest.restoreAllMocks();
} );
it( 'should exit early if the gadget names are empty', () => {
jest.spyOn( mw, 'msg' ).mockImplementation( () => '' );
const p = document.createElement( 'p' );
const a = document.createElement( 'a' );
p.appendChild( a );
a.href = 'https://test.com/';
a.title = 'test';
alterDisableLink( p );
expect( a.href ).toBe( 'https://test.com/' );
expect( a.title ).toBe( 'test' );
} );
it( 'should leave the surrounding element unaltered', () => {
const p = document.createElement( 'p' );
const a = document.createElement( 'a' );
p.appendChild( a );
p.textContent = 'test';
alterDisableLink( p );
expect( p.textContent ).toBe( 'test' );
} );
it( 'should strip the title and href attributes', () => {
const p = document.createElement( 'p' );
const a = document.createElement( 'a' );
p.appendChild( a );
a.href = 'test.com';
a.title = 'test';
alterDisableLink( p );
expect( a.href ).toBe( '' );
expect( a.title ).toBe( '' );
} );
it( 'should make the link display inline', () => {
const p = document.createElement( 'p' );
const a = document.createElement( 'a' );
p.appendChild( a );
alterDisableLink( p );
expect( a.style.display ).toBe( 'inline' );
} );
// actual click test to be added after https://github.com/wikimedia/mw-node-qunit/pull/39
} );
describe( 'alterExclusionMessage', () => {
beforeEach( () => {
jest.spyOn( mw.loader, 'using' ).mockImplementation( () => ( {
then: ( fn ) => fn()
} ) );
// https://github.com/wikimedia/mw-node-qunit/pull/40
jest.spyOn( mw, 'message' ).mockImplementation( () => ( {
parseDom: () => ( {
appendTo: () => {}
} )
} ) );
} );
afterEach( () => {
jest.restoreAllMocks();
} );
it( 'should remove the existing text from the notice', () => {
const p = document.createElement( 'p' );
document.documentElement.appendChild( p );
p.className = 'exclusion-notice';
p.textContent = 'test';
alterExclusionMessage();
expect( p.textContent ).toBe( '' );
} );
} );