Skip to content

Commit 197b532

Browse files
Merge pull request #1404 from Instabug/fix/dynamically-update-changelog-on-dashboard
fix: dynamically update changelog on dashboard
2 parents c668f3b + 636334d commit 197b532

File tree

4 files changed

+136
-28
lines changed

4 files changed

+136
-28
lines changed

.circleci/config.yml

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -401,22 +401,33 @@ jobs:
401401
prepare_steps:
402402
type: steps
403403
default: []
404+
api_endpoint:
405+
type: string
406+
dashboard_token_env:
407+
type: string
404408
working_directory: ~/project
405409
executor:
406410
name: node/default
407411
steps:
408412
- advanced-checkout/shallow-checkout
413+
- run: git clone [email protected]:Instabug/Escape.git
414+
- run:
415+
working_directory: Escape
416+
command: swift build -c release
417+
- run:
418+
working_directory: Escape/.build/release
419+
command: cp -f Escape /usr/local/bin/escape
409420
- steps: << parameters.prepare_steps >>
410421
- install_node_modules
411422
- run:
412423
name: Build the SDK
413424
command: yarn build
414425
- run:
415-
name: Authorize with NPM
416-
command: echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ~/.npmrc
417-
- run:
418-
name: Publish new enterprise version
419-
command: npm publish
426+
name: Publish Custom Package with Escape
427+
command: Escape react-native publish-custompackage
428+
environment:
429+
DASHBOARD_TOKEN: << parameters.dashboard_token_env >>
430+
DASHBOARD_API_ENDPOINT: << parameters.api_endpoint >>
420431

421432
publish:
422433
macos:
@@ -438,8 +449,11 @@ jobs:
438449
working_directory: project
439450
command: yarn build
440451
- run:
452+
name: Publish Official Package with Escape
441453
working_directory: project
442454
command: Escape react-native publish
455+
environment:
456+
DASHBOARD_API_ENDPOINT: api.instabug.com
443457
publish_new_namespace:
444458
working_directory: ~/project
445459
executor:
@@ -562,6 +576,8 @@ workflows:
562576
npm_package: '@instabug/react-native-nn'
563577
android_package: nn
564578
api_endpoint: st001009nn.instabug.com
579+
api_endpoint: st001009nn.instabug.com
580+
dashboard_token_env: ${NN_TOKEN}
565581

566582
- hold_release_injazat:
567583
requires: *release_dependencies
@@ -581,6 +597,8 @@ workflows:
581597
npm_package: '@instabug/react-native-injazat'
582598
android_package: injazat
583599
api_endpoint: st001013mec1.instabug.com
600+
api_endpoint: st001013mec1.instabug.com
601+
dashboard_token_env: ${INJAZAT_TOKEN}
584602

585603
# Dream11 tests
586604
- hold_test_dream11:
@@ -622,3 +640,5 @@ workflows:
622640
only: dream11
623641
prepare_steps:
624642
- prepare_dream11
643+
api_endpoint: st001012dream11.instabug.com
644+
dashboard_token_env: ${DREAM11_TOKEN}

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
- Added more search capabilities to the find-token.sh script. e.g., searching in .env file for react config. [#1366](https://github.com/Instabug/Instabug-React-Native/pull/1366)
2222

23+
- Updated the CHANGELOG on the dashboard for the enterprise users. [#1404](https://github.com/Instabug/Instabug-React-Native/pull/1404)
24+
2325
## [14.3.0](https://github.com/Instabug/Instabug-React-Native/compare/v14.1.0...14.3.0)
2426

2527
### Added

src/utils/InstabugUtils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export const getActiveRouteName = (navigationState: NavigationStateV4): string |
7474
return route.routeName;
7575
};
7676

77-
function getFullRoute(state: NavigationStateV5 | PartialState<NavigationStateV5>): string {
77+
export function getFullRoute(state: NavigationStateV5 | PartialState<NavigationStateV5>): string {
7878
try {
7979
if (!state.routes[state.index!].state) {
8080
return state.routes[state.index!].name;

test/utils/InstabugUtils.spec.ts

Lines changed: 108 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,7 @@ import * as Instabug from '../../src/modules/Instabug';
77
import * as NetworkLogger from '../../src/modules/NetworkLogger';
88
import { NativeCrashReporting } from '../../src/native/NativeCrashReporting';
99
import { InvocationEvent, NetworkData, NonFatalErrorLevel } from '../../src';
10-
import InstabugUtils, {
11-
getStackTrace,
12-
registerFilteringAndObfuscationListener,
13-
registerFilteringListener,
14-
registerObfuscationListener,
15-
reportNetworkLog,
16-
resetNativeObfuscationListener,
17-
sendCrashReport,
18-
updateNetworkLogSnapshot,
19-
} from '../../src/utils/InstabugUtils';
10+
import * as InstabugUtils from '../../src/utils/InstabugUtils';
2011

2112
import {
2213
NativeNetworkLogger,
@@ -203,9 +194,9 @@ describe('Instabug Utils', () => {
203194
const remoteSenderCallback = NativeCrashReporting.sendHandledJSCrash;
204195
Platform.OS = 'android';
205196
const errorMock = new TypeError('Invalid type');
206-
const jsStackTrace = getStackTrace(errorMock);
197+
const jsStackTrace = InstabugUtils.getStackTrace(errorMock);
207198

208-
sendCrashReport(errorMock, (data) =>
199+
InstabugUtils.sendCrashReport(errorMock, (data) =>
209200
remoteSenderCallback(data, null, null, NonFatalErrorLevel.error),
210201
);
211202

@@ -231,9 +222,9 @@ describe('Instabug Utils', () => {
231222
const remoteSenderCallback = NativeCrashReporting.sendHandledJSCrash;
232223
Platform.OS = 'ios';
233224
const errorMock = new TypeError('Invalid type');
234-
const jsStackTrace = getStackTrace(errorMock);
225+
const jsStackTrace = InstabugUtils.getStackTrace(errorMock);
235226

236-
sendCrashReport(errorMock, (data) =>
227+
InstabugUtils.sendCrashReport(errorMock, (data) =>
237228
remoteSenderCallback(data, null, null, NonFatalErrorLevel.error),
238229
);
239230
const expectedMap = {
@@ -290,7 +281,7 @@ describe('reportNetworkLog', () => {
290281

291282
const requestHeaders = JSON.stringify(network.requestHeaders);
292283
const responseHeaders = JSON.stringify(network.responseHeaders);
293-
reportNetworkLog(network);
284+
InstabugUtils.reportNetworkLog(network);
294285

295286
expect(NativeInstabug.networkLogAndroid).toHaveBeenCalledTimes(1);
296287
expect(NativeInstabug.networkLogAndroid).toHaveBeenCalledWith(
@@ -335,7 +326,7 @@ describe('reportNetworkLog', () => {
335326
it('reportNetworkLog should send network logs to native with the correct parameters on iOS', () => {
336327
Platform.OS = 'ios';
337328

338-
reportNetworkLog(network);
329+
InstabugUtils.reportNetworkLog(network);
339330

340331
expect(NativeInstabug.networkLogIOS).toHaveBeenCalledTimes(1);
341332
expect(NativeInstabug.networkLogIOS).toHaveBeenCalledWith(
@@ -397,7 +388,7 @@ describe('test registerNetworkLogsListener usage', () => {
397388
};
398389

399390
it('registerObfuscationListener should call NetworkLogger.registerNetworkLogsListener() with NetworkListenerType = NetworkListenerType.obfuscation', () => {
400-
registerObfuscationListener();
391+
InstabugUtils.registerObfuscationListener();
401392
expect(NetworkLogger.registerNetworkLogsListener).toBeCalledTimes(1);
402393
expect(NetworkLogger.registerNetworkLogsListener).toBeCalledWith(
403394
NetworkListenerType.obfuscation,
@@ -407,7 +398,7 @@ describe('test registerNetworkLogsListener usage', () => {
407398

408399
it('registerFilteringListener should call NetworkLogger.registerNetworkLogsListener() with NetworkListenerType = NetworkListenerType.filtering', () => {
409400
const testText = 'true';
410-
registerFilteringListener(testText);
401+
InstabugUtils.registerFilteringListener(testText);
411402

412403
expect(NetworkLogger.registerNetworkLogsListener).toBeCalledTimes(1);
413404
expect(NetworkLogger.registerNetworkLogsListener).toBeCalledWith(
@@ -418,7 +409,7 @@ describe('test registerNetworkLogsListener usage', () => {
418409

419410
it('registerFilteringAndObfuscationListener should call NetworkLogger.registerNetworkLogsListener() with NetworkListenerType = NetworkListenerType.both', () => {
420411
const testText = 'true';
421-
registerFilteringAndObfuscationListener(testText);
412+
InstabugUtils.registerFilteringAndObfuscationListener(testText);
422413

423414
expect(NetworkLogger.registerNetworkLogsListener).toBeCalledTimes(1);
424415
expect(NetworkLogger.registerNetworkLogsListener).toBeCalledWith(
@@ -429,23 +420,23 @@ describe('test registerNetworkLogsListener usage', () => {
429420

430421
it('should call NetworkLoggerEmitter.removeAllListeners when call resetNativeObfuscationListener', () => {
431422
jest.spyOn(NetworkLoggerEmitter, 'removeAllListeners').mockImplementation();
432-
resetNativeObfuscationListener();
423+
InstabugUtils.resetNativeObfuscationListener();
433424
expect(NetworkLoggerEmitter.removeAllListeners).toBeCalledTimes(1);
434425
});
435426

436427
it('should call NativeNetworkLogger.resetNetworkLogsListener when call resetNativeObfuscationListener on android platform', () => {
437428
Platform.OS = 'android';
438429
jest.spyOn(NativeNetworkLogger, 'resetNetworkLogsListener').mockImplementation();
439430
jest.spyOn(NetworkLoggerEmitter, 'removeAllListeners').mockImplementation();
440-
resetNativeObfuscationListener();
431+
InstabugUtils.resetNativeObfuscationListener();
441432
expect(NativeNetworkLogger.resetNetworkLogsListener).toBeCalledTimes(1);
442433
expect(NetworkLoggerEmitter.removeAllListeners).toBeCalledTimes(1);
443434
});
444435

445436
it('should call NativeNetworkLogger.updateNetworkLogSnapshot when call updateNetworkLogSnapshot with correct parameters', () => {
446437
jest.spyOn(NativeNetworkLogger, 'updateNetworkLogSnapshot').mockImplementation();
447438

448-
updateNetworkLogSnapshot(network);
439+
InstabugUtils.updateNetworkLogSnapshot(network);
449440
expect(NativeNetworkLogger.updateNetworkLogSnapshot).toBeCalledTimes(1);
450441
expect(NativeNetworkLogger.updateNetworkLogSnapshot).toHaveBeenCalledWith(
451442
network.url,
@@ -458,3 +449,98 @@ describe('test registerNetworkLogsListener usage', () => {
458449
);
459450
});
460451
});
452+
453+
describe('InstabugUtils', () => {
454+
it('setApmNetworkFlagsIfChanged should return true if flags change', () => {
455+
const flags = {
456+
isNativeInterceptionFeatureEnabled: true,
457+
hasAPMNetworkPlugin: true,
458+
shouldEnableNativeInterception: true,
459+
};
460+
expect(InstabugUtils.setApmNetworkFlagsIfChanged(flags)).toBe(true);
461+
expect(InstabugUtils.setApmNetworkFlagsIfChanged(flags)).toBe(false);
462+
});
463+
464+
it('generateTracePartialId should return a non-zero hex string and number', () => {
465+
const { numberPartilId, hexStringPartialId } = InstabugUtils.generateTracePartialId();
466+
expect(hexStringPartialId).toMatch(/^[0-9a-f]{8}$/);
467+
expect(hexStringPartialId).not.toBe('00000000');
468+
expect(typeof numberPartilId).toBe('number');
469+
expect(numberPartilId).not.toBe(0);
470+
});
471+
472+
it('generateW3CHeader should return a valid w3c header object', () => {
473+
const now = Date.now();
474+
const result = InstabugUtils.generateW3CHeader(now);
475+
expect(result).toHaveProperty('timestampInSeconds');
476+
expect(result).toHaveProperty('partialId');
477+
expect(result).toHaveProperty('w3cHeader');
478+
expect(typeof result.w3cHeader).toBe('string');
479+
expect(result.w3cHeader.split('-').length).toBe(4);
480+
});
481+
482+
it('isContentTypeNotAllowed should return false for allowed types and true for not allowed', () => {
483+
expect(InstabugUtils.isContentTypeNotAllowed('application/json')).toBe(false);
484+
expect(InstabugUtils.isContentTypeNotAllowed('text/plain')).toBe(false);
485+
expect(InstabugUtils.isContentTypeNotAllowed('image/png')).toBe(true);
486+
expect(InstabugUtils.isContentTypeNotAllowed('application/pdf')).toBe(true);
487+
});
488+
});
489+
490+
describe('checkNetworkRequestHandlers', () => {
491+
let registerNetworkLogsListenerSpy: jest.SpyInstance;
492+
493+
beforeEach(() => {
494+
jest.clearAllMocks();
495+
registerNetworkLogsListenerSpy = jest
496+
.spyOn(NetworkLogger, 'registerNetworkLogsListener')
497+
.mockImplementation(jest.fn());
498+
});
499+
500+
it('should register for both if obfuscation handler and filter expression exist', () => {
501+
jest.spyOn(NetworkLogger, 'getNetworkDataObfuscationHandler').mockReturnValue(jest.fn());
502+
jest.spyOn(NetworkLogger, 'hasRequestFilterExpression').mockReturnValue(true);
503+
jest.spyOn(NetworkLogger, 'getRequestFilterExpression').mockReturnValue('true');
504+
505+
InstabugUtils.checkNetworkRequestHandlers();
506+
507+
expect(registerNetworkLogsListenerSpy).toHaveBeenCalledWith(
508+
NetworkListenerType.both,
509+
expect.any(Function),
510+
);
511+
});
512+
513+
it('should register for obfuscation only if only obfuscation handler exists', () => {
514+
jest.spyOn(NetworkLogger, 'getNetworkDataObfuscationHandler').mockReturnValue(jest.fn());
515+
jest.spyOn(NetworkLogger, 'hasRequestFilterExpression').mockReturnValue(false);
516+
517+
InstabugUtils.checkNetworkRequestHandlers();
518+
519+
expect(registerNetworkLogsListenerSpy).toHaveBeenCalledWith(
520+
NetworkListenerType.obfuscation,
521+
expect.any(Function),
522+
);
523+
});
524+
525+
it('should register for filtering only if only filter expression exists', () => {
526+
jest.spyOn(NetworkLogger, 'getNetworkDataObfuscationHandler').mockReturnValue(undefined);
527+
jest.spyOn(NetworkLogger, 'hasRequestFilterExpression').mockReturnValue(true);
528+
jest.spyOn(NetworkLogger, 'getRequestFilterExpression').mockReturnValue('true');
529+
530+
InstabugUtils.checkNetworkRequestHandlers();
531+
532+
expect(registerNetworkLogsListenerSpy).toHaveBeenCalledWith(
533+
NetworkListenerType.filtering,
534+
expect.any(Function),
535+
);
536+
});
537+
538+
it('should not register any listener if neither exist', () => {
539+
jest.spyOn(NetworkLogger, 'getNetworkDataObfuscationHandler').mockReturnValue(undefined);
540+
jest.spyOn(NetworkLogger, 'hasRequestFilterExpression').mockReturnValue(false);
541+
542+
InstabugUtils.checkNetworkRequestHandlers();
543+
544+
expect(registerNetworkLogsListenerSpy).not.toHaveBeenCalled();
545+
});
546+
});

0 commit comments

Comments
 (0)