From dbca42352b4af1cd99d3019c0af4fb847fe78ab4 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 10 Nov 2020 11:22:23 +0100 Subject: [PATCH 01/11] Migrate CI to Github Actions --- .github/workflows/test.yml | 22 ++++++++++++++++++++++ .travis.yml | 26 -------------------------- Makefile | 9 ++++++++- 3 files changed, 30 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/test.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000000..ccfcc91dcc7 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,22 @@ +name: "Test - action" + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Use Node.js LTS + uses: actions/setup-node@v1 + with: + node-version: '14.x' + - name: Install + run: make install + - name: Test + run: make test + env: + CI: true + diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8e701e2c493..00000000000 --- a/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -dist: bionic -services: xvfb - -language: node_js -node_js: - - 'lts/*' - -addons: - chrome: stable - -env: - global: - - DISPLAY=:99.0 - - NODE_ENV=test - -cache: - yarn: true - directories: - - ~/.cache - -script: make test - -branches: - only: - - master - - next diff --git a/Makefile b/Makefile index c18ca9dbada..030573e03b1 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,14 @@ help: @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' install: package.json ## install dependencies - @yarn + @if [ "$(CI)" != "true" ]; then \ + echo "Full install..."; \ + yarn; \ + fi + @if [ "$(CI)" = "true" ]; then \ + echo "Frozen install..."; \ + yarn --frozen-lockfile; \ + fi run: run-simple From 5fe596952e768c47aaf835041f405998676ee86b Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 10 Nov 2020 12:13:05 +0100 Subject: [PATCH 02/11] Parallelize tests --- .github/workflows/test.yml | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ccfcc91dcc7..7f9b6e3a879 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,9 +3,8 @@ name: "Test - action" on: [push, pull_request] jobs: - build: + setup: runs-on: ubuntu-latest - steps: - name: Checkout uses: actions/checkout@v2 @@ -15,8 +14,26 @@ jobs: node-version: '14.x' - name: Install run: make install - - name: Test - run: make test + + build: + needs: setup + - run: make build + + lint: + needs: setup + - run: make lint + + unit-test: + needs: build + steps: + - run: make test-unit + env: + CI: true + + e2e-test: + needs: build + steps: + - run: make test-e2e env: CI: true From 55f9ae2f97ddb3274936d1fb0775579bdc120f12 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 10 Nov 2020 12:14:33 +0100 Subject: [PATCH 03/11] Fix workflow --- .github/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7f9b6e3a879..aab1e62af6e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,10 +17,12 @@ jobs: build: needs: setup + steps: - run: make build lint: needs: setup + steps: - run: make lint unit-test: From 9256d29dafb0819ed0e6ecde82174b102c65b6ae Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 10 Nov 2020 12:15:33 +0100 Subject: [PATCH 04/11] Fix workflow --- .github/workflows/test.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index aab1e62af6e..11b571f960b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,16 +16,19 @@ jobs: run: make install build: + runs-on: ubuntu-latest needs: setup steps: - run: make build lint: + runs-on: ubuntu-latest needs: setup steps: - run: make lint unit-test: + runs-on: ubuntu-latest needs: build steps: - run: make test-unit @@ -33,6 +36,7 @@ jobs: CI: true e2e-test: + runs-on: ubuntu-latest needs: build steps: - run: make test-e2e From 70f42059679db04fe0f0c8647d951e564369a25c Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 10 Nov 2020 14:35:18 +0100 Subject: [PATCH 05/11] Revert to two jobs --- .github/workflows/test.yml | 40 ++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 11b571f960b..e473ec5c125 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,7 +3,7 @@ name: "Test - action" on: [push, pull_request] jobs: - setup: + unit-test: runs-on: ubuntu-latest steps: - name: Checkout @@ -14,32 +14,30 @@ jobs: node-version: '14.x' - name: Install run: make install - - build: - runs-on: ubuntu-latest - needs: setup - steps: - - run: make build - - lint: - runs-on: ubuntu-latest - needs: setup - steps: - - run: make lint - - unit-test: - runs-on: ubuntu-latest - needs: build - steps: - - run: make test-unit + - name: Build + run: make build + - name: Lint + run: make lint + - name: Unit Tests + run: make test-unit env: CI: true e2e-test: runs-on: ubuntu-latest - needs: build steps: - - run: make test-e2e + - name: Checkout + uses: actions/checkout@v2 + - name: Use Node.js LTS + uses: actions/setup-node@v1 + with: + node-version: '14.x' + - name: Install + run: make install + - name: Build + run: make build + - name: e2e Tests + run: make test-e2e env: CI: true From 19eafe883ae2a5a725a237defb96eb6829d036ba Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 10 Nov 2020 14:46:27 +0100 Subject: [PATCH 06/11] Make tests fail --- cypress/integration/auth.js | 2 +- packages/ra-core/src/auth/Authenticated.spec.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cypress/integration/auth.js b/cypress/integration/auth.js index 8a5454808cb..d3b7add1b12 100644 --- a/cypress/integration/auth.js +++ b/cypress/integration/auth.js @@ -8,7 +8,7 @@ describe('Authentication', () => { it('should go to login page after logout', () => { ListPage.navigate(); ListPage.logout(); - cy.url().then(url => expect(url).to.contain('/#/login')); + cy.url().then(url => expect(url).to.contain('/#/login_fail')); }); it('should redirect to login page when not logged in', () => { diff --git a/packages/ra-core/src/auth/Authenticated.spec.tsx b/packages/ra-core/src/auth/Authenticated.spec.tsx index 15ab116d66b..e65fbb46719 100644 --- a/packages/ra-core/src/auth/Authenticated.spec.tsx +++ b/packages/ra-core/src/auth/Authenticated.spec.tsx @@ -20,7 +20,7 @@ describe('', () => { ); - expect(queryByText('Foo')).toBeDefined(); + expect(queryByText('Foo_failed')).toBeDefined(); await wait(); expect(dispatch).toHaveBeenCalledTimes(0); }); From b144c55ced659b13ddde653183dfe0fffc6ae7ac Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 10 Nov 2020 15:13:21 +0100 Subject: [PATCH 07/11] Fix false positive tests --- .../ra-core/src/auth/Authenticated.spec.tsx | 2 +- .../src/controller/useListContext.spec.tsx | 4 ++-- .../ra-core/src/core/CoreAdminRouter.spec.tsx | 24 +++++++++---------- packages/ra-core/src/core/Resource.spec.tsx | 10 ++++---- .../ra-core/src/form/ValidationError.spec.tsx | 6 ++--- .../src/field/ReferenceArrayField.spec.tsx | 12 +++++----- .../src/field/ReferenceField.spec.tsx | 2 +- .../src/form/SimpleFormIterator.spec.tsx | 6 ++--- .../src/input/InputHelperText.spec.tsx | 6 ++--- .../src/input/RadioButtonGroupInput.spec.tsx | 2 +- .../list/datagrid/DatagridHeaderCell.spec.tsx | 2 +- 11 files changed, 38 insertions(+), 38 deletions(-) diff --git a/packages/ra-core/src/auth/Authenticated.spec.tsx b/packages/ra-core/src/auth/Authenticated.spec.tsx index e65fbb46719..3df5622a8ff 100644 --- a/packages/ra-core/src/auth/Authenticated.spec.tsx +++ b/packages/ra-core/src/auth/Authenticated.spec.tsx @@ -20,7 +20,7 @@ describe('', () => { ); - expect(queryByText('Foo_failed')).toBeDefined(); + expect(queryByText('Failed')).not.toBeNull(); await wait(); expect(dispatch).toHaveBeenCalledTimes(0); }); diff --git a/packages/ra-core/src/controller/useListContext.spec.tsx b/packages/ra-core/src/controller/useListContext.spec.tsx index eddf9c337cd..401a842a3e1 100644 --- a/packages/ra-core/src/controller/useListContext.spec.tsx +++ b/packages/ra-core/src/controller/useListContext.spec.tsx @@ -32,7 +32,7 @@ describe('useListContext', () => { ); - expect(getByText('hello')).toBeDefined(); + expect(getByText('hello')).not.toBeNull(); }); it('should return injected props if the context was not set', () => { @@ -44,6 +44,6 @@ describe('useListContext', () => { data={{ 1: { id: 1, title: 'hello' } }} /> ); - expect(getByText('hello')).toBeDefined(); + expect(getByText('hello')).not.toBeNull(); }); }); diff --git a/packages/ra-core/src/core/CoreAdminRouter.spec.tsx b/packages/ra-core/src/core/CoreAdminRouter.spec.tsx index 9da840d60ca..5677b371089 100644 --- a/packages/ra-core/src/core/CoreAdminRouter.spec.tsx +++ b/packages/ra-core/src/core/CoreAdminRouter.spec.tsx @@ -35,11 +35,11 @@ describe('', () => { ); - expect(getByText('Layout')).toBeDefined(); + expect(getByText('Layout')).not.toBeNull(); history.push('/posts'); - expect(getByText('PostList')).toBeDefined(); + expect(getByText('PostList')).not.toBeNull(); history.push('/comments'); - expect(getByText('CommentList')).toBeDefined(); + expect(getByText('CommentList')).not.toBeNull(); }); }); @@ -63,11 +63,11 @@ describe('', () => { ); await new Promise(resolve => setTimeout(resolve, 10)); - expect(getByText('Layout')).toBeDefined(); + expect(getByText('Layout')).not.toBeNull(); history.push('/posts'); - expect(getByText('PostList')).toBeDefined(); + expect(getByText('PostList')).not.toBeNull(); history.push('/comments'); - expect(getByText('CommentList')).toBeDefined(); + expect(getByText('CommentList')).not.toBeNull(); }); }); @@ -105,11 +105,11 @@ describe('', () => { ); // Timeout needed because of the authProvider call await wait(); - expect(getByText('Layout')).toBeDefined(); + expect(getByText('Layout')).not.toBeNull(); history.push('/posts'); - expect(getByText('PostList')).toBeDefined(); + expect(getByText('PostList')).not.toBeNull(); history.push('/comments'); - expect(getByText('CommentList')).toBeDefined(); + expect(getByText('CommentList')).not.toBeNull(); }); }); @@ -142,9 +142,9 @@ describe('', () => { ); history.push('/foo'); expect(queryByText('Layout')).toBeNull(); - expect(getByText('Foo')).toBeDefined(); + expect(getByText('Foo')).not.toBeNull(); history.push('/bar'); - expect(getByText('Layout')).toBeDefined(); - expect(getByText('Bar')).toBeDefined(); + expect(getByText('Layout')).not.toBeNull(); + expect(getByText('Bar')).not.toBeNull(); }); }); diff --git a/packages/ra-core/src/core/Resource.spec.tsx b/packages/ra-core/src/core/Resource.spec.tsx index 7ff227cef8e..ae4de7a9017 100644 --- a/packages/ra-core/src/core/Resource.spec.tsx +++ b/packages/ra-core/src/core/Resource.spec.tsx @@ -69,13 +69,13 @@ describe('', () => { { admin: { resources: { posts: {} } } } ); history.push('/posts'); - expect(getByText('PostList')).toBeDefined(); + expect(getByText('PostList')).not.toBeNull(); history.push('/posts/123'); - expect(getByText('PostEdit')).toBeDefined(); + expect(getByText('PostEdit')).not.toBeNull(); history.push('/posts/123/show'); - expect(getByText('PostShow')).toBeDefined(); + expect(getByText('PostShow')).not.toBeNull(); history.push('/posts/create'); - expect(getByText('PostCreate')).toBeDefined(); + expect(getByText('PostCreate')).not.toBeNull(); }); it('injects permissions to the resource routes', async () => { const history = createMemoryHistory(); @@ -108,6 +108,6 @@ describe('', () => { ); history.push('/posts'); await wait(); - expect(getByText('Permissions: admin')).toBeDefined(); + expect(getByText('Permissions: admin')).not.toBeNull(); }); }); diff --git a/packages/ra-core/src/form/ValidationError.spec.tsx b/packages/ra-core/src/form/ValidationError.spec.tsx index 020f2848f38..f230ce499fa 100644 --- a/packages/ra-core/src/form/ValidationError.spec.tsx +++ b/packages/ra-core/src/form/ValidationError.spec.tsx @@ -76,7 +76,7 @@ describe('ValidationError', () => { /> ); - expect(getByText('Min Value 10')).toBeDefined(); + expect(getByText('Min Value 10')).not.toBeNull(); }); it('renders the error message translated if it is an object, interpolating strings', () => { @@ -89,7 +89,7 @@ describe('ValidationError', () => { /> ); - expect(getByText('Must match IAmMatch')).toBeDefined(); + expect(getByText('Must match IAmMatch')).not.toBeNull(); }); it('renders the error message translated if it is an object, interpolating arrays', () => { @@ -102,6 +102,6 @@ describe('ValidationError', () => { /> ); - expect(getByText('Must be one of foo,bar')).toBeDefined(); + expect(getByText('Must be one of foo,bar')).not.toBeNull(); }); }); diff --git a/packages/ra-ui-materialui/src/field/ReferenceArrayField.spec.tsx b/packages/ra-ui-materialui/src/field/ReferenceArrayField.spec.tsx index eedea2c4019..d6e3526113f 100644 --- a/packages/ra-ui-materialui/src/field/ReferenceArrayField.spec.tsx +++ b/packages/ra-ui-materialui/src/field/ReferenceArrayField.spec.tsx @@ -67,8 +67,8 @@ describe('', () => { ); expect(queryAllByRole('progressbar')).toHaveLength(0); expect(container.firstChild.textContent).not.toBeUndefined(); - expect(getByText('hello')).toBeDefined(); - expect(getByText('world')).toBeDefined(); + expect(getByText('hello')).not.toBeNull(); + expect(getByText('world')).not.toBeNull(); }); it('should render nothing when there are no related records', () => { @@ -129,8 +129,8 @@ describe('', () => { ); expect(queryAllByRole('progressbar')).toHaveLength(0); expect(container.firstChild.textContent).not.toBeUndefined(); - expect(getByText('hello')).toBeDefined(); - expect(getByText('world')).toBeDefined(); + expect(getByText('hello')).not.toBeNull(); + expect(getByText('world')).not.toBeNull(); }); it('should support record with number identifier', () => { @@ -165,8 +165,8 @@ describe('', () => { ); expect(queryAllByRole('progressbar')).toHaveLength(0); expect(container.firstChild.textContent).not.toBeUndefined(); - expect(getByText('hello')).toBeDefined(); - expect(getByText('world')).toBeDefined(); + expect(getByText('hello')).not.toBeNull(); + expect(getByText('world')).not.toBeNull(); }); it('should use custom className', () => { diff --git a/packages/ra-ui-materialui/src/field/ReferenceField.spec.tsx b/packages/ra-ui-materialui/src/field/ReferenceField.spec.tsx index 3725fddcf24..c7a2fc93bd7 100644 --- a/packages/ra-ui-materialui/src/field/ReferenceField.spec.tsx +++ b/packages/ra-ui-materialui/src/field/ReferenceField.spec.tsx @@ -164,7 +164,7 @@ describe('', () => { }, } ); - expect(getByText('hello')).toBeDefined(); + expect(getByText('hello')).not.toBeNull(); const links = container.getElementsByTagName('a'); expect(links).toHaveLength(1); expect(links.item(0).href).toBe('http://localhost/posts/123'); diff --git a/packages/ra-ui-materialui/src/form/SimpleFormIterator.spec.tsx b/packages/ra-ui-materialui/src/form/SimpleFormIterator.spec.tsx index 40c1033b855..a674ba01f3c 100644 --- a/packages/ra-ui-materialui/src/form/SimpleFormIterator.spec.tsx +++ b/packages/ra-ui-materialui/src/form/SimpleFormIterator.spec.tsx @@ -44,7 +44,7 @@ describe('', () => { ); - expect(getByText('ra.action.add')).toBeDefined(); + expect(getByText('ra.action.add')).not.toBeNull(); }); it('should not display add button if disableAdd is truthy', () => { @@ -334,7 +334,7 @@ describe('', () => { ); - expect(getByText('Custom Add Button')).toBeDefined(); + expect(getByText('Custom Add Button')).not.toBeNull(); }); it('should display the custom remove button', () => { @@ -360,7 +360,7 @@ describe('', () => { ); - expect(getByText('Custom Remove Button')).toBeDefined(); + expect(getByText('Custom Remove Button')).not.toBeNull(); }); it('should call the onClick method when the custom add button is clicked', async () => { diff --git a/packages/ra-ui-materialui/src/input/InputHelperText.spec.tsx b/packages/ra-ui-materialui/src/input/InputHelperText.spec.tsx index ca16c245cee..fcc491f1751 100644 --- a/packages/ra-ui-materialui/src/input/InputHelperText.spec.tsx +++ b/packages/ra-ui-materialui/src/input/InputHelperText.spec.tsx @@ -18,7 +18,7 @@ describe('InputHelperText', () => { ); - expect(getByText('Please help!')).toBeDefined(); + expect(getByText('Please help!')).not.toBeNull(); }); it('renders the helperText when there is an error but the input has not been touched yet', () => { @@ -30,7 +30,7 @@ describe('InputHelperText', () => { /> ); - expect(getByText('Please help!')).toBeDefined(); + expect(getByText('Please help!')).not.toBeNull(); expect(queryByText('Crap!')).toBeNull(); }); @@ -40,6 +40,6 @@ describe('InputHelperText', () => { ); expect(queryByText('Please help!')).toBeNull(); - expect(getByText('Crap!')).toBeDefined(); + expect(getByText('Crap!')).not.toBeNull(); }); }); diff --git a/packages/ra-ui-materialui/src/input/RadioButtonGroupInput.spec.tsx b/packages/ra-ui-materialui/src/input/RadioButtonGroupInput.spec.tsx index da788ab11e2..aa554857cff 100644 --- a/packages/ra-ui-materialui/src/input/RadioButtonGroupInput.spec.tsx +++ b/packages/ra-ui-materialui/src/input/RadioButtonGroupInput.spec.tsx @@ -343,7 +343,7 @@ describe('', () => { fireEvent.blur(input); - expect(getByText('ra.validation.error')).toBeDefined(); + expect(getByText('ra.validation.error')).not.toBeNull(); }); it('should be displayed even with an helper Text', () => { diff --git a/packages/ra-ui-materialui/src/list/datagrid/DatagridHeaderCell.spec.tsx b/packages/ra-ui-materialui/src/list/datagrid/DatagridHeaderCell.spec.tsx index ab236d6bf82..3ca385d293a 100644 --- a/packages/ra-ui-materialui/src/list/datagrid/DatagridHeaderCell.spec.tsx +++ b/packages/ra-ui-materialui/src/list/datagrid/DatagridHeaderCell.spec.tsx @@ -23,7 +23,7 @@ describe('', () => { ); - expect(getByText('Label')).toBeDefined(); + expect(getByText('Label')).not.toBeNull(); }); describe('sorting on a column', () => { From 6906a74ea0d8f88278b063d3726e4beda056f987 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 10 Nov 2020 15:30:03 +0100 Subject: [PATCH 08/11] Restore valid tests --- cypress/integration/auth.js | 2 +- packages/ra-core/src/auth/Authenticated.spec.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cypress/integration/auth.js b/cypress/integration/auth.js index d3b7add1b12..8a5454808cb 100644 --- a/cypress/integration/auth.js +++ b/cypress/integration/auth.js @@ -8,7 +8,7 @@ describe('Authentication', () => { it('should go to login page after logout', () => { ListPage.navigate(); ListPage.logout(); - cy.url().then(url => expect(url).to.contain('/#/login_fail')); + cy.url().then(url => expect(url).to.contain('/#/login')); }); it('should redirect to login page when not logged in', () => { diff --git a/packages/ra-core/src/auth/Authenticated.spec.tsx b/packages/ra-core/src/auth/Authenticated.spec.tsx index 3df5622a8ff..8e2a6bc271c 100644 --- a/packages/ra-core/src/auth/Authenticated.spec.tsx +++ b/packages/ra-core/src/auth/Authenticated.spec.tsx @@ -20,7 +20,7 @@ describe('', () => { ); - expect(queryByText('Failed')).not.toBeNull(); + expect(queryByText('Foo')).not.toBeNull(); await wait(); expect(dispatch).toHaveBeenCalledTimes(0); }); From 76e694fd052a4c29dffe31453eecd42850b933e5 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 10 Nov 2020 16:55:00 +0100 Subject: [PATCH 09/11] Fix some test warnings --- .../details/useEditController.spec.tsx | 204 ++++++++++-------- .../src/button/SaveButton.spec.tsx | 6 +- .../src/form/FormTab.spec.tsx | 6 +- .../src/form/SimpleForm.spec.tsx | 6 +- .../src/form/SimpleFormIterator.spec.tsx | 6 +- .../src/form/TabbedForm.spec.tsx | 6 +- 6 files changed, 142 insertions(+), 92 deletions(-) diff --git a/packages/ra-core/src/controller/details/useEditController.spec.tsx b/packages/ra-core/src/controller/details/useEditController.spec.tsx index ae328c349c4..0dc120bee3f 100644 --- a/packages/ra-core/src/controller/details/useEditController.spec.tsx +++ b/packages/ra-core/src/controller/details/useEditController.spec.tsx @@ -6,6 +6,7 @@ import { EditController } from './EditController'; import renderWithRedux from '../../util/renderWithRedux'; import { DataProviderContext } from '../../dataProvider'; import { DataProvider } from '../../types'; +import { SaveContextProvider } from '../../../esm'; describe('useEditController', () => { afterEach(cleanup); @@ -21,6 +22,11 @@ describe('useEditController', () => { debounce: 200, }; + const saveContextValue = { + save: jest.fn(), + setOnFailure: jest.fn(), + }; + it('should call the dataProvider.getOne() function on mount', async () => { const getOne = jest .fn() @@ -30,9 +36,11 @@ describe('useEditController', () => { const dataProvider = ({ getOne } as unknown) as DataProvider; const { queryAllByText } = renderWithRedux( - - {({ record }) =>
{record && record.title}
} -
+ + + {({ record }) =>
{record && record.title}
} +
+
, { admin: { resources: { posts: { data: {} } } } } ); @@ -48,9 +56,11 @@ describe('useEditController', () => { } as unknown) as DataProvider; const { dispatch } = renderWithRedux( - - {({ record }) =>
{record && record.title}
} -
+ + + {({ record }) =>
{record && record.title}
} +
+
, { admin: { resources: { posts: { data: {} } } } } ); @@ -66,9 +76,11 @@ describe('useEditController', () => { } as unknown) as DataProvider; const { queryAllByText } = renderWithRedux( - - {({ record }) =>
{record && record.title}
} -
+ + + {({ record }) =>
{record && record.title}
} +
+
, { admin: { @@ -94,12 +106,14 @@ describe('useEditController', () => { let saveCallback; renderWithRedux( - - {({ save }) => { - saveCallback = save; - return null; - }} - + + + {({ save }) => { + saveCallback = save; + return null; + }} + + , { admin: { resources: { posts: { data: {} } } } } ); @@ -120,12 +134,14 @@ describe('useEditController', () => { let saveCallback; const { dispatch } = renderWithRedux( - - {({ save }) => { - saveCallback = save; - return null; - }} - + + + {({ save }) => { + saveCallback = save; + return null; + }} + + , { admin: { resources: { posts: { data: {} } } } } ); @@ -152,12 +168,14 @@ describe('useEditController', () => { } as unknown) as DataProvider; const { dispatch } = renderWithRedux( - - {({ save }) => { - saveCallback = save; - return null; - }} - + + + {({ save }) => { + saveCallback = save; + return null; + }} + + , { admin: { resources: { posts: { data: {} } } } } ); @@ -193,16 +211,18 @@ describe('useEditController', () => { const onSuccess = jest.fn(); const { dispatch } = renderWithRedux( - - {({ save }) => { - saveCallback = save; - return null; - }} - + + + {({ save }) => { + saveCallback = save; + return null; + }} + + , { admin: { resources: { posts: { data: {} } } } } ); @@ -225,16 +245,18 @@ describe('useEditController', () => { const onSuccessSave = jest.fn(); const { dispatch } = renderWithRedux( - - {({ save }) => { - saveCallback = save; - return null; - }} - + + + {({ save }) => { + saveCallback = save; + return null; + }} + + , { admin: { resources: { posts: { data: {} } } } } ); @@ -261,16 +283,18 @@ describe('useEditController', () => { const onFailure = jest.fn(); const { dispatch } = renderWithRedux( - - {({ save }) => { - saveCallback = save; - return null; - }} - + + + {({ save }) => { + saveCallback = save; + return null; + }} + + , { admin: { resources: { posts: { data: {} } } } } ); @@ -293,16 +317,18 @@ describe('useEditController', () => { const onFailureSave = jest.fn(); const { dispatch } = renderWithRedux( - - {({ save }) => { - saveCallback = save; - return null; - }} - + + + {({ save }) => { + saveCallback = save; + return null; + }} + + , { admin: { resources: { posts: { data: {} } } } } ); @@ -336,16 +362,18 @@ describe('useEditController', () => { })); renderWithRedux( - - {({ save }) => { - saveCallback = save; - return null; - }} - + + + {({ save }) => { + saveCallback = save; + return null; + }} + + , { admin: { resources: { posts: { data: {} } } } } ); @@ -378,16 +406,18 @@ describe('useEditController', () => { })); renderWithRedux( - - {({ save }) => { - saveCallback = save; - return null; - }} - + + + {({ save }) => { + saveCallback = save; + return null; + }} + + , { admin: { resources: { posts: { data: {} } } } } ); diff --git a/packages/ra-ui-materialui/src/button/SaveButton.spec.tsx b/packages/ra-ui-materialui/src/button/SaveButton.spec.tsx index a7ab42282ff..a1ed18bdbd3 100644 --- a/packages/ra-ui-materialui/src/button/SaveButton.spec.tsx +++ b/packages/ra-ui-materialui/src/button/SaveButton.spec.tsx @@ -37,7 +37,11 @@ const invalidButtonDomProps = { describe('', () => { afterEach(cleanup); - const saveContextValue = { save: jest.fn(), saving: false }; + const saveContextValue = { + save: jest.fn(), + saving: false, + setOnFailure: jest.fn(), + }; it('should render as submit type with no DOM errors', () => { const spy = jest.spyOn(console, 'error').mockImplementation(() => {}); diff --git a/packages/ra-ui-materialui/src/form/FormTab.spec.tsx b/packages/ra-ui-materialui/src/form/FormTab.spec.tsx index 8a67c9bad86..cae397a9b0a 100644 --- a/packages/ra-ui-materialui/src/form/FormTab.spec.tsx +++ b/packages/ra-ui-materialui/src/form/FormTab.spec.tsx @@ -14,7 +14,11 @@ import TextInput from '../input/TextInput'; describe('', () => { afterEach(cleanup); - const saveContextValue = { save: jest.fn(), saving: false }; + const saveContextValue = { + save: jest.fn(), + saving: false, + setOnFailure: jest.fn(), + }; const sideEffectValue = {}; it('should display ', () => { diff --git a/packages/ra-ui-materialui/src/form/SimpleForm.spec.tsx b/packages/ra-ui-materialui/src/form/SimpleForm.spec.tsx index a4ea3bb89f2..699a5753208 100644 --- a/packages/ra-ui-materialui/src/form/SimpleForm.spec.tsx +++ b/packages/ra-ui-materialui/src/form/SimpleForm.spec.tsx @@ -13,7 +13,11 @@ import TextInput from '../input/TextInput'; describe('', () => { afterEach(cleanup); - const saveContextValue = { save: jest.fn(), saving: false }; + const saveContextValue = { + save: jest.fn(), + saving: false, + setOnFailure: jest.fn(), + }; const sideEffects = {}; it('should embed a form with given component children', () => { diff --git a/packages/ra-ui-materialui/src/form/SimpleFormIterator.spec.tsx b/packages/ra-ui-materialui/src/form/SimpleFormIterator.spec.tsx index a674ba01f3c..e55cce6a2ab 100644 --- a/packages/ra-ui-materialui/src/form/SimpleFormIterator.spec.tsx +++ b/packages/ra-ui-materialui/src/form/SimpleFormIterator.spec.tsx @@ -26,7 +26,11 @@ describe('', () => { afterEach(cleanup); - const saveContextValue = { save: jest.fn(), saving: false }; + const saveContextValue = { + save: jest.fn(), + saving: false, + setOnFailure: jest.fn(), + }; const sideEffectValue = {}; it('should display an add item button at least', () => { diff --git a/packages/ra-ui-materialui/src/form/TabbedForm.spec.tsx b/packages/ra-ui-materialui/src/form/TabbedForm.spec.tsx index 04279094c5e..6a21de0dfd3 100644 --- a/packages/ra-ui-materialui/src/form/TabbedForm.spec.tsx +++ b/packages/ra-ui-materialui/src/form/TabbedForm.spec.tsx @@ -14,7 +14,11 @@ import FormTab from './FormTab'; describe('', () => { afterEach(cleanup); - const saveContextValue = { save: jest.fn(), saving: false }; + const saveContextValue = { + save: jest.fn(), + saving: false, + setOnFailure: jest.fn(), + }; const sideEffectValue = {}; it('should display the tabs', () => { From 2c5a24c6b2448609e81eb6c97cfd94658b13d794 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 10 Nov 2020 16:55:21 +0100 Subject: [PATCH 10/11] Silence ResourceContext hook warning for now --- packages/ra-core/src/core/useResourceContext.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/ra-core/src/core/useResourceContext.ts b/packages/ra-core/src/core/useResourceContext.ts index 71212678d34..eca9c0e7f42 100644 --- a/packages/ra-core/src/core/useResourceContext.ts +++ b/packages/ra-core/src/core/useResourceContext.ts @@ -23,9 +23,10 @@ export const useResourceContext = < * @deprecated - to be removed in 4.0 */ if (process.env.NODE_ENV !== 'production') { - console.warn( - "Any react-admin components must be used inside a . Relying on props rather than context to get the resource data is deprecated and won't be supported in the next major version of react-admin." - ); + // Restore this message when ResourceContext is actually used + // console.warn( + // "Any react-admin components must be used inside a . Relying on props rather than context to get the resource data is deprecated and won't be supported in the next major version of react-admin." + // ); } // Ignored because resource is often optional (as it is injected) in components which passes the props to this hook return props.resource; From 68e635ca1d6d1cacd7ae403d7bb1a7e47ada3248 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 10 Nov 2020 16:55:45 +0100 Subject: [PATCH 11/11] Add cache on CI + ensure to only run it when needed --- .github/workflows/test.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e473ec5c125..be498c39a82 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,6 +1,11 @@ name: "Test - action" -on: [push, pull_request] +on: + push: + branches: + - main + - next + pull_request: jobs: unit-test: @@ -12,8 +17,7 @@ jobs: uses: actions/setup-node@v1 with: node-version: '14.x' - - name: Install - run: make install + - uses: bahmutov/npm-install@v1 - name: Build run: make build - name: Lint @@ -32,8 +36,7 @@ jobs: uses: actions/setup-node@v1 with: node-version: '14.x' - - name: Install - run: make install + - uses: bahmutov/npm-install@v1 - name: Build run: make build - name: e2e Tests