Skip to content

Commit 9301cc0

Browse files
committed
Updates; fixed test suites
1 parent 122e591 commit 9301cc0

File tree

6 files changed

+66
-57
lines changed

6 files changed

+66
-57
lines changed

packages/core/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
],
6565
"peerDependencies": {
6666
"expo": ">=49.0.0",
67-
"react": ">=17.0.0",
6867
"react-native": ">=0.65.0"
6968
},
7069
"dependencies": {
@@ -76,18 +75,19 @@
7675
"@sentry/types": "10.12.0"
7776
},
7877
"devDependencies": {
79-
"@babel/core": "^7.25.2",
78+
"@babel/core": "^7.26.7",
8079
"@expo/metro-config": "~0.20.0",
8180
"@mswjs/interceptors": "^0.25.15",
8281
"@react-native/babel-preset": "0.80.0",
8382
"@sentry-internal/eslint-config-sdk": "10.12.0",
8483
"@sentry-internal/eslint-plugin-sdk": "10.12.0",
8584
"@sentry-internal/typescript": "10.12.0",
8685
"@sentry/wizard": "6.4.0",
87-
"@testing-library/react-native": "^12.7.2",
86+
"@testing-library/react-native": "^13.2.2",
8887
"@types/jest": "^29.5.13",
8988
"@types/node": "^20.9.3",
9089
"@types/react": "^19.1.0",
90+
"@types/react-test-renderer": "^19.1.0",
9191
"@types/uglify-js": "^3.17.2",
9292
"@types/uuid": "^9.0.4",
9393
"@types/xmlhttprequest": "^1.8.2",
@@ -102,14 +102,14 @@
102102
"eslint-plugin-react-native": "^3.8.1",
103103
"expo": "^53.0.0",
104104
"expo-module-scripts": "3.1.0",
105-
"jest": "^29.6.2",
105+
"jest": "^29.6.3",
106106
"jest-environment-jsdom": "^29.6.2",
107107
"jest-extended": "^4.0.2",
108108
"madge": "^6.1.0",
109109
"metro": "0.83.1",
110110
"prettier": "^2.0.5",
111111
"react": "19.1.0",
112-
"react-native": "0.80.0",
112+
"react-native": "0.80.1",
113113
"react-test-renderer": "19.1.0",
114114
"rimraf": "^4.1.1",
115115
"ts-jest": "^29.3.1",

packages/core/src/js/RNSentryReplayMaskNativeComponent.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { HostComponent, ViewProps } from 'react-native';
22
// The default export exists in the file but eslint doesn't see it
33
// eslint-disable-next-line import/default
4-
import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
4+
import { codegenNativeComponent } from 'react-native';
55

66
// If changed to type NativeProps = ViewProps, react native codegen will fail finding the NativeProps type
77
// eslint-disable-next-line @typescript-eslint/no-empty-interface

packages/core/src/js/RNSentryReplayUnmaskNativeComponent.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { HostComponent, ViewProps } from 'react-native';
22
// The default export exists in the file but eslint doesn't see it
33
// eslint-disable-next-line import/default
4-
import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
4+
import { codegenNativeComponent } from 'react-native';
55

66
// If changed to type NativeProps = ViewProps, react native codegen will fail finding the NativeProps type
77
// eslint-disable-next-line @typescript-eslint/no-empty-interface

packages/core/src/js/tracing/span.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export const startIdleNavigationSpan = (
5858
}
5959

6060
const activeSpan = getActiveSpan();
61+
console.log(activeSpan);
6162
clearActiveSpanFromScope(getCurrentScope());
6263
if (activeSpan && isRootSpan(activeSpan) && isSentryInteractionSpan(activeSpan)) {
6364
debug.log(

packages/core/test/tracing/idleNavigationSpan.test.ts

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { Span } from '@sentry/core';
22
import { getActiveSpan, getCurrentScope, spanToJSON, startSpanManual } from '@sentry/core';
3-
import type { AppState, AppStateStatus } from 'react-native';
3+
import type { AppStateStatus } from 'react-native';
4+
import { AppState } from 'react-native';
45
import type { ScopeWithMaybeSpan } from '../../src/js/tracing/span';
56
import { SCOPE_SPAN_FIELD, startIdleNavigationSpan } from '../../src/js/tracing/span';
67
import { NATIVE } from '../../src/js/wrapper';
@@ -11,36 +12,39 @@ type MockAppState = {
1112
listener: (newState: AppStateStatus) => void;
1213
removeSubscription: jest.Func;
1314
};
14-
const mockedAppState: AppState & MockAppState = {
15-
removeSubscription: jest.fn(),
16-
listener: jest.fn(),
17-
isAvailable: true,
18-
currentState: 'active',
19-
addEventListener: (_, listener) => {
20-
mockedAppState.listener = listener;
21-
return {
22-
remove: mockedAppState.removeSubscription,
23-
};
24-
},
25-
setState: (state: AppStateStatus) => {
26-
mockedAppState.currentState = state;
27-
mockedAppState.listener(state);
28-
},
29-
};
30-
jest.mock('react-native/Libraries/AppState/AppState', () => mockedAppState);
15+
jest.mock('react-native', () => {
16+
const mockedAppState: AppState & MockAppState = {
17+
removeSubscription: jest.fn(),
18+
listener: jest.fn(),
19+
isAvailable: true,
20+
currentState: 'active',
21+
addEventListener: jest.fn(),
22+
setState: (state: AppStateStatus) => {
23+
mockedAppState.currentState = state;
24+
mockedAppState.listener(state);
25+
},
26+
};
27+
return {
28+
AppState: mockedAppState,
29+
Platform: { OS: 'ios' },
30+
NativeModules: {
31+
RNSentry: {}
32+
}
33+
};
34+
});
35+
36+
const mockedAppState = AppState as jest.Mocked<typeof AppState & MockAppState>;
3137

3238
describe('startIdleNavigationSpan', () => {
3339
beforeEach(() => {
3440
jest.useFakeTimers();
3541
NATIVE.enableNative = true;
3642
mockedAppState.isAvailable = true;
3743
mockedAppState.currentState = 'active';
38-
mockedAppState.addEventListener = (_, listener) => {
44+
(mockedAppState.addEventListener as jest.Mock).mockImplementation((_, listener) => {
3945
mockedAppState.listener = listener;
40-
return {
41-
remove: mockedAppState.removeSubscription,
42-
};
43-
};
46+
return { remove: mockedAppState.removeSubscription };
47+
});
4448
setupTestClient();
4549
});
4650

@@ -66,9 +70,9 @@ describe('startIdleNavigationSpan', () => {
6670

6771
it('Does not crash when AppState is not available', async () => {
6872
mockedAppState.isAvailable = false;
69-
mockedAppState.addEventListener = ((): void => {
73+
(mockedAppState.addEventListener as jest.Mock).mockImplementation(() => {
7074
return undefined;
71-
}) as unknown as (typeof mockedAppState)['addEventListener']; // RN Web can return undefined
75+
});
7276

7377
startIdleNavigationSpan({
7478
name: 'test',
@@ -94,7 +98,7 @@ describe('startIdleNavigationSpan', () => {
9498

9599
// Verify it's a non-recording span
96100
expect(span).toBeDefined();
97-
expect(span.constructor.name).toBe('SentryNonRecordingSpan');
101+
expect(span?.constructor.name).toBe('SentryNonRecordingSpan');
98102

99103
// No AppState listener should be set up for non-recording spans
100104
expect(mockedAppState.removeSubscription).not.toHaveBeenCalled();
@@ -140,7 +144,7 @@ describe('startIdleNavigationSpan', () => {
140144
name: 'test',
141145
});
142146

143-
firstSpan.end();
147+
firstSpan?.end();
144148

145149
const secondSpan = startIdleNavigationSpan({
146150
name: 'test',

packages/core/test/tracing/integrations/userInteraction.test.ts

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import {
77
startInactiveSpan,
88
startSpanManual,
99
} from '@sentry/core';
10-
import type { AppState, AppStateStatus } from 'react-native';
10+
import type { AppStateStatus } from 'react-native';
11+
import { AppState } from 'react-native';
1112
import {
1213
startUserInteractionSpan,
1314
userInteractionIntegration,
@@ -26,23 +27,28 @@ type MockAppState = {
2627
listener: (newState: AppStateStatus) => void;
2728
removeSubscription: jest.Func;
2829
};
29-
const mockedAppState: AppState & MockAppState = {
30-
removeSubscription: jest.fn(),
31-
listener: jest.fn(),
32-
isAvailable: true,
33-
currentState: 'active',
34-
addEventListener: (_, listener) => {
35-
mockedAppState.listener = listener;
36-
return {
37-
remove: mockedAppState.removeSubscription,
38-
};
39-
},
40-
setState: (state: AppStateStatus) => {
41-
mockedAppState.currentState = state;
42-
mockedAppState.listener(state);
43-
},
44-
};
45-
jest.mock('react-native/Libraries/AppState/AppState', () => mockedAppState);
30+
jest.mock('react-native', () => {
31+
const mockedAppState: AppState & MockAppState = {
32+
removeSubscription: jest.fn(),
33+
listener: jest.fn(),
34+
isAvailable: true,
35+
currentState: 'active',
36+
addEventListener: jest.fn(),
37+
setState: (state: AppStateStatus) => {
38+
mockedAppState.currentState = state;
39+
mockedAppState.listener(state);
40+
},
41+
};
42+
return {
43+
AppState: mockedAppState,
44+
Platform: { OS: 'ios' },
45+
NativeModules: {
46+
RNSentry: {}
47+
}
48+
};
49+
});
50+
51+
const mockedAppState = AppState as jest.Mocked<typeof AppState & MockAppState>;
4652

4753
jest.mock('../../../src/js/wrapper', () => {
4854
return {
@@ -69,12 +75,10 @@ describe('User Interaction Tracing', () => {
6975
NATIVE.enableNative = true;
7076
mockedAppState.isAvailable = true;
7177
mockedAppState.currentState = 'active';
72-
mockedAppState.addEventListener = (_, listener) => {
78+
(mockedAppState.addEventListener as jest.Mock).mockImplementation((_, listener) => {
7379
mockedAppState.listener = listener;
74-
return {
75-
remove: mockedAppState.removeSubscription,
76-
};
77-
};
80+
return { remove: mockedAppState.removeSubscription };
81+
});
7882

7983
mockedUserInteractionId = { elementId: 'mockedElementId', op: 'mocked.op' };
8084
client = setupTestClient({

0 commit comments

Comments
 (0)