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.49 KB
/
ErrorPlugin-spec.ts
File metadata and controls
129 lines (108 loc) · 3.49 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 { IEvent } from '../../models/IEvent';
import { ContextData } from '../ContextData';
import { EventPluginContext } from '../EventPluginContext';
import { expect } from 'chai';
import { ErrorPlugin } from './ErrorPlugin';
import { CapturedExceptions } from './ErrorPlugin-spec-exceptions';
import { createFixture } from './EventPluginTestFixture';
function BaseTestError() {
this.name = 'NotImplementedError';
this.someProperty = 'Test';
}
BaseTestError.prototype = new Error();
function DerivedTestError() {
this.someOtherProperty = 'Test2';
}
DerivedTestError.prototype = new BaseTestError();
describe('ErrorPlugin', () => {
const target = new ErrorPlugin();
let contextData: ContextData;
let context: EventPluginContext;
let client: any;
let event: IEvent;
beforeEach(() => {
({
contextData,
context,
client,
event
} = createFixture());
});
function processError(error) {
const 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);
const additionalData = getAdditionalData(event);
expect(additionalData).to.be.null;
});
});
it('should add custom properties to additional data', () => {
const error = {
someProperty: 'Test'
};
processError(error);
const additionalData = getAdditionalData(event);
expect(additionalData).not.to.be.null;
expect(additionalData.someProperty).to.equal('Test');
});
it('should support custom exception types', () => {
processError(new BaseTestError());
const additionalData = getAdditionalData(event);
expect(additionalData).not.to.be.null;
expect(additionalData.someProperty).to.equal('Test');
});
it('should support inherited properties', () => {
processError(new DerivedTestError());
const 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({});
const additionalData = getAdditionalData(event);
expect(additionalData).to.be.null;
});
it('should ignore functions', () => {
const exception: any = new Error('Error with function');
exception.someFunction = () => { };
contextData.setException(exception);
target.run(context);
const additionalData = getAdditionalData(event);
expect(additionalData).to.be.null;
});
});
});
function describeForCapturedExceptions(specDefinitions: (exception: any) => void) {
const keys = Object.getOwnPropertyNames(CapturedExceptions);
keys.forEach((key) => {
const 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) {
const 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;
}
}