mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Echo
synced 2024-11-15 11:59:11 +00:00
46484e8b53
* Declare variables inline, as per the current code conventions. * Convert ad-hoc cases objects into native QUnit.test.each(). This makes for shorter and cleaner code, as well as for more detailed test reporting, and removes the need to manually construct assertion messages based on test case prefix string etc. * Start adopting ES5 Array.forEach in a few places where otherwise ESLint would complain about variable name clashes. * Future proof the test module names, by stripping the global variable namespace that some classes still use, matching packageFiles convention as used for NotificationBadge.js and its tests already, by specifying only the bundle name and the exported class name. Note that the QUnit UI does fuzzy matching so filtering works the same either way, e.g. "echodmfilter" will match "ext.echo.dm - FilterModel". Change-Id: I49858dd2c95d0869f2cd15693f05c38312a9f710
180 lines
4.8 KiB
JavaScript
180 lines
4.8 KiB
JavaScript
QUnit.module( 'ext.echo.dm - NotificationsList' );
|
|
|
|
QUnit.test.each( 'Constructing the model', {
|
|
'Empty config': {
|
|
config: {},
|
|
expected: {}
|
|
},
|
|
'Prefilled data': {
|
|
config: {
|
|
title: 'Some title',
|
|
name: 'local_demo',
|
|
source: 'hewiki',
|
|
sourceURL: 'http://he.wiki.local.wmftest.net:8080/wiki/$1',
|
|
timestamp: '20160916171300'
|
|
},
|
|
expected: {
|
|
getTitle: 'Some title',
|
|
getName: 'local_demo',
|
|
getSource: 'hewiki',
|
|
getSourceURL: 'http://he.wiki.local.wmftest.net:8080/wiki/$1',
|
|
getTimestamp: '20160916171300',
|
|
isForeign: true
|
|
}
|
|
}
|
|
}, function ( assert, data ) {
|
|
var defaultValues = {
|
|
getAllItemIds: [],
|
|
getAllItemIdsByType: [],
|
|
getTitle: '',
|
|
getName: 'local',
|
|
getSource: 'local',
|
|
getSourceURL: '',
|
|
getTimestamp: 0,
|
|
getCount: 0,
|
|
hasUnseen: false,
|
|
isForeign: false
|
|
};
|
|
var expected = $.extend( true, {}, defaultValues, data.expected );
|
|
var model = new mw.echo.dm.NotificationsList( data.config );
|
|
|
|
for ( var method in expected ) {
|
|
assert.deepEqual(
|
|
// Run the method
|
|
model[ method ](),
|
|
// Expected value
|
|
expected[ method ],
|
|
// Message
|
|
method
|
|
);
|
|
}
|
|
} );
|
|
|
|
QUnit.test( 'Handling notification items', function ( assert ) {
|
|
var model = new mw.echo.dm.NotificationsList( { timestamp: '200101010000' } );
|
|
var items = [
|
|
new mw.echo.dm.NotificationItem( 0, { type: 'alert', timestamp: '201609190000', read: false, seen: false } ),
|
|
new mw.echo.dm.NotificationItem( 1, { type: 'message', timestamp: '201609190100', read: false, seen: true } ),
|
|
new mw.echo.dm.NotificationItem( 2, { type: 'alert', timestamp: '201609190200', read: true, seen: true } ),
|
|
new mw.echo.dm.NotificationItem( 3, { type: 'message', timestamp: '201609190300', read: true, seen: true } ),
|
|
new mw.echo.dm.NotificationItem( 4, { type: 'alert', timestamp: '201609190400', read: true, seen: true } ),
|
|
new mw.echo.dm.NotificationItem( 5, { type: 'message', timestamp: '201609190500', read: true, seen: false } )
|
|
];
|
|
|
|
assert.strictEqual(
|
|
model.getCount(),
|
|
0,
|
|
'Model list starts empty'
|
|
);
|
|
assert.strictEqual(
|
|
model.getTimestamp(),
|
|
'200101010000',
|
|
'Model timestamp is its default'
|
|
);
|
|
|
|
model.setItems( items );
|
|
assert.strictEqual(
|
|
model.getCount(),
|
|
6,
|
|
'Item list setup'
|
|
);
|
|
assert.strictEqual(
|
|
model.getTimestamp(),
|
|
'201609190100',
|
|
'Model timestamp is the latest unread item\'s timestamp'
|
|
);
|
|
assert.deepEqual(
|
|
model.getAllItemIds(),
|
|
[ 1, 0, 5, 4, 3, 2 ],
|
|
'getAllItemIds (sorted)'
|
|
);
|
|
assert.deepEqual(
|
|
[
|
|
model.getAllItemIdsByType( 'alert' ),
|
|
model.getAllItemIdsByType( 'message' )
|
|
],
|
|
[
|
|
[ 0, 4, 2 ],
|
|
[ 1, 5, 3 ]
|
|
],
|
|
'getAllItemIdsByType (sorted)'
|
|
);
|
|
assert.deepEqual(
|
|
model.findByIds( [ 1, 2 ] ),
|
|
[ items[ 1 ], items[ 2 ] ],
|
|
'findByIds'
|
|
);
|
|
|
|
// Change item state (trigger resort)
|
|
items[ 1 ].toggleRead( true );
|
|
items[ 3 ].toggleRead( false );
|
|
items[ 5 ].toggleSeen( true ); // Will not affect sorting order of the item
|
|
assert.deepEqual(
|
|
model.getAllItemIds(),
|
|
[ 3, 0, 5, 4, 2, 1 ],
|
|
'getAllItemIds (re-sorted)'
|
|
);
|
|
|
|
// Discard items
|
|
model.discardItems( [ items[ 5 ], items[ 2 ] ] );
|
|
|
|
assert.deepEqual(
|
|
model.getAllItemIds(),
|
|
[ 3, 0, 4, 1 ],
|
|
'getAllItemIds (discarded items)'
|
|
);
|
|
assert.deepEqual(
|
|
[
|
|
model.getAllItemIdsByType( 'alert' ),
|
|
model.getAllItemIdsByType( 'message' )
|
|
],
|
|
[
|
|
[ 0, 4 ],
|
|
[ 3, 1 ]
|
|
],
|
|
'getAllItemIdsByType (discarded items)'
|
|
);
|
|
|
|
} );
|
|
|
|
QUnit.test( 'Intercepting events', function ( assert ) {
|
|
var model = new mw.echo.dm.NotificationsList();
|
|
var result = [];
|
|
var items = [
|
|
new mw.echo.dm.NotificationItem( 0, { timestamp: '201609190000', read: false, seen: false } ),
|
|
new mw.echo.dm.NotificationItem( 1, { timestamp: '201609190100', read: false, seen: true } ),
|
|
new mw.echo.dm.NotificationItem( 2, { timestamp: '201609190200', read: true, seen: true } ),
|
|
new mw.echo.dm.NotificationItem( 3, { timestamp: '201609190300', read: true, seen: true } ),
|
|
new mw.echo.dm.NotificationItem( 4, { timestamp: '201609190400', read: true, seen: true } ),
|
|
new mw.echo.dm.NotificationItem( 5, { timestamp: '201609190500', read: true, seen: true } )
|
|
];
|
|
|
|
// Listen to events
|
|
model
|
|
.on( 'update', function ( itms ) {
|
|
result.push( 'update:' + itms.length );
|
|
} )
|
|
.on( 'discard', function ( item ) {
|
|
result.push( 'discard:' + item.getId() );
|
|
} )
|
|
.on( 'itemUpdate', function ( item ) {
|
|
result.push( 'itemUpdate:' + item.getId() );
|
|
} );
|
|
|
|
// Set up and trigger events
|
|
model
|
|
.setItems( items ); // [ 'update:6' ]
|
|
model.discardItems( items[ items.length - 1 ] ); // [ 'update:6', 'discard:5' ]
|
|
items[ 0 ].toggleSeen( true ); // [ 'update:6', 'discard:5', 'itemUpdate:0' ]
|
|
items[ 1 ].toggleRead( true ); // [ 'update:6', 'discard:5', 'itemUpdate:0', 'itemUpdate:1' ]
|
|
|
|
assert.deepEqual(
|
|
// Actual
|
|
result,
|
|
// Expected:
|
|
[ 'update:6', 'discard:5', 'itemUpdate:0', 'itemUpdate:1' ],
|
|
// Message
|
|
'Events emitted correctly'
|
|
);
|
|
} );
|