mediawiki-skins-MinervaNeue/tests/qunit/skins.minerva.scripts/page-issues/parser.test.js
Timo Tijhof 548e94da98 tests: Adopt private require() for skins.minerva.scripts
Added to MediaWiki core last year with I9fca9fdf9b7623b1.

This fixes a confusing assertion in page-issues/index.test.js,
where for "insertBannersOrNotice()" it was asserting that the HTML
contain "⧼skin-minerva-issue-learn-more⧽", where the ⧼ character
indicates the message is not found (i.e. an error).

The test had to be written this way in order to pass, because
the skins.minerva.scripts module was not actually loaded, and thus
its templates and messages are not present either. This lack was
filled in by index.js for mw.templates, but not mw.messages.

By adopting private require(), these workarounds can all be removed.

== Motivation ==

In change I3a4024ccf90e505581, I'm working on improving the testrunner
config to enforce uselang=qqx on all tests. This is passing except
for GrowthExperiments and Minerva, both of which have the above
workarounds in place that caused a message to be undefined, and then
kept in the assertion expectation. When using uselang=qqx, values are
returned as (key) instead of ⧼key⧽, which exposes these message
existence errors.

By removing this workaround, the test will simply import the module
in the test as normal, thus the messages will exist, and thus it
will expect (key), and thus it will continue to pass even after
enforcing uselang=qqx.

Change-Id: Ib68f45d93a7054ed8bd35fc5644e2852f2f90248
2024-08-23 19:04:36 +00:00

188 lines
5.5 KiB
JavaScript

( function () {
const iconElement = document.createElement( 'div' ),
pageIssuesParser = require( 'skins.minerva.scripts/page-issues/parser.js' ),
extractMessage = pageIssuesParser.extract;
iconElement.classList.add( 'minerva-icon--issue-generic-defaultColor', 'minerva-ambox-icon' );
QUnit.module( 'Minerva pageIssuesParser' );
/**
* @param {string} className
* @return {Element}
*/
function newBox( className ) {
const box = document.createElement( 'div' );
box.className = className;
return box;
}
QUnit.test( 'extractMessage', ( assert ) => {
[
[
$( '<div>' ).html(
'<div class="mbox-text">Smelly</div>'
).appendTo( '<div class="mw-collapsible-content" />' ),
{
issue: {
severity: 'DEFAULT',
iconElement,
grouped: true
},
text: '<p>Smelly</p>'
},
'When the box is a child of mw-collapsible-content it grouped'
],
[
$( '<div>' ).html(
'<div class="mbox-text">Dirty</div>'
),
{
issue: {
severity: 'DEFAULT',
iconElement,
grouped: false
},
text: '<p>Dirty</p>'
},
'When the box is not child of mw-collapsible-content it !grouped'
]
].forEach( ( test ) => {
const msg = extractMessage( test[ 0 ] );
delete msg.$el;
assert.deepEqual(
msg,
test[ 1 ],
test[ 2 ]
);
} );
} );
QUnit.test( 'parseSeverity', ( assert ) => {
const tests = [
[ '', 'DEFAULT', 'empty' ],
[ 'foo', 'DEFAULT', 'unknown' ],
[ 'ambox-style', 'LOW', 'style' ],
[ 'ambox-content', 'MEDIUM', 'content' ],
[ 'ambox-speedy', 'HIGH', 'speedy' ],
[ 'ambox-delete', 'HIGH', 'delete' ],
// Move has an "unknown" severity and falls into DEFAULT.
[ 'ambox-move', 'DEFAULT', 'move' ],
// Point of view uses ambox-content to identify correct severity.
[ 'ambox-content ambox-POV', 'MEDIUM', 'point of view' ]
// Mixed severities such as 'ambox-style ambox-content' are not prioritized.
];
tests.forEach( ( params, i ) => {
const className = params[ 0 ];
const expect = params[ 1 ];
const test = params[ 2 ];
const box = newBox( className );
assert.strictEqual(
pageIssuesParser.test.parseSeverity( box ),
expect,
'Result should be the correct severity; case ' + i + ': ' + test + '.'
);
} );
} );
QUnit.test( 'parseType', ( assert ) => {
const tests = [
[ '', 'DEFAULT', 'issue-generic', 'empty' ],
[ 'foo', 'DEFAULT', 'issue-generic', 'unknown' ],
[ 'ambox-move', 'DEFAULT', 'issue-type-move', 'move' ],
[ 'ambox-POV', 'MEDIUM', 'issue-type-point-of-view', 'point of view' ],
[ '', 'DEFAULT', 'issue-generic', 'Default severity' ],
[ '', 'LOW', 'issue-severity-low', 'Low severity' ],
[ '', 'MEDIUM', 'issue-severity-medium', 'Medium severity' ],
[ '', 'HIGH', 'issue-generic', 'HIGH severity' ]
];
tests.forEach( ( params, i ) => {
const className = params[ 0 ];
const severity = params[ 1 ];
const expect = {
name: params[ 2 ],
severity: severity
};
const test = params[ 3 ];
const box = newBox( className );
assert.propEqual(
pageIssuesParser.test.parseType( box, severity ),
expect,
'Result should be the correct icon type; case ' + i + ': ' + test + '.'
);
} );
} );
QUnit.test( 'parseGroup', ( assert ) => {
const tests = [
[ undefined, false, 'orphaned' ],
[ '', false, 'ungrouped' ],
[ 'mw-collapsible-content', true, 'grouped' ]
];
tests.forEach( ( params, i ) => {
const parentClassName = params[ 0 ];
const expect = params[ 1 ];
const test = params[ 2 ];
const box = newBox( '' );
if ( parentClassName !== undefined ) {
const parent = document.createElement( 'div' );
parent.className = parentClassName;
parent.appendChild( box );
}
assert.strictEqual(
pageIssuesParser.test.parseGroup( box ),
expect,
'Result should be the correct grouping; case ' + i + ': ' + test + '.'
);
} );
} );
QUnit.test( 'iconName', ( assert ) => {
const tests = [
[ '', 'DEFAULT', 'issue-generic-defaultColor' ],
[ '', 'LOW', 'issue-severity-low-lowColor' ],
[ '', 'MEDIUM', 'issue-severity-medium-mediumColor' ],
[ '', 'HIGH', 'issue-generic-highColor' ],
[ 'ambox-move', 'DEFAULT', 'issue-type-move-defaultColor' ],
[ 'ambox-POV', 'MEDIUM', 'issue-type-point-of-view-mediumColor' ],
// ResourceLoader only supplies color variants for the generic type. Ensure impossible
// combinations are forbidden.
[ 'ambox-style ambox-POV', 'LOW', 'issue-type-point-of-view-mediumColor' ],
[ 'ambox-content ambox-move', 'MEDIUM', 'issue-type-move-defaultColor' ]
];
tests.forEach( ( params, i ) => {
const className = params[ 0 ];
const severity = params[ 1 ];
const expect = params[ 2 ];
const box = newBox( className );
assert.strictEqual(
pageIssuesParser.iconName( box, severity ),
expect,
'Result should be the correct ResourceLoader icon name; case ' + i + ': ' + severity + '.'
);
} );
} );
QUnit.test( 'maxSeverity', ( assert ) => {
const tests = [
[ [], 'DEFAULT' ],
[ [ 'DEFAULT' ], 'DEFAULT' ],
[ [ 'DEFAULT', 'LOW' ], 'LOW' ],
[ [ 'DEFAULT', 'LOW', 'MEDIUM' ], 'MEDIUM' ],
[ [ 'DEFAULT', 'LOW', 'MEDIUM', 'HIGH' ], 'HIGH' ],
[ [ 'HIGH', 'DEFAULT', 'LOW', 'MEDIUM' ], 'HIGH' ],
[ [ 'DEFAULT', 'HIGH', 'LOW', 'MEDIUM' ], 'HIGH' ]
];
tests.forEach( ( params, i ) => {
const severities = params[ 0 ];
const expect = params[ 1 ];
assert.strictEqual(
pageIssuesParser.maxSeverity( severities ),
expect,
'Result should be the highest severity in the array; case ' + i + '.'
);
} );
} );
}() );