Fix last batch of jest tests (#6582)

As title
This commit is contained in:
Thomas Trompette
2024-08-08 15:53:17 +02:00
committed by GitHub
parent 774cb554f4
commit a0e5ca44ba
5 changed files with 188 additions and 355 deletions

View File

@ -1,194 +1,139 @@
import { gql } from '@apollo/client';
import { MockedProvider } from '@apollo/client/testing';
import { act, renderHook, waitFor } from '@testing-library/react';
import { RecoilRoot, useSetRecoilState } from 'recoil';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useMultiObjectSearch } from '@/object-record/relation-picker/hooks/useMultiObjectSearch';
import {
MultiObjectSearch,
ObjectRecordForSelect,
SelectedObjectRecordId,
useMultiObjectSearch,
} from '@/object-record/relation-picker/hooks/useMultiObjectSearch';
import { useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery } from '@/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery';
import { useMultiObjectSearchMatchesSearchFilterAndToSelectQuery } from '@/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndToSelectQuery';
import { useMultiObjectSearchSelectedItemsQuery } from '@/object-record/relation-picker/hooks/useMultiObjectSearchSelectedItemsQuery';
import { renderHook } from '@testing-library/react';
import { FieldMetadataType } from '~/generated/graphql';
const query = gql`
query CombinedFindManyRecords(
$filterNameSingular: NameSingularFilterInput
$orderByNameSingular: [NameSingularOrderByInput]
$lastCursorNameSingular: String
$limitNameSingular: Int
) {
namePlural(
filter: $filterNameSingular
orderBy: $orderByNameSingular
first: $limitNameSingular
after: $lastCursorNameSingular
) {
edges {
node {
__typename
id
}
cursor
}
pageInfo {
hasNextPage
startCursor
endCursor
}
totalCount
}
}
`;
const response = {
namePlural: {
edges: [{ node: { __typename: 'Custom', id: 'nodeId' }, cursor: 'cursor' }],
pageInfo: { startCursor: '', hasNextPage: '', endCursor: '' },
},
};
jest.mock(
'@/object-record/relation-picker/hooks/useMultiObjectSearchSelectedItemsQuery',
);
jest.mock(
'@/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery',
);
jest.mock(
'@/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndToSelectQuery',
);
const mocks = [
const objectData: ObjectMetadataItem[] = [
{
request: {
query,
variables: {
filterNameSingular: { id: { in: ['1'] } },
orderByNameSingular: [{ createdAt: 'DescNullsLast' }],
limitNameSingular: 60,
createdAt: 'createdAt',
id: 'id',
isActive: true,
isCustom: true,
isSystem: false,
isRemote: false,
labelPlural: 'labelPlural',
labelSingular: 'labelSingular',
namePlural: 'namePlural',
nameSingular: 'nameSingular',
updatedAt: 'updatedAt',
fields: [
{
id: 'f6a0a73a-5ee6-442e-b764-39b682471240',
name: 'id',
label: 'id',
type: FieldMetadataType.Uuid,
createdAt: '2024-01-01T00:00:00.000Z',
updatedAt: '2024-01-01T00:00:00.000Z',
isActive: true,
},
},
result: jest.fn(() => ({
data: response,
})),
},
{
request: {
query,
variables: {
filterNameSingular: { and: [{}, { id: { in: ['1'] } }] },
orderByNameSingular: [{ createdAt: 'DescNullsLast' }],
limitNameSingular: 60,
},
},
result: jest.fn(() => ({
data: response,
})),
},
{
request: {
query,
variables: {
limitNameSingular: 60,
filterNameSingular: { not: { id: { in: ['1'] } } },
orderByNameSingular: [{ createdAt: 'DescNullsLast' }],
},
},
result: jest.fn(() => ({
data: response,
})),
],
},
];
const Wrapper = ({ children }: { children: React.ReactNode }) => (
<MockedProvider mocks={mocks} addTypename={false}>
<RecoilRoot>{children}</RecoilRoot>
</MockedProvider>
);
describe('useMultiObjectSearch', () => {
it('should return object formatted from objectMetadataItemsState', async () => {
const { result } = renderHook(
() => ({
multiObjects: useMultiObjectSearch({
searchFilterValue: '',
selectedObjectRecordIds: [
{
objectNameSingular: 'nameSingular',
id: '1',
},
],
}),
setObjectMetadata: useSetRecoilState(objectMetadataItemsState),
}),
{
wrapper: Wrapper,
},
);
const objectData: ObjectMetadataItem[] = [
{
const selectedObjectRecordIds: SelectedObjectRecordId[] = [
{ objectNameSingular: 'object1', id: '1' },
{ objectNameSingular: 'object2', id: '2' },
];
const searchFilterValue = 'searchValue';
const limit = 5;
const excludedObjectRecordIds: SelectedObjectRecordId[] = [
{ objectNameSingular: 'object3', id: '3' },
{ objectNameSingular: 'object4', id: '4' },
];
const excludedObjects: CoreObjectNameSingular[] = [];
const selectedObjectRecords: ObjectRecordForSelect[] = [
{
objectMetadataItem: objectData[0],
record: {
__typename: 'ObjectRecord',
id: '1',
createdAt: 'createdAt',
id: 'id',
isActive: true,
isCustom: true,
isSystem: false,
isRemote: false,
labelPlural: 'labelPlural',
labelSingular: 'labelSingular',
namePlural: 'namePlural',
nameSingular: 'nameSingular',
updatedAt: 'updatedAt',
fields: [
{
id: 'f6a0a73a-5ee6-442e-b764-39b682471240',
name: 'id',
label: 'id',
type: FieldMetadataType.Uuid,
createdAt: '2024-01-01T00:00:00.000Z',
updatedAt: '2024-01-01T00:00:00.000Z',
isActive: true,
},
],
},
];
act(() => {
result.current.setObjectMetadata(objectData);
});
await waitFor(() => {
expect(mocks[0].result).toHaveBeenCalled();
// expect(mocks[1].result).toHaveBeenCalled();
expect(mocks[2].result).toHaveBeenCalled();
});
const expectedData = [
{
objectMetadataItem: {
createdAt: 'createdAt',
id: 'id',
isActive: true,
isCustom: true,
isSystem: false,
isRemote: false,
labelPlural: 'labelPlural',
labelSingular: 'labelSingular',
namePlural: 'namePlural',
nameSingular: 'nameSingular',
updatedAt: 'updatedAt',
fields: [
{
id: 'f6a0a73a-5ee6-442e-b764-39b682471240',
name: 'id',
label: 'id',
isActive: true,
type: FieldMetadataType.Uuid,
createdAt: '2024-01-01T00:00:00.000Z',
updatedAt: '2024-01-01T00:00:00.000Z',
},
],
},
record: { id: 'nodeId', __typename: 'Custom' },
recordIdentifier: {
id: 'nodeId',
name: '',
avatarUrl: '',
avatarType: 'rounded',
linkToShowPage: '/object/nameSingular/nodeId',
},
recordIdentifier: {
id: '1',
name: 'name',
},
];
expect(result.current.multiObjects.selectedObjectRecords).toStrictEqual(
expectedData,
);
expect(
result.current.multiObjects.filteredSelectedObjectRecords,
).toStrictEqual(expectedData);
expect(result.current.multiObjects.objectRecordsToSelect).toStrictEqual(
expectedData,
},
];
const selectedObjectRecordsLoading = false;
const selectedAndMatchesSearchFilterObjectRecords: ObjectRecordForSelect[] =
[];
const selectedAndMatchesSearchFilterObjectRecordsLoading = false;
const toSelectAndMatchesSearchFilterObjectRecords: ObjectRecordForSelect[] =
[];
const toSelectAndMatchesSearchFilterObjectRecordsLoading = false;
beforeEach(() => {
(useMultiObjectSearchSelectedItemsQuery as jest.Mock).mockReturnValue({
selectedObjectRecords,
selectedObjectRecordsLoading,
});
(
useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery as jest.Mock
).mockReturnValue({
selectedAndMatchesSearchFilterObjectRecords,
selectedAndMatchesSearchFilterObjectRecordsLoading,
});
(
useMultiObjectSearchMatchesSearchFilterAndToSelectQuery as jest.Mock
).mockReturnValue({
toSelectAndMatchesSearchFilterObjectRecords,
toSelectAndMatchesSearchFilterObjectRecordsLoading,
});
});
afterEach(() => {
jest.resetAllMocks();
});
it('should return the correct object records and loading state', () => {
const { result } = renderHook(() =>
useMultiObjectSearch({
searchFilterValue,
selectedObjectRecordIds,
limit,
excludedObjectRecordIds,
excludedObjects,
}),
);
const expected: MultiObjectSearch = {
selectedObjectRecords,
filteredSelectedObjectRecords:
selectedAndMatchesSearchFilterObjectRecords,
objectRecordsToSelect: toSelectAndMatchesSearchFilterObjectRecords,
loading:
selectedAndMatchesSearchFilterObjectRecordsLoading ||
toSelectAndMatchesSearchFilterObjectRecordsLoading ||
selectedObjectRecordsLoading,
};
expect(result.current).toEqual(expected);
});
});