rollbar
Version:
Effortlessly track and debug errors in your JavaScript applications with Rollbar. This package includes advanced error tracking features and an intuitive interface to help you identify and fix issues more quickly.
266 lines (253 loc) • 7.22 kB
JavaScript
/* globals expect */
/* globals describe */
/* globals it */
import _ from '../src/utility.js';
import t from '../src/transforms.js';
function itemFromArgs(args) {
var item = _.createItem(args);
item.level = 'debug';
return item;
}
var fakeLogger = {
error: function () {},
log: function () {},
};
describe('itemToPayload', function () {
it('ignores options.payload.body but merges in other payload options', function (done) {
var args = ['a message', { custom: 'stuff' }];
var item = itemFromArgs(args);
item.accessToken = 'abc123';
item._isUncaught = true;
item._originalArgs = ['c', 3];
item.data = {};
var options = {
endpoint: 'api.rollbar.com',
payload: { body: 'hey', x: 42 },
};
t.itemToPayload(item, options, function (e, i) {
expect(i._isUncaught).to.eql(item._isUncaught);
expect(i._originalArgs).to.eql(item._originalArgs);
// This transform shouldn't apply any payload keys.
expect(i.body).to.not.eql('hey');
expect(i.x).to.not.eql(42);
done(e);
});
});
it('ignores handles trailing slash in endpoint', function (done) {
var args = ['a message', { custom: 'stuff' }];
var item = itemFromArgs(args);
item.accessToken = 'abc123';
item.data = { message: 'a message' };
var options = {
endpoint: 'api.rollbar.com/',
};
t.itemToPayload(item, options, function (e, i) {
expect(i.message).to.eql('a message');
done(e);
});
});
});
describe('addPayloadOptions', function () {
it('ignores options.payload.body but merges in other payload options', function (done) {
var args = ['a message', { custom: 'stuff' }];
var item = itemFromArgs(args);
item.accessToken = 'abc123';
var options = {
endpoint: 'api.rollbar.com',
payload: { body: 'hey', x: 42 },
};
t.addPayloadOptions(item, options, function (e, i) {
expect(i.data.body).to.not.eql('hey');
expect(i.data.x).to.eql(42);
done(e);
});
});
});
describe('addTelemetryData', function () {
it('adds the data to the right place if events exist', function (done) {
var item = {
data: {
body: {
message: 'hello world',
},
},
telemetryEvents: [
{
type: 'log',
body: {
subtype: 'console',
message: 'bork',
},
timestamp_ms: 12345,
level: 'info',
},
{
type: 'manual',
body: {
hello: 'world',
},
timestamp_ms: 88889,
level: 'info',
},
],
};
var options = {};
t.addTelemetryData(item, options, function (e, i) {
expect(i.data.body.telemetry.length).to.eql(2);
expect(i.data.body.telemetry[0].type).to.eql('log');
done(e);
});
});
});
describe('addConfiguredOptions', function () {
it('adds the configured options', function (done) {
var item = {
data: {
body: {
message: 'hello world',
},
notifier: {
name: 'rollbar-js',
},
},
};
var options = {
accessToken: 'abc123',
foo: 'bar',
captureUncaught: true,
_configuredOptions: {
accessToken: 'abc123',
captureUncaught: true,
},
};
t.addConfiguredOptions(item, options, function (e, i) {
expect(i.data.notifier.configured_options).to.eql({
captureUncaught: true,
});
done(e);
});
});
});
describe('userTransform', function () {
it('calls user transform if is present and a function', function (done) {
var args = ['a message'];
var item = itemFromArgs(args);
var options = {
endpoint: 'api.rollbar.com',
transform: function (newItem, item) {
newItem.origin = item;
newItem.message = 'HELLO';
},
};
var payload = {
access_token: '123',
data: item,
};
expect(payload.data.message).to.not.eql('HELLO');
t.userTransform(fakeLogger)(payload, options, function (e, i) {
expect(i.data.origin).to.be.an('object');
expect(i.data.message).to.eql('HELLO');
done(e);
});
});
it('does nothing if transform is not a function', function (done) {
var args = ['a message'];
var item = itemFromArgs(args);
var options = {
endpoint: 'api.rollbar.com',
transform: 'hi there',
};
var payload = {
access_token: '123',
data: item,
};
expect(payload.data.message).to.not.eql('HELLO');
t.userTransform(fakeLogger)(payload, options, function (e, i) {
expect(i.data.message).to.not.eql('HELLO');
done(e);
});
});
it('does nothing if transform throws', function (done) {
var args = ['a message'];
var item = itemFromArgs(args);
var options = {
endpoint: 'api.rollbar.com',
transform: function (i) {
i.data.message = 'HELLO';
throw 'bork';
},
};
var payload = {
access_token: '123',
data: item,
};
expect(payload.data.message).to.not.eql('HELLO');
t.userTransform(fakeLogger)(payload, options, function (e, i) {
expect(i.data.message).to.not.eql('HELLO');
expect(options.transform).to.not.be.ok();
done(e);
});
});
it('waits for promise resolution if transform returns a promise', function (done) {
var args = ['a message'];
var item = itemFromArgs(args);
var payload = {
access_token: '123',
data: item,
};
var options = {
endpoint: 'api.rollbar.com',
transform: function (newItem) {
newItem.message = 'HELLO';
return Promise.resolve();
},
};
t.userTransform(fakeLogger)(payload, options, function (e, i) {
expect(i.data.message).to.eql('HELLO');
done(e);
});
expect(payload.data.message).to.not.eql('HELLO');
});
it('uses resolved value if transform returns a promise with a value', function (done) {
var args = ['a message'];
var item = itemFromArgs(args);
var payload = {
access_token: '123',
data: item,
};
var options = {
endpoint: 'api.rollbar.com',
transform: function (newItem) {
return Promise.resolve({ message: 'HELLO' });
},
};
t.userTransform(fakeLogger)(payload, options, function (e, i) {
expect(i.data.message).to.eql('HELLO');
expect(i.data).to.not.eql(item);
done(e);
});
expect(payload.data.message).to.not.eql('HELLO');
});
it('uses untransformed value if transform returns a promise that rejects', function (done) {
var args = ['a message'];
var item = itemFromArgs(args);
var err = { message: 'HELLO' };
var payload = {
access_token: '123',
data: item,
};
var options = {
endpoint: 'api.rollbar.com',
transform: function (newItem) {
return Promise.reject(err);
},
};
t.userTransform(fakeLogger)(payload, options, function (e, i) {
expect(i.data.message).to.not.eql('HELLO');
expect(i.data).to.eql(item);
expect(e).to.eql(err);
done();
});
expect(payload.data.message).to.not.eql('HELLO');
});
});