diff --git a/resources/skins.minerva.scripts/pageIssues.js b/resources/skins.minerva.scripts/pageIssues.js index 0ea0a18..dabe661 100644 --- a/resources/skins.minerva.scripts/pageIssues.js +++ b/resources/skins.minerva.scripts/pageIssues.js @@ -26,6 +26,7 @@ /** * @typedef {Object} IssueSummary * @prop {string} severity A PageIssue.severity. + * @prop {Boolean} isMultiple Whether or not the issue is part of a "multiple issues" template. * @prop {string} icon HTML string. * @prop {string} text HTML string. */ @@ -36,11 +37,27 @@ } /** - * @param {IssueSummary} summary - * @return {string} + * Array.reduce callback that returns the severity of page issues. + * In the case that a page-issue is part of a "multiple issues" template, + * returns the maximum severity for that group of issues. + * + * @param {array} acc - the return array containing severities + * @param {IssueSummary} summary current IssueSummary object + * @param {number} currentIndex current index of pageIssues + * @param {array} pageIssues array of pageIssues + * + * @return {array} acc */ - function formatPageIssuesSeverity( summary ) { - return summary.severity; + function formatPageIssuesSeverity( acc, summary, currentIndex, pageIssues ) { + var lastItem = pageIssues[ currentIndex - 1 ]; + if ( lastItem && lastItem.isMultiple && summary.isMultiple ) { + acc[ acc.length - 1 ] = pageIssuesParser.maxSeverity( + [ lastItem.severity, summary.severity ] + ); + } else { + acc.push( summary.severity ); + } + return acc; } /** @@ -50,11 +67,12 @@ * @return {IssueSummary} */ function extractMessage( $box ) { - var selector = '.mbox-text, .ambox-text', + var SELECTOR = '.mbox-text, .ambox-text', + MULTIPLE_SELECTOR = '.mw-collapsible-content', $container = $( '
Smelly
' + }, + 'When the box is a child of mw-collapsible-content it isMultiple' + ], + [ + $( '' ).html( + 'Dirty
' + }, + 'When the box is not child of mw-collapsible-content it !isMultiple' + ] + ].forEach( function ( test ) { + assert.deepEqual( + extractMessage( test[ 0 ] ), + test[ 1 ], + test[ 2 ] + ); + } ); + } ); + QUnit.test( 'getAllIssuesSections', function ( assert ) { - var allIssuesOldTreatment, allIssuesNewTreatment; + var multipleIssuesWithDeletion, + multipleIssues, allIssuesOldTreatment, allIssuesNewTreatment; allIssuesOldTreatment = { 0: [ MEDIUM_ISSUE, @@ -70,6 +119,21 @@ MEDIUM_ISSUE ] }; + multipleIssues = { + 0: [ + util.extend( {}, MEDIUM_ISSUE, { isMultiple: true } ), + util.extend( {}, LOW_ISSUE, { isMultiple: true } ), + util.extend( {}, MEDIUM_ISSUE, { isMultiple: true } ) + ] + }; + multipleIssuesWithDeletion = { + 0: [ + HIGH_ISSUE, + util.extend( {}, MEDIUM_ISSUE, { isMultiple: true } ), + util.extend( {}, LOW_ISSUE, { isMultiple: true } ), + util.extend( {}, MEDIUM_ISSUE, { isMultiple: true } ) + ] + }; allIssuesNewTreatment = { 0: [ HIGH_ISSUE, @@ -90,5 +154,15 @@ [ '0', '0', '0', '1' ], 'section numbers correctly extracted from new treatment' ); + assert.deepEqual( + getAllIssuesSections( multipleIssues ), + [ '0' ], + 'multiple issues are packed into one entry since there is one box' + ); + assert.deepEqual( + getAllIssuesSections( multipleIssuesWithDeletion ), + [ '0', '0' ], + 'while multiple issues are grouped, non-multiple issues are still reported' + ); } ); }( mw.mobileFrontend ) );