forked from exceptionless/Exceptionless.JavaScript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathErrorPlugin-spec.ts
More file actions
129 lines (108 loc) · 3.46 KB
/
ErrorPlugin-spec.ts
File metadata and controls
129 lines (108 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import { ContextData } from '../ContextData';
import { EventPluginContext } from '../EventPluginContext';
import { IEvent } from '../../models/IEvent';
import { ErrorPlugin } from './ErrorPlugin';
import { CapturedExceptions } from './ErrorPlugin-spec-exceptions';
import { createFixture } from './EventPluginTestFixture';
import { expect } from 'chai';
function BaseTestError() {
this.name = 'NotImplementedError';
this.someProperty = 'Test';
}
BaseTestError.prototype = new Error();
function DerivedTestError() {
this.someOtherProperty = 'Test2';
}
DerivedTestError.prototype = new BaseTestError();
describe('ErrorPlugin', () => {
let target = new ErrorPlugin();
let contextData: ContextData;
let context: EventPluginContext;
let client: any;
let event: IEvent;
beforeEach(() => {
({
contextData,
context,
client,
event
} = createFixture());
});
function processError(error) {
let exception = throwAndCatch(error);
contextData.setException(exception);
target.run(context);
}
describe('additional data', () => {
describeForCapturedExceptions((exception) => {
it('should ignore default error properties', () => {
contextData.setException(exception);
target.run(context);
let additionalData = getAdditionalData(event);
expect(additionalData).to.be.null;
});
});
it('should add custom properties to additional data', () => {
let error = {
someProperty: 'Test'
};
processError(error);
let additionalData = getAdditionalData(event);
expect(additionalData).not.to.be.null;
expect(additionalData.someProperty).to.equal('Test');
});
it('should support custom exception types', () => {
processError(new BaseTestError());
let additionalData = getAdditionalData(event);
expect(additionalData).not.to.be.null;
expect(additionalData.someProperty).to.equal('Test');
});
it('should support inherited properties', () => {
processError(new DerivedTestError());
let additionalData = getAdditionalData(event);
expect(additionalData).not.to.be.null;
expect(additionalData.someProperty).to.equal('Test');
expect(additionalData.someOtherProperty).to.equal('Test2');
});
it('shouldn\'t set empty additional data', () => {
processError({});
let additionalData = getAdditionalData(event);
expect(additionalData).to.be.null;
});
it('should ignore functions', () => {
let exception: any = new Error('Error with function');
exception.someFunction = () => { };
contextData.setException(exception);
target.run(context);
let additionalData = getAdditionalData(event);
expect(additionalData).to.be.null;
});
});
});
function describeForCapturedExceptions(specDefinitions: (exception: any) => void) {
let keys = Object.getOwnPropertyNames(CapturedExceptions);
keys.forEach(key => {
let exception = CapturedExceptions[key];
describe(key, () => { specDefinitions(exception); });
});
}
function getError(event: IEvent) {
if (event && event.data && event.data['@error']) {
return event.data['@error'];
}
return null;
}
function getAdditionalData(event: IEvent) {
let error = getError(event);
if (error && error.data && error.data['@ext']) {
return error.data['@ext'];
}
return null;
}
function throwAndCatch(error: any): Error {
try {
throw error;
} catch (exception) {
return exception;
}
}