mediawiki-extensions-Popups/tests/qunit/ext.popups/reducers.eventLogging.test.js
Sam Smith df441982fa {LINK,PREVIEW}_ABANDON_END logs an event
Since the user can dwell on a link, abandon it while moving to dwell on
the preview and vice versa:

* The time at which the link/preview was abandoned is recorded and can
  be updated.
* The event can only be queued when the link/preview has definitely been
  abandoned.

Reducer changes:
* Make the eventLogging reducer:
  * Calculate the time it took to show the preview.
  * Mark the interaction as finished when the user abandons the link or
    the preview.
  * Queue a "dismissed" event if the preview hasn't been shown or a
    "dwelledButAbandoned" event if it has when the abandon has
    finalized.

Bug: T152225
Change-Id: I6a254136f615484fc26e440fe5125289e74688a6
2016-12-12 19:00:33 +00:00

199 lines
4 KiB
JavaScript

( function ( mw ) {
var counts = mw.popups.counts;
QUnit.module( 'ext.popups/reducers#eventLogging', {
setup: function () {
this.initialState = mw.popups.reducers.eventLogging( undefined, {
type: '@@INIT'
} );
}
} );
QUnit.test( 'BOOT', function ( assert ) {
var action = {
type: 'BOOT',
sessionToken: '0123456789',
pageToken: '9876543210',
page: {
title: 'Foo',
namespaceID: 1,
id: 2
},
user: {
isInCondition: true,
isAnon: false,
editCount: 11,
previewCount: 22
}
},
expectedEditCountBucket,
expectedPreviewCountBucket;
expectedEditCountBucket = counts.getEditCountBucket( action.user.editCount );
expectedPreviewCountBucket = counts.getPreviewCountBucket( action.user.previewCount );
assert.deepEqual(
mw.popups.reducers.eventLogging( this.initialState, action ),
{
previewCount: action.user.previewCount,
baseData: {
pageTitleSource: action.page.title,
namespaceIdSource: action.page.namespaceID,
pageIdSource: action.page.id,
isAnon: action.user.isAnon,
popupEnabled: action.user.isInCondition,
pageToken: action.pageToken,
sessionToken: action.sessionToken,
editCountBucket: expectedEditCountBucket,
previewCountBucket: expectedPreviewCountBucket
},
event: {
action: 'pageLoaded'
},
interaction: undefined
}
);
} );
QUnit.test( 'EVENT_LOGGED', function ( assert ) {
var state,
action;
state = {
event: {}
};
action = {
type: 'EVENT_LOGGED'
};
assert.deepEqual(
mw.popups.reducers.eventLogging( state, action ),
{
event: undefined
},
'It dequeues any event queued for logging.'
);
} );
QUnit.test( 'PREVIEW_SHOW', function ( assert ) {
var state,
count = 22,
expectedCount = count + 1;
state = {
previewCount: count,
baseData: {
previewCountBucket: counts.getPreviewCountBucket( count )
},
event: undefined,
// state.interaction.started is used in this part of the reducer.
interaction: {}
};
state = mw.popups.reducers.eventLogging( state, {
type: 'PREVIEW_SHOW'
} );
assert.equal(
state.previewCount,
expectedCount,
'It updates the user\'s preview count.'
);
assert.deepEqual(
state.baseData,
{
previewCountBucket: counts.getPreviewCountBucket( expectedCount )
},
'It re-buckets the user\'s preview count.'
);
} );
QUnit.module( 'ext.popups/reducers#eventLogging @integration' );
QUnit.test( 'LINK_DWELL starts an interaction', function ( assert ) {
var state,
action;
state = {
interaction: undefined
};
action = {
type: 'LINK_DWELL',
interactionToken: '0987654321',
timestamp: mw.now()
};
assert.deepEqual(
mw.popups.reducers.eventLogging( state, action ),
{
interaction: {
token: action.interactionToken,
started: action.timestamp
}
}
);
} );
QUnit.test( 'LINK_CLICK should enqueue an "opened" event', function ( assert ) {
var state,
now = mw.now();
state = {
interaction: undefined
};
state = mw.popups.reducers.eventLogging( state, {
type: 'LINK_DWELL',
interactionToken: '0987654321',
timestamp: now
} );
state = mw.popups.reducers.eventLogging( state, {
type: 'LINK_CLICK',
timestamp: now + 250.25
} );
assert.deepEqual(
state.event,
{
action: 'opened',
linkInteractionToken: '0987654321',
totalInteractionTime: 250
},
'The event is enqueued and the totalInteractionProperty is an integer.'
);
} );
QUnit.test( 'PREVIEW_SHOW should update the perceived wait time of the interaction', function ( assert ) {
var state,
now = mw.now();
state = {
interaction: undefined
};
state = mw.popups.reducers.eventLogging( state, {
type: 'LINK_DWELL',
interactionToken: '0987654321',
timestamp: now
} );
state = mw.popups.reducers.eventLogging( state, {
type: 'PREVIEW_SHOW',
timestamp: now + 500
} );
assert.deepEqual( state.interaction, {
token: '0987654321',
started: now,
timeToPreviewShow: 500
} );
} );
}( mediaWiki ) );