mediawiki-extensions-Visual.../modules/ve-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlineContainerWidget.test.js
Thiemo Kreuz 22757fa901 Fix and test page name splitting code in template dialog
In JavaScript .split() behaves different, compared to PHP. In
PHP the last element contains the rest of the string. In
JavaScript the rest of the string is discarded. The limit acts
as if the array is truncated. That's why we can reduce the
number in

  'foo/bar'.split( '/', 1 )[ 0 ]

to 1, as we are only interested in the element "foo".

The same code in the other class is currently not covered by a
test. But changing it accordingly should be obviously fine now.

Change-Id: I20c27d480ddb1799df9eb1e5bc119b724e80653d
2021-09-11 17:40:39 +00:00

100 lines
4 KiB
JavaScript

QUnit.module( 've.ui.MWTransclusionOutlineContainerWidget' );
QUnit.test( 'Constructor', ( assert ) => {
const widget = new ve.ui.MWTransclusionOutlineContainerWidget();
// eslint-disable-next-line no-jquery/no-class-state
assert.ok( widget.$element.hasClass( 've-ui-mwTransclusionOutlineContainerWidget' ) );
assert.deepEqual( widget.partWidgets, {} );
} );
QUnit.test( 'Supports all ve.dm.MWTransclusionPartModel subclasses', ( assert ) => {
const transclusion = new ve.dm.MWTransclusionModel(),
widget = new ve.ui.MWTransclusionOutlineContainerWidget();
widget.onReplacePart( null, new ve.dm.MWTemplateModel( transclusion, {} ) );
widget.onReplacePart( null, new ve.dm.MWTemplatePlaceholderModel( transclusion ) );
widget.onReplacePart( null, new ve.dm.MWTransclusionContentModel( transclusion ) );
assert.ok( widget.partWidgets.part_0 instanceof ve.ui.MWTransclusionOutlineTemplateWidget );
assert.ok( widget.partWidgets.part_1 instanceof ve.ui.MWTransclusionOutlinePlaceholderWidget );
assert.ok( widget.partWidgets.part_2 instanceof ve.ui.MWTransclusionOutlineWikitextWidget );
} );
QUnit.test( 'Basic functionality', ( assert ) => {
const transclusion = new ve.dm.MWTransclusionModel(),
part0 = new ve.dm.MWTransclusionContentModel( transclusion ),
part1 = new ve.dm.MWTransclusionContentModel( transclusion ),
widget = new ve.ui.MWTransclusionOutlineContainerWidget();
widget.onReplacePart();
assert.deepEqual( widget.partWidgets, {} );
widget.onReplacePart( null, part0 );
widget.onReplacePart( null, part1 );
assert.deepEqual( Object.keys( widget.partWidgets ), [ 'part_0', 'part_1' ] );
widget.onReplacePart( part0 );
assert.deepEqual( Object.keys( widget.partWidgets ), [ 'part_1' ] );
widget.clear();
assert.deepEqual( widget.partWidgets, {} );
} );
QUnit.test( 'Adding and moving parts to specific positions', ( assert ) => {
const transclusion = new ve.dm.MWTransclusionModel(),
part0 = new ve.dm.MWTransclusionContentModel( transclusion ),
part1 = new ve.dm.MWTransclusionContentModel( transclusion ),
part2 = new ve.dm.MWTransclusionContentModel( transclusion ),
widget = new ve.ui.MWTransclusionOutlineContainerWidget();
// This adds the parts at an invalid position, at the start, and in the middle
widget.onReplacePart( null, part0, 666 );
widget.onReplacePart( null, part1, 0 );
widget.onReplacePart( null, part2, 1 );
// Note this is just a map and doesn't reflect the order in the UI
assert.deepEqual( Object.keys( widget.partWidgets ), [ 'part_0', 'part_1', 'part_2' ] );
let $items = widget.$element.children();
assert.ok( $items.eq( 0 ).is( widget.partWidgets.part_1.$element ) );
assert.ok( $items.eq( 1 ).is( widget.partWidgets.part_2.$element ) );
assert.ok( $items.eq( 2 ).is( widget.partWidgets.part_0.$element ) );
// This bypasses all logic in ve.dm.MWTransclusionModel, effectively making it a mock.
transclusion.parts = [ part2, part0, part1 ];
widget.onTransclusionModelChange( transclusion );
$items = widget.$element.children();
assert.ok( $items.eq( 0 ).is( widget.partWidgets.part_2.$element ) );
assert.ok( $items.eq( 1 ).is( widget.partWidgets.part_0.$element ) );
assert.ok( $items.eq( 2 ).is( widget.partWidgets.part_1.$element ) );
} );
[
[ '', null ],
[ 'part_0', null ],
[ 'part_0/', '' ],
[ 'part_0/foo', 'foo' ],
[ 'part_1/foo', null ],
[ 'part_0/foo/bar', 'foo/bar' ]
].forEach( ( [ pageName, expected ] ) =>
QUnit.test( 'highlightSubItemByPageName: ' + pageName, ( assert ) => {
const transclusion = new ve.dm.MWTransclusionModel(),
template = new ve.dm.MWTemplateModel( transclusion, {} ),
partWidget = new ve.ui.MWTransclusionOutlineTemplateWidget( template ),
widget = new ve.ui.MWTransclusionOutlineContainerWidget();
// eslint-disable-next-line camelcase
widget.partWidgets.part_0 = partWidget;
let actual = null;
partWidget.highlightParameter = ( paramName ) => {
actual = paramName;
};
widget.highlightSubItemByPageName( pageName );
assert.strictEqual( actual, expected );
} )
);