2018-03-27 19:42:01 +00:00
|
|
|
/* global Promise */
|
|
|
|
import getPageviewTracker, { getSendBeacon } from '../../src/getPageviewTracker';
|
|
|
|
|
|
|
|
QUnit.module( 'ext.popups#getPageviewTracker', {
|
|
|
|
beforeEach: function () {
|
|
|
|
this.makeBeaconUrl = this.sandbox.stub();
|
|
|
|
this.prepare = this.sandbox.stub();
|
|
|
|
this.trackerGetter = () => ( { makeBeaconUrl: this.makeBeaconUrl,
|
|
|
|
prepare: this.prepare } );
|
|
|
|
this.loader = () => Promise.resolve();
|
2018-04-10 14:56:07 +00:00
|
|
|
this.Title = {
|
|
|
|
newFromText: this.sandbox.stub()
|
|
|
|
};
|
|
|
|
mediaWiki.Title = this.Title;
|
|
|
|
},
|
|
|
|
afterEach() {
|
|
|
|
mediaWiki.Title = null;
|
2018-03-27 19:42:01 +00:00
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
const enabledConfig = {
|
|
|
|
get: () => true
|
|
|
|
};
|
|
|
|
|
|
|
|
QUnit.test( 'getPageviewTracker', function ( assert ) {
|
|
|
|
const loader = this.sandbox.stub();
|
|
|
|
const sendBeacon = this.sandbox.stub();
|
2018-04-10 14:56:07 +00:00
|
|
|
|
|
|
|
/* eslint-disable camelcase */
|
|
|
|
const data = {
|
|
|
|
page_title: 'Test title',
|
|
|
|
source_title: 'Source title',
|
|
|
|
page_namespace: 1,
|
|
|
|
source_url: 'http://some/url'
|
|
|
|
};
|
|
|
|
const eventData = {
|
|
|
|
page_title: 'Test_title',
|
|
|
|
source_title: 'Source_title',
|
|
|
|
page_namespace: 1,
|
|
|
|
source_url: 'http://some/url'
|
|
|
|
};
|
|
|
|
this.Title.newFromText.withArgs( data.page_title ).returns( {
|
|
|
|
getPrefixedDb: () => eventData.page_title
|
|
|
|
} );
|
|
|
|
this.Title.newFromText.withArgs( data.source_title ).returns( {
|
|
|
|
getPrefixedDb: () => eventData.source_title
|
|
|
|
} );
|
|
|
|
/* eslint-enable camelcase */
|
2018-03-27 19:42:01 +00:00
|
|
|
const tracker = getPageviewTracker( enabledConfig,
|
|
|
|
loader, this.trackerGetter, sendBeacon );
|
|
|
|
|
|
|
|
loader.resolves();
|
|
|
|
return tracker( 'event.VirtualPageView', data ).then( () => {
|
2018-04-24 22:03:32 +00:00
|
|
|
assert.strictEqual( loader.callCount, 1, 'loader called once' );
|
2018-03-27 19:42:01 +00:00
|
|
|
assert.ok( loader.calledWith( [ 'ext.eventLogging', 'schema.VirtualPageView' ] ),
|
|
|
|
'appropriate code is loaded' );
|
2018-05-08 19:48:17 +00:00
|
|
|
assert.strictEqual(
|
|
|
|
this.Title.newFromText.callCount,
|
|
|
|
2,
|
|
|
|
'The title factory was invoked twice.'
|
|
|
|
);
|
2018-04-10 14:56:07 +00:00
|
|
|
assert.ok( this.prepare.calledWith( 'VirtualPageView', eventData ),
|
2018-03-27 19:42:01 +00:00
|
|
|
'mw.eventLog.prepare called appropriately' );
|
2018-04-24 22:03:32 +00:00
|
|
|
assert.strictEqual( this.makeBeaconUrl.callCount, 1,
|
2018-03-27 19:42:01 +00:00
|
|
|
'makeBeacon called with result of prepare' );
|
2018-04-24 22:03:32 +00:00
|
|
|
assert.strictEqual( sendBeacon.callCount, 1,
|
2018-03-27 19:42:01 +00:00
|
|
|
'sendBeacon called with url from makeBeaconUrl' );
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
|
|
|
QUnit.test( 'getSendBeacon', function ( assert ) {
|
|
|
|
let success = false;
|
|
|
|
const navtr = {
|
|
|
|
successful: true,
|
|
|
|
sendBeacon: function () {
|
|
|
|
// This local variable helps test context. Don't refactor.
|
|
|
|
success = this.successful;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const sendBeacon = getSendBeacon( navtr );
|
|
|
|
sendBeacon();
|
|
|
|
assert.ok( success, 'native sendBeacon is used when available and run in appropriate context' );
|
|
|
|
} );
|
|
|
|
|
|
|
|
QUnit.test( 'getSendBeacon (fallback)', function ( assert ) {
|
|
|
|
const spy = this.sandbox.spy( document, 'createElement' );
|
|
|
|
const sendBeacon = getSendBeacon( {} );
|
|
|
|
sendBeacon();
|
2018-04-24 22:03:32 +00:00
|
|
|
assert.strictEqual( spy.callCount, 1, 'an img element is used as fallback' );
|
2018-03-27 19:42:01 +00:00
|
|
|
} );
|