mediawiki-extensions-Popups/tests/qunit/ext.popups/reducers/preview.test.js
joakin e49103061e Don't reset interaction info when dwelling back to a link
When dwelling back to a link, previously a new LINK_DWELL action would
be sent and the reducer would reset the interaction as if it was a new
one.

This shouldn't happen, since dwelling back to the active link (from
the preview, for example) is not a new interaction, and should not
create a new interaction or hide and show the preview.

With this change, the preview reducer has the notion of new or repeat
interactions, and only resets state on new ones, and only sets
isUserDwelling when dwelling on a the link of the current interaction.

Also when the interaction is repeat, we guard on the action creator and
don't trigger the wait or the fetch request.

Change-Id: I71cde81cbfe50b6f955e562e7e5b57d0f920fdb9
2017-01-10 17:44:37 -08:00

214 lines
4.1 KiB
JavaScript

( function ( mw, $ ) {
QUnit.module( 'ext.popups/reducers#preview', {
setup: function () {
this.el = $( '<a>' );
}
} );
QUnit.test( '@@INIT', function ( assert ) {
var state = mw.popups.reducers.preview( undefined, { type: '@@INIT' } );
assert.expect( 1 );
assert.deepEqual(
state,
{
enabled: undefined,
activeLink: undefined,
activeEvent: undefined,
activeToken: '',
shouldShow: false,
isUserDwelling: false
}
);
} );
QUnit.test( 'BOOT', function ( assert ) {
var action = {
type: 'BOOT',
isEnabled: true
};
assert.expect( 1 );
assert.deepEqual(
mw.popups.reducers.preview( {}, action ),
{
enabled: true
},
'It should set whether or not previews are enabled.'
);
} );
QUnit.test( 'SETTINGS_CHANGE', function ( assert ) {
var action = {
type: 'SETTINGS_CHANGE',
enabled: true
};
assert.expect( 1 );
assert.deepEqual(
mw.popups.reducers.preview( {}, action ),
{
enabled: true
},
'It should set whether or not previews are enabled when settings change.'
);
} );
QUnit.test( 'LINK_DWELL initializes the state for a new link', function ( assert ) {
var action = {
type: 'LINK_DWELL',
el: this.el,
event: {},
token: '1234567890'
};
assert.deepEqual(
mw.popups.reducers.preview( {}, action ),
{
activeLink: action.el,
activeEvent: action.event,
activeToken: action.token,
shouldShow: false,
isUserDwelling: true
},
'It should set active link and event as well as interaction info and hide the preview.'
);
} );
QUnit.test( 'LINK_DWELL on an active link only updates dwell state', function ( assert ) {
var action = {
type: 'LINK_DWELL',
el: this.el,
event: {},
token: '1234567890'
},
state = {
activeLink: this.el,
isUserDwelling: false
};
assert.deepEqual(
mw.popups.reducers.preview( state, action ),
{
activeLink: this.el,
isUserDwelling: true
},
'It should only set isUserDwelling to true'
);
} );
QUnit.test( 'LINK_ABANDON_END', function ( assert ) {
var action = {
type: 'LINK_ABANDON_END',
el: this.el
},
state = {
activeLink: this.el
};
assert.deepEqual(
mw.popups.reducers.preview( state, action ),
{
activeLink: undefined,
activeEvent: undefined,
fetchResponse: undefined,
shouldShow: false
},
'It should hide the preview and reset the interaction info.'
);
// ---
state = {
activeLink: this.el,
isUserDwelling: true
};
assert.equal(
mw.popups.reducers.preview( state, action ),
state,
'It should NOOP if the user is dwelling on the preview.'
);
} );
QUnit.test( 'FETCH_END', function ( assert ) {
var state = {
activeLink: this.el
},
action = {
type: 'FETCH_END',
el: this.el,
result: {}
};
assert.expect( 2 );
assert.deepEqual(
mw.popups.reducers.preview( state, action ),
{
activeLink: state.activeLink, // Previous state.
fetchResponse: action.result,
shouldShow: true
},
'It should store the result and signal that a preview should be rendered.'
);
// ---
state = {
activeLink: $( '<a>' )
};
action = {
type: 'FETCH_END',
el: this.el,
result: {}
};
assert.deepEqual(
mw.popups.reducers.preview( state, action ),
state,
'It should NOOP if the user has interacted with another link since the request was dispatched via the gateway.'
);
} );
QUnit.test( 'PREVIEW_DWELL', function ( assert ) {
var action = {
type: 'PREVIEW_DWELL'
};
assert.expect( 1 );
assert.deepEqual(
mw.popups.reducers.preview( {}, action ),
{
isUserDwelling: true
},
'It should mark the preview as being dwelled on.'
);
} );
QUnit.test( 'PREVIEW_ABANDON_START', function ( assert ) {
var actions = [ 'PREVIEW_ABANDON_START', 'LINK_ABANDON_START' ];
$.each( actions, function ( i, testCase ) {
var action = {
type: testCase
};
assert.deepEqual(
mw.popups.reducers.preview( {}, action ),
{
isUserDwelling: false
},
testCase + ' should mark the preview having been abandoned.'
);
} );
} );
}( mediaWiki, jQuery ) );