diff --git a/.eslintrc.json b/.eslintrc.json
index f170c0fb..70b2ee43 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -12,6 +12,16 @@
"mw": "writable",
"OO": "readonly"
},
+ "overrides": [
+ {
+ "files": [
+ "tests/*"
+ ],
+ "parserOptions": {
+ "ecmaVersion": 6
+ }
+ }
+ ],
"rules": {
"camelcase": "off",
"eqeqeq": "warn",
diff --git a/src/modules/core.js b/src/modules/core.js
index 67fe61ec..c12b3614 100644
--- a/src/modules/core.js
+++ b/src/modules/core.js
@@ -1641,78 +1641,110 @@
},
/**
- * @param {string} talkText Wikitext of the draft talk page
+ * @param {string} wikicode Wikitext of the draft talk page
* @param {string} newAssessment Value of "Article assessment" dropdown list, or "" if blank
* @param {number} revId Revision ID of the draft that is being accepted
* @param {boolean} isBiography Value of the "Is the article a biography?" check box
* @param {Array} newWikiProjects Value of the "Add WikiPrjects" part of the form. The is a chips interface called jquery.chosen. Note that if there are existing WikiProject banners on the page, the form will auto-add those to the "Add WikiProjects" part of the form when it first loads.
* @param {string} lifeStatus Value of "Is the subject alive?" dropdown list ("unknown", "living", "dead")
* @param {string} subjectName Value of the "Subject name (last, first)" text input, or "" if blank
- * @param {Array} existingWikiProjects An array of associative arrays. The associative arrays contain the keys {string} displayName (example: Somalia), {string} templateName (example: WikiProject Somalia), and {boolean} alreadyOnPage
- * @param {boolean} alreadyHasWPBio
- * @param {null} existingWPBioTemplateName
- * @return {Object} { {string} talkText, {number} countOfWikiProjectsAdded, {number} countOfWikiProjectsRemoved }
+ * @return {Object} wikicode
*/
- addTalkPageBanners: function ( talkText, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName, existingWikiProjects, alreadyHasWPBio, existingWPBioTemplateName ) {
- var talkTextPrefix = '';
+ addTalkPageBanners: function ( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName ) {
+ // build an array of all banners already on page
+ var bannerTemplates = 'wikiproject (?!banner)|football|oka';
+ var bannerTemplateRegEx = new RegExp( '{{(?:' + bannerTemplates + ')[^}]+}}', 'gi' );
+ var banners = wikicode.match( bannerTemplateRegEx ) || [];
+
+ // delete all banners already on page
+ banners.forEach( function ( v ) {
+ wikicode = wikicode.replace( v, '' );
+ } );
- // Add the AFC banner
- talkTextPrefix += '{{subst:WPAFC/article|class=' + newAssessment +
- ( revId ? '|oldid=' + revId : '' ) + '}}';
+ // delete shell already on page
+ var bannerShellTemplates = 'WikiProject banner shell|WikiProjectBanners|WikiProject Banners|WPB|WPBS|WikiProject cooperation shell|Wikiprojectbannershell|WikiProject Banner Shell|Wpb|WPBannerShell|Wpbs|Wikiprojectbanners|WP Banner Shell|WP banner shell|Bannershell|Wikiproject banner shell|WIkiProjectBanner Shell|WikiProjectBannerShell|WikiProject BannerShell|Coopshell|WikiprojectBannerShell|WikiProject Shell|Scope shell|Project shell|WikiProject shell|WikiProject banner|Wpbannershell|Multiple wikiprojects|Wikiproject banner holder|Project banner holder|WikiProject banner shell\\/test1|Article assessment|WikiProject bannershell';
+ var bannerShellRegEx = new RegExp( '{{(?:' + bannerShellTemplates + ')[^}]*}}', 'is' );
+ wikicode = wikicode.replace( bannerShellRegEx, '' );
- // Add biography banner if specified
- if ( isBiography ) {
- // Ensure we don't have duplicate biography tags
- AFCH.removeFromArray( newWikiProjects, 'WikiProject Biography' );
+ // trim. makes unit tests more stable
+ wikicode = wikicode.trim();
+
+ // add AFC banner to array
+ banners.push(
+ '{{subst:WPAFC/article' +
+ ( revId ? '|oldid=' + revId : '' ) +
+ '}}'
+ );
- talkTextPrefix += ( '\n{{WikiProject Biography|living=' +
+ // delete existing biography banner. when accepting, reviewer is forced to choose if it's a biography or not, so we'll add (or not add) our own biography banner later
+ banners = banners.filter( function ( value ) {
+ return !value.match( /^{{WikiProject Biography/i );
+ } );
+
+ // add biography banner to array
+ if ( isBiography ) {
+ banners.push(
+ '{{WikiProject Biography|living=' +
( lifeStatus !== 'unknown' ? ( lifeStatus === 'living' ? 'yes' : 'no' ) : '' ) +
- '|class=' + newAssessment + '|listas=' + subjectName + '}}' );
+ '|listas=' + subjectName +
+ '}}'
+ );
}
- // Add disambiguation banner if needed
- if ( newAssessment === 'disambig' &&
- $.inArray( 'WikiProject Disambiguation', newWikiProjects ) === -1 ) {
- newWikiProjects.push( 'WikiProject Disambiguation' );
+ // add disambiguation banner to array
+ if ( newAssessment === 'disambig' ) {
+ banners.push( '{{WikiProject Disambiguation}}' );
}
- // Add and remove WikiProjects
- /** @member {Array} */
- var wikiProjectsToAdd = newWikiProjects.filter( function ( newTemplateName ) {
- return !existingWikiProjects.some( function ( existingTplObj ) {
- return existingTplObj.templateName === newTemplateName;
- } );
- } );
- /** @member {Array} */
- var wikiProjectsToRemove = existingWikiProjects.filter( function ( existingTplObj ) {
- return !newWikiProjects.some( function ( newTemplateName ) {
- return existingTplObj.templateName === newTemplateName;
- } );
- } ).map( function ( templateObj ) {
- return templateObj.realTemplateName || templateObj.templateName;
- } );
- if ( alreadyHasWPBio && !isBiography ) {
- wikiProjectsToRemove.push( existingWPBioTemplateName || 'wikiproject biography' );
+ // add banners selected in UI to array
+ for ( var key in newWikiProjects ) {
+ banners.push( '{{' + newWikiProjects[ key ] + '}}' );
}
- $.each( wikiProjectsToAdd, function ( _index, templateName ) {
- talkTextPrefix += '\n{{' + templateName + '|class=' + newAssessment + '}}';
- } );
- $.each( wikiProjectsToRemove, function ( _index, templateName ) {
- // Regex from https://stackoverflow.com/a/5306111/1757964
- var sanitizedTemplateName = templateName.replace( /[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&' );
- talkText = talkText.replace( new RegExp( '\\n?\\{\\{\\s*' + sanitizedTemplateName + '\\s*.+?\\}\\}', 'is' ), '' );
+ // remove duplicate banners, case insensitive
+ banners = AFCH.removeDuplicateBanners( banners );
+
+ // delete |class= from banners in array
+ banners = banners.map( function ( value ) {
+ return value.replace( /\s*\|\s*class\s*=\s*[^|}]*([\n|}])/, '$1' );
} );
- // We prepend the text so that talk page content is not removed
- // (e.g. pages in `Draft:` namespace with discussion)
- talkText = talkTextPrefix + '\n\n' + talkText;
+ // Convert array back to wikitext and append to top of talk page.
+ // Always add a shell even if it's just wrapping one banner, for code simplification reasons.
+ // Add |class= to shell.
+ wikicode = '{{WikiProject banner shell' +
+ ( newAssessment ? '|class=' + newAssessment : '' ) +
+ '|\n' +
+ banners.join( '\n' ) +
+ '\n}}\n' +
+ wikicode;
- return {
- talkText: talkText,
- countOfWikiProjectsAdded: wikiProjectsToAdd.length,
- countOfWikiProjectsRemoved: wikiProjectsToRemove.length
- };
+ // add an extra line break between the last template and the first heading
+ wikicode = wikicode.replace( /}}\n==/, '}}\n\n==' );
+
+ // trim. makes unit tests more stable
+ wikicode = wikicode.trim();
+
+ return wikicode;
+ },
+
+ /**
+ * In an array of templates, remove duplicate templates, case insensitive.
+ *
+ * @param {Array} banners [ '{{WikiProject Australia}}', {{wikiproject australia}}', '{{WikiProject Australia|class=B}}' ]
+ * @return {Array} banners [ '{{WikiProject Australia}}' ]
+ */
+ removeDuplicateBanners: function ( banners ) {
+ var uniqueBanners = [];
+ var bannerMap = {};
+ banners.forEach( function ( banner ) {
+ var bannerKey = banner.toLowerCase().match( /{{[^|}]+/ )[ 0 ];
+ if ( !bannerMap[ bannerKey ] ) {
+ uniqueBanners.push( banner );
+ bannerMap[ bannerKey ] = true;
+ }
+ } );
+ return uniqueBanners;
},
/**
diff --git a/src/modules/submissions.js b/src/modules/submissions.js
index 6c2f949b..afd909f9 100644
--- a/src/modules/submissions.js
+++ b/src/modules/submissions.js
@@ -2388,29 +2388,17 @@
// ---------
talkPage.getText().done( function ( talkText ) {
- var results = AFCH.addTalkPageBanners(
+ talkText = AFCH.addTalkPageBanners(
talkText,
data.newAssessment,
afchPage.additionalData.revId,
data.isBiography,
data.newWikiProjects,
data.lifeStatus,
- data.subjectName,
- data.existingWikiProjects,
- data.alreadyHasWPBio,
- data.existingWPBioTemplateName
+ data.subjectName
);
- talkText = results.talkText;
- var summary = 'Placing [[Wikipedia:Articles for creation|Articles for creation]] banner';
- if ( results.countOfWikiProjectsAdded > 0 ) {
- summary += ', adding ' + results.countOfWikiProjectsAdded +
- ' WikiProject banner' + ( ( results.countOfWikiProjectsAdded === 1 ) ? '' : 's' );
- }
- if ( results.countOfWikiProjectsRemoved > 0 ) {
- summary += ', removing ' + results.countOfWikiProjectsRemoved +
- ' WikiProject banner' + ( ( results.countOfWikiProjectsRemoved === 1 ) ? '' : 's' );
- }
+ var summary = 'Placing [[Wikipedia:Articles for creation|Articles for creation]] banner, and possibly other banners';
if ( comments && comments.length > 0 ) {
talkText = talkText.trim() + '\n\n== Comments left by AfC reviewers ==\n' + comments.join( '\n\n' );
diff --git a/tests/test-core.js b/tests/test-core.js
index 61edc6ce..23baf169 100644
--- a/tests/test-core.js
+++ b/tests/test-core.js
@@ -3,6 +3,7 @@
*/
/* eslint-env jest */
+/* eslint-disable indent, quotes */
require( './scaffold.js' );
@@ -122,76 +123,181 @@ describe( 'AFCH.removeEmptySectionAtEnd', function () {
describe( 'AFCH.addTalkPageBanners', function () {
it( 'talk page is blank', function () {
- var talkText = '';
+ var wikicode = '';
var newAssessment = '';
var revId = 592485;
var isBiography = false;
var newWikiProjects = [];
var lifeStatus = 'unknown';
var subjectName = '';
- var existingWikiProjects = [];
- var alreadyHasWPBio = false;
- var existingWPBioTemplateName = null;
- var output = AFCH.addTalkPageBanners( talkText, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName, existingWikiProjects, alreadyHasWPBio, existingWPBioTemplateName );
- expect( output.talkText ).toBe( '{{subst:WPAFC/article|class=|oldid=592485}}\n\n' );
- expect( output.countOfWikiProjectsAdded ).toBe( 0 );
- expect( output.countOfWikiProjectsRemoved ).toBe( 0 );
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|
+{{subst:WPAFC/article|oldid=592485}}
+}}`
+ );
} );
it( 'talk page has existing sections', function () {
- var talkText = '== Hello ==\nI have a question. Can you help answer it? –[[User:Novem Linguae|\'\'\'Novem Linguae\'\'\' ]] ([[User talk:Novem Linguae|talk]]) 20:22, 10 April 2024 (UTC)';
+ var wikicode =
+`== Hello ==
+I have a question. Can you help answer it? –[[User:Novem Linguae|'''Novem Linguae''' ]] ([[User talk:Novem Linguae|talk]]) 20:22, 10 April 2024 (UTC)`;
var newAssessment = '';
var revId = 592485;
var isBiography = false;
var newWikiProjects = [];
var lifeStatus = 'unknown';
var subjectName = '';
- var existingWikiProjects = [];
- var alreadyHasWPBio = false;
- var existingWPBioTemplateName = null;
- var output = AFCH.addTalkPageBanners( talkText, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName, existingWikiProjects, alreadyHasWPBio, existingWPBioTemplateName );
- expect( output.talkText ).toBe( '{{subst:WPAFC/article|class=|oldid=592485}}\n\n== Hello ==\nI have a question. Can you help answer it? –[[User:Novem Linguae|\'\'\'Novem Linguae\'\'\' ]] ([[User talk:Novem Linguae|talk]]) 20:22, 10 April 2024 (UTC)' );
- expect( output.countOfWikiProjectsAdded ).toBe( 0 );
- expect( output.countOfWikiProjectsRemoved ).toBe( 0 );
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|
+{{subst:WPAFC/article|oldid=592485}}
+}}
+
+== Hello ==
+I have a question. Can you help answer it? –[[User:Novem Linguae|'''Novem Linguae''' ]] ([[User talk:Novem Linguae|talk]]) 20:22, 10 April 2024 (UTC)`
+ );
+ } );
+
+ it( 'talk page has existing templates, WikiProject banners on top', function () {
+ var wikicode =
+`{{WikiProject Women}}
+{{translated page|ar|بحيرة كناو|version=|small=no|insertversion=|section=}}
+`;
+ var newAssessment = '';
+ var revId = 592485;
+ var isBiography = false;
+ var newWikiProjects = [];
+ var lifeStatus = 'unknown';
+ var subjectName = '';
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|
+{{WikiProject Women}}
+{{subst:WPAFC/article|oldid=592485}}
+}}
+{{translated page|ar|بحيرة كناو|version=|small=no|insertversion=|section=}}`
+ );
+ } );
+
+ it( 'talk page has existing templates, WikiProject banners on bottom', function () {
+ var wikicode =
+`{{translated page|ar|بحيرة كناو|version=|small=no|insertversion=|section=}}
+{{WikiProject Women}}
+`;
+ var newAssessment = '';
+ var revId = 592485;
+ var isBiography = false;
+ var newWikiProjects = [];
+ var lifeStatus = 'unknown';
+ var subjectName = '';
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|
+{{WikiProject Women}}
+{{subst:WPAFC/article|oldid=592485}}
+}}
+{{translated page|ar|بحيرة كناو|version=|small=no|insertversion=|section=}}`
+ );
+ } );
+
+ it( '|class= is removed from existing banners', function () {
+ var wikicode =
+`{{WikiProject Women|class=B}}`;
+ var newAssessment = '';
+ var revId = 592485;
+ var isBiography = false;
+ var newWikiProjects = [];
+ var lifeStatus = 'unknown';
+ var subjectName = '';
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|
+{{WikiProject Women}}
+{{subst:WPAFC/article|oldid=592485}}
+}}`
+ );
} );
- // FIXME: unexpected \n between new banners and old banners. https://github.com/wikimedia-gadgets/afc-helper/issues/330
it( 'talk page has existing WikiProject banners', function () {
- var talkText = '{{WikiProject Women}}\n{{WikiProject Women\'s sport}}\n{{WikiProject Somalia}}';
+ var wikicode =
+`{{WikiProject Women}}
+{{WikiProject Women's sport}}
+{{WikiProject Somalia}}`;
var newAssessment = '';
var revId = 592507;
var isBiography = false;
var newWikiProjects = [ 'WikiProject Somalia', 'WikiProject Women', 'WikiProject Women\'s sport' ];
var lifeStatus = 'unknown';
var subjectName = '';
- var existingWikiProjects = [
- {
- displayName: 'Somalia',
- templateName: 'WikiProject Somalia',
- alreadyOnPage: true
- },
- {
- displayName: 'Women',
- templateName: 'WikiProject Women',
- alreadyOnPage: true
- },
- {
- displayName: 'Women\'s sport',
- templateName: 'WikiProject Women\'s sport',
- alreadyOnPage: true
- }
- ];
- var alreadyHasWPBio = false;
- var existingWPBioTemplateName = null;
- var output = AFCH.addTalkPageBanners( talkText, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName, existingWikiProjects, alreadyHasWPBio, existingWPBioTemplateName );
- expect( output.talkText ).toBe( '{{subst:WPAFC/article|class=|oldid=592507}}\n\n{{WikiProject Women}}\n{{WikiProject Women\'s sport}}\n{{WikiProject Somalia}}' );
- expect( output.countOfWikiProjectsAdded ).toBe( 0 );
- expect( output.countOfWikiProjectsRemoved ).toBe( 0 );
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|
+{{WikiProject Women}}
+{{WikiProject Women's sport}}
+{{WikiProject Somalia}}
+{{subst:WPAFC/article|oldid=592507}}
+}}`
+ );
+ } );
+
+ it( 'talk page has existing WikiProject banner shell and banners', function () {
+ var wikicode =
+`{{WikiProject banner shell|
+{{WikiProject Women}}
+{{WikiProject Women's sport}}
+{{WikiProject Somalia}}
+}}`;
+ var newAssessment = '';
+ var revId = 592507;
+ var isBiography = false;
+ var newWikiProjects = [ 'WikiProject Somalia', 'WikiProject Women', 'WikiProject Women\'s sport' ];
+ var lifeStatus = 'unknown';
+ var subjectName = '';
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|
+{{WikiProject Women}}
+{{WikiProject Women's sport}}
+{{WikiProject Somalia}}
+{{subst:WPAFC/article|oldid=592507}}
+}}`
+ );
} );
- // FIXME: the edit summary of 1 WikiProject banner removed is correct, but this doesn't actually remove the WikiProject banner from the talk page. https://github.com/wikimedia-gadgets/afc-helper/issues/329
- it( 'remove an existing WikiProject', function () {
- var talkText = '{{WikiProject Women}}\n{{WikiProject Women\'s sport}}\n{{WikiProject Somalia}}';
+ it( 'talk page has existing WikiProject banner shell and banners, and reviewer adds more banners', function () {
+ var wikicode =
+`{{WikiProject banner shell|
+{{WikiProject Film}}
+{{WikiProject Biography}}
+{{WikiProject Women}}
+{{WikiProject Television}}
+}}`;
+ var newAssessment = '';
+ var revId = 592507;
+ var isBiography = true;
+ var newWikiProjects = [ 'WikiProject Romania' ];
+ var lifeStatus = 'living';
+ var subjectName = 'Lazarut, Raluca';
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|
+{{WikiProject Film}}
+{{WikiProject Women}}
+{{WikiProject Television}}
+{{subst:WPAFC/article|oldid=592507}}
+{{WikiProject Biography|living=yes|listas=Lazarut, Raluca}}
+{{WikiProject Romania}}
+}}`
+ );
+ } );
+
+ // FIXME
+ it.skip( 'remove an existing WikiProject', function () {
+ var wikicode =
+`{{WikiProject Women}}
+{{WikiProject Women's sport}}
+{{WikiProject Somalia}}`;
var newAssessment = '';
var revId = 592507;
var isBiography = false;
@@ -199,109 +305,134 @@ describe( 'AFCH.addTalkPageBanners', function () {
var newWikiProjects = [ 'WikiProject Women', 'WikiProject Women\'s sport' ];
var lifeStatus = 'unknown';
var subjectName = '';
- var existingWikiProjects = [
- {
- displayName: 'Somalia',
- templateName: 'WikiProject Somalia',
- alreadyOnPage: true
- },
- {
- displayName: 'Women',
- templateName: 'WikiProject Women',
- alreadyOnPage: true
- },
- {
- displayName: 'Women\'s sport',
- templateName: 'WikiProject Women\'s sport',
- alreadyOnPage: true
- }
- ];
- var alreadyHasWPBio = false;
- var existingWPBioTemplateName = null;
- var output = AFCH.addTalkPageBanners( talkText, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName, existingWikiProjects, alreadyHasWPBio, existingWPBioTemplateName );
- expect( output.talkText ).toBe( '{{subst:WPAFC/article|class=|oldid=592507}}\n\n{{WikiProject Women}}\n{{WikiProject Women\'s sport}}\n{{WikiProject Somalia}}' );
- expect( output.countOfWikiProjectsAdded ).toBe( 0 );
- expect( output.countOfWikiProjectsRemoved ).toBe( 1 );
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|
+{{WikiProject Women}}
+{{WikiProject Women's sport}}
+{{WikiProject Somalia}}
+{{subst:WPAFC/article|oldid=592507}}
+}}`
+ );
} );
it( 'accept form is a biography with all fields filled in', function () {
- var talkText = '';
+ var wikicode = '';
var newAssessment = 'B';
var revId = 592496;
var isBiography = true;
var newWikiProjects = [ 'WikiProject Africa', 'WikiProject Alabama' ];
var lifeStatus = 'living';
var subjectName = 'Jones, Bob';
- var existingWikiProjects = [];
- var alreadyHasWPBio = false;
- var existingWPBioTemplateName = null;
- var output = AFCH.addTalkPageBanners( talkText, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName, existingWikiProjects, alreadyHasWPBio, existingWPBioTemplateName );
- expect( output.talkText ).toBe( '{{subst:WPAFC/article|class=B|oldid=592496}}\n{{WikiProject Biography|living=yes|class=B|listas=Jones, Bob}}\n{{WikiProject Africa|class=B}}\n{{WikiProject Alabama|class=B}}\n\n' );
- expect( output.countOfWikiProjectsAdded ).toBe( 2 );
- expect( output.countOfWikiProjectsRemoved ).toBe( 0 );
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|class=B|
+{{subst:WPAFC/article|oldid=592496}}
+{{WikiProject Biography|living=yes|listas=Jones, Bob}}
+{{WikiProject Africa}}
+{{WikiProject Alabama}}
+}}`
+ );
} );
it( 'lifeStatus = dead', function () {
- var talkText = '';
+ var wikicode = '';
var newAssessment = '';
var revId = 592496;
var isBiography = true;
var newWikiProjects = [];
var lifeStatus = 'dead';
var subjectName = '';
- var existingWikiProjects = [];
- var alreadyHasWPBio = false;
- var existingWPBioTemplateName = null;
- var output = AFCH.addTalkPageBanners( talkText, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName, existingWikiProjects, alreadyHasWPBio, existingWPBioTemplateName );
- expect( output.talkText ).toBe( '{{subst:WPAFC/article|class=|oldid=592496}}\n{{WikiProject Biography|living=no|class=|listas=}}\n\n' );
- expect( output.countOfWikiProjectsAdded ).toBe( 0 );
- expect( output.countOfWikiProjectsRemoved ).toBe( 0 );
- } );
-
- // FIXME: is supposed to remove the {{wikiproject biography}} template and report 1 template removed, but does not. code outside of AFCH.addTalkPageBanners() is incorrectly calculating alreadyHasWPBio as false
- // FIXME: 2 extra line breaks in the output
- it( 'talk page has {{wikiproject biography}}, and user selects that it\'s not a biography, so should remove {{wikiproject biography}}', function () {
- var talkText = '{{wikiproject biography|living=yes|class=B|listas=Jones, Bob}}\n{{WikiProject Somalia}}';
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|
+{{subst:WPAFC/article|oldid=592496}}
+{{WikiProject Biography|living=no|listas=}}
+}}`
+ );
+ } );
+
+ it.skip( 'talk page has {{wikiproject biography}}, and user selects that it\'s not a biography, so should remove {{wikiproject biography}}', function () {
+ var wikicode =
+`{{wikiproject biography|living=yes|class=B|listas=Jones, Bob}}
+{{WikiProject Somalia}}`;
var newAssessment = '';
var revId = 592496;
var isBiography = false;
+ // FIXME: if isBiography = false, WikiProject Biography should not be making it into this array
var newWikiProjects = [ 'WikiProject Biography', 'WikiProject Somalia' ];
var lifeStatus = 'unknown';
var subjectName = '';
- var existingWikiProjects = [
- {
- displayName: 'Biography',
- templateName: 'WikiProject Biography',
- alreadyOnPage: true
- },
- {
- displayName: 'Somalia',
- templateName: 'WikiProject Somalia',
- alreadyOnPage: true
- }
- ];
- var alreadyHasWPBio = false;
- var existingWPBioTemplateName = null;
- var output = AFCH.addTalkPageBanners( talkText, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName, existingWikiProjects, alreadyHasWPBio, existingWPBioTemplateName );
- expect( output.talkText ).toBe( '{{subst:WPAFC/article|class=|oldid=592496}}\n\n{{wikiproject biography|living=yes|class=B|listas=Jones, Bob}}\n{{WikiProject Somalia}}' );
- expect( output.countOfWikiProjectsAdded ).toBe( 0 );
- expect( output.countOfWikiProjectsRemoved ).toBe( 0 );
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|
+{{WikiProject Somalia}}
+{{subst:WPAFC/article|oldid=592496}}
+}}`
+ );
} );
it( 'user selects class = disambiguation', function () {
- var talkText = '';
+ var wikicode = '';
var newAssessment = 'disambig';
var revId = 592681;
var isBiography = false;
var newWikiProjects = [];
var lifeStatus = 'unknown';
var subjectName = '';
- var existingWikiProjects = [];
- var alreadyHasWPBio = false;
- var existingWPBioTemplateName = null;
- var output = AFCH.addTalkPageBanners( talkText, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName, existingWikiProjects, alreadyHasWPBio, existingWPBioTemplateName );
- expect( output.talkText ).toBe( '{{subst:WPAFC/article|class=disambig|oldid=592681}}\n{{WikiProject Disambiguation|class=disambig}}\n\n' );
- expect( output.countOfWikiProjectsAdded ).toBe( 1 );
- expect( output.countOfWikiProjectsRemoved ).toBe( 0 );
+ var output = AFCH.addTalkPageBanners( wikicode, newAssessment, revId, isBiography, newWikiProjects, lifeStatus, subjectName );
+ expect( output ).toBe(
+`{{WikiProject banner shell|class=disambig|
+{{subst:WPAFC/article|oldid=592681}}
+{{WikiProject Disambiguation}}
+}}`
+ );
+ } );
+} );
+
+describe( 'AFCH.removeDuplicateBanners', function () {
+ it( 'should handle empty array', function () {
+ var banners = [];
+ var output = AFCH.removeDuplicateBanners( banners );
+ expect( output ).toEqual( [] );
+ } );
+
+ it( 'should handle array with 1 element', function () {
+ var banners = [ '{{Test}}' ];
+ var output = AFCH.removeDuplicateBanners( banners );
+ expect( output ).toEqual( [ '{{Test}}' ] );
+ } );
+
+ it( 'should handle array with 2 identical elements', function () {
+ var banners = [ '{{Test}}', '{{Test}}' ];
+ var output = AFCH.removeDuplicateBanners( banners );
+ expect( output ).toEqual( [ '{{Test}}' ] );
+ } );
+
+ it( 'should handle array with 2 identical elements, case insensitive', function () {
+ var banners = [ '{{Test}}', '{{test}}' ];
+ var output = AFCH.removeDuplicateBanners( banners );
+ expect( output ).toEqual( [ '{{Test}}' ] );
+ } );
+
+ it( 'should handle array with 2 identical templates, but different parameters', function () {
+ var banners = [ '{{Test|1=a}}', '{{Test|2=b}}' ];
+ var output = AFCH.removeDuplicateBanners( banners );
+ expect( output ).toEqual( [ '{{Test|1=a}}' ] );
+ } );
+
+ it( 'should handle a realistic example using WikiProject banners', function () {
+ var banners = [
+ '{{WikiProject Australia}}',
+ '{{WikiProject Australia}}',
+ '{{wikiproject australia}}',
+ '{{WikiProject Australia|class=A}}',
+ '{{WikiProject Ontario}}'
+ ];
+ var output = AFCH.removeDuplicateBanners( banners );
+ expect( output ).toEqual( [
+ '{{WikiProject Australia}}',
+ '{{WikiProject Ontario}}'
+ ] );
} );
} );