From 4e917068b1cd8a5f8d0ecf429c844169ce40dbd6 Mon Sep 17 00:00:00 2001 From: Julie Plantey Date: Mon, 3 Oct 2022 15:51:39 +0200 Subject: [PATCH 1/8] reverse orders of existing relations --- .../RelationInputDataManager.js | 1 - .../utils/normalizeRelations.js | 11 +++++++- .../utils/tests/normalizeRelations.test.js | 25 +++++++++++++++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js index 3a01dd4e76..d2ee014837 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js @@ -195,7 +195,6 @@ export const RelationInputDataManger = ({ required={required} searchResults={normalizeRelations(search, { mainFieldName: mainField.name, - search: 'search', })} size={size} /> diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js index aa94d5e6df..f937030598 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js @@ -26,12 +26,21 @@ export const normalizeRelations = ( relations, { modifiedData = {}, shouldAddLink = false, mainFieldName, targetModel } ) => { + // To display oldest to newest relations we need to reverse each elements in array of results + // and reverse each arrays itself + const existingRelationsReversed = [...(relations?.data?.pages ?? [])] + .map((relation) => ({ + ...relation, + results: relation.results.slice().reverse(), + })) + .reverse(); + return { ...relations, data: { pages: [ - ...(relations?.data?.pages ?? []), + ...(targetModel ? existingRelationsReversed : relations?.data?.pages ?? []), ...(modifiedData?.connect ? [{ results: modifiedData.connect }] : []), ] ?.map((page) => diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeRelations.test.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeRelations.test.js index f01d19062c..fd9e2d5728 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeRelations.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeRelations.test.js @@ -85,9 +85,9 @@ describe('normalizeRelations', () => { data: { pages: [ [ - expect.objectContaining({ href: '/content-manager/collectionType/something/1' }), - expect.objectContaining({ href: '/content-manager/collectionType/something/2' }), expect.objectContaining({ href: '/content-manager/collectionType/something/3' }), + expect.objectContaining({ href: '/content-manager/collectionType/something/2' }), + expect.objectContaining({ href: '/content-manager/collectionType/something/1' }), ], ], }, @@ -161,4 +161,25 @@ describe('normalizeRelations', () => { }, }); }); + + test.only('reverse order of existing relations', () => { + expect( + normalizeRelations(FIXTURE_RELATIONS, { + modifiedData: { connect: [{ id: 4 }, { id: 5 }] }, + shouldAddLink: true, + targetModel: 'something', + }) + ).toStrictEqual({ + data: { + pages: [ + [ + expect.objectContaining({ id: 3 }), + expect.objectContaining({ id: 2 }), + expect.objectContaining({ id: 1 }), + ], + [expect.objectContaining({ id: 4 }), expect.objectContaining({ id: 5 })], + ], + }, + }); + }); }); From fc6e4adbee2eeed292bd0c39816adea9cdf6bf70 Mon Sep 17 00:00:00 2001 From: Julie Plantey Date: Mon, 3 Oct 2022 17:41:55 +0200 Subject: [PATCH 2/8] refactor existingRelationsReversed + doc --- .../RelationInputDataManager.js | 1 + .../utils/normalizeRelations.js | 26 +++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js index d2ee014837..e6cbdfda7c 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js @@ -195,6 +195,7 @@ export const RelationInputDataManger = ({ required={required} searchResults={normalizeRelations(search, { mainFieldName: mainField.name, + isSearch: true, })} size={size} /> diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js index f937030598..d556af8d19 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js @@ -22,25 +22,35 @@ const normalizeRelation = (relation, { shouldAddLink, mainFieldName, targetModel return nextRelation; }; +/* + * Applies some transformations to existing and new relations in order to display them correctly + * relations: raw relations data coming from useRelations + * shouldAddLink: comes from generateRelationQueryInfos, if true we display a link to the relation (TO FIX: explanation) + * mainFieldName: name of the main field inside the relation (e.g. text field), if no displayable main field exists (e.g. date field) we use the id of the entry + * targetModel: the model on which the relation is based on, used to create an URL link + */ + export const normalizeRelations = ( relations, - { modifiedData = {}, shouldAddLink = false, mainFieldName, targetModel } + { modifiedData = {}, shouldAddLink = false, mainFieldName, targetModel, isSearch = false } ) => { // To display oldest to newest relations we need to reverse each elements in array of results // and reverse each arrays itself - const existingRelationsReversed = [...(relations?.data?.pages ?? [])] - .map((relation) => ({ - ...relation, - results: relation.results.slice().reverse(), - })) - .reverse(); + const existingRelationsReversed = Array.isArray(relations?.data?.pages) + ? relations?.data?.pages + .map((relation) => ({ + ...relation, + results: relation.results.slice().reverse(), + })) + .reverse() + : []; return { ...relations, data: { pages: [ - ...(targetModel ? existingRelationsReversed : relations?.data?.pages ?? []), + ...(!isSearch ? existingRelationsReversed : relations?.data?.pages ?? []), ...(modifiedData?.connect ? [{ results: modifiedData.connect }] : []), ] ?.map((page) => From 359b4e756eca71472b313f66101ea25b1d2f7e8f Mon Sep 17 00:00:00 2001 From: Julie Plantey Date: Wed, 5 Oct 2022 16:21:02 +0200 Subject: [PATCH 3/8] use useQuery select to reverse, split normalizeSearchResults & normalizeRelations --- .../RelationInputDataManager.js | 5 +- .../RelationInputDataManager/utils/index.js | 1 + .../utils/normalizeRelations.js | 18 +-- .../utils/normalizeSearchResults.js | 12 ++ .../utils/tests/normalizeRelations.test.js | 58 +++++++-- .../useRelation/tests/useRelation.test.js | 114 ++++++++++-------- .../hooks/useRelation/useRelation.js | 3 + 7 files changed, 128 insertions(+), 83 deletions(-) create mode 100644 packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeSearchResults.js diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js index e6cbdfda7c..cea6a57d3e 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js @@ -7,7 +7,7 @@ import { useCMEditViewDataManager, NotAllowedInput, useQueryParams } from '@stra import { RelationInput } from '../RelationInput'; import { useRelation } from '../../hooks/useRelation'; -import { connect, select, normalizeRelations } from './utils'; +import { connect, select, normalizeRelations, normalizeSearchResults } from './utils'; import { PUBLICATION_STATES, RELATIONS_TO_DISPLAY, SEARCH_RESULTS_TO_DISPLAY } from './constants'; import { getTrad } from '../../utils'; @@ -193,9 +193,8 @@ export const RelationInputDataManger = ({ }} relations={normalizedRelations} required={required} - searchResults={normalizeRelations(search, { + searchResults={normalizeSearchResults(search, { mainFieldName: mainField.name, - isSearch: true, })} size={size} /> diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/index.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/index.js index a213b58305..cb154b7049 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/index.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/index.js @@ -1,3 +1,4 @@ export { default as connect } from './connect'; export { default as select } from './select'; export { normalizeRelations } from './normalizeRelations'; +export { normalizeSearchResults } from './normalizeSearchResults'; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js index d556af8d19..adbd04d693 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js @@ -2,7 +2,7 @@ import { getRelationLink } from './getRelationLink'; import { PUBLICATION_STATES } from '../constants'; -const normalizeRelation = (relation, { shouldAddLink, mainFieldName, targetModel }) => { +export const normalizeRelation = (relation, { shouldAddLink, mainFieldName, targetModel }) => { const nextRelation = { ...relation }; if (shouldAddLink) { @@ -32,25 +32,14 @@ const normalizeRelation = (relation, { shouldAddLink, mainFieldName, targetModel export const normalizeRelations = ( relations, - { modifiedData = {}, shouldAddLink = false, mainFieldName, targetModel, isSearch = false } + { modifiedData = {}, shouldAddLink = false, mainFieldName, targetModel } ) => { - // To display oldest to newest relations we need to reverse each elements in array of results - // and reverse each arrays itself - const existingRelationsReversed = Array.isArray(relations?.data?.pages) - ? relations?.data?.pages - .map((relation) => ({ - ...relation, - results: relation.results.slice().reverse(), - })) - .reverse() - : []; - return { ...relations, data: { pages: [ - ...(!isSearch ? existingRelationsReversed : relations?.data?.pages ?? []), + ...(relations?.data?.pages.reverse() ?? []), ...(modifiedData?.connect ? [{ results: modifiedData.connect }] : []), ] ?.map((page) => @@ -63,7 +52,6 @@ export const normalizeRelations = ( ) .map((relation) => normalizeRelation(relation, { - modifiedData, shouldAddLink, mainFieldName, targetModel, diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeSearchResults.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeSearchResults.js new file mode 100644 index 0000000000..a37da728c1 --- /dev/null +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeSearchResults.js @@ -0,0 +1,12 @@ +import { normalizeRelation } from './normalizeRelations'; + +export const normalizeSearchResults = (relations, { mainFieldName }) => { + return { + ...relations, + data: { + pages: [...(relations?.data?.pages ?? [])]?.map((page) => + page?.results.map((relation) => normalizeRelation(relation, { mainFieldName })) + ), + }, + }; +}; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeRelations.test.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeRelations.test.js index fd9e2d5728..969edda52d 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeRelations.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeRelations.test.js @@ -6,8 +6,8 @@ const FIXTURE_RELATIONS = { { results: [ { - id: 1, - name: 'Relation 1', + id: 3, + name: 'Relation 3', publishedAt: '2022-08-24T09:29:11.38', }, @@ -18,8 +18,8 @@ const FIXTURE_RELATIONS = { }, { - id: 3, - name: 'Relation 3', + id: 1, + name: 'Relation 1', }, ], }, @@ -37,8 +37,8 @@ describe('normalizeRelations', () => { data: { pages: [ [ + expect.objectContaining(FIXTURE_RELATIONS.data.pages[0].results[0]), expect.objectContaining(FIXTURE_RELATIONS.data.pages[0].results[1]), - expect.objectContaining(FIXTURE_RELATIONS.data.pages[0].results[2]), ], ], }, @@ -162,22 +162,56 @@ describe('normalizeRelations', () => { }); }); - test.only('reverse order of existing relations', () => { + test('reverse order of relations pages', () => { + const fixtureExtended = { + pages: [ + ...FIXTURE_RELATIONS.data.pages, + { + results: [ + { + id: 6, + name: 'Relation 6', + publishedAt: '2022-08-24T09:29:11.38', + }, + + { + id: 5, + name: 'Relation 5', + publishedAt: '', + }, + + { + id: 4, + name: 'Relation 4', + }, + ], + }, + ], + }; + expect( - normalizeRelations(FIXTURE_RELATIONS, { - modifiedData: { connect: [{ id: 4 }, { id: 5 }] }, - shouldAddLink: true, - targetModel: 'something', - }) + normalizeRelations( + { + data: fixtureExtended, + }, + { + modifiedData: { connect: [{ id: 6 }] }, + } + ) ).toStrictEqual({ data: { pages: [ + [ + expect.objectContaining({ id: 6 }), + expect.objectContaining({ id: 5 }), + expect.objectContaining({ id: 4 }), + ], [ expect.objectContaining({ id: 3 }), expect.objectContaining({ id: 2 }), expect.objectContaining({ id: 1 }), ], - [expect.objectContaining({ id: 4 }), expect.objectContaining({ id: 5 })], + [expect.objectContaining({ id: 6 })], ], }, }); diff --git a/packages/core/admin/admin/src/content-manager/hooks/useRelation/tests/useRelation.test.js b/packages/core/admin/admin/src/content-manager/hooks/useRelation/tests/useRelation.test.js index 7ddb993338..6720f1f632 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useRelation/tests/useRelation.test.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useRelation/tests/useRelation.test.js @@ -8,9 +8,15 @@ import { useRelation } from '../useRelation'; jest.mock('../../../../core/utils', () => ({ ...jest.requireActual('../../../../core/utils'), axiosInstance: { - get: jest - .fn() - .mockResolvedValue({ data: { values: [], pagination: { page: 1, pageCount: 10 } } }), + get: jest.fn().mockResolvedValue({ + data: { + results: [ + { id: 2, name: 'newest', publishedAt: null }, + { id: 1, name: 'oldest', publishedAt: null }, + ], + pagination: { page: 1, pageCount: 10 }, + }, + }), }, })); @@ -95,7 +101,7 @@ describe('useRelation', () => { }); }); - test('doesn not fetch relations if it was not enabled', async () => { + test('does not fetch relations if it was not enabled', async () => { await setup(undefined, { relation: { enabled: false } }); expect(axiosInstance.get).not.toBeCalled(); @@ -119,7 +125,7 @@ describe('useRelation', () => { test('fetch relations next page, if there is one', async () => { axiosInstance.get = jest.fn().mockResolvedValue({ data: { - values: [], + results: [], pagination: { page: 1, pageCount: 3, @@ -155,7 +161,7 @@ describe('useRelation', () => { test("does not fetch relations next page, if there isn't one", async () => { axiosInstance.get = jest.fn().mockResolvedValue({ data: { - values: [], + results: [], pagination: { page: 1, pageCount: 1, @@ -191,7 +197,7 @@ describe('useRelation', () => { const spy = jest .fn() - .mockResolvedValue({ data: { values: [], pagination: { page: 1, pageCount: 2 } } }); + .mockResolvedValue({ data: { results: [], pagination: { page: 1, pageCount: 2 } } }); axiosInstance.get = spy; act(() => { @@ -232,63 +238,65 @@ describe('useRelation', () => { }); }); - test('fetch search next page, if there is one', async () => { - const { result, waitForNextUpdate } = await setup(undefined); + // TOFIX: 2 tests breaking (infinite loop & || time out depending on firing them alone or all at the same time) - const spy = jest - .fn() - .mockResolvedValue({ data: { values: [], pagination: { page: 1, pageCount: 2 } } }); - axiosInstance.get = spy; + // test('fetch search next page, if there is one', async () => { + // const { result, waitForNextUpdate } = await setup(undefined); - act(() => { - result.current.searchFor('something'); - }); + // const spy = jest + // .fn() + // .mockResolvedValue({ data: { results: [], pagination: { page: 1, pageCount: 2 } } }); + // axiosInstance.get = spy; - await waitForNextUpdate(); + // act(() => { + // result.current.searchFor('something'); + // }); - act(() => { - result.current.search.fetchNextPage(); - }); + // await waitForNextUpdate(); - await waitForNextUpdate(); + // act(() => { + // result.current.search.fetchNextPage(); + // }); - expect(spy).toBeCalledTimes(2); - expect(spy).toHaveBeenNthCalledWith(1, expect.any(String), { - params: { - _q: 'something', - limit: expect.any(Number), - page: 1, - }, - }); - expect(spy).toHaveBeenNthCalledWith(2, expect.any(String), { - params: { - _q: 'something', - limit: expect.any(Number), - page: 2, - }, - }); - }); + // await waitForNextUpdate(); - test("doesn not fetch search next page, if there isn't one", async () => { - const { result, waitForNextUpdate } = await setup(undefined); + // expect(spy).toBeCalledTimes(2); + // expect(spy).toHaveBeenNthCalledWith(1, expect.any(String), { + // params: { + // _q: 'something', + // limit: expect.any(Number), + // page: 1, + // }, + // }); + // expect(spy).toHaveBeenNthCalledWith(2, expect.any(String), { + // params: { + // _q: 'something', + // limit: expect.any(Number), + // page: 2, + // }, + // }); + // }); - const spy = jest - .fn() - .mockResolvedValue({ data: { values: [], pagination: { page: 1, pageCount: 1 } } }); - axiosInstance.get = spy; + // test("does not fetch search next page, if there isn't one", async () => { + // const { result, waitForNextUpdate } = await setup(undefined); - act(() => { - result.current.searchFor('something'); - }); + // const spy = jest.fn().mockResolvedValue({ + // data: { results: [], pagination: { page: 1, pageCount: 1 }, spy: 'hello' }, + // }); + // axiosInstance.get = spy; - await waitForNextUpdate(); + // act(() => { + // result.current.searchFor('something'); + // }); - act(() => { - result.current.search.fetchNextPage(); - }); + // await waitForNextUpdate(); - await waitForNextUpdate(); + // act(() => { + // result.current.search.fetchNextPage(); + // }); - expect(spy).toBeCalledTimes(1); - }); + // await waitForNextUpdate(); + + // expect(spy).toBeCalledTimes(1); + // }); }); diff --git a/packages/core/admin/admin/src/content-manager/hooks/useRelation/useRelation.js b/packages/core/admin/admin/src/content-manager/hooks/useRelation/useRelation.js index 1690d19c94..3a0dd09b26 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useRelation/useRelation.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useRelation/useRelation.js @@ -44,6 +44,9 @@ export const useRelation = (cacheKey, { relation, search }) => { // eslint-disable-next-line consistent-return return lastPage.pagination.page + 1; }, + select: (data) => ({ + pages: data.pages.map((page) => ({ ...page, results: page.results.slice().reverse() })), + }), }); const searchRes = useInfiniteQuery( From 51f3b540adb0ab0121d59eb51c6e554bd99a5687 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Thu, 6 Oct 2022 10:48:12 +0200 Subject: [PATCH 4/8] useRelation: Wrap search fetch in try catch --- .../hooks/useRelation/useRelation.js | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/core/admin/admin/src/content-manager/hooks/useRelation/useRelation.js b/packages/core/admin/admin/src/content-manager/hooks/useRelation/useRelation.js index 3a0dd09b26..58270a7cb0 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useRelation/useRelation.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useRelation/useRelation.js @@ -22,15 +22,19 @@ export const useRelation = (cacheKey, { relation, search }) => { }; const fetchSearch = async ({ pageParam = 1 }) => { - const { data } = await axiosInstance.get(search.endpoint, { - params: { - ...(search.pageParams ?? {}), - ...searchParams, - page: pageParam, - }, - }); + try { + const { data } = await axiosInstance.get(search.endpoint, { + params: { + ...(search.pageParams ?? {}), + ...searchParams, + page: pageParam, + }, + }); - return data; + return data; + } catch (err) { + return null; + } }; const relationsRes = useInfiniteQuery(['relation', cacheKey], fetchRelations, { @@ -45,7 +49,7 @@ export const useRelation = (cacheKey, { relation, search }) => { return lastPage.pagination.page + 1; }, select: (data) => ({ - pages: data.pages.map((page) => ({ ...page, results: page.results.slice().reverse() })), + pages: data.pages.map((page) => ({ ...page, results: [...(page.results ?? [])].reverse() })), }), }); From 221c80a9d46d03dbd8e2b05086683684fbf8ff0a Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Thu, 6 Oct 2022 10:48:50 +0200 Subject: [PATCH 5/8] useRelation: Uncomment unit tests --- .../useRelation/tests/useRelation.test.js | 94 +++++++++---------- 1 file changed, 46 insertions(+), 48 deletions(-) diff --git a/packages/core/admin/admin/src/content-manager/hooks/useRelation/tests/useRelation.test.js b/packages/core/admin/admin/src/content-manager/hooks/useRelation/tests/useRelation.test.js index 6720f1f632..9b30a872b7 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useRelation/tests/useRelation.test.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useRelation/tests/useRelation.test.js @@ -238,65 +238,63 @@ describe('useRelation', () => { }); }); - // TOFIX: 2 tests breaking (infinite loop & || time out depending on firing them alone or all at the same time) + test('fetch search next page, if there is one', async () => { + const { result, waitForNextUpdate } = await setup(undefined); - // test('fetch search next page, if there is one', async () => { - // const { result, waitForNextUpdate } = await setup(undefined); + const spy = jest + .fn() + .mockResolvedValue({ data: { results: [], pagination: { page: 1, pageCount: 2 } } }); + axiosInstance.get = spy; - // const spy = jest - // .fn() - // .mockResolvedValue({ data: { results: [], pagination: { page: 1, pageCount: 2 } } }); - // axiosInstance.get = spy; + act(() => { + result.current.searchFor('something'); + }); - // act(() => { - // result.current.searchFor('something'); - // }); + await waitForNextUpdate(); - // await waitForNextUpdate(); + act(() => { + result.current.search.fetchNextPage(); + }); - // act(() => { - // result.current.search.fetchNextPage(); - // }); + await waitForNextUpdate(); - // await waitForNextUpdate(); + expect(spy).toBeCalledTimes(2); + expect(spy).toHaveBeenNthCalledWith(1, expect.any(String), { + params: { + _q: 'something', + limit: expect.any(Number), + page: 1, + }, + }); + expect(spy).toHaveBeenNthCalledWith(2, expect.any(String), { + params: { + _q: 'something', + limit: expect.any(Number), + page: 2, + }, + }); + }); - // expect(spy).toBeCalledTimes(2); - // expect(spy).toHaveBeenNthCalledWith(1, expect.any(String), { - // params: { - // _q: 'something', - // limit: expect.any(Number), - // page: 1, - // }, - // }); - // expect(spy).toHaveBeenNthCalledWith(2, expect.any(String), { - // params: { - // _q: 'something', - // limit: expect.any(Number), - // page: 2, - // }, - // }); - // }); + test("does not fetch search next page, if there isn't one", async () => { + const { result, waitForNextUpdate } = await setup(undefined); - // test("does not fetch search next page, if there isn't one", async () => { - // const { result, waitForNextUpdate } = await setup(undefined); + const spy = jest.fn().mockResolvedValue({ + data: { results: [], pagination: { page: 1, pageCount: 1 } }, + }); + axiosInstance.get = spy; - // const spy = jest.fn().mockResolvedValue({ - // data: { results: [], pagination: { page: 1, pageCount: 1 }, spy: 'hello' }, - // }); - // axiosInstance.get = spy; + act(() => { + result.current.searchFor('something'); + }); - // act(() => { - // result.current.searchFor('something'); - // }); + await waitForNextUpdate(); - // await waitForNextUpdate(); + act(() => { + result.current.search.fetchNextPage(); + }); - // act(() => { - // result.current.search.fetchNextPage(); - // }); + await waitForNextUpdate(); - // await waitForNextUpdate(); - - // expect(spy).toBeCalledTimes(1); - // }); + expect(spy).toBeCalledTimes(1); + }); }); From f6afb6f4f4efb6bec3832d84c188cc20d997ccf0 Mon Sep 17 00:00:00 2001 From: Julie Plantey Date: Thu, 6 Oct 2022 12:33:59 +0200 Subject: [PATCH 6/8] add test for normalizeSearchResults --- .../utils/tests/normalizeRelations.test.js | 6 +- .../tests/normalizeSearchResults.test.js | 68 +++++++++++++++++++ 2 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeSearchResults.test.js diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeRelations.test.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeRelations.test.js index 969edda52d..845d5f28b1 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeRelations.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeRelations.test.js @@ -27,8 +27,8 @@ const FIXTURE_RELATIONS = { }, }; -describe('normalizeRelations', () => { - test('filters out deleted releations', () => { +describe('RelationInputDataManager || normalizeRelations', () => { + test('filters out deleted relations', () => { expect( normalizeRelations(FIXTURE_RELATIONS, { modifiedData: { disconnect: [{ id: 1 }] }, @@ -137,7 +137,7 @@ describe('normalizeRelations', () => { }); }); - test('allows to connect new relations, eventhough pages is empty', () => { + test('allows to connect new relations, even though pages is empty', () => { expect( normalizeRelations( { diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeSearchResults.test.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeSearchResults.test.js new file mode 100644 index 0000000000..cc561cec77 --- /dev/null +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeSearchResults.test.js @@ -0,0 +1,68 @@ +import { normalizeSearchResults } from '../normalizeSearchResults'; + +const FIXTURE_RELATIONS = { + data: { + pages: [ + { + results: [ + { + id: 3, + name: 'Relation 3', + publishedAt: '2022-08-24T09:29:11.38', + }, + + { + id: 2, + name: 'Relation 2', + publishedAt: '', + }, + + { + id: 1, + name: 'Relation 1', + }, + ], + }, + ], + }, +}; + +describe('RelationInputDataManager || normalizeRelations', () => { + test('add publicationState attribute to each relation', () => { + expect(normalizeSearchResults(FIXTURE_RELATIONS, {})).toStrictEqual({ + data: { + pages: [ + [ + expect.objectContaining({ publicationState: 'published' }), + expect.objectContaining({ publicationState: 'draft' }), + expect.objectContaining({ publicationState: false }), + ], + ], + }, + }); + }); + + test('add mainField attribute to each relation', () => { + expect( + normalizeSearchResults(FIXTURE_RELATIONS, { + mainFieldName: 'name', + }) + ).toStrictEqual({ + data: { + pages: [ + [ + expect.objectContaining({ + mainField: FIXTURE_RELATIONS.data.pages[0].results[0].name, + }), + expect.objectContaining({ + mainField: FIXTURE_RELATIONS.data.pages[0].results[1].name, + }), + expect.objectContaining({ + mainField: FIXTURE_RELATIONS.data.pages[0].results[2].name, + }), + ], + ], + }, + }); + }); +}); From a457efe802a1b1692b9f2d8f0a5edb86bb3a6cfb Mon Sep 17 00:00:00 2001 From: Julie Plantey Date: Thu, 6 Oct 2022 12:48:00 +0200 Subject: [PATCH 7/8] fix sending idsToInclude=false as search param --- .../RelationInputDataManager/RelationInputDataManager.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js index 24512f6afa..4660548def 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js @@ -126,8 +126,7 @@ export const RelationInputDataManager = ({ const handleOpenSearch = () => { searchFor('', { - idsToInclude: - !isCreatingEntry && relationsFromModifiedData?.disconnect?.map((relation) => relation.id), + idsToInclude: relationsFromModifiedData?.disconnect?.map((relation) => relation.id), idsToOmit: relationsFromModifiedData?.connect?.map((relation) => relation.id), }); }; From 6ec4502450c4c60b50c971fd670e945151af8d99 Mon Sep 17 00:00:00 2001 From: Julie Plantey Date: Thu, 6 Oct 2022 15:42:00 +0200 Subject: [PATCH 8/8] fix tests name for normalizeSearchResults --- .../utils/tests/normalizeSearchResults.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeSearchResults.test.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeSearchResults.test.js index cc561cec77..eab606c0d8 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeSearchResults.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/normalizeSearchResults.test.js @@ -27,7 +27,7 @@ const FIXTURE_RELATIONS = { }, }; -describe('RelationInputDataManager || normalizeRelations', () => { +describe('RelationInputDataManager || normalizeSearchResults', () => { test('add publicationState attribute to each relation', () => { expect(normalizeSearchResults(FIXTURE_RELATIONS, {})).toStrictEqual({ data: {