Skip to content

Infra/test kit add props #2619

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/components/button/Button.driver.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import {ButtonProps} from './ButtonTypes';
import {ImageDriver} from '../image/Image.driver';
import {ComponentDriver, ComponentDriverArgs} from '../../testkit/Component.driver';
import {TextDriver} from '../text/Text.driver';

/**
* Please run clear after each test
*/
export class ButtonDriver extends ComponentDriver {
export class ButtonDriver extends ComponentDriver<ButtonProps> {
private readonly labelDriver: TextDriver;
private readonly iconDriver: ImageDriver;

Expand Down
3 changes: 2 additions & 1 deletion src/components/carousel/Carousel.driver.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {CarouselProps} from './types';
import {ComponentDriver} from '../../testkit';

export class CarouselDriver extends ComponentDriver {
export class CarouselDriver extends ComponentDriver<CarouselProps> {
getContentOffset = async () => (await this.getElementProps()).contentOffset;
scroll = async (delta: number) => (await this.uniDriver.selectorByTestId(this.testID)).scrollX(delta);
}
3 changes: 2 additions & 1 deletion src/components/checkbox/Checkbox.driver.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {CheckboxProps} from './index';
import {ComponentDriver} from '../../testkit';

export class CheckboxDriver extends ComponentDriver {
export class CheckboxDriver extends ComponentDriver<CheckboxProps> {

}
3 changes: 2 additions & 1 deletion src/components/hint/Hint.driver.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {HintProps} from './index';
import {ComponentDriver} from '../../testkit';

export class HintDriver extends ComponentDriver {
export class HintDriver extends ComponentDriver<HintProps> {

getHintContent = async () => this.getByTestId(`${this.testID}.message`);

Expand Down
3 changes: 2 additions & 1 deletion src/components/image/Image.driver.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import {ImageProps} from './index';
import {ComponentDriver} from '../../testkit';

export class ImageDriver extends ComponentDriver {}
export class ImageDriver extends ComponentDriver<ImageProps> {}
3 changes: 2 additions & 1 deletion src/components/picker/Picker.driver.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {PickerProps} from './types';
import {ComponentDriver} from '../../testkit';

export class PickerDriver extends ComponentDriver {
export class PickerDriver extends ComponentDriver<PickerProps> {
getPickerOverlay = async () => await this.getByTestId(`${this.testID}.overlay`);
getPickerOverlayProps = async () => await this.getPropsByTestId(`${this.testID}.overlay`);
}
3 changes: 2 additions & 1 deletion src/components/radioButton/RadioButton.driver.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import {RadioButtonProps} from './index';
import {ComponentDriver, ImageDriver, TextDriver} from '../../testkit';
import {ComponentDriverArgs} from '../../testkit/Component.driver';

export class RadioButtonDriver extends ComponentDriver {
export class RadioButtonDriver extends ComponentDriver<RadioButtonProps> {
private readonly labelDriver: TextDriver;
private readonly iconDriver: ImageDriver;

Expand Down
3 changes: 2 additions & 1 deletion src/components/radioGroup/RadioGroup.driver.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import {RadioGroupProps} from './index';
import {ComponentDriver} from '../../testkit';
import {RadioButtonDriver} from '../radioButton/RadioButton.driver';
import {ComponentDriverArgs} from '../../testkit/Component.driver';

type RadioGroupDriverArgs = ComponentDriverArgs & {testIDs: {[key: string]: string}}

export class RadioGroupDriver extends ComponentDriver {
export class RadioGroupDriver extends ComponentDriver<RadioGroupProps> {
private readonly radioButtonDrivers: {[key: string]: RadioButtonDriver};
constructor(radioGroupDriverArgs: RadioGroupDriverArgs) {
super({...radioGroupDriverArgs});
Expand Down
2 changes: 1 addition & 1 deletion src/components/slider/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ export default class Slider extends PureComponent<SliderProps, State> {
accessibilityLabel: 'Slider',
accessible: true,
accessibilityRole: 'adjustable' as AccessibilityRole,
accessibilityStates: disabled ? ['disabled'] : [],
accessibilityState: disabled ? {disabled} : undefined,
accessibilityActions: [
{name: 'increment', label: 'increment'},
{name: 'decrement', label: 'decrement'}
Expand Down
5 changes: 3 additions & 2 deletions src/components/slider/slider.driver.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {SliderProps} from './index';
import {ComponentDriver} from '../../testkit';

export class SliderDriver extends ComponentDriver {
isDisabled = async () => (await this.getElementProps()).accessibilityStates[0] === 'disabled';
export class SliderDriver extends ComponentDriver<SliderProps> {
isDisabled = async () => (await this.getElementProps()).accessibilityState?.disabled === true;
}
3 changes: 2 additions & 1 deletion src/components/sortableList/SortableListItem.driver.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import _ from 'lodash';
import {SortableListProps, SortableListItemProps} from './types';
import {ComponentDriver} from '../../testkit/Component.driver';

/**
* Please run clear after each test
*/
export class SortableListItemDriver extends ComponentDriver {
export class SortableListItemDriver<ItemT extends SortableListItemProps> extends ComponentDriver<SortableListProps<ItemT>> {
dragUp = async (indices: number) => {
this.validateIndices(indices);
const data = _.times(indices, index => {
Expand Down
10 changes: 6 additions & 4 deletions src/components/switch/switch.driver.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import {SwitchProps} from './index';
import {ComponentDriver} from '../../testkit';

export class SwitchDriver extends ComponentDriver {
getAccessibilityValue = async () => (await this.getElementProps()).accessibilityValue.text === '1';
export class SwitchDriver extends ComponentDriver<SwitchProps> {
getAccessibilityValue = async () => (await this.getElementProps()).accessibilityValue?.text === '1';

isDisabled = async () => (await this.getElementProps()).accessibilityState.disabled === true;
isDisabled = async () => (await this.getElementProps()).accessibilityState?.disabled === true;

isChecked = async () => (await this.getElementProps()).accessibilityState.checked === 'checked';
isChecked = async () => (await this.getElementProps()).accessibilityValue?.text === '1';

// @ts-ignore
getColor = async () => (await this.getElementProps()).style.backgroundColor;
}
3 changes: 2 additions & 1 deletion src/components/text/Text.driver.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {TextProps} from './index';
import {ComponentDriver} from '../../testkit';

export class TextDriver extends ComponentDriver {
export class TextDriver extends ComponentDriver<TextProps> {
getTextContent = async () => {
if (await this.exists()) {
return (await this.getElementProps()).children;
Expand Down
4 changes: 2 additions & 2 deletions src/incubator/Slider/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ const Slider = React.memo((props: Props) => {
disableActiveStyling,
disabled,
useGap = true,
accessible,
accessible = true,
testID
} = props;

Expand All @@ -184,7 +184,7 @@ const Slider = React.memo((props: Props) => {
accessibilityLabel: 'Slider',
accessible: true,
accessibilityRole: 'adjustable' as AccessibilityRole,
accessibilityStates: disabled ? ['disabled'] : [],
accessibilityState: disabled ? {disabled} : undefined,
accessibilityActions: [
{name: 'increment', label: 'increment'},
{name: 'decrement', label: 'decrement'}
Expand Down
14 changes: 3 additions & 11 deletions src/incubator/TextField/TextField.driver.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import _ from 'lodash';
import {TextFieldProps} from './types';
import {ComponentDriver, ComponentDriverArgs} from '../../testkit/Component.driver';
import {TextDriver} from '../../components/text/Text.driver';


export class TextFieldDriver extends ComponentDriver {
export class TextFieldDriver extends ComponentDriver<TextFieldProps> {
private readonly labelDriver: TextDriver;
private readonly validationMsgDriver: TextDriver;
private readonly floatingPlaceholderDriver: TextDriver;
Expand All @@ -29,7 +30,7 @@ export class TextFieldDriver extends ComponentDriver {

isDisabled = async () => {
if (await this.exists()) {
return (await this.getElementProps()).accessibilityState.disabled;
return (await this.getElementProps()).accessibilityState?.disabled;
} else {
console.warn(`TextField component with testId:${this.testID}, is not found. So you can't get the disabled state`);
return null;
Expand Down Expand Up @@ -57,15 +58,6 @@ export class TextFieldDriver extends ComponentDriver {
}
};

isPressable = async () => {
if (await this.exists()) {
return typeof (await this.getElementProps()).onPress === 'function';
} else {
console.warn(`TextDriver: cannot click because testID:${this.testID} were not found`);
return null;
}
};

// label
getLabelElement = () => this.labelDriver.getElement();
isLabelExists = async () =>
Expand Down
8 changes: 4 additions & 4 deletions src/testkit/Component.driver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ export type ComponentDriverArgs = {
/**
* Please run clear after each test
*/
export class ComponentDriver {
export class ComponentDriver<Props> {
protected readonly testID: string;
protected readonly uniDriver: UniDriver;
protected readonly uniDriver: UniDriver<Props>;
static uniDrivers: {[key: string]: UniDriver} = {};

static clear() {
Expand Down Expand Up @@ -69,11 +69,11 @@ export class ComponentDriver {
.then((driver) => driver.instance());
};

getElementProps = () => {
getElementProps = (): Promise<Props> => {
return this.getPropsByTestId(this.testID);
};

getPropsByTestId = (testID: string) => {
getPropsByTestId = (testID: string): Promise<Props> => {
return this.uniDriver
.selectorByTestId(testID)
.then((driver) => driver.getInstanceProps());
Expand Down
14 changes: 7 additions & 7 deletions src/testkit/UniDriver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ export type DragData = {
y?: number;
};

export interface UniDriver {
selectorByTestId(testId: string): Promise<UniDriver>;
selectorByText(text: string): Promise<UniDriver>;
getByDisplayValue(value: string): Promise<UniDriver>;
first(): Promise<UniDriver>;
at(index: number): Promise<UniDriver>;
export interface UniDriver<Props = any> {
selectorByTestId(testId: string): Promise<UniDriver<Props>>;
selectorByText(text: string): Promise<UniDriver<Props>>;
getByDisplayValue(value: string): Promise<UniDriver<Props>>;
first(): Promise<UniDriver<Props>>;
at(index: number): Promise<UniDriver<Props>>;
instance(): Promise<any>;
getInstanceProps(): Promise<any>;
getInstanceProps(): Promise<Props>;
press(): void;
drag(data: DragData | DragData[]): void;
focus(): void;
Expand Down
12 changes: 6 additions & 6 deletions src/testkit/drivers/TestingLibraryDriver.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
SelectorNotFoundException
} from '../DriverException';

export class TestingLibraryDriver implements UniDriver {
export class TestingLibraryDriver<Props> implements UniDriver<Props> {
private readonly renderAPI: RenderAPI | null;
private readonly reactTestInstances: ReactTestInstance[];

Expand All @@ -29,7 +29,7 @@ export class TestingLibraryDriver implements UniDriver {
}
}

selectorByTestId = async (testId: string): Promise<UniDriver> => {
selectorByTestId = async (testId: string): Promise<UniDriver<Props>> => {
if (!this.renderAPI) {
throw new SelectorChainingException();
}
Expand All @@ -41,25 +41,25 @@ export class TestingLibraryDriver implements UniDriver {
}
};

selectorByText = async (text: string): Promise<UniDriver> => {
selectorByText = async (text: string): Promise<UniDriver<Props>> => {
if (!this.renderAPI) {
throw new SelectorChainingException();
}
const instances = await this.renderAPI.findAllByText(text).catch(() => []);
return new TestingLibraryDriver(instances);
};

getByDisplayValue = async (value: string): Promise<UniDriver> => {
getByDisplayValue = async (value: string): Promise<UniDriver<Props>> => {
if (!this.renderAPI) {
throw new SelectorChainingException();
}
const instances = await this.renderAPI?.findAllByDisplayValue(value).catch(() => []);
return new TestingLibraryDriver(instances);
};

first = (): Promise<UniDriver> => this.at(0);
first = (): Promise<UniDriver<Props>> => this.at(0);

at = (index: number): Promise<UniDriver> => {
at = (index: number): Promise<UniDriver<Props>> => {
return Promise.resolve(new TestingLibraryDriver([this.reactTestInstances[index]]));
};

Expand Down
1 change: 1 addition & 0 deletions src/testkit/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ export {HintDriver} from '../components/hint/Hint.driver';
export {RadioButtonDriver} from '../components/radioButton/RadioButton.driver';
export {RadioGroupDriver} from '../components/radioGroup/RadioGroup.driver';
export {SortableListItemDriver} from '../components/sortableList/SortableListItem.driver';
export {SliderDriver} from '../components/slider/slider.driver';