Skip to content

Commit 7d995cb

Browse files
committed
Moar tests
1 parent 1b9c9db commit 7d995cb

File tree

7 files changed

+185
-49
lines changed

7 files changed

+185
-49
lines changed

packages/core/src/integrations/inboundfilters.ts

+6
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ export class InboundFilters implements Integration {
161161
/** JSDoc */
162162
private _getEventFilterUrl(event: Event): string | null {
163163
try {
164+
// tslint:disable-next-line:deprecation
164165
if (event.stacktrace) {
165166
// tslint:disable:no-unsafe-any
166167
const frames = (event as any).stacktrace.frames;
@@ -171,6 +172,11 @@ export class InboundFilters implements Integration {
171172
const frames = (event as any).exception.values[0].stacktrace.frames;
172173
return frames[frames.length - 1].filename;
173174
}
175+
if (event.threads) {
176+
// tslint:disable:no-unsafe-any
177+
const frames = (event as any).threads[0].stacktrace.frames;
178+
return frames[frames.length - 1].filename;
179+
}
174180
return null;
175181
} catch (oO) {
176182
logger.error(`Cannot extract url for event ${getEventDescription(event)}`);

packages/integrations/src/dedupe.ts

+4-19
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { Event, EventProcessor, Exception, Hub, Integration, StackFrame } from '@sentry/types';
22

3+
import { getFramesFromEvent } from './helpers';
4+
35
/** Deduplication filter */
46
export class Dedupe implements Integration {
57
/**
@@ -86,27 +88,10 @@ export class Dedupe implements Integration {
8688
return true;
8789
}
8890

89-
/** JSDoc */
90-
private _getFramesFromEvent(event: Event): StackFrame[] | undefined {
91-
const exception = event.exception;
92-
93-
if (exception) {
94-
try {
95-
// @ts-ignore
96-
return exception.values[0].stacktrace.frames;
97-
} catch (_oO) {
98-
return undefined;
99-
}
100-
} else if (event.stacktrace) {
101-
return event.stacktrace.frames;
102-
}
103-
return undefined;
104-
}
105-
10691
/** JSDoc */
10792
private _isSameStacktrace(currentEvent: Event, previousEvent: Event): boolean {
108-
let currentFrames = this._getFramesFromEvent(currentEvent);
109-
let previousFrames = this._getFramesFromEvent(previousEvent);
93+
let currentFrames = getFramesFromEvent(currentEvent);
94+
let previousFrames = getFramesFromEvent(previousEvent);
11095

11196
// If no event has a fingerprint, they are assumed to be the same
11297
if (!currentFrames && !previousFrames) {

packages/integrations/src/helpers.ts

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Event, StackFrame } from '@sentry/types';
2+
3+
/**
4+
* Extract frames from the Event, independent of it's shape
5+
*/
6+
export function getFramesFromEvent(event: Event): StackFrame[] | undefined {
7+
if (event.exception) {
8+
try {
9+
// @ts-ignore
10+
return event.exception.values[0].stacktrace.frames;
11+
} catch (_oO) {
12+
return undefined;
13+
}
14+
// tslint:disable:deprecation
15+
} else if (event.stacktrace) {
16+
return event.stacktrace.frames;
17+
// tslint:enable:deprecation
18+
} else if (event.threads) {
19+
try {
20+
// @ts-ignore
21+
return event.threads[0].stacktrace.frames;
22+
} catch (_oO) {
23+
return undefined;
24+
}
25+
}
26+
return undefined;
27+
}

packages/integrations/src/rewriteframes.ts

+6-23
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { Event, EventProcessor, Hub, Integration, StackFrame } from '@sentry/types';
22
import { basename, relative } from '@sentry/utils';
33

4+
import { getFramesFromEvent } from './helpers';
5+
46
type StackFrameIteratee = (frame: StackFrame) => StackFrame;
57

68
/** Rewrite event frames paths */
@@ -58,30 +60,11 @@ export class RewriteFrames implements Integration {
5860

5961
/** JSDoc */
6062
public process(event: Event): Event {
61-
const frames = this._getFramesFromEvent(event);
62-
if (frames) {
63-
for (const i in frames) {
64-
// tslint:disable-next-line
65-
frames[i] = this._iteratee(frames[i]);
66-
}
63+
const frames = getFramesFromEvent(event) || [];
64+
for (const i in frames) {
65+
// tslint:disable-next-line
66+
frames[i] = this._iteratee(frames[i]);
6767
}
6868
return event;
6969
}
70-
71-
/** JSDoc */
72-
private _getFramesFromEvent(event: Event): StackFrame[] | undefined {
73-
const exception = event.exception;
74-
75-
if (exception) {
76-
try {
77-
// tslint:disable-next-line:no-unsafe-any
78-
return (exception as any).values[0].stacktrace.frames;
79-
} catch (_oO) {
80-
return undefined;
81-
}
82-
} else if (event.stacktrace) {
83-
return event.stacktrace.frames;
84-
}
85-
return undefined;
86-
}
8770
}

packages/integrations/src/transaction.ts

+3-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { Event, EventProcessor, Hub, Integration, StackFrame } from '@sentry/types';
22

3+
import { getFramesFromEvent } from './helpers';
4+
35
/** Add node transaction to the event */
46
export class Transaction implements Integration {
57
/**
@@ -28,7 +30,7 @@ export class Transaction implements Integration {
2830
* @inheritDoc
2931
*/
3032
public process(event: Event): Event {
31-
const frames = this._getFramesFromEvent(event);
33+
const frames = getFramesFromEvent(event) || [];
3234

3335
// use for loop so we don't have to reverse whole frames array
3436
for (let i = frames.length - 1; i >= 0; i--) {
@@ -43,12 +45,6 @@ export class Transaction implements Integration {
4345
return event;
4446
}
4547

46-
/** JSDoc */
47-
private _getFramesFromEvent(event: Event): StackFrame[] {
48-
const exception = event.exception && event.exception.values && event.exception.values[0];
49-
return (exception && exception.stacktrace && exception.stacktrace.frames) || [];
50-
}
51-
5248
/** JSDoc */
5349
private _getTransaction(frame: StackFrame): string {
5450
return frame.module || frame.function ? `${frame.module || '?'}/${frame.function || '?'}` : '<unknown>';
+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import { getFramesFromEvent } from '../src/helpers';
2+
3+
describe('getFramesFromEvent', () => {
4+
it('event.exception.values[0].stacktrace.frames', () => {
5+
const frames = getFramesFromEvent({
6+
exception: {
7+
values: [
8+
{
9+
stacktrace: {
10+
frames: [
11+
{
12+
filename: '/www/src/app/file1.js',
13+
},
14+
{
15+
filename: '/www/src/app/file2.js',
16+
},
17+
],
18+
},
19+
},
20+
],
21+
},
22+
});
23+
expect(frames).toEqual([
24+
{
25+
filename: '/www/src/app/file1.js',
26+
},
27+
{
28+
filename: '/www/src/app/file2.js',
29+
},
30+
]);
31+
});
32+
33+
it('event.stacktrace.frames', () => {
34+
const frames = getFramesFromEvent({
35+
stacktrace: {
36+
frames: [
37+
{
38+
filename: '/www/src/app/file1.js',
39+
},
40+
{
41+
filename: '/www/src/app/file2.js',
42+
},
43+
],
44+
},
45+
});
46+
expect(frames).toEqual([
47+
{
48+
filename: '/www/src/app/file1.js',
49+
},
50+
{
51+
filename: '/www/src/app/file2.js',
52+
},
53+
]);
54+
});
55+
56+
it('event.threads[0].stacktrace.frames', () => {
57+
const frames = getFramesFromEvent({
58+
threads: [
59+
{
60+
stacktrace: {
61+
frames: [
62+
{
63+
filename: '/www/src/app/file1.js',
64+
},
65+
{
66+
filename: '/www/src/app/file2.js',
67+
},
68+
],
69+
},
70+
},
71+
],
72+
});
73+
expect(frames).toEqual([
74+
{
75+
filename: '/www/src/app/file1.js',
76+
},
77+
{
78+
filename: '/www/src/app/file2.js',
79+
},
80+
]);
81+
});
82+
83+
it('no frames', () => {
84+
const frames = getFramesFromEvent({});
85+
expect(frames).toEqual(undefined);
86+
});
87+
88+
it('broken frames', () => {
89+
const exceptionNoFrames = getFramesFromEvent({
90+
exception: {
91+
values: [],
92+
},
93+
});
94+
const threadsNoFrames = getFramesFromEvent({
95+
threads: [],
96+
});
97+
expect(exceptionNoFrames).toEqual(undefined);
98+
expect(threadsNoFrames).toEqual(undefined);
99+
});
100+
});

packages/integrations/test/rewriteframes.test.ts

+39
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
// tslint:disable:deprecation
2+
13
import { Event, StackFrame } from '@sentry/types';
24

35
import { RewriteFrames } from '../src/rewriteframes';
46

57
let rewriteFrames: RewriteFrames;
68
let messageEvent: Event;
79
let exceptionEvent: Event;
10+
let threadEvent: Event;
811

912
describe('RewriteFrames', () => {
1013
beforeEach(() => {
@@ -38,6 +41,22 @@ describe('RewriteFrames', () => {
3841
],
3942
},
4043
};
44+
threadEvent = {
45+
threads: [
46+
{
47+
stacktrace: {
48+
frames: [
49+
{
50+
filename: '/www/src/app/file1.js',
51+
},
52+
{
53+
filename: '/www/src/app/file2.js',
54+
},
55+
],
56+
},
57+
},
58+
],
59+
};
4160
});
4261

4362
describe('default iteratee appends basename to `app:///` if frame starts with `/`', () => {
@@ -56,6 +75,12 @@ describe('RewriteFrames', () => {
5675
expect(event.exception!.values![0].stacktrace!.frames![0].filename).toEqual('app:///file1.js');
5776
expect(event.exception!.values![0].stacktrace!.frames![1].filename).toEqual('app:///file2.js');
5877
});
78+
79+
it('transforms threadEvent frames', () => {
80+
const event = rewriteFrames.process(threadEvent);
81+
expect(event.threads![0].stacktrace!.frames![0].filename).toEqual('app:///file1.js');
82+
expect(event.threads![0].stacktrace!.frames![1].filename).toEqual('app:///file2.js');
83+
});
5984
});
6085

6186
describe('can use custom root to perform `relative` on filepaths', () => {
@@ -76,6 +101,12 @@ describe('RewriteFrames', () => {
76101
expect(event.exception!.values![0].stacktrace!.frames![0].filename).toEqual('app:///src/app/file1.js');
77102
expect(event.exception!.values![0].stacktrace!.frames![1].filename).toEqual('app:///src/app/file2.js');
78103
});
104+
105+
it('transforms threadEvent frames', async () => {
106+
const event = rewriteFrames.process(threadEvent);
107+
expect(event.threads![0].stacktrace!.frames![0].filename).toEqual('app:///src/app/file1.js');
108+
expect(event.threads![0].stacktrace!.frames![1].filename).toEqual('app:///src/app/file2.js');
109+
});
79110
});
80111

81112
describe('can use custom iteratee', () => {
@@ -103,5 +134,13 @@ describe('RewriteFrames', () => {
103134
expect(event.exception!.values![0].stacktrace!.frames![1].filename).toEqual('/www/src/app/file2.js');
104135
expect(event.exception!.values![0].stacktrace!.frames![1].function).toEqual('whoops');
105136
});
137+
138+
it('transforms threadEvent frames', async () => {
139+
const event = rewriteFrames.process(threadEvent);
140+
expect(event.threads![0].stacktrace!.frames![0].filename).toEqual('/www/src/app/file1.js');
141+
expect(event.threads![0].stacktrace!.frames![0].function).toEqual('whoops');
142+
expect(event.threads![0].stacktrace!.frames![1].filename).toEqual('/www/src/app/file2.js');
143+
expect(event.threads![0].stacktrace!.frames![1].function).toEqual('whoops');
144+
});
106145
});
107146
});

0 commit comments

Comments
 (0)