/* globals expect */ /* globals describe */ /* globals it */ /* globals sinon */ var Telemeter = require('../src/telemetry'); describe('Telemetry()', function() { it('should have all of the expected methods', function(done) { var options = {}; var t = new Telemeter(options); expect(t).to.have.property('copyEvents'); expect(t).to.have.property('capture'); expect(t).to.have.property('captureLog'); expect(t).to.have.property('captureError'); expect(t).to.have.property('captureNetwork'); expect(t).to.have.property('captureEvent'); done(); }); }); describe('capture', function() { it('should return a valid telemetry event', function(done) { var options = {}; var t = new Telemeter(options); var now = +new Date(); var event = t.capture('network', {url: 'a.com'}, 'debug'); expect(event.timestamp_ms - now).to.be.below(500); expect(event.type).to.equal('network'); expect(event.level).to.equal('debug'); expect(event.body.url).to.equal('a.com'); done(); }); }); describe('captureEvent', function() { it('should return a valid telemetry event', function(done) { var t = new Telemeter(); var event = t.captureEvent('log', {message: 'bar'}, 'info'); expect(event.type).to.equal('log'); expect(event.level).to.equal('info'); expect(event.body.message).to.equal('bar'); done(); }); }); describe('filterTelemetry', function() { it('should filter out events that don\'t match the test', function(done) { var options = { filterTelemetry: function(e) { return e.type === 'network' && (e.body.subtype === 'xhr' || e.body.subtype === 'fetch') && e.body.url.indexOf('https://spammer.com') === 0; } }; var t = new Telemeter(options); var evt = t.capture('network', {url: 'https://spammer.com', subtype: 'xhr'}, 'debug'); expect(evt).to.be(false); done(); }); it('should filter out events in copy even if they are modified after capture', function(done) { var options = { filterTelemetry: function(e) { return e.type === 'network' && e.body.statusCode === 200; } }; var t = new Telemeter(options); var evt = t.capture('network', {url: 'https://spammer.com'}, 'debug'); var evt2 = t.capture('network', {url: 'https://spammer.com', statusCode: 404}, 'debug'); expect(evt).not.to.be(false); expect(evt2).not.to.be(false); var events = t.copyEvents(); expect(events.length).to.equal(2); evt.body.statusCode = 200; events = t.copyEvents(); expect(events.length).to.equal(1); expect(events[0].body.statusCode).to.equal(404); done(); }); }); describe('configure', function() { it('should truncate events to new max', function(done) { var options = {maxTelemetryEvents: 5}; var t = new Telemeter(options); for (var i = 0; i < 7; i++) { t.capture('network', {url: 'a.com'}, 'debug'); } expect(t.queue.length).to.equal(5); t.configure({maxTelemetryEvents: 3}); expect(t.queue.length).to.equal(3); done(); }); it('should lengthen events to allow new max', function(done) { var options = {maxTelemetryEvents: 3}; var t = new Telemeter(options); for (var i = 0; i < 7; i++) { t.capture('network', {url: 'a.com'}, 'debug'); } expect(t.queue.length).to.equal(3); t.configure({maxTelemetryEvents: 5}); expect(t.queue.length).to.equal(3); for (var i = 0; i < 7; i++) { t.capture('network', {url: 'a.com'}, 'debug'); } expect(t.queue.length).to.equal(5); done(); }); it('does not drop existing options that are not passed to configure', function(done) { var options = {maxTelemetryEvents: 3}; var t = new Telemeter(options); for (var i = 0; i < 7; i++) { t.capture('network', {url: 'a.com'}, 'debug'); } expect(t.queue.length).to.equal(3); t.configure({}); expect(t.queue.length).to.equal(3); for (var i = 0; i < 7; i++) { t.capture('network', {url: 'a.com'}, 'debug'); } expect(t.queue.length).to.equal(3); done(); }); });