Skip to content

Commit adfb66f

Browse files
fix(client): Option enabled: false ensures no events are sent (#3606)
1 parent a5f6b2f commit adfb66f

File tree

4 files changed

+92
-3
lines changed

4 files changed

+92
-3
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
### Fixes
6+
7+
- Option `enabled: false` ensures no events are sent ([#3606](https://github.com/getsentry/sentry-react-native/pull/3606))
8+
59
### Dependencies
610

711
- Bump Cocoa SDK from v8.17.1 to v8.20.0 ([#3476](https://github.com/getsentry/sentry-react-native/pull/3476))

src/js/client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ export class ReactNativeClient extends BaseClient<ReactNativeClientOptions> {
134134
}
135135

136136
let shouldClearOutcomesBuffer = true;
137-
if (this._transport && this._dsn) {
137+
if (this._isEnabled() && this._transport && this._dsn) {
138138
this.emit('beforeEnvelope', envelope);
139139

140140
this._transport.send(envelope).then(null, reason => {

test/client.test.ts

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { defaultStackParser } from '@sentry/browser';
2-
import type { Envelope, Event, Outcome, Transport } from '@sentry/types';
2+
import type { Envelope, Event, MetricInstance, Outcome, Transport } from '@sentry/types';
33
import { rejectedSyncPromise, SentryError } from '@sentry/utils';
44
import * as RN from 'react-native';
55

@@ -11,6 +11,7 @@ import { NativeTransport } from '../src/js/transports/native';
1111
import { SDK_NAME, SDK_PACKAGE_NAME, SDK_VERSION } from '../src/js/version';
1212
import { NATIVE } from '../src/js/wrapper';
1313
import {
14+
createMockTransport,
1415
envelopeHeader,
1516
envelopeItemHeader,
1617
envelopeItemPayload,
@@ -147,6 +148,83 @@ describe('Tests ReactNativeClient', () => {
147148
});
148149
});
149150

151+
describe('enabled option', () => {
152+
test('captureMessage does not call transport when enabled false', () => {
153+
const mockTransport = createMockTransport();
154+
const client = createDisabledClientWith(mockTransport);
155+
156+
client.captureMessage('This message will never be sent because the client is disabled.');
157+
158+
expect(mockTransport.send).not.toBeCalled();
159+
});
160+
161+
test('captureException does not call transport when enabled false', () => {
162+
const mockTransport = createMockTransport();
163+
const client = createDisabledClientWith(mockTransport);
164+
165+
client.captureException(new Error('This exception will never be sent because the client is disabled.'));
166+
167+
expect(mockTransport.send).not.toBeCalled();
168+
});
169+
170+
test('captureEvent does not call transport when enabled false', () => {
171+
const mockTransport = createMockTransport();
172+
const client = createDisabledClientWith(mockTransport);
173+
174+
client.captureEvent({
175+
message: 'This event will never be sent because the client is disabled.',
176+
});
177+
178+
expect(mockTransport.send).not.toBeCalled();
179+
});
180+
181+
test('captureSession does not call transport when enabled false', () => {
182+
const mockTransport = createMockTransport();
183+
const client = createDisabledClientWith(mockTransport);
184+
185+
client.captureSession(getMockSession());
186+
187+
expect(mockTransport.send).not.toBeCalled();
188+
});
189+
190+
test('captureUserFeedback does not call transport when enabled false', () => {
191+
const mockTransport = createMockTransport();
192+
const client = createDisabledClientWith(mockTransport);
193+
194+
client.captureUserFeedback(getMockUserFeedback());
195+
196+
expect(mockTransport.send).not.toBeCalled();
197+
});
198+
199+
test('captureAggregateMetrics does not call transport when enabled false', () => {
200+
const mockTransport = createMockTransport();
201+
const client = createDisabledClientWith(mockTransport);
202+
203+
client.captureAggregateMetrics([
204+
{
205+
// https://github.com/getsentry/sentry-javascript/blob/a7097d9ba2a74b2cb323da0ef22988a383782ffb/packages/core/test/lib/metrics/aggregator.test.ts#L115
206+
metric: { _value: 1 } as unknown as MetricInstance,
207+
metricType: 'c',
208+
name: 'requests',
209+
tags: {},
210+
timestamp: expect.any(Number),
211+
unit: 'none',
212+
},
213+
]);
214+
215+
expect(mockTransport.send).not.toBeCalled();
216+
});
217+
218+
function createDisabledClientWith(transport: Transport) {
219+
return new ReactNativeClient({
220+
...DEFAULT_OPTIONS,
221+
dsn: EXAMPLE_DSN,
222+
enabled: false,
223+
transport: () => transport,
224+
});
225+
}
226+
});
227+
150228
describe('onReady', () => {
151229
test('calls onReady callback with true if Native SDK is initialized', done => {
152230
new ReactNativeClient(

test/testutils.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Transaction } from '@sentry/core';
2-
import type { Session, UserFeedback } from '@sentry/types';
2+
import type { Session, Transport, UserFeedback } from '@sentry/types';
33
import { rejectedSyncPromise } from '@sentry/utils';
44

55
import { getBlankTransactionContext } from '../src/js/tracing/utils';
@@ -66,3 +66,10 @@ export const getSyncPromiseRejectOnFirstCall = <Y extends any[]>(reason: unknown
6666
}
6767
});
6868
};
69+
70+
export const createMockTransport = (): MockInterface<Transport> => {
71+
return {
72+
send: jest.fn().mockResolvedValue(undefined),
73+
flush: jest.fn().mockResolvedValue(true),
74+
};
75+
};

0 commit comments

Comments
 (0)