mediawiki-extensions-Popups/tests/node-qunit/preview/model.test.js
WMDE-Fisch bf10902f23 Don't bail out early when there are no selectors configured
It seems to me, that at this point 3rd parties might not have been
loaded that want to add custom preview types. So the list of
selectors is empty.

We still might want to initialze though for 3rd parties that load
later.

Bug: T355933
Change-Id: I5f293a134521f086c9f62babb9d06cd9c51d7d47
2024-01-26 12:38:47 +01:00

180 lines
4.4 KiB
JavaScript

import {
createModel, getPreviewType, previewTypes, registerModel, test,
findNearestEligibleTarget, createNullModel
} from '../../../src/preview/model';
QUnit.module( 'ext.popups.preview#createModel' );
QUnit.test( 'it should copy the basic properties', ( assert ) => {
const thumbnail = {},
model = createModel(
'Foo',
'https://en.wikipedia.org/wiki/Foo',
'en',
'ltr',
'Foo bar baz.',
'standard',
thumbnail
);
assert.strictEqual(
model.title,
'Foo',
'The title is passed.'
);
assert.strictEqual(
model.url,
'https://en.wikipedia.org/wiki/Foo',
'The URL is generated.'
);
assert.strictEqual(
model.languageCode,
'en',
'The language code is passed.'
);
assert.strictEqual(
model.languageDirection,
'ltr',
'The language direction is passed.'
);
assert.strictEqual(
model.type,
previewTypes.TYPE_PAGE,
'The preview type is "page preview".'
);
assert.strictEqual( model.thumbnail, thumbnail, 'The thumbnail is passed' );
} );
QUnit.test( 'it computes the type property', ( assert ) => {
function createModelWith( { extract, type } ) {
return createModel(
'Foo',
'https://en.wikipedia.org/wiki/Foo',
'en',
'ltr',
extract,
type
);
}
assert.strictEqual(
createModelWith( { extract: 'Foo', type: 'standard' } ).type,
previewTypes.TYPE_PAGE,
'A non-generic ("page") preview has an extract and type "standard" property.'
);
assert.strictEqual(
createModelWith( { extract: 'Foo', type: undefined } ).type,
previewTypes.TYPE_PAGE,
'A non-generic ("page") preview has an extract with an undefined "type" property.'
);
assert.strictEqual(
createModelWith( { extract: undefined, type: undefined } ).type,
previewTypes.TYPE_GENERIC,
'A generic ("empty") preview has an undefined extract and an undefined "type" property.'
);
assert.strictEqual(
createModelWith( { extract: undefined, type: 'standard' } ).type,
previewTypes.TYPE_GENERIC,
'A generic ("empty") preview has an undefined extract regardless of "type".'
);
assert.strictEqual(
createModelWith( { extract: 'Foo', type: 'disambiguation' } ).type,
previewTypes.TYPE_DISAMBIGUATION,
'A disambiguation preview has an extract and type ("disambiguation") property.'
);
} );
QUnit.module( 'ext.popups.preview#getPreviewType', {
beforeEach() {
this.referenceLink = $( '<a>' )
.attr( 'href', '#RefLink' )
.appendTo( $( '<span>' ).addClass( 'reference' ) ).get( 0 );
this.referenceLinkNoFragment = $( '<a>' )
.attr( 'href', '/wiki/Url' )
.appendTo( $( '<span>' ).addClass( 'reference' ) ).get( 0 );
this.validEl = $( '<a>' ).appendTo( $( '<span>' ).addClass( 'reference' ) ).get( 0 );
this.registerRefModel = () => {
registerModel(
previewTypes.TYPE_REFERENCE,
'.reference a[ href*="#" ]'
);
};
},
afterEach() {
test.reset();
}
} );
QUnit.test( 'it uses the reference gateway with valid element', function ( assert ) {
this.registerRefModel();
assert.strictEqual(
getPreviewType( this.referenceLink ),
previewTypes.TYPE_REFERENCE
);
} );
QUnit.test( 'it does not suggest page previews on reference links when reference previews are not registered', function ( assert ) {
assert.strictEqual(
getPreviewType( this.referenceLink ),
null
);
} );
QUnit.test( 'it uses the page gateway when on links to a different page', function ( assert ) {
registerModel(
previewTypes.TYPE_PAGE,
'a'
);
assert.strictEqual(
getPreviewType(
this.validEl
),
previewTypes.TYPE_PAGE
);
} );
QUnit.test( 'it does not use the reference gateway when there is no fragment', function ( assert ) {
this.registerRefModel();
assert.strictEqual(
getPreviewType(
this.referenceLinkNoFragment
),
null
);
} );
QUnit.test( 'it does not suggest page previews on reference links not having a parent with reference class', function ( assert ) {
const el = $( '<a>' ).appendTo( $( '<span>' ) ).get( 0 );
this.registerRefModel();
assert.strictEqual(
getPreviewType( el ),
null
);
} );
QUnit.test( 'findNearestEligibleTarget returns null by default', function ( assert ) {
test.reset();
assert.strictEqual(
findNearestEligibleTarget( document.createElement( 'div' ) ),
null
);
} );
QUnit.test( 'createNullModel returns an empty page preview model', function ( assert ) {
const testTitle = 'test title';
const testUrl = 'test://url.com';
const nullModel = createNullModel( testTitle, testUrl );
assert.strictEqual(
nullModel.title,
testTitle
);
assert.strictEqual(
nullModel.url,
testUrl
);
} );