From deacc157e9ff0264c7a2b33b66011e7d6f467838 Mon Sep 17 00:00:00 2001 From: Pavlos Vinieratos Date: Fri, 9 Oct 2020 14:13:49 +0200 Subject: [PATCH 1/6] first try --- src/__tests__/render.test.js | 15 +++++++++++++++ src/render.js | 8 +++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/__tests__/render.test.js b/src/__tests__/render.test.js index ebf846967..1697fe86d 100644 --- a/src/__tests__/render.test.js +++ b/src/__tests__/render.test.js @@ -382,3 +382,18 @@ test('renders options.wrapper around updated node', () => { `); }); + +test('returns custom queries added', () => { + const _getByCustom = (instance: ReactTestInstance) => + function (someArg: string) { + return `You sent: ${someArg}`; + }; + + const { getByCustom } = render(, { + extendWithQueries: (instance) => ({ + getByCustom: _getByCustom(instance), + }), + }); + + expect(getByCustom('yass!!')).toBe('You sent: yass!!'); +}); diff --git a/src/render.js b/src/render.js index 3adfcc8d7..0747f02ac 100644 --- a/src/render.js +++ b/src/render.js @@ -13,6 +13,7 @@ import debugDeep from './helpers/debugDeep'; type Options = { wrapper?: React.ComponentType, createNodeMock?: (element: React.Element) => any, + extendWithQueries?: (instance: ReactTestInstance) => any, }; type TestRendererOptions = { createNodeMock: (element: React.Element) => any, @@ -24,7 +25,11 @@ type TestRendererOptions = { */ export default function render( component: React.Element, - { wrapper: Wrapper, createNodeMock }: Options = {} + { + wrapper: Wrapper, + createNodeMock, + extendWithQueries = () => ({}), + }: Options = {} ) { const wrap = (innerElement: React.Element) => Wrapper ? {innerElement} : innerElement; @@ -43,6 +48,7 @@ export default function render( ...queryByAPI(instance), ...findByAPI(instance), ...a11yAPI(instance), + ...extendWithQueries(instance), update, rerender: update, // alias for `update` unmount: renderer.unmount, From 2ea9cc247dd260e12804d6900755b0343c7cb275 Mon Sep 17 00:00:00 2001 From: Pavlos Vinieratos Date: Mon, 19 Oct 2020 13:13:37 +0200 Subject: [PATCH 2/6] this should be there --- src/__tests__/render.test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/__tests__/render.test.js b/src/__tests__/render.test.js index 1697fe86d..b889f6732 100644 --- a/src/__tests__/render.test.js +++ b/src/__tests__/render.test.js @@ -384,6 +384,7 @@ test('renders options.wrapper around updated node', () => { }); test('returns custom queries added', () => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const _getByCustom = (instance: ReactTestInstance) => function (someArg: string) { return `You sent: ${someArg}`; From 87de07d529dc2ef4e3853d324a9039c959d3a50a Mon Sep 17 00:00:00 2001 From: Pavlos Vinieratos Date: Mon, 19 Oct 2020 13:14:51 +0200 Subject: [PATCH 3/6] rename --- src/__tests__/render.test.js | 2 +- src/render.js | 10 +++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/__tests__/render.test.js b/src/__tests__/render.test.js index b889f6732..e57db79dc 100644 --- a/src/__tests__/render.test.js +++ b/src/__tests__/render.test.js @@ -391,7 +391,7 @@ test('returns custom queries added', () => { }; const { getByCustom } = render(, { - extendWithQueries: (instance) => ({ + queries: (instance) => ({ getByCustom: _getByCustom(instance), }), }); diff --git a/src/render.js b/src/render.js index 0747f02ac..89f3dfaa3 100644 --- a/src/render.js +++ b/src/render.js @@ -13,7 +13,7 @@ import debugDeep from './helpers/debugDeep'; type Options = { wrapper?: React.ComponentType, createNodeMock?: (element: React.Element) => any, - extendWithQueries?: (instance: ReactTestInstance) => any, + queries?: (instance: ReactTestInstance) => any, }; type TestRendererOptions = { createNodeMock: (element: React.Element) => any, @@ -25,11 +25,7 @@ type TestRendererOptions = { */ export default function render( component: React.Element, - { - wrapper: Wrapper, - createNodeMock, - extendWithQueries = () => ({}), - }: Options = {} + { wrapper: Wrapper, createNodeMock, queries = () => ({}) }: Options = {} ) { const wrap = (innerElement: React.Element) => Wrapper ? {innerElement} : innerElement; @@ -48,7 +44,7 @@ export default function render( ...queryByAPI(instance), ...findByAPI(instance), ...a11yAPI(instance), - ...extendWithQueries(instance), + ...queries(instance), update, rerender: update, // alias for `update` unmount: renderer.unmount, From f01e6a3c120768547149df0f6e4c4047dcea3274 Mon Sep 17 00:00:00 2001 From: Pavlos Vinieratos Date: Mon, 19 Oct 2020 15:55:40 +0200 Subject: [PATCH 4/6] lets use it --- src/__tests__/render.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/__tests__/render.test.js b/src/__tests__/render.test.js index e57db79dc..971e3dd1c 100644 --- a/src/__tests__/render.test.js +++ b/src/__tests__/render.test.js @@ -384,9 +384,9 @@ test('renders options.wrapper around updated node', () => { }); test('returns custom queries added', () => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars const _getByCustom = (instance: ReactTestInstance) => function (someArg: string) { + console.log({ instance }); return `You sent: ${someArg}`; }; From 3a2a2b171c8a7c4b3fff22bbb268ce60c3bfd3af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Tue, 20 Oct 2020 09:07:46 +0200 Subject: [PATCH 5/6] make API compatible with TL --- src/__tests__/render.test.js | 14 ++++++-------- src/render.js | 24 +++++++++++++----------- typings/index.d.ts | 8 +++++++- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/__tests__/render.test.js b/src/__tests__/render.test.js index 971e3dd1c..bbf16b2d5 100644 --- a/src/__tests__/render.test.js +++ b/src/__tests__/render.test.js @@ -384,16 +384,14 @@ test('renders options.wrapper around updated node', () => { }); test('returns custom queries added', () => { - const _getByCustom = (instance: ReactTestInstance) => - function (someArg: string) { - console.log({ instance }); - return `You sent: ${someArg}`; - }; + const _getByCustom = (instance: ReactTestInstance, someArg: string) => { + return `You sent: ${someArg}`; + }; const { getByCustom } = render(, { - queries: (instance) => ({ - getByCustom: _getByCustom(instance), - }), + queries: { + getByCustom: _getByCustom, + }, }); expect(getByCustom('yass!!')).toBe('You sent: yass!!'); diff --git a/src/render.js b/src/render.js index 89f3dfaa3..a427b3ae5 100644 --- a/src/render.js +++ b/src/render.js @@ -3,17 +3,16 @@ import * as React from 'react'; import TestRenderer, { type ReactTestRenderer } from 'react-test-renderer'; // eslint-disable-line import/no-extraneous-dependencies import act from './act'; import { addToCleanupQueue } from './cleanup'; -import { getByAPI } from './helpers/getByAPI'; -import { queryByAPI } from './helpers/queryByAPI'; -import { findByAPI } from './helpers/findByAPI'; -import a11yAPI from './helpers/a11yAPI'; import debugShallow from './helpers/debugShallow'; import debugDeep from './helpers/debugDeep'; +import { getQueriesForElement } from './within'; type Options = { wrapper?: React.ComponentType, createNodeMock?: (element: React.Element) => any, - queries?: (instance: ReactTestInstance) => any, + queries?: { + [key: string]: (instance: ReactTestInstance, ...rest: Array) => any, + }, }; type TestRendererOptions = { createNodeMock: (element: React.Element) => any, @@ -25,7 +24,7 @@ type TestRendererOptions = { */ export default function render( component: React.Element, - { wrapper: Wrapper, createNodeMock, queries = () => ({}) }: Options = {} + { wrapper: Wrapper, createNodeMock, queries = {} }: Options = {} ) { const wrap = (innerElement: React.Element) => Wrapper ? {innerElement} : innerElement; @@ -37,14 +36,17 @@ export default function render( const update = updateWithAct(renderer, wrap); const instance = renderer.root; + for (let query in queries) { + queries[query] = queries[query].bind(null, instance); + } + addToCleanupQueue(renderer.unmount); return { - ...getByAPI(instance), - ...queryByAPI(instance), - ...findByAPI(instance), - ...a11yAPI(instance), - ...queries(instance), + ...(queries: { + [key: $Keys]: (...rest: Array) => any, + }), + ...getQueriesForElement(instance), update, rerender: update, // alias for `update` unmount: renderer.unmount, diff --git a/typings/index.d.ts b/typings/index.d.ts index 898e504da..0143b3d22 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -137,7 +137,10 @@ interface FindByAPI { value: string | RegExp, waitForOptions?: WaitForOptions ) => FindReturn; - findByTestId: (testID: string | RegExp, waitForOptions?: WaitForOptions) => FindReturn; + findByTestId: ( + testID: string | RegExp, + waitForOptions?: WaitForOptions + ) => FindReturn; findAllByText: ( text: string | RegExp, waitForOptions?: WaitForOptions @@ -293,6 +296,9 @@ export interface Thenable { export interface RenderOptions { wrapper?: React.ComponentType; createNodeMock?: (element: React.ReactElement) => any; + queries?: { + [key: string]: (instance: ReactTestInstance, ...rest: Array) => any; + }; } type Queries = GetByAPI & QueryByAPI & FindByAPI & A11yAPI; From 064157533971c963d09d6f173b6ec80924f2a52a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Wed, 21 Oct 2020 10:49:59 +0200 Subject: [PATCH 6/6] Update src/__tests__/render.test.js Co-authored-by: Maciej Jastrzebski --- src/__tests__/render.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/__tests__/render.test.js b/src/__tests__/render.test.js index bbf16b2d5..7f29a081f 100644 --- a/src/__tests__/render.test.js +++ b/src/__tests__/render.test.js @@ -383,7 +383,7 @@ test('renders options.wrapper around updated node', () => { `); }); -test('returns custom queries added', () => { +test('uses custom queries', () => { const _getByCustom = (instance: ReactTestInstance, someArg: string) => { return `You sent: ${someArg}`; };