mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/MultimediaViewer
synced 2024-12-01 03:06:17 +00:00
bbaf7a38b4
* Deletes the mmv.model.EmbedFileInfo class file and its test file * Updates the extension.json and MultimediaViewerHooks.php files to reflect these deletions (by removing entries from dependency lists) * Refactors all instances of `new mmv.model.EmbedFileInfo()` to instead use a POJO with appropriate properties. Conditional assignment is used for the caption and alt properties if there is any chance they won't be available, to keep from adding props with falsy values. * Refactors JSDoc method annotations so that `@param` tags expecting an EmbedFileInfo instance now expect an object; relevant properties of this object and their types have been added to the method annotations as well. Bug: T77320 Change-Id: Ie9f5f24136f4b73000259685474ce4d765a3ccd3
302 lines
12 KiB
JavaScript
302 lines
12 KiB
JavaScript
( function () {
|
|
QUnit.module( 'mmv.EmbedFileFormatter', QUnit.newMwEnvironment() );
|
|
|
|
function createEmbedFileInfo( options ) {
|
|
var license = options.licenseShortName ? new mw.mmv.model.License( options.licenseShortName,
|
|
options.licenseInternalName, options.licenseLongName, options.licenseUrl ) : undefined,
|
|
imageInfo = new mw.mmv.model.Image(
|
|
|
|
options.title,
|
|
options.title.getNameText(),
|
|
undefined,
|
|
undefined,
|
|
undefined,
|
|
undefined,
|
|
options.imgUrl,
|
|
options.filePageUrl,
|
|
options.shortFilePageUrl,
|
|
42,
|
|
'repo',
|
|
undefined,
|
|
undefined,
|
|
undefined,
|
|
undefined,
|
|
options.source,
|
|
options.author,
|
|
options.authorCount,
|
|
license ),
|
|
repoInfo = { displayName: options.siteName, getSiteLink:
|
|
function () { return options.siteUrl; } };
|
|
|
|
return {
|
|
imageInfo: imageInfo,
|
|
repoInfo: repoInfo,
|
|
caption: options.caption
|
|
};
|
|
}
|
|
|
|
QUnit.test( 'EmbedFileFormatter constructor sanity check', function ( assert ) {
|
|
var formatter = new mw.mmv.EmbedFileFormatter();
|
|
assert.ok( formatter, 'constructor with no argument works' );
|
|
} );
|
|
|
|
QUnit.test( 'getByline():', function ( assert ) {
|
|
var formatter = new mw.mmv.EmbedFileFormatter(),
|
|
author = '<span class="mw-mmv-author">Homer</span>',
|
|
source = '<span class="mw-mmv-source">Iliad</span>',
|
|
attribution = '<span class="mw-mmv-attr">Cat</span>',
|
|
byline;
|
|
|
|
// Works with no arguments
|
|
byline = formatter.getByline();
|
|
assert.strictEqual( byline, undefined, 'No argument case handled correctly.' );
|
|
|
|
// Attribution present
|
|
byline = formatter.getByline( author, source, attribution );
|
|
assert.ok( byline.match( /Cat/ ), 'Attribution found in bylines' );
|
|
|
|
// Author and source present
|
|
byline = formatter.getByline( author, source );
|
|
assert.ok( byline.match( /Homer|Iliad/ ), 'Author and source found in bylines' );
|
|
|
|
// Only author present
|
|
byline = formatter.getByline( author );
|
|
assert.ok( byline.match( /Homer/ ), 'Author found in bylines.' );
|
|
|
|
// Only source present
|
|
byline = formatter.getByline( undefined, source );
|
|
assert.ok( byline.match( /Iliad/ ), 'Source found in bylines.' );
|
|
} );
|
|
|
|
QUnit.test( 'getSiteLink():', function ( assert ) {
|
|
var repoInfo = new mw.mmv.model.Repo( 'Wikipedia', '//wikipedia.org/favicon.ico', true ),
|
|
info = { imageInfo: {}, repoInfo: repoInfo },
|
|
formatter = new mw.mmv.EmbedFileFormatter(),
|
|
siteUrl = repoInfo.getSiteLink(),
|
|
siteLink = formatter.getSiteLink( info );
|
|
|
|
assert.strictEqual( siteLink.indexOf( 'Wikipedia' ) !== -1, true, 'Site name is present in site link' );
|
|
assert.strictEqual( siteLink.indexOf( siteUrl ) !== -1, true, 'Site URL is present in site link' );
|
|
} );
|
|
|
|
QUnit.test( 'getThumbnailHtml():', function ( assert ) {
|
|
var formatter = new mw.mmv.EmbedFileFormatter(),
|
|
titleText = 'Music Room',
|
|
title = mw.Title.newFromText( titleText ),
|
|
imgUrl = 'https://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg',
|
|
filePageUrl = 'https://commons.wikimedia.org/wiki/File:Foobar.jpg',
|
|
filePageShortUrl = 'https://commons.wikimedia.org/wiki/index.php?curid=42',
|
|
siteName = 'Site Name',
|
|
siteUrl = '//site.url/',
|
|
licenseShortName = 'Public License',
|
|
licenseInternalName = '-',
|
|
licenseLongName = 'Public Domain, copyrights have lapsed',
|
|
licenseUrl = '//example.com/pd',
|
|
author = '<span class="mw-mmv-author">Homer</span>',
|
|
source = '<span class="mw-mmv-source">Iliad</span>',
|
|
thumbUrl = 'https://upload.wikimedia.org/wikipedia/thumb/Foobar.jpg',
|
|
width = 700,
|
|
height = 500,
|
|
info,
|
|
generatedHtml;
|
|
|
|
// Bylines, license and site
|
|
info = createEmbedFileInfo( { title: title, imgUrl: imgUrl, filePageUrl: filePageUrl,
|
|
shortFilePageUrl: filePageShortUrl, siteName: siteName, siteUrl: siteUrl,
|
|
licenseShortName: licenseShortName, licenseInternalName: licenseInternalName,
|
|
licenseLongName: licenseLongName, licenseUrl: licenseUrl, author: author, source: source } );
|
|
|
|
generatedHtml = formatter.getThumbnailHtml( info, thumbUrl, width, height );
|
|
assert.ok( generatedHtml.match( titleText ), 'Title appears in generated HTML.' );
|
|
assert.ok( generatedHtml.match( filePageUrl ), 'Page url appears in generated HTML.' );
|
|
assert.ok( generatedHtml.match( thumbUrl ), 'Thumbnail url appears in generated HTML' );
|
|
assert.ok( generatedHtml.match( 'Public License' ), 'License appears in generated HTML' );
|
|
assert.ok( generatedHtml.match( 'Homer' ), 'Author appears in generated HTML' );
|
|
assert.ok( generatedHtml.match( 'Iliad' ), 'Source appears in generated HTML' );
|
|
assert.ok( generatedHtml.match( width ), 'Width appears in generated HTML' );
|
|
assert.ok( generatedHtml.match( height ), 'Height appears in generated HTML' );
|
|
// .includes() for checking the short url since it contains a ? (bad for regex). Could escape instead.
|
|
// eslint-disable-next-line no-restricted-syntax
|
|
assert.ok( generatedHtml.includes( filePageShortUrl ), 'Short URL appears in generated HTML' );
|
|
|
|
// Bylines, no license and site
|
|
info = createEmbedFileInfo( { title: title, imgUrl: imgUrl, filePageUrl: filePageUrl,
|
|
shortFilePageUrl: filePageShortUrl, siteName: siteName, siteUrl: siteUrl,
|
|
author: author, source: source } );
|
|
generatedHtml = formatter.getThumbnailHtml( info, thumbUrl, width, height );
|
|
|
|
assert.ok( generatedHtml.match( titleText ), 'Title appears in generated HTML.' );
|
|
assert.ok( generatedHtml.match( filePageUrl ), 'Page url appears in generated HTML.' );
|
|
assert.ok( generatedHtml.match( thumbUrl ), 'Thumbnail url appears in generated HTML' );
|
|
assert.notOk( generatedHtml.match( 'Public License' ), 'License should not appear in generated HTML' );
|
|
assert.ok( generatedHtml.match( 'Homer' ), 'Author appears in generated HTML' );
|
|
assert.ok( generatedHtml.match( 'Iliad' ), 'Source appears in generated HTML' );
|
|
assert.ok( generatedHtml.match( width ), 'Width appears in generated HTML' );
|
|
assert.ok( generatedHtml.match( height ), 'Height appears in generated HTML' );
|
|
// eslint-disable-next-line no-restricted-syntax
|
|
assert.ok( generatedHtml.includes( filePageShortUrl ), 'Short URL appears in generated HTML' );
|
|
|
|
// No bylines, license and site
|
|
info = createEmbedFileInfo( { title: title, imgUrl: imgUrl, filePageUrl: filePageUrl,
|
|
siteName: siteName, siteUrl: siteUrl, licenseShortName: licenseShortName,
|
|
licenseInternalName: licenseInternalName, licenseLongName: licenseLongName,
|
|
licenseUrl: licenseUrl, shortFilePageUrl: filePageShortUrl } );
|
|
generatedHtml = formatter.getThumbnailHtml( info, thumbUrl, width, height );
|
|
|
|
assert.ok( generatedHtml.match( titleText ), 'Title appears in generated HTML.' );
|
|
assert.ok( generatedHtml.match( filePageUrl ), 'Page url appears in generated HTML.' );
|
|
assert.ok( generatedHtml.match( thumbUrl ), 'Thumbnail url appears in generated HTML' );
|
|
assert.ok( generatedHtml.match( 'Public License' ), 'License appears in generated HTML' );
|
|
assert.notOk( generatedHtml.match( 'Homer' ), 'Author should not appear in generated HTML' );
|
|
assert.notOk( generatedHtml.match( 'Iliad' ), 'Source should not appear in generated HTML' );
|
|
assert.ok( generatedHtml.match( width ), 'Width appears in generated HTML' );
|
|
assert.ok( generatedHtml.match( height ), 'Height appears in generated HTML' );
|
|
// eslint-disable-next-line no-restricted-syntax
|
|
assert.ok( generatedHtml.includes( filePageShortUrl ), 'Short URL appears in generated HTML' );
|
|
|
|
// No bylines, no license and site
|
|
info = createEmbedFileInfo( { title: title, imgUrl: imgUrl, filePageUrl: filePageUrl,
|
|
siteName: siteName, siteUrl: siteUrl, shortFilePageUrl: filePageShortUrl } );
|
|
generatedHtml = formatter.getThumbnailHtml( info, thumbUrl, width, height );
|
|
|
|
assert.ok( generatedHtml.match( titleText ), 'Title appears in generated HTML.' );
|
|
assert.ok( generatedHtml.match( filePageUrl ), 'Page url appears in generated HTML.' );
|
|
assert.ok( generatedHtml.match( thumbUrl ), 'Thumbnail url appears in generated HTML' );
|
|
assert.notOk( generatedHtml.match( 'Public License' ), 'License should not appear in generated HTML' );
|
|
assert.notOk( generatedHtml.match( 'Homer' ), 'Author should not appear in generated HTML' );
|
|
assert.notOk( generatedHtml.match( 'Iliad' ), 'Source should not appear in generated HTML' );
|
|
assert.ok( generatedHtml.match( width ), 'Width appears in generated HTML' );
|
|
assert.ok( generatedHtml.match( height ), 'Height appears in generated HTML' );
|
|
// eslint-disable-next-line no-restricted-syntax
|
|
assert.ok( generatedHtml.includes( filePageShortUrl ), 'Short URL appears in generated HTML' );
|
|
|
|
} );
|
|
|
|
QUnit.test( 'getThumbnailWikitext():', function ( assert ) {
|
|
var formatter = new mw.mmv.EmbedFileFormatter(),
|
|
title = mw.Title.newFromText( 'File:Foobar.jpg' ),
|
|
imgUrl = 'https://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg',
|
|
filePageUrl = 'https://commons.wikimedia.org/wiki/File:Foobar.jpg',
|
|
caption = 'Foobar caption.',
|
|
width = 700,
|
|
info,
|
|
wikitext;
|
|
|
|
// Title, width and caption
|
|
info = createEmbedFileInfo( { title: title, imgUrl: imgUrl, filePageUrl: filePageUrl,
|
|
caption: caption } );
|
|
wikitext = formatter.getThumbnailWikitextFromEmbedFileInfo( info, width );
|
|
|
|
assert.strictEqual(
|
|
wikitext,
|
|
'[[File:Foobar.jpg|700px|thumb|Foobar caption.]]',
|
|
'Wikitext generated correctly.' );
|
|
|
|
// Title, width and no caption
|
|
info = createEmbedFileInfo( { title: title, imgUrl: imgUrl, filePageUrl: filePageUrl } );
|
|
wikitext = formatter.getThumbnailWikitextFromEmbedFileInfo( info, width );
|
|
|
|
assert.strictEqual(
|
|
wikitext,
|
|
'[[File:Foobar.jpg|700px|thumb|Foobar]]',
|
|
'Wikitext generated correctly.' );
|
|
|
|
// Title, no width and no caption
|
|
info = createEmbedFileInfo( { title: title, imgUrl: imgUrl, filePageUrl: filePageUrl } );
|
|
wikitext = formatter.getThumbnailWikitextFromEmbedFileInfo( info );
|
|
|
|
assert.strictEqual(
|
|
wikitext,
|
|
'[[File:Foobar.jpg|thumb|Foobar]]',
|
|
'Wikitext generated correctly.' );
|
|
} );
|
|
|
|
QUnit.test( 'getCreditText():', function ( assert ) {
|
|
var txt, formatter = new mw.mmv.EmbedFileFormatter();
|
|
|
|
txt = formatter.getCreditText( {
|
|
repoInfo: {
|
|
displayName: 'Localcommons'
|
|
},
|
|
|
|
imageInfo: {
|
|
author: 'Author',
|
|
source: 'Source',
|
|
descriptionShortUrl: 'link',
|
|
title: {
|
|
getNameText: function () { return 'Image Title'; }
|
|
}
|
|
}
|
|
} );
|
|
|
|
assert.strictEqual( txt, 'By Author - Source, link', 'Sanity check' );
|
|
|
|
txt = formatter.getCreditText( {
|
|
repoInfo: {
|
|
displayName: 'Localcommons'
|
|
},
|
|
|
|
imageInfo: {
|
|
author: 'Author',
|
|
source: 'Source',
|
|
descriptionShortUrl: 'link',
|
|
title: {
|
|
getNameText: function () { return 'Image Title'; }
|
|
},
|
|
license: {
|
|
getShortName: function () { return 'WTFPL v2'; },
|
|
longName: 'Do What the Fuck You Want Public License Version 2',
|
|
isFree: this.sandbox.stub().returns( true )
|
|
}
|
|
}
|
|
} );
|
|
|
|
assert.strictEqual( txt, 'By Author - Source, WTFPL v2, link', 'License message works' );
|
|
} );
|
|
|
|
QUnit.test( 'getCreditHtml():', function ( assert ) {
|
|
var html, formatter = new mw.mmv.EmbedFileFormatter();
|
|
|
|
html = formatter.getCreditHtml( {
|
|
repoInfo: {
|
|
displayName: 'Localcommons',
|
|
getSiteLink: function () { return 'quux'; }
|
|
},
|
|
|
|
imageInfo: {
|
|
author: 'Author',
|
|
source: 'Source',
|
|
descriptionShortUrl: 'some link',
|
|
title: {
|
|
getNameText: function () { return 'Image Title'; }
|
|
}
|
|
}
|
|
} );
|
|
|
|
assert.strictEqual( html, 'By Author - Source, <a href="some link">Link</a>', 'Sanity check' );
|
|
|
|
html = formatter.getCreditHtml( {
|
|
repoInfo: {
|
|
displayName: 'Localcommons',
|
|
getSiteLink: function () { return 'quux'; }
|
|
},
|
|
|
|
imageInfo: {
|
|
author: 'Author',
|
|
source: 'Source',
|
|
descriptionShortUrl: 'some link',
|
|
title: {
|
|
getNameText: function () { return 'Image Title'; }
|
|
},
|
|
license: {
|
|
getShortLink: function () { return '<a href="http://www.wtfpl.net/">WTFPL v2</a>'; },
|
|
longName: 'Do What the Fuck You Want Public License Version 2',
|
|
isFree: this.sandbox.stub().returns( true )
|
|
}
|
|
}
|
|
} );
|
|
|
|
assert.strictEqual( html, 'By Author - Source, <a href="http://www.wtfpl.net/">WTFPL v2</a>, <a href="some link">Link</a>', 'Sanity check' );
|
|
} );
|
|
}() );
|