/* globals expect */ /* globals describe */ /* globals it */ /* globals sinon */ var p = require('../src/predicates'); var logger = { log: function () {}, error: function () {}, }; describe('userCheckIgnore', function () { it('should return true if no user function', function () { var item = { level: 'debug', body: 'stuff', _originalArgs: [1, 2, 3] }; var settings = { reportLevel: 'debug' }; expect(p.userCheckIgnore(logger)(item, settings)).to.be.ok(); }); it('should return true if checkIgnore is not a function', function () { var item = { level: 'debug', body: 'stuff', _originalArgs: [1, 2, 3] }; var settings = { reportLevel: 'debug', checkIgnore: true }; expect(p.userCheckIgnore(logger)(item, settings)).to.be.ok(); }); it('should return true if checkIgnore returns false', function () { var item = { level: 'debug', body: 'stuff', _originalArgs: [1, 2, 3] }; var settings = { reportLevel: 'debug', checkIgnore: function () { return false; }, }; expect(p.userCheckIgnore(logger)(item, settings)).to.be.ok(); }); it('should return false if checkIgnore returns true', function () { var item = { level: 'debug', body: 'stuff', _originalArgs: [1, 2, 3] }; var settings = { reportLevel: 'debug', checkIgnore: function () { return true; }, }; expect(p.userCheckIgnore(logger)(item, settings)).to.not.be.ok(); }); it('should return true if checkIgnore throws', function () { var item = { level: 'debug', body: 'stuff', _originalArgs: [1, 2, 3] }; var settings = { reportLevel: 'debug', checkIgnore: function () { throw new Error('bork bork'); }, }; expect(p.userCheckIgnore(logger)(item, settings)).to.be.ok(); expect(settings.checkIgnore).to.not.be.ok(); }); it('should get the right arguments', function () { var item = { level: 'debug', body: 'stuff', _originalArgs: [1, 2, 3] }; var settings = { reportLevel: 'debug', checkIgnore: function (isUncaught, args, payload) { expect(isUncaught).to.not.be.ok(); expect(args).to.eql([1, 2, 3]); expect(payload).to.eql(item); }, }; expect(p.userCheckIgnore(logger)(item, settings)).to.be.ok(); }); }); describe('urlIsSafeListed', function () { var item = { level: 'critical', body: { trace: { frames: [ { filename: 'http://api.fake.com/v1/something' }, { filename: 'http://api.example.com/v1/something' }, { filename: 'http://api.fake.com/v2/something' }, ], }, }, }; var traceChainItem = { level: 'critical', body: { trace_chain: [ { frames: [ { filename: 'http://api.fake.com/v1/something' }, { filename: 'http://api.example.com/v1/something' }, { filename: 'http://api.fake.com/v2/something' }, ], }, { frames: [ { filename: 'http://api.fake1.com/v2/something' }, { filename: 'http://api.example1.com/v2/something' }, { filename: 'http://api.fake1.com/v3/something' }, ], }, ], }, }; it('should return true with no safelist', function () { var settings = { reportLevel: 'debug', }; expect(p.urlIsSafeListed(logger)(item, settings)).to.be.ok(); expect(p.urlIsSafeListed(logger)(traceChainItem, settings)).to.be.ok(); }); it('should return true with no trace', function () { var item = { level: 'critical', body: { message: 'hey' }, }; var settings = { reportLevel: 'debug', hostSafeList: ['fake.com', 'example.com'], }; expect(p.urlIsSafeListed(logger)(item, settings)).to.be.ok(); }); it('should return true if at least one regex matches at least one filename in the trace', function () { var settings = { reportLevel: 'debug', hostSafeList: ['example.com'], }; expect(p.urlIsSafeListed(logger)(item, settings)).to.be.ok(); expect(p.urlIsSafeListed(logger)(traceChainItem, settings)).to.be.ok(); }); it('should return true if the filename is not a string', function () { var item = { level: 'critical', body: { trace: { frames: [ { filename: { url: 'http://api.fake.com/v1/something' } }, { filename: { url: 'http://api.example.com/v1/something' } }, { filename: { url: 'http://api.fake.com/v2/something' } }, ], }, }, }; var traceChainItem = { level: 'critical', body: { trace_chain: [ { frames: [ { filename: { url: 'http://api.fake.com/v1/something' } }, { filename: { url: 'http://api.example.com/v1/something' } }, { filename: { url: 'http://api.fake.com/v2/something' } }, ], }, { frames: [ { filename: { url: 'http://api.fake.com/v1/something' } }, { filename: { url: 'http://api.example.com/v1/something' } }, { filename: { url: 'http://api.fake.com/v2/something' } }, ], }, ], }, }; var settings = { reportLevel: 'debug', hostSafeList: ['nope.com'], }; expect(p.urlIsSafeListed(logger)(item, settings)).to.be.ok(); expect(p.urlIsSafeListed(logger)(traceChainItem, settings)).to.be.ok(); }); it('should return true if there is no frames key', function () { var item = { level: 'critical', body: { trace: { notframes: [] } }, }; var traceChainItem = { level: 'critical', body: { trace_chain: [{ notframes: [] }, { notframes: [] }] }, }; var settings = { reportLevel: 'debug', hostSafeList: ['nope.com'], }; expect(p.urlIsSafeListed(logger)(item, settings)).to.be.ok(); expect(p.urlIsSafeListed(logger)(traceChainItem, settings)).to.be.ok(); }); it('should return true if there are no frames', function () { var item = { level: 'critical', body: { trace: { frames: [] } }, }; var traceChainItem = { level: 'critical', body: { trace_chain: [{ frames: [] }, { frames: [] }] }, }; var settings = { reportLevel: 'debug', hostSafeList: ['nope.com'], }; expect(p.urlIsSafeListed(logger)(item, settings)).to.be.ok(); expect(p.urlIsSafeListed(logger)(traceChainItem, settings)).to.be.ok(); }); it('should return false if nothing in the safelist matches', function () { var settings = { reportLevel: 'debug', hostSafeList: ['baz.com', 'foo.com'], }; expect(p.urlIsSafeListed(logger)(item, settings)).to.not.be.ok(); expect(p.urlIsSafeListed(logger)(traceChainItem, settings)).to.not.be.ok(); }); }); describe('urlIsNotBlockListed', function () { var item = { level: 'critical', body: { trace: { frames: [ { filename: 'http://api.fake.com/v1/something' }, { filename: 'http://api.example.com/v1/something' }, { filename: 'http://api.fake.com/v2/something' }, ], }, }, }; var traceChainItem = { level: 'critical', body: { trace_chain: [ { frames: [ { filename: 'http://api.fake.com/v1/something' }, { filename: 'http://api.example.com/v1/something' }, { filename: 'http://api.fake.com/v2/something' }, ], }, { frames: [ { filename: 'http://api.fake1.com/v2/something' }, { filename: 'http://api.example1.com/v2/something' }, { filename: 'http://api.fake1.com/v3/something' }, ], }, ], }, }; it('should return true with no blocklist', function () { var settings = { reportLevel: 'debug', }; expect(p.urlIsNotBlockListed(logger)(item, settings)).to.be.ok(); expect(p.urlIsNotBlockListed(logger)(traceChainItem, settings)).to.be.ok(); }); it('should return true with no trace', function () { var item = { level: 'critical', body: { message: 'hey' }, }; var settings = { reportLevel: 'debug', hostBlockList: ['fake.com', 'other.com'], }; expect(p.urlIsNotBlockListed(logger)(item, settings)).to.be.ok(); }); it('should return false if any regex matches at least one filename in the trace', function () { var settings = { reportLevel: 'debug', hostBlockList: ['example.com', 'other.com'], }; expect(p.urlIsNotBlockListed(logger)(item, settings)).to.not.be.ok(); expect( p.urlIsNotBlockListed(logger)(traceChainItem, settings), ).to.not.be.ok(); }); it('should return true if the filename is not a string', function () { var item = { level: 'critical', body: { trace: { frames: [ { filename: { url: 'http://api.fake.com/v1/something' } }, { filename: { url: 'http://api.example.com/v1/something' } }, { filename: { url: 'http://api.fake.com/v2/something' } }, ], }, }, }; var traceChainItem = { level: 'critical', body: { trace_chain: [ { frames: [ { filename: { url: 'http://api.fake.com/v1/something' } }, { filename: { url: 'http://api.example.com/v1/something' } }, { filename: { url: 'http://api.fake.com/v2/something' } }, ], }, { frames: [ { filename: { url: 'http://api.fake.com/v1/something' } }, { filename: { url: 'http://api.example.com/v1/something' } }, { filename: { url: 'http://api.fake.com/v2/something' } }, ], }, ], }, }; var settings = { reportLevel: 'debug', hostBlockList: ['example.com', 'other.com'], }; expect(p.urlIsNotBlockListed(logger)(item, settings)).to.be.ok(); expect(p.urlIsNotBlockListed(logger)(traceChainItem, settings)).to.be.ok(); }); it('should return true if there is no frames key', function () { var item = { level: 'critical', body: { trace: { notframes: [] } }, }; var traceChainItem = { level: 'critical', body: { trace_chain: [{ notframes: [] }, { notframes: [] }] }, }; var settings = { reportLevel: 'debug', hostBlockList: ['nope.com'], }; expect(p.urlIsNotBlockListed(logger)(item, settings)).to.be.ok(); expect(p.urlIsNotBlockListed(logger)(traceChainItem, settings)).to.be.ok(); }); it('should return true if there are no frames', function () { var item = { level: 'critical', body: { trace: { frames: [] } }, }; var traceChainItem = { level: 'critical', body: { trace_chain: [{ frames: [] }, { frames: [] }] }, }; var settings = { reportLevel: 'debug', hostBlockList: ['nope.com'], }; expect(p.urlIsNotBlockListed(logger)(item, settings)).to.be.ok(); expect(p.urlIsNotBlockListed(logger)(traceChainItem, settings)).to.be.ok(); }); it('should return true if nothing in the blocklist matches', function () { var settings = { reportLevel: 'debug', hostBlockList: ['baz.com', 'foo.com'], }; expect(p.urlIsNotBlockListed(logger)(item, settings)).to.be.ok(); expect(p.urlIsNotBlockListed(logger)(traceChainItem, settings)).to.be.ok(); }); }); describe('messageIsIgnored', function () { it('true if no ignoredMessages setting', function () { var item = { level: 'critical', body: { trace: { exception: { message: 'bork bork' } }, message: { body: 'fuzz' }, }, }; var settings = { reportLevel: 'debug', }; expect(p.messageIsIgnored(logger)(item, settings)).to.be.ok(); }); it('true if ignoredMessages is empty', function () { var item = { level: 'critical', body: { trace: { exception: { message: 'bork bork' } }, message: { body: 'fuzz' }, }, }; var settings = { reportLevel: 'debug', ignoredMessages: [], }; expect(p.messageIsIgnored(logger)(item, settings)).to.be.ok(); }); it('true if no exception message', function () { var item = { level: 'critical', body: { trace: { exception: {} }, message: 'fuzz', }, }; var settings = { reportLevel: 'debug', ignoredMessages: ['bork bork', 'fuzz'], }; expect(p.messageIsIgnored(logger)(item, settings)).to.be.ok(); }); it('true if no ignoredMessages match', function () { var item = { level: 'critical', body: { trace: { exception: { message: 'bork bork' } }, message: { body: 'fuzz' }, }, }; var settings = { reportLevel: 'debug', ignoredMessages: ['fake', 'stuff'], }; expect(p.messageIsIgnored(logger)(item, settings)).to.be.ok(); }); it('false if any ignoredMessages match', function () { var item = { level: 'critical', body: { trace: { exception: { message: 'bork bork' } }, message: { body: 'fuzz' }, }, }; var settings = { reportLevel: 'debug', ignoredMessages: ['bork bork', 'stuff'], }; expect(p.messageIsIgnored(logger)(item, settings)).to.not.be.ok(); }); it('false if ignoredMessages regex match', function () { var item = { level: 'critical', body: { message: { body: 'This is an ignored message' }, }, }; var settings = { reportLevel: 'debug', ignoredMessages: ['^This is an .{7} message$'], }; expect(p.messageIsIgnored(logger)(item, settings)).to.not.be.ok(); }); it('false if ignoredMessages literal match', function () { var item = { level: 'critical', body: { message: { body: '{"data":{"messages":[{"message":"Unauthorized"}]}}' }, }, }; var settings = { reportLevel: 'debug', ignoredMessages: ['{"data":{"messages":\\['], }; expect(p.messageIsIgnored(logger)(item, settings)).to.not.be.ok(); }); it('false if ignoredMessages more literal regex matches', function () { var item = { level: 'critical', body: { message: { body: 'Match these characters: (*+?)' }, }, }; var settings = { reportLevel: 'debug', ignoredMessages: ['\\(\\*\\+\\?\\)'], }; expect(p.messageIsIgnored(logger)(item, settings)).to.not.be.ok(); }); it('false if both trace and body message but ignoredMessages only match body', function () { var item = { level: 'critical', body: { trace: { exception: { message: 'bork bork' } }, message: { body: 'fuzz' }, }, }; var settings = { reportLevel: 'debug', ignoredMessages: ['fuzz', 'stuff'], }; expect(p.messageIsIgnored(logger)(item, settings)).to.not.be.ok(); }); it('false if ignoredMessages match something in body exception message', function () { var item = { level: 'critical', body: { trace: { frames: [] }, message: { body: 'fuzz' }, }, }; var settings = { reportLevel: 'debug', ignoredMessages: ['stuff', 'fuzz'], }; expect(p.messageIsIgnored(logger)(item, settings)).to.not.be.ok(); }); it("true if trace_chain doesn't match", function () { var item = { level: 'critical', body: { trace_chain: [ { exception: { message: 'inner bork' } }, { exception: { message: 'outer bork' } }, ], }, }; var settings = { reportLevel: 'debug', ignoredMessages: ['stuff', 'fuzz'], }; expect(p.messageIsIgnored(logger)(item, settings)).to.be.ok(); }); it('false if first trace_chain trace matches', function () { var item = { level: 'critical', body: { trace_chain: [ { exception: { message: 'inner stuff' } }, { exception: { message: 'outer bork' } }, ], }, }; var settings = { reportLevel: 'debug', ignoredMessages: ['stuff', 'fuzz'], }; expect(p.messageIsIgnored(logger)(item, settings)).to.not.be.ok(); }); it('false if last trace_chain trace matches', function () { var item = { level: 'critical', body: { trace_chain: [ { exception: { message: 'inner bork' } }, { exception: { message: 'outer fuzz' } }, ], }, }; var settings = { reportLevel: 'debug', ignoredMessages: ['stuff', 'fuzz'], }; expect(p.messageIsIgnored(logger)(item, settings)).to.not.be.ok(); }); });