From 1f6456f4350635808b45df10f7646f28bf6b49bd Mon Sep 17 00:00:00 2001 From: Aliaksandr Pashkevich Date: Thu, 15 Feb 2024 18:32:46 +0300 Subject: [PATCH] =?UTF-8?q?feat(deploy=5Fbeta):=20=D1=83=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=20property=20nativeFeaturesFts=20=D0=B8=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=20=D1=87=D1=82=D0=BE=20=D1=81=20=D0=BD=D0=B8=D0=BC?= =?UTF-8?q?=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/constants.ts | 2 - src/index.ts | 8 +-- src/types.ts | 5 +- test/index.test.ts | 62 ++++++++---------------- test/integration.test.ts | 13 +---- test/native-fallbacks.test.ts | 10 ++-- test/native-navigation-and-title.test.ts | 6 --- 7 files changed, 30 insertions(+), 76 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index fcac742..9725b7b 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -17,14 +17,12 @@ export const versionToIosAppId = { export const nativeFeaturesFromVersion: NativeFeaturesFromVersion = { android: { linksInBrowser: { - nativeFeatureFtKey: 'linksInBrowserAndroid', fromVersion: '11.71.0', }, geolocation: { fromVersion: '11.71.0' }, }, ios: { linksInBrowser: { - nativeFeatureFtKey: 'linksInBrowserIos', fromVersion: '13.3.0', }, geolocation: { fromVersion: '0.0.0' }, diff --git a/src/index.ts b/src/index.ts index 3201545..74a2f13 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,7 +12,6 @@ import { HandleRedirect, NativeNavigationAndTitle } from './native-navigation-an import type { Environment, NativeFeatureKey, - NativeFeaturesFts, NativeParams, WebViewWindow, } from './types'; @@ -50,7 +49,6 @@ export class BridgeToNative { private _handleRedirect: HandleRedirect; constructor( - public nativeFeaturesFts: NativeFeaturesFts = {'linksInBrowserAndroid': true, 'linksInBrowserIos': true}, handleRedirect: HandleRedirect, nativeParams?: NativeParams, ) { @@ -108,13 +106,9 @@ export class BridgeToNative { * @param feature Название функциональности, которую нужно проверить. */ public canUseNativeFeature(feature: NativeFeatureKey) { - const { nativeFeatureFtKey, fromVersion } = + const { fromVersion } = nativeFeaturesFromVersion[this.environment][feature]; - if (nativeFeatureFtKey && !this.nativeFeaturesFts[nativeFeatureFtKey]) { - return false; - } - return this.isCurrentVersionHigherOrEqual(fromVersion); } diff --git a/src/types.ts b/src/types.ts index 61e8b04..a99eef5 100644 --- a/src/types.ts +++ b/src/types.ts @@ -9,9 +9,6 @@ export type NativeParams = { originalWebviewParams: string; }; -type NativeFeatureFtKey = 'linksInBrowserAndroid' | 'linksInBrowserIos'; -export type NativeFeaturesFts = Record; - export type NativeFeatureKey = // Возможность работы с геолокацией. | 'geolocation' @@ -19,7 +16,7 @@ export type NativeFeatureKey = | 'linksInBrowser'; type NativeFeaturesParams = Readonly< - Record + Record >; export type NativeFeaturesFromVersion = Readonly<{ android: NativeFeaturesParams; diff --git a/test/index.test.ts b/test/index.test.ts index 4cab552..2ad0aa0 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -4,6 +4,7 @@ import { BridgeToNative } from '../src'; import { PREVIOUS_B2N_STATE_STORAGE_KEY } from '../src/constants'; import { mockSessionStorage } from '../src/mock/mock-session-storage'; import { WebViewWindow } from '../src/types'; +import {mockWindowLocation} from '../src/mock/mock-window-location'; const mockedNativeFallbacksInstance = {}; const mockedNativeNavigationAndTitleInstance = { @@ -28,11 +29,6 @@ jest.mock('../src/native-navigation-and-title', () => ({ })); describe('BridgeToNative', () => { - const defaultAmFeaturesFts = { - linksInBrowserAndroid: true, - linksInBrowserIos: true, - }; - const defaultAmParams = { appVersion: '12.0.0', theme: 'light', @@ -50,9 +46,6 @@ describe('BridgeToNative', () => { nextPageId: null, }; - // const { getItem, setItem, removeItem } = mockSessionStorage({ - // [PREVIOUS_B2N_STATE_STORAGE_KEY]: savedBridgeToAmState, - // }); const { getItem, setItem } = mockSessionStorage( PREVIOUS_B2N_STATE_STORAGE_KEY, savedBridgeToAmState, @@ -69,7 +62,7 @@ describe('BridgeToNative', () => { BridgeToNative.prototype['restorePreviousState'] = jest.fn(); - const inst = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst = new BridgeToNative(mockedHandleRedirect, { ...defaultAmParams, title: 'Initial Title', }); @@ -85,7 +78,6 @@ describe('BridgeToNative', () => { describe('method `saveCurrentState`', () => { it('should save current state into sessionStorage and call `AmNavigationAndTitle.saveCurrentState`', () => { const inst = new BridgeToNative( - defaultAmFeaturesFts, mockedHandleRedirect, defaultAmParams, ); @@ -112,7 +104,6 @@ describe('BridgeToNative', () => { // JSON.parse = jest.fn().mockImplementationOnce(() => savedBridgeToAmState); const inst = new BridgeToNative( - defaultAmFeaturesFts, mockedHandleRedirect, defaultAmParams, ); @@ -153,7 +144,7 @@ describe('BridgeToNative', () => { describe('constructor', () => { it('should pass `initialAmTitle` to `AmNavigationAndTitle` constructor', () => { - const inst = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst = new BridgeToNative( mockedHandleRedirect, { ...defaultAmParams, title: 'Initial Title', }); @@ -170,11 +161,11 @@ describe('BridgeToNative', () => { describe('public props', () => { it('should save theme used by AM in `theme` property', () => { const inst1 = new BridgeToNative( - defaultAmFeaturesFts, + mockedHandleRedirect, defaultAmParams, ); - const inst2 = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst2 = new BridgeToNative(mockedHandleRedirect, { ...defaultAmParams, theme: 'dark', }); @@ -186,7 +177,7 @@ describe('BridgeToNative', () => { it('should save original AM query params in `originalWebviewParams` property', () => { const originalWebviewParamsExample = 'device_uuid=8441576F-A09F-41E9-89A7-EE1FA486C20A&device_id=2E32AFD5-F50B-4B2F-B758-CAE59DF2BF6C&applicationId=1842D0AA-0008-4941-93E0-4FD80E087841&device_os_version=com.aconcierge.app&device_app_version=iOS 16.1&scope=12.26.0&device_boot_time=openid mobile-bank'; - const inst = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst = new BridgeToNative( mockedHandleRedirect, { ...defaultAmParams, originalWebviewParams: originalWebviewParamsExample, }); @@ -195,7 +186,7 @@ describe('BridgeToNative', () => { }); it('should save nextPageId in `nextPageId` property and send it into `AmNavigationAndTitle` constructor', () => { - const inst = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst = new BridgeToNative( mockedHandleRedirect, { ...defaultAmParams, title: 'Test', nextPageId: 7, @@ -213,7 +204,7 @@ describe('BridgeToNative', () => { it('should provide `NativeFallbacks` instance', () => { const inst = new BridgeToNative( - defaultAmFeaturesFts, + mockedHandleRedirect, defaultAmParams, ); @@ -223,7 +214,7 @@ describe('BridgeToNative', () => { it('should provide `AmNavigationAndTitle` instance', () => { const inst = new BridgeToNative( - defaultAmFeaturesFts, + mockedHandleRedirect, defaultAmParams, ); @@ -240,7 +231,7 @@ describe('BridgeToNative', () => { it('should provide `AndroidBridge` property', () => { const inst = new BridgeToNative( - defaultAmFeaturesFts, + mockedHandleRedirect, defaultAmParams, ); @@ -250,7 +241,7 @@ describe('BridgeToNative', () => { it('should set `environment` property correctly', () => { const inst = new BridgeToNative( - defaultAmFeaturesFts, + mockedHandleRedirect, defaultAmParams, ); @@ -260,7 +251,6 @@ describe('BridgeToNative', () => { it('should not provide application type using `iosAppId` property', () => { const ins = new BridgeToNative( - defaultAmFeaturesFts, mockedHandleRedirect, defaultAmParams, ); @@ -272,7 +262,7 @@ describe('BridgeToNative', () => { describe('iOS environment', () => { it('should not provide `AndroidBridge` property', () => { const ins = new BridgeToNative( - defaultAmFeaturesFts, + mockedHandleRedirect, defaultAmParams, ); @@ -282,7 +272,7 @@ describe('BridgeToNative', () => { it('should set `environment` property correctly', () => { const ins = new BridgeToNative( - defaultAmFeaturesFts, + mockedHandleRedirect, defaultAmParams, ); @@ -303,7 +293,7 @@ describe('BridgeToNative', () => { ])( 'should detect app scheme for version %s correctly and save it in `iosAppId` property', (appVersion, expected) => { - const ins = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const ins = new BridgeToNative( mockedHandleRedirect, { ...defaultAmParams, appVersion, }); @@ -313,12 +303,12 @@ describe('BridgeToNative', () => { ); it('should use `iosAppId` parameter as value for `iosApplicationId` while parameter exists', () => { - const inst1 = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst1 = new BridgeToNative( mockedHandleRedirect, { ...defaultAmParams, appVersion: '0.0.0', iosAppId: 'kittycash', }); - const inst2 = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst2 = new BridgeToNative( mockedHandleRedirect, { ...defaultAmParams, appVersion: '12.22.0', iosAppId: 'kittycash', @@ -345,7 +335,7 @@ describe('BridgeToNative', () => { androidEnvFlag = true; } - const inst = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst = new BridgeToNative( mockedHandleRedirect, { ...defaultAmParams, appVersion, }); @@ -353,16 +343,6 @@ describe('BridgeToNative', () => { expect(inst.canUseNativeFeature('linksInBrowser')).toBe(expected); }, ); - - it('should return `false` for feature while FT is off', () => { - const inst = new BridgeToNative( - { ...defaultAmFeaturesFts, linksInBrowserIos: false }, - mockedHandleRedirect, - { ...defaultAmParams, appVersion: '14.0.0' }, - ); - - expect(inst.canUseNativeFeature('linksInBrowser')).toBeFalsy(); - }); }); describe('method `closeWebview`', () => { @@ -389,7 +369,7 @@ describe('BridgeToNative', () => { ])( 'should compare current version `%s` with `%s` and return `%s`', (currentVersion, versionToCompare, result) => { - const inst = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst = new BridgeToNative( mockedHandleRedirect, { ...defaultAmParams, appVersion: currentVersion, @@ -405,7 +385,7 @@ describe('BridgeToNative', () => { androidEnvFlag = true; const inst = new BridgeToNative( - defaultAmFeaturesFts, + mockedHandleRedirect, defaultAmParams, ); @@ -430,7 +410,7 @@ describe('BridgeToNative', () => { ])( 'should detect app scheme for version `%s` as `%s` while parameter is not passed', (version, appId) => { - const inst = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst = new BridgeToNative( mockedHandleRedirect, { ...defaultAmParams, appVersion: version, }); @@ -440,7 +420,7 @@ describe('BridgeToNative', () => { ); it('should use app scheme from parameter', () => { - const inst = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst = new BridgeToNative( mockedHandleRedirect, { ...defaultAmParams, appVersion: '1.0.0', }); diff --git a/test/integration.test.ts b/test/integration.test.ts index 6a1db7f..d23a7fc 100644 --- a/test/integration.test.ts +++ b/test/integration.test.ts @@ -3,11 +3,6 @@ import { BridgeToNative } from '../src'; describe('BridgeToNative integration testing', () => { - const defaultAmFeaturesFts = { - linksInBrowserAndroid: true, - linksInBrowserIos: true, - }; - const defaultAmParams = { appVersion: '12.0.0', theme: 'light', @@ -57,7 +52,7 @@ describe('BridgeToNative integration testing', () => { }); it('should use AM interface correctly when moving forward and then backward', async () => { - const inst = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst = new BridgeToNative(mockedHandleRedirect, { ...defaultAmParams, title: 'Initial Title', }); @@ -116,7 +111,6 @@ describe('BridgeToNative integration testing', () => { it('should act and use AM interface correctly when using `goBackAFewSteps`', async () => { const inst = new BridgeToNative( - defaultAmFeaturesFts, mockedHandleRedirect, defaultAmParams, ); @@ -150,7 +144,6 @@ describe('BridgeToNative integration testing', () => { it('should act and use AM interface correctly when using `setInitialView`', async () => { const inst = new BridgeToNative( - defaultAmFeaturesFts, mockedHandleRedirect, defaultAmParams, ); @@ -179,7 +172,7 @@ describe('BridgeToNative integration testing', () => { describe('iOS environment', () => { it('should use AM interface correctly when moving forward and then backward', async () => { - const inst = new BridgeToNative(defaultAmFeaturesFts, mockedHandleRedirect, { + const inst = new BridgeToNative(mockedHandleRedirect, { ...defaultAmParams, title: 'Initial Title', }); @@ -246,7 +239,6 @@ describe('BridgeToNative integration testing', () => { it('should act and use AM interface correctly when using `goBackAFewSteps`', async () => { const inst = new BridgeToNative( - defaultAmFeaturesFts, mockedHandleRedirect, defaultAmParams, ); @@ -282,7 +274,6 @@ describe('BridgeToNative integration testing', () => { it('should act and use AM interface correctly when using `setInitialView`', async () => { const inst = new BridgeToNative( - defaultAmFeaturesFts, mockedHandleRedirect, defaultAmParams, ); diff --git a/test/native-fallbacks.test.ts b/test/native-fallbacks.test.ts index 7134980..12908f5 100644 --- a/test/native-fallbacks.test.ts +++ b/test/native-fallbacks.test.ts @@ -5,13 +5,13 @@ import { PdfType } from '../src/types'; let androidEnvFlag = false; let iosAppId: string | undefined; -let linksInBrowserFeatureFlag = false; +let canOpenLinksInBrowser = false; let mockedHandleRedirect: any; let mockedSetInitialView: any; const mockedBridgeToAmInstance = { canUseNativeFeature() { - return linksInBrowserFeatureFlag; + return canOpenLinksInBrowser; }, get environment() { return androidEnvFlag ? 'android' : 'ios'; @@ -54,7 +54,7 @@ describe('AmFallbacks', () => { afterEach(() => { androidEnvFlag = false; iosAppId = undefined; - linksInBrowserFeatureFlag = false; + canOpenLinksInBrowser = false; windowSpy.mockRestore(); jest.resetAllMocks(); @@ -68,7 +68,7 @@ describe('AmFallbacks', () => { "should return href with link with 'openInBrowser' query for '%s' app v. >= '%s'", (platform) => { androidEnvFlag = platform === 'android'; - linksInBrowserFeatureFlag = true; + canOpenLinksInBrowser = true; const inst = new NativeFallbacks(mockedBridgeToAmInstance); @@ -197,7 +197,7 @@ describe('AmFallbacks', () => { ['android', nativeFeaturesFromVersion.android.linksInBrowser.fromVersion], ])("should visit link with 'openInBrowser' query for '%s' app v. >= '%s'", (platform) => { androidEnvFlag = platform === 'android'; - linksInBrowserFeatureFlag = true; + canOpenLinksInBrowser = true; const inst = new NativeFallbacks(mockedBridgeToAmInstance); diff --git a/test/native-navigation-and-title.test.ts b/test/native-navigation-and-title.test.ts index 8c2c9dd..d7b19ae 100644 --- a/test/native-navigation-and-title.test.ts +++ b/test/native-navigation-and-title.test.ts @@ -41,12 +41,6 @@ jest.mock('../src', () => ({ describe('AmNavigationAndTitle', () => { describe('sessionStorage interaction', () => { - // const mockedSessionStorage = mockSessionStorage({ - // [PREVIOUS_NATIVE_NAVIGATION_AND_TITLE_STATE_STORAGE_KEY]: { - // nativeHistoryStack: ['page1', 'page2', 'lastPage'], - // title: 'lastPage', - // }, - // }); const mockedSessionStorage = mockSessionStorage( PREVIOUS_NATIVE_NAVIGATION_AND_TITLE_STATE_STORAGE_KEY, {