summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/MultimediaViewer/tests/qunit/mmv/logging/mmv.logging.ViewLogger.test.js
blob: 5da3633fed5971f81112cc920d9c1d2480c3b5d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
( function ( mw, $ ) {
	QUnit.module( 'mmv.logging.ViewLogger', QUnit.newMwEnvironment( {
		setup: function () {
			this.clock = this.sandbox.useFakeTimers();

			// since jQuery 2/3, $.now will capture a reference to Date.now
			// before above fake timer gets a chance to override it, so I'll
			// override that new behavior in order to run these tests...
			// @see https://github.com/sinonjs/lolex/issues/76
			this.oldNow = $.now;
			$.now = function () { return +( new Date() ); };
		},

		teardown: function () {
			$.now = this.oldNow;
			this.clock.restore();
		}
	} ) );

	QUnit.test( 'unview()', function ( assert ) {
		var logger = { log: $.noop },
			viewLogger = new mw.mmv.logging.ViewLogger( { recordVirtualViewBeaconURI: $.noop }, {}, logger );

		this.sandbox.stub( logger, 'log' );

		viewLogger.unview();

		assert.ok( !logger.log.called, 'action logger not called' );

		viewLogger.setLastViewLogged( false );
		viewLogger.unview();

		assert.ok( !logger.log.called, 'action logger not called' );

		viewLogger.setLastViewLogged( true );
		viewLogger.unview();

		assert.ok( logger.log.calledOnce, 'action logger called' );

		viewLogger.unview();

		assert.ok( logger.log.calledOnce, 'action logger not called again' );
	} );

	QUnit.test( 'focus and blur', function ( assert ) {
		var fakeWindow = $( '<div>' ),
			viewLogger = new mw.mmv.logging.ViewLogger( { recordVirtualViewBeaconURI: $.noop }, fakeWindow, { log: $.noop } );

		this.clock.tick( 1 ); // This is just so that $.now() > 0 in the fake timer environment

		viewLogger.attach();

		this.clock.tick( 5 );

		fakeWindow.triggerHandler( 'blur' );

		this.clock.tick( 2 );

		fakeWindow.triggerHandler( 'focus' );

		this.clock.tick( 3 );

		fakeWindow.triggerHandler( 'blur' );

		this.clock.tick( 4 );

		assert.strictEqual( viewLogger.viewDuration, 8, 'Only focus duration was logged' );
	} );

	QUnit.test( 'stopViewDuration before startViewDuration', function ( assert ) {
		var viewLogger = new mw.mmv.logging.ViewLogger( { recordVirtualViewBeaconURI: $.noop }, {}, { log: $.noop } );

		this.clock.tick( 1 ); // This is just so that $.now() > 0 in the fake timer environment

		viewLogger.stopViewDuration();

		this.clock.tick( 2 );

		viewLogger.startViewDuration();

		this.clock.tick( 3 );

		viewLogger.stopViewDuration();

		assert.strictEqual( viewLogger.viewDuration, 3, 'Only last timeframe was logged' );
	} );
}( mediaWiki, jQuery ) );