From d9692540aa6908ce160d971fcc9c0c8fbaae14a1 Mon Sep 17 00:00:00 2001 From: Adi Date: Tue, 16 Jan 2024 15:50:52 +0200 Subject: [PATCH 01/14] new driver for hint testing --- src/components/hint/Hint.driver.new.ts | 27 +++++++ src/components/hint/__tests__/index.spec.tsx | 83 +++++++++----------- src/testkit/index.ts | 1 + 3 files changed, 65 insertions(+), 46 deletions(-) create mode 100644 src/components/hint/Hint.driver.new.ts diff --git a/src/components/hint/Hint.driver.new.ts b/src/components/hint/Hint.driver.new.ts new file mode 100644 index 0000000000..59043c918e --- /dev/null +++ b/src/components/hint/Hint.driver.new.ts @@ -0,0 +1,27 @@ +import {HintProps} from './index'; +import {useComponentDriver, ComponentProps, usePressableDriver, ViewDriver} from '../../testkit'; +import {ViewStyle, StyleSheet} from 'react-native'; + +export const HintDriver = (props: ComponentProps) => { + const driver = usePressableDriver(useComponentDriver(props)); + + const modalDriver = ViewDriver({ + renderTree: props.renderTree, + testID: `${props.testID}.modal` + }); + + const contentDriver = ViewDriver({ + renderTree: props.renderTree, + testID: `${props.testID}.message` + }); + + const getContentStyle = (): ViewStyle => { + return StyleSheet.flatten(contentDriver.getProps().style) as ViewStyle; + }; + + const getModalExists = (): boolean => { + return modalDriver.exists(); + }; + + return {getContentStyle, getModalExists, ...driver}; +}; diff --git a/src/components/hint/__tests__/index.spec.tsx b/src/components/hint/__tests__/index.spec.tsx index 102f87985b..efe21e94ee 100644 --- a/src/components/hint/__tests__/index.spec.tsx +++ b/src/components/hint/__tests__/index.spec.tsx @@ -1,16 +1,11 @@ import React from 'react'; -import {Hint} from 'react-native-ui-lib'; -import {Colors} from '../../../style'; -import {findStyle} from '../../../uilib-test-renderer'; -import {HintDriver} from '../Hint.driver'; +import {render} from '@testing-library/react-native'; +import {Hint, Colors} from 'react-native-ui-lib'; +import {HintDriver} from '../Hint.driver.new'; -const HintTestComponent = ({ - showHint, - color -}: { - showHint: boolean; - color?: string; -}) => { +const TEST_ID = 'Hint'; + +const HintTestComponent = ({showHint, color}: {showHint: boolean; color?: string}) => { return ( ); }; +//TODO: Add test for onPress functionality describe('Hint Screen component test', () => { - afterEach(() => { - HintDriver.clear(); - }); - - it('Test Hint component background color', async () => { - const expectedColor = Colors.$backgroundPrimaryHeavy; - const component = ; - - const driver = new HintDriver({component, testID: 'Hint'}); - expect(await driver.getElement()).toBeTruthy(); - - const hintContent = await driver.getHintContent(); - let color = findStyle('backgroundColor', hintContent); - - expect(color).toBe(expectedColor); - expect(hintContent).toBeTruthy(); - - const WhiteHint = ; - const WhiteHintDriver = new HintDriver({component: WhiteHint, testID: 'Hint'}); - - const WhiteHintContent = await WhiteHintDriver.getHintContent(); - color = findStyle('backgroundColor', WhiteHintContent); - expect(color).toBe(Colors.white); - }); - - it('Test Hint modal is not visible when showHint is false', async () => { - const component = ; - const driver = new HintDriver({component, testID: 'Hint'}); - expect(await driver.getHintModal()).toBeFalsy(); + describe('Test Hint style, background color:', () => { + it('Test Hint component background color', async () => { + const expectedColor = Colors.$backgroundPrimaryHeavy; + const renderTree = render(); + const driver = HintDriver({renderTree, testID: TEST_ID}); + expect(await driver.getElement()).toBeTruthy(); + + let contentColor = await driver.getContentStyle().backgroundColor; + expect(contentColor).toBe(expectedColor); + + const whiteHintRenderTree = render(); + const whiteHintDriver = HintDriver({renderTree: whiteHintRenderTree, testID: TEST_ID}); + + contentColor = await whiteHintDriver.getContentStyle().backgroundColor; + expect(contentColor).toBe(Colors.white); + }); }); - it('Test Hint modal is visible when showHint is true', async () => { - const component = ; - const driver = new HintDriver({component, testID: 'Hint'}); - expect(await driver.getElement()).toBeTruthy(); - expect(await driver.getHintModal()).toBeTruthy(); + describe('Test Hint modal visibility:', () => { + it('Test Hint modal is not visible when showHint is false', async () => { + const renderTree = render(); + const driver = HintDriver({renderTree, testID: TEST_ID}); + expect(await driver.getModalExists()).toBeFalsy(); + }); + + it('Test Hint modal is visible when showHint is true', async () => { + const renderTree = render(); + const driver = HintDriver({renderTree, testID: TEST_ID}); + expect(await driver.exists()).toBeTruthy(); + expect(await driver.getModalExists()).toBeTruthy(); + }); }); }); diff --git a/src/testkit/index.ts b/src/testkit/index.ts index a9d9c913cc..d7f7e83e7d 100644 --- a/src/testkit/index.ts +++ b/src/testkit/index.ts @@ -10,3 +10,4 @@ export {SortableListItemDriver} from '../components/sortableList/SortableListIte export {TextDriver} from '../components/text/Text.driver.new'; export {TextFieldDriver} from '../components/textField/TextField.driver.new'; export {ViewDriver} from '../components/view/View.driver.new'; +export {HintDriver} from '../components/hint/Hint.driver.new'; From ea2828c52c9e6fc4705a8f34b0fbf7695fca60e1 Mon Sep 17 00:00:00 2001 From: Adi Date: Tue, 16 Jan 2024 17:05:32 +0200 Subject: [PATCH 02/14] onPress & onBackgroundPress tests --- src/components/hint/Hint.driver.new.ts | 25 +++++++-- src/components/hint/__tests__/index.spec.tsx | 57 +++++++++++++++++--- src/components/hint/index.tsx | 16 ++++-- 3 files changed, 84 insertions(+), 14 deletions(-) diff --git a/src/components/hint/Hint.driver.new.ts b/src/components/hint/Hint.driver.new.ts index 59043c918e..ff7b563215 100644 --- a/src/components/hint/Hint.driver.new.ts +++ b/src/components/hint/Hint.driver.new.ts @@ -1,4 +1,5 @@ import {HintProps} from './index'; +import {TouchableOpacityProps} from '../touchableOpacity'; import {useComponentDriver, ComponentProps, usePressableDriver, ViewDriver} from '../../testkit'; import {ViewStyle, StyleSheet} from 'react-native'; @@ -15,13 +16,31 @@ export const HintDriver = (props: ComponentProps) => { testID: `${props.testID}.message` }); + const hintTouchableDriver = usePressableDriver(useComponentDriver({ + renderTree: props.renderTree, + testID: `${props.testID}` + })); + + const overlayTouchableDriver = usePressableDriver(useComponentDriver({ + renderTree: props.renderTree, + testID: `${props.testID}.overlay` + })); + const getContentStyle = (): ViewStyle => { return StyleSheet.flatten(contentDriver.getProps().style) as ViewStyle; }; - const getModalExists = (): boolean => { - return modalDriver.exists(); + const getModal = () => { + return modalDriver; + }; + + const getHintTouchable = () => { + return hintTouchableDriver; + }; + + const getOverlayTouchable = () => { + return overlayTouchableDriver; }; - return {getContentStyle, getModalExists, ...driver}; + return {getContentStyle, getModal, getHintTouchable, getOverlayTouchable, ...driver}; }; diff --git a/src/components/hint/__tests__/index.spec.tsx b/src/components/hint/__tests__/index.spec.tsx index efe21e94ee..6cb48b53a3 100644 --- a/src/components/hint/__tests__/index.spec.tsx +++ b/src/components/hint/__tests__/index.spec.tsx @@ -1,11 +1,21 @@ import React from 'react'; -import {render} from '@testing-library/react-native'; +import {waitFor, render} from '@testing-library/react-native'; import {Hint, Colors} from 'react-native-ui-lib'; import {HintDriver} from '../Hint.driver.new'; const TEST_ID = 'Hint'; -const HintTestComponent = ({showHint, color}: {showHint: boolean; color?: string}) => { +const HintTestComponent = ({ + showHint, + color, + onPress, + onBackgroundPress +}: { + showHint: boolean; + color?: string; + onPress?: Function; + onBackgroundPress?: Function; +}) => { return ( {}} + onBackgroundPress={onBackgroundPress} + onPress={onPress} color={color} removePaddings enableShadow @@ -47,14 +58,48 @@ describe('Hint Screen component test', () => { it('Test Hint modal is not visible when showHint is false', async () => { const renderTree = render(); const driver = HintDriver({renderTree, testID: TEST_ID}); - expect(await driver.getModalExists()).toBeFalsy(); + expect(await driver.getModal().exists()).toBeFalsy(); }); it('Test Hint modal is visible when showHint is true', async () => { - const renderTree = render(); + const renderTree = render( {}}/>); const driver = HintDriver({renderTree, testID: TEST_ID}); expect(await driver.exists()).toBeTruthy(); - expect(await driver.getModalExists()).toBeTruthy(); + expect(await driver.getModal().exists()).toBeTruthy(); + }); + }); + + describe('Test Hint onPress & onBackgroundPress', () => { + let onPressCallback: jest.Mock; + beforeEach(() => (onPressCallback = jest.fn())); + afterEach(() => onPressCallback.mockClear()); + + it('should trigger onPress callback', async () => { + const renderTree = render(); + const driver = HintDriver({renderTree, testID: TEST_ID}); + driver.getHintTouchable().press(); + await waitFor(() => expect(onPressCallback).toHaveBeenCalledTimes(1)); + }); + + // it('should trigger onBackgroundPress callback', async () => { + // const renderTree = render(); + // const driver = HintDriver({renderTree, testID: TEST_ID}); + // expect(driver.getOverlayTouchable().exists()).toBeTruthy(); + // driver.getOverlayTouchable().press(); + // await waitFor(() => expect(onPressCallback).toHaveBeenCalledTimes(1)); + // }); + + it('should not trigger onPress callback when onPress isn\'t passed', async () => { + const renderTree = render(); + const driver = HintDriver({renderTree, testID: TEST_ID}); + driver.getHintTouchable().press(); + await waitFor(() => expect(onPressCallback).toHaveBeenCalledTimes(0)); + }); + + it('should not create touchable overlay driver when onBackgroundPress isn\'t passed', async () => { + const renderTree = render(); + const driver = HintDriver({renderTree, testID: TEST_ID}); + expect(driver.getOverlayTouchable().exists()).toBeFalsy(); }); }); }); diff --git a/src/components/hint/index.tsx b/src/components/hint/index.tsx index 7ae4b3f633..9690370e92 100644 --- a/src/components/hint/index.tsx +++ b/src/components/hint/index.tsx @@ -425,10 +425,13 @@ class Hint extends Component { } ]} pointerEvents="box-none" - testID={`${testID}.overlay`} > {onBackgroundPress && ( - + )} @@ -480,7 +483,11 @@ class Hint extends Component { > {customContent} {!customContent && icon && } - {!customContent && {message}} + {!customContent && ( + + {message} + + )} ); } @@ -501,9 +508,8 @@ class Hint extends Component { this.getHintAnimatedStyle() ]} pointerEvents="box-none" - testID={testID} > - + {this.renderContent()} {this.renderHintTip()} From ee0c75770f2d102039213ba9dd62ad88dcecdcfb Mon Sep 17 00:00:00 2001 From: Adi Date: Wed, 17 Jan 2024 14:24:49 +0200 Subject: [PATCH 03/14] testing icon on Hint --- src/components/hint/Hint.driver.new.ts | 19 +++++++--- src/components/hint/__tests__/index.spec.tsx | 37 +++++++++++++++++--- src/components/hint/index.tsx | 2 +- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/components/hint/Hint.driver.new.ts b/src/components/hint/Hint.driver.new.ts index ff7b563215..e921679438 100644 --- a/src/components/hint/Hint.driver.new.ts +++ b/src/components/hint/Hint.driver.new.ts @@ -1,6 +1,6 @@ import {HintProps} from './index'; import {TouchableOpacityProps} from '../touchableOpacity'; -import {useComponentDriver, ComponentProps, usePressableDriver, ViewDriver} from '../../testkit'; +import {useComponentDriver, ComponentProps, usePressableDriver, ViewDriver, ImageDriver} from '../../testkit'; import {ViewStyle, StyleSheet} from 'react-native'; export const HintDriver = (props: ComponentProps) => { @@ -26,14 +26,23 @@ export const HintDriver = (props: ComponentProps) => { testID: `${props.testID}.overlay` })); - const getContentStyle = (): ViewStyle => { - return StyleSheet.flatten(contentDriver.getProps().style) as ViewStyle; - }; + const iconDriver = ImageDriver({ + renderTree: props.renderTree, + testID: `${props.testID}.icon` + }); const getModal = () => { return modalDriver; }; + const getIcon = () => { + return iconDriver; + }; + + const getContentStyle = (): ViewStyle => { + return StyleSheet.flatten(contentDriver.getProps().style) as ViewStyle; + }; + const getHintTouchable = () => { return hintTouchableDriver; }; @@ -42,5 +51,5 @@ export const HintDriver = (props: ComponentProps) => { return overlayTouchableDriver; }; - return {getContentStyle, getModal, getHintTouchable, getOverlayTouchable, ...driver}; + return {getContentStyle, getModal, getIcon, getHintTouchable, getOverlayTouchable, ...driver}; }; diff --git a/src/components/hint/__tests__/index.spec.tsx b/src/components/hint/__tests__/index.spec.tsx index 6cb48b53a3..12cce4f0ae 100644 --- a/src/components/hint/__tests__/index.spec.tsx +++ b/src/components/hint/__tests__/index.spec.tsx @@ -5,16 +5,22 @@ import {HintDriver} from '../Hint.driver.new'; const TEST_ID = 'Hint'; +const settingsIcon = require('../../../assets/icons/check.png'); + const HintTestComponent = ({ showHint, color, onPress, - onBackgroundPress + onBackgroundPress, + useModal, + useIcon }: { showHint: boolean; color?: string; onPress?: Function; onBackgroundPress?: Function; + useModal?: boolean; + useIcon?: boolean; }) => { return ( ); }; //TODO: Add test for onPress functionality describe('Hint Screen component test', () => { - describe('Test Hint style, background color:', () => { + describe('Test Hint style:', () => { it('Test Hint component background color', async () => { const expectedColor = Colors.$backgroundPrimaryHeavy; const renderTree = render(); @@ -54,6 +62,20 @@ describe('Hint Screen component test', () => { }); }); + describe('Test Hint icon', () => { + it('Hint should include icon', async () => { + const renderTree = render(); + const driver = HintDriver({renderTree, testID: TEST_ID}); + expect(driver.getIcon().exists()).toBeTruthy(); + }); + + it('Hint shouldn\'t include icon', async () => { + const renderTree = render(); + const driver = HintDriver({renderTree, testID: TEST_ID}); + expect(driver.getIcon().exists()).toBeFalsy(); + }); + }); + describe('Test Hint modal visibility:', () => { it('Test Hint modal is not visible when showHint is false', async () => { const renderTree = render(); @@ -81,11 +103,14 @@ describe('Hint Screen component test', () => { await waitFor(() => expect(onPressCallback).toHaveBeenCalledTimes(1)); }); + //TODO - fix this test for onBackgroundTest // it('should trigger onBackgroundPress callback', async () => { - // const renderTree = render(); + // jest.useFakeTimers(); + // const renderTree = render(); // const driver = HintDriver({renderTree, testID: TEST_ID}); - // expect(driver.getOverlayTouchable().exists()).toBeTruthy(); - // driver.getOverlayTouchable().press(); + // act(() => { + // driver.getOverlayTouchable().press(); + // }); // await waitFor(() => expect(onPressCallback).toHaveBeenCalledTimes(1)); // }); @@ -102,4 +127,6 @@ describe('Hint Screen component test', () => { expect(driver.getOverlayTouchable().exists()).toBeFalsy(); }); }); + + describe('Test Hint tip', () => {}); }); diff --git a/src/components/hint/index.tsx b/src/components/hint/index.tsx index 9690370e92..01fbd80cf6 100644 --- a/src/components/hint/index.tsx +++ b/src/components/hint/index.tsx @@ -482,7 +482,7 @@ class Hint extends Component { ref={this.hintRef} > {customContent} - {!customContent && icon && } + {!customContent && icon && } {!customContent && ( {message} From 44c64186a886fbcd9044df58c22a36d3264328c9 Mon Sep 17 00:00:00 2001 From: Adi Date: Mon, 22 Jan 2024 11:00:16 +0200 Subject: [PATCH 04/14] removed on background press test --- jestSetup/jest-setup.js | 12 +++++++++ src/components/hint/Hint.driver.new.ts | 11 +++++++-- src/components/hint/__tests__/index.spec.tsx | 26 +++++++++----------- src/components/hint/index.tsx | 2 +- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/jestSetup/jest-setup.js b/jestSetup/jest-setup.js index 15d9d4f2e5..4338988e8d 100644 --- a/jestSetup/jest-setup.js +++ b/jestSetup/jest-setup.js @@ -1,4 +1,5 @@ import {NativeModules, AccessibilityInfo, Animated} from 'react-native'; +import React from 'react'; // ========= Mock Object.defineProperty to always allow overriding ========= const originalDefineProperty = Object.defineProperty; Object.defineProperty = (obj, prop, desc) => { @@ -15,6 +16,17 @@ Object.defineProperties = (obj, props) => { return obj; }; // ========================================================================= +const OriginalReactComponent = React.Component; +Object.defineProperty(React, 'Component', { + value: class MockedReactComponent extends OriginalReactComponent { + componentDidMount() { + super.componentDidMount?.(); + this.props.onLayout?.({nativeEvent: {layout: {}}}); + console.log(`MOCK MOCK MOCK! this.measureInWindow:`, this.measureInWindow); + this.measureInWindow?.({nativeEvent: {layout: {}}}); + } + } +}); global._UILIB_TESTING = true; diff --git a/src/components/hint/Hint.driver.new.ts b/src/components/hint/Hint.driver.new.ts index e921679438..d640acaa33 100644 --- a/src/components/hint/Hint.driver.new.ts +++ b/src/components/hint/Hint.driver.new.ts @@ -1,12 +1,19 @@ import {HintProps} from './index'; import {TouchableOpacityProps} from '../touchableOpacity'; -import {useComponentDriver, ComponentProps, usePressableDriver, ViewDriver, ImageDriver} from '../../testkit'; +import { + useComponentDriver, + ComponentProps, + usePressableDriver, + ViewDriver, + ImageDriver, + ModalDriver +} from '../../testkit'; import {ViewStyle, StyleSheet} from 'react-native'; export const HintDriver = (props: ComponentProps) => { const driver = usePressableDriver(useComponentDriver(props)); - const modalDriver = ViewDriver({ + const modalDriver = ModalDriver({ renderTree: props.renderTree, testID: `${props.testID}.modal` }); diff --git a/src/components/hint/__tests__/index.spec.tsx b/src/components/hint/__tests__/index.spec.tsx index 12cce4f0ae..9a789e37f8 100644 --- a/src/components/hint/__tests__/index.spec.tsx +++ b/src/components/hint/__tests__/index.spec.tsx @@ -1,6 +1,6 @@ -import React from 'react'; +import React, {useRef} from 'react'; import {waitFor, render} from '@testing-library/react-native'; -import {Hint, Colors} from 'react-native-ui-lib'; +import {Hint, Colors, Button} from 'react-native-ui-lib'; import {HintDriver} from '../Hint.driver.new'; const TEST_ID = 'Hint'; @@ -12,6 +12,7 @@ const HintTestComponent = ({ color, onPress, onBackgroundPress, + useTargetFrame = true, useModal, useIcon }: { @@ -19,9 +20,11 @@ const HintTestComponent = ({ color?: string; onPress?: Function; onBackgroundPress?: Function; + useTargetFrame?: boolean; useModal?: boolean; useIcon?: boolean; }) => { + const ref = useRef(); return ( + ref={ref} + > +