| import {assert} from 'chai'; |
| import sinon from 'sinon'; |
| |
| import MonorailTSMon, {PAGE_TYPES} from './monorail-ts-mon.js'; |
| |
| describe('MonorailTSMon', () => { |
| let mts; |
| |
| beforeEach(() => { |
| window.CS_env = { |
| token: 'rutabaga-token', |
| tokenExpiresSec: 1234, |
| app_version: 'rutabaga-version', |
| }; |
| window.chops = {rpc: {PrpcClient: sinon.spy()}}; |
| MonorailTSMon.prototype.disableAfterNextFlush = sinon.spy(); |
| mts = new MonorailTSMon(); |
| }); |
| |
| afterEach(() => { |
| delete window.CS_env; |
| }); |
| |
| describe('constructor', () => { |
| it('initializes a prpcClient', () => { |
| assert.equal(mts.prpcClient.constructor.name, 'AutoRefreshPrpcClient'); |
| }); |
| |
| it('sets a client ID', () => { |
| assert.isNotNull(mts.clientId); |
| }); |
| |
| it('disables sending after next flush', () => { |
| sinon.assert.calledOnce(mts.disableAfterNextFlush); |
| }); |
| }); |
| |
| it('generateClientId', () => { |
| const clientID = MonorailTSMon.generateClientId(); |
| assert.isNotNumber(clientID); |
| const clientIDNum = parseInt(clientID, 32); |
| assert.isNumber(clientIDNum); |
| assert.isAtLeast(clientIDNum, 0); |
| assert.isAtMost(clientIDNum, Math.pow(2, 32)); |
| }); |
| |
| describe('recordUserTiming', () => { |
| it('records a timing metric only if matches', () => { |
| const metric = {add: sinon.spy()}; |
| mts._userTimingMetrics = [{ |
| category: 'rutabaga', |
| eventName: 'rutabaga-name', |
| eventLabel: 'rutabaga-label', |
| metric: metric, |
| }]; |
| |
| mts.recordUserTiming('kohlrabi', 'rutabaga-name', 'rutabaga-label', 1); |
| sinon.assert.notCalled(metric.add); |
| metric.add.resetHistory(); |
| |
| mts.recordUserTiming('rutabaga', 'is-a-tuber', 'rutabaga-label', 1); |
| sinon.assert.notCalled(metric.add); |
| metric.add.resetHistory(); |
| |
| mts.recordUserTiming('rutabaga', 'rutabaga-name', 'went bad', 1); |
| sinon.assert.notCalled(metric.add); |
| metric.add.resetHistory(); |
| |
| mts.recordUserTiming('rutabaga', 'rutabaga-name', 'rutabaga-label', 1); |
| sinon.assert.calledOnce(metric.add); |
| assert.equal(metric.add.args[0][0], 1); |
| const argsKeys = Array.from(metric.add.args[0][1].keys()); |
| assert.deepEqual(argsKeys, ['client_id', 'host_name', 'document_visible']); |
| }); |
| }); |
| |
| describe('recordPageLoadTiming', () => { |
| beforeEach(() => { |
| mts.pageLoadMetric = {add: sinon.spy()}; |
| sinon.stub(MonorailTSMon, 'isPageVisible').callsFake(() => (true)); |
| }); |
| |
| afterEach(() => { |
| MonorailTSMon.isPageVisible.restore(); |
| }); |
| |
| it('records page load on issue entry page', () => { |
| mts.recordIssueEntryTiming(); |
| sinon.assert.calledOnce(mts.pageLoadMetric.add); |
| assert.isNumber(mts.pageLoadMetric.add.getCall(0).args[0]); |
| assert.isString(mts.pageLoadMetric.add.getCall(0).args[1].get( |
| 'client_id')); |
| assert.equal(mts.pageLoadMetric.add.getCall(0).args[1].get( |
| 'host_name'), 'rutabaga-version'); |
| assert.equal(mts.pageLoadMetric.add.getCall(0).args[1].get( |
| 'template_name'), 'issue_entry'); |
| assert.equal(mts.pageLoadMetric.add.getCall(0).args[1].get( |
| 'document_visible'), true); |
| }); |
| |
| it('does not record page load timing on other pages', () => { |
| mts.recordPageLoadTiming(); |
| sinon.assert.notCalled(mts.pageLoadMetric.add); |
| }); |
| |
| it('does not record page load timing if over max threshold', () => { |
| window.performance = { |
| timing: { |
| navigationStart: 1000, |
| domContentLoadedEventEnd: 2001, |
| }, |
| }; |
| mts.recordIssueEntryTiming(1000); |
| sinon.assert.notCalled(mts.pageLoadMetric.add); |
| }); |
| |
| it('records page load on issue entry page if under threshold', () => { |
| MonorailTSMon.isPageVisible.restore(); |
| sinon.stub(MonorailTSMon, 'isPageVisible').callsFake(() => (false)); |
| window.performance = { |
| timing: { |
| navigationStart: 1000, |
| domContentLoadedEventEnd: 1999, |
| }, |
| }; |
| mts.recordIssueEntryTiming(1000); |
| sinon.assert.calledOnce(mts.pageLoadMetric.add); |
| assert.isNumber(mts.pageLoadMetric.add.getCall(0).args[0]); |
| assert.equal(mts.pageLoadMetric.add.getCall(0).args[0], 999); |
| assert.isString(mts.pageLoadMetric.add.getCall(0).args[1].get( |
| 'client_id')); |
| assert.equal(mts.pageLoadMetric.add.getCall(0).args[1].get( |
| 'host_name'), 'rutabaga-version'); |
| assert.equal(mts.pageLoadMetric.add.getCall(0).args[1].get( |
| 'template_name'), 'issue_entry'); |
| assert.equal(mts.pageLoadMetric.add.getCall(0).args[1].get( |
| 'document_visible'), false); |
| }); |
| }); |
| |
| describe('getGlobalClient', () => { |
| it('only creates one global client', () => { |
| delete window.__tsMonClient; |
| const client1 = MonorailTSMon.getGlobalClient(); |
| assert.equal(client1, window.__tsMonClient); |
| |
| const client2 = MonorailTSMon.getGlobalClient(); |
| assert.equal(client2, window.__tsMonClient); |
| assert.equal(client2, client1); |
| }); |
| }); |
| }); |