mediawiki-extensions-Multim.../tests/qunit/mmv.ui.fileUsage.test.js
Gilles Dubuc 30563de71d Add file usage data to MMV metadata panel
Interface code is its own class which does not depend on the main
interface class it can be unit tested (and eventually moved into its
own file to make browsing the code easier). IMO we should aim to
eventually break up the interface into similar classes (with a simple
init/empty/set interface + custom events where it makes sense).

Also, sneak-introducing LESS!

API usage could be more effective (globalusage is a separate API call;
it needn't be), but we will have to rewrite that part soon anyway, so
it should pass for now.

Bug: 60087
Mingle: https://wikimedia.mingle.thoughtworks.com/projects/multimedia/cards/44
Change-Id: Ibe5c323cdeab4a378316925f0c3efb3dc7ef5997
2014-01-30 13:03:28 +01:00

142 lines
5.4 KiB
JavaScript

( function ( mw, $ ) {
QUnit.module( 'mmv.ui.fileUsage', QUnit.newMwEnvironment() );
QUnit.test( 'File usage panel with no usage', 1, function( assert ) {
var fileUsage = new mw.mmv.ui.FileUsage( $( '#qunit-fixture' ) ),
file = new mw.Title( 'File:Foo' ),
localUsage = new mw.mmv.model.FileUsage( file, 'local', [] ),
globalUsage = new mw.mmv.model.FileUsage( file, 'global', [] );
fileUsage.init();
fileUsage.set( localUsage, globalUsage );
assert.ok( $( '#qunit-fixture' ).hasClass( 'empty' ) );
} );
QUnit.test( 'File usage panel with local usage', 7, function( assert ) {
var $list,
fileUsage = new mw.mmv.ui.FileUsage( $( '#qunit-fixture' ) ),
file = new mw.Title( 'File:Foo' ),
localUsage = new mw.mmv.model.FileUsage( file, 'local', [
{ wiki: null, page: new mw.Title( 'Bar' ) },
{ wiki: null, page: new mw.Title( 'Baz' ) }
] ),
globalUsage = new mw.mmv.model.FileUsage( file, 'global', [] );
fileUsage.init();
fileUsage.set( localUsage, globalUsage );
assert.ok( ! $( '#qunit-fixture' ).hasClass( 'empty' ) );
$list = $( '#qunit-fixture li:not([class])' );
assert.strictEqual( $list.length, 2 );
assert.strictEqual( $list.eq( 0 ).text(), 'Bar' );
assert.strictEqual( $list.eq( 1 ).text(), 'Baz' );
assert.strictEqual( $( '#qunit-fixture .mw-mlb-fileusage-local-section' ).length, 1 );
assert.strictEqual( $( '#qunit-fixture .mw-mlb-fileusage-global-section' ).length, 0 );
assert.strictEqual( $( '#qunit-fixture .mw-mlb-fileusage-view-all' ).length, 0 );
} );
QUnit.test( 'File usage panel with local usage and overflow', 3, function( assert ) {
var $list,
fileUsage = new mw.mmv.ui.FileUsage( $( '#qunit-fixture' ) ),
file = new mw.Title( 'File:Foo' ),
localUsage = new mw.mmv.model.FileUsage( file, 'local', [
{ wiki: null, page: new mw.Title( 'Bar' ) },
{ wiki: null, page: new mw.Title( 'Baz' ) },
{ wiki: null, page: new mw.Title( 'Boom' ) },
{ wiki: null, page: new mw.Title( 'Boing' ) }
] ),
globalUsage = new mw.mmv.model.FileUsage( file, 'global', [] );
fileUsage.init();
fileUsage.set( localUsage, globalUsage );
assert.ok( ! $( '#qunit-fixture' ).hasClass( 'empty' ) );
$list = $( '#qunit-fixture li:not([class])' );
assert.strictEqual( $list.length, fileUsage.MAX_LOCAL );
assert.strictEqual( $( '#qunit-fixture .mw-mlb-fileusage-view-all' ).length, 1 );
} );
QUnit.test( 'File usage panel with global usage', 9, function( assert ) {
var $list,
fileUsage = new mw.mmv.ui.FileUsage( $( '#qunit-fixture' ) ),
file = new mw.Title( 'File:Foo' ),
localUsage = new mw.mmv.model.FileUsage( file, 'local', [] ),
globalUsage = new mw.mmv.model.FileUsage( file, 'global', [
{ wiki: 'x.com', page: new mw.Title( 'Bar' ) },
{ wiki: 'y.com', page: new mw.Title( 'Baz' ) }
] );
fileUsage.init();
fileUsage.set( localUsage, globalUsage );
assert.ok( ! $( '#qunit-fixture' ).hasClass( 'empty' ) );
$list = $( '#qunit-fixture li:not([class])' );
assert.strictEqual( $list.length, 2 );
assert.strictEqual( $list.eq( 0 ).find( 'a' ).text(), 'Bar' );
assert.strictEqual( $list.eq( 1 ).find( 'a' ).text(), 'Baz' );
assert.strictEqual( $list.eq( 0 ).find( 'aside' ).text(), 'x.com' );
assert.strictEqual( $list.eq( 1 ).find( 'aside' ).text(), 'y.com' );
assert.strictEqual( $( '#qunit-fixture .mw-mlb-fileusage-local-section' ).length, 0 );
assert.strictEqual( $( '#qunit-fixture .mw-mlb-fileusage-global-section' ).length, 1 );
assert.strictEqual( $( '#qunit-fixture .mw-mlb-fileusage-view-all' ).length, 0 );
} );
QUnit.test( 'File usage panel with lots of uses', 3, function( assert ) {
var $list,
totalCount = 100,
fileUsage = new mw.mmv.ui.FileUsage( $( '#qunit-fixture' ) ),
file = new mw.Title( 'File:Foo' ),
localUsage = new mw.mmv.model.FileUsage( file, 'local', [
{ wiki: null, page: new mw.Title( 'Bar' ) },
{ wiki: null, page: new mw.Title( 'Baz' ) },
{ wiki: null, page: new mw.Title( 'Boom' ) },
{ wiki: null, page: new mw.Title( 'Boing' ) }
], totalCount, true ),
globalUsage = new mw.mmv.model.FileUsage( file, 'global', [
{ wiki: 'x.com', page: new mw.Title( 'Bar' ) },
{ wiki: 'x.com', page: new mw.Title( 'Baz' ) },
{ wiki: 'y.com', page: new mw.Title( 'Bar' ) },
{ wiki: 'y.com', page: new mw.Title( 'Baz' ) }
] );
fileUsage.init();
fileUsage.set( localUsage, globalUsage );
$list = $( '#qunit-fixture li:not([class])' );
assert.strictEqual( $list.length, fileUsage.MAX_LOCAL + fileUsage.MAX_GLOBAL );
assert.strictEqual( $( '#qunit-fixture .mw-mlb-fileusage-view-all' ).length, 2 );
assert.ok( $( '#qunit-fixture h3' ).text().match( totalCount ) );
} );
QUnit.test( 'The interface is emptied properly when necessary', 4, function( assert ) {
var $list,
fileUsage = new mw.mmv.ui.FileUsage( $( '#qunit-fixture' ) ),
file = new mw.Title( 'File:Foo' ),
localUsage = new mw.mmv.model.FileUsage( file, 'local', [
{ wiki: null, page: new mw.Title( 'Bar' ) },
{ wiki: null, page: new mw.Title( 'Baz' ) }
] ),
globalUsage = new mw.mmv.model.FileUsage( file, 'global', [] );
fileUsage.init();
fileUsage.set( localUsage, globalUsage );
assert.ok( ! $( '#qunit-fixture' ).hasClass( 'empty' ) );
fileUsage.empty();
assert.ok( $( '#qunit-fixture' ).hasClass( 'empty' ) );
$list = $( '#qunit-fixture li:not([class])' );
assert.strictEqual( $list.length, 0 );
assert.strictEqual( $( '#qunit-fixture h3' ).text(), '' );
} );
}( mediaWiki, jQuery ) );