diff --git a/modules/overlay/ext.echo.overlay.js b/modules/overlay/ext.echo.overlay.js
index 302cfcb2b..079ae17a1 100644
--- a/modules/overlay/ext.echo.overlay.js
+++ b/modules/overlay/ext.echo.overlay.js
@@ -314,7 +314,6 @@
_getTitleElement: function() {
var $title = $( '
' ).addClass( 'mw-echo-overlay-title' )
.append( this._getTabsElement() );
- this._showTabList( this._activeTab );
return $title;
},
@@ -364,6 +363,8 @@
$overlay.prepend( this._getTitleElement() );
$overlay.append( this._getFooterElement() );
+ // Show the active tab.
+ this._showTabList( this._activeTab );
}
};
diff --git a/tests/qunit/overlay/test_ext.echo.overlay.js b/tests/qunit/overlay/test_ext.echo.overlay.js
index bc8f2e33d..047f931bd 100644
--- a/tests/qunit/overlay/test_ext.echo.overlay.js
+++ b/tests/qunit/overlay/test_ext.echo.overlay.js
@@ -12,12 +12,14 @@
};
ApiStub.prototype = {
post: function( data ) {
- return new $.Deferred().resolve( this.getNewNotificationCountData( data ) );
+ return new $.Deferred().resolve( this.getNewNotificationCountData( data,
+ this.mode === 'with-new-messages' ) );
},
get: function() {
var i, id,
index = [], listObj = {},
data = this.getData();
+ // a response which contains 0 unread messages and 1 read alert
if ( this.mode === 'no-new-messages' ) {
data.query.notifications.message = {
index: [ 100 ],
@@ -33,6 +35,7 @@
rawcount: 0,
count: '0'
};
+ // a response which contains 8 unread messages and 1 read alert
} else if ( this.mode === 'with-new-messages' ) {
for ( i = 0; i < 7; i++ ) {
id = 500 + i;
@@ -51,7 +54,7 @@
}
return $.Deferred().resolve( data );
},
- getNewNotificationCountData: function( data ) {
+ getNewNotificationCountData: function( data, hasNewMessages ) {
var alertCount, messageCount,
rawCount = 0,
count = 0;
@@ -60,26 +63,37 @@
count: '0',
rawcount: 0
};
+ alertCount = {
+ count: '0',
+ rawcount: 0
+ };
if ( data.list === '100' ) {
- alertCount = {
- count: '1',
- rawcount: 1
- };
- count = 1;
- rawCount = 1;
- } else if ( data.list === 500 ) {
- messageCount = {
- count: '6',
- rawcount: 6
- };
- rawCount = 7;
- count = 7;
- } else {
alertCount = {
count: '0',
rawcount: 0
};
+ count = 1;
+ rawCount = 1;
}
+
+ if ( hasNewMessages && data.sections === 'alert' ) {
+ messageCount = {
+ count: '7',
+ rawcount: 7
+ };
+ rawCount = 7;
+ count = 7;
+ }
+
+ if ( data.list === 500 ) {
+ messageCount = {
+ count: '6',
+ rawcount: 6
+ };
+ rawCount = 6;
+ count = 6;
+ }
+
data = {
query: {
echomarkread: {
@@ -158,26 +172,47 @@
false, 'The badge no longer indicates new messages.' );
} );
- QUnit.test( 'Switch tabs on overlay. No unread messages, 1 unread alert.', 4, function( assert ) {
+ QUnit.test( 'mw.echo.overlay.buildOverlay with messages', 5, function( assert ) {
+ var $overlay;
+ this.sandbox.stub( mw.echo.overlay, 'api', new this.ApiStub( 'no-new-messages' ) );
+ mw.echo.overlay.buildOverlay( function( $o ) {
+ $overlay = $o;
+ } );
+ assert.strictEqual( $overlay.find( '.mw-echo-overlay-title ul li' ).length, 2, 'There are two tabs in header' );
+ assert.strictEqual( $overlay.find( '.mw-echo-notifications' ).length, 2, 'Overlay contains 2 lists of notifications.' );
+ assert.strictEqual( $overlay.find( '.mw-echo-overlay-title a' ).eq( 0 ).hasClass( 'mw-ui-active' ),
+ true, 'First tab is the selected tab upon opening.' );
+ assert.strictEqual( this.$badge.text(),
+ '0', 'The label updates to 0 as alerts tab is default and now alerts have been read.' );
+ assert.strictEqual( this.$badge.hasClass( 'mw-echo-unread-notifications' ),
+ false, 'The notification button class is updated with the default switch to alert tab.' );
+ } );
+
+ QUnit.test( 'Switch tabs on overlay. No unread messages, 1 unread alert.', 7, function( assert ) {
var $overlay, $tabs;
this.sandbox.stub( mw.echo.overlay, 'api', new this.ApiStub( 'no-new-messages' ) );
mw.echo.overlay.buildOverlay( function( $o ) {
$overlay = $o;
- $tabs = $overlay.find( '.mw-echo-overlay-title li a' );
+ // switch to 1st tab
+ $overlay.find( '.mw-echo-overlay-title li a' ).eq( 0 ).trigger( 'click' );
} );
- // switch to 2nd tab
- $overlay.find( '.mw-echo-overlay-title li a' ).eq( 1 ).trigger( 'click' );
+ $tabs = $overlay.find( '.mw-echo-overlay-title li a' );
- assert.strictEqual( $tabs.eq( 0 ).hasClass( 'mw-ui-quiet' ),
- false, 'First tab is now the selected tab.' );
assert.strictEqual( $tabs.eq( 1 ).hasClass( 'mw-ui-quiet' ),
- true, 'Second tab is now the selected tab.' );
+ false, 'Second tab is now the selected tab.' );
+ assert.strictEqual( $tabs.eq( 0 ).hasClass( 'mw-ui-quiet' ),
+ true, 'First tab is now the selected tab.' );
assert.strictEqual( this.$badge.text(),
'0', 'The label is now set to 0.' );
assert.strictEqual( this.$badge.hasClass( 'mw-echo-unread-notifications' ),
false, 'There are now zero unread notifications.' );
+
+ assert.strictEqual( $tabs.eq( 0 ).text(), 'Messages (0)', 'Check the label has a count in it.' );
+ assert.strictEqual( $tabs.eq( 1 ).text(), 'Alerts (0)', 'Check the label has an updated count in it.' );
+ assert.strictEqual( $tabs.eq( 1 ).hasClass( 'mw-ui-active' ),
+ true, 'Second tab has active class .as it is the only clickable tab' );
} );
QUnit.test( 'Unread message behaviour', 5, function( assert ) {
@@ -203,6 +238,35 @@
'There are no notifications now so no need for button.' );
} );
+ QUnit.test( 'Mark as read.', 8, function( assert ) {
+ var $overlay;
+ this.$badge.text( '8' );
+ this.sandbox.stub( mw.echo.overlay, 'api', new this.ApiStub( 'with-new-messages' ) );
+ mw.echo.overlay.buildOverlay( function( $o ) {
+ $overlay = $o;
+ } );
+
+ // Test initial state
+ assert.strictEqual( $overlay.find( '.mw-echo-overlay-title li a' ).eq( 0 ).text(), 'Messages (7)',
+ 'Check the label has a count in it and it is not automatically reset when tab is open.' );
+ assert.strictEqual( $overlay.find( '.mw-echo-unread' ).length, 8,
+ 'There are 7 unread message notifications and although the alert is marked as read on server is displays as unread in overlay.' );
+ assert.strictEqual( this.$badge.text(), '7', '7 unread notifications in badge (alerts get marked automatically).' );
+ assert.strictEqual( $overlay.find( '.mw-echo-notifications li button' ).length, 7,
+ 'There are 7 mark as read button.' );
+
+ // Click first mark as read
+ $overlay.find( '.mw-echo-notifications li button' ).eq( 0 ).trigger( 'click' );
+
+ assert.strictEqual( $overlay.find( '.mw-echo-overlay-title li a' ).eq( 0 ).text(), 'Messages (6)',
+ 'Check the notification was marked as read.' );
+ assert.strictEqual( $overlay.find( '.mw-echo-unread' ).length, 7,
+ 'There are now 6 unread message notifications in UI and 1 unread alert.' );
+ assert.strictEqual( $overlay.find( '.mw-echo-notifications li button' ).length, 6,
+ 'There are now 6 mark as read buttons.' );
+ assert.strictEqual( this.$badge.text(), '6', 'Now 6 unread notifications.' );
+ } );
+
QUnit.test( 'Tabs when there is overflow.', 2, function( assert ) {
var $overlay;
this.sandbox.stub( mw.echo.overlay, 'api', new this.ApiStub( 'with-new-messages', 50 ) );
@@ -227,11 +291,11 @@
// Test initial state
assert.strictEqual( $overlay.find( '.mw-echo-notifications' ).eq( 0 ).is( ':visible' ),
- false, 'First tab starts hidden.' );
+ false, 'First tab (messages) starts hidden.' );
assert.strictEqual( $overlay.find( '.mw-echo-notifications' ).eq( 1 ).is( ':visible' ),
- true, 'Second tab is visible.' );
+ true, 'Second tab (alerts) starts visibile.' );
- // Switch to first tab
+ // Switch to second tab
$overlay.find( '.mw-echo-overlay-title li a' ).eq( 0 ).trigger( 'click' );
// check new tab visibility