Add tests for modules/object-metadata/hooks (#3485)
* Add tests for `modules/object-metadata/hooks` Co-authored-by: v1b3m <vibenjamin6@gmail.com> * Merge main Co-authored-by: v1b3m <vibenjamin6@gmail.com> * Refactor according to self review Co-authored-by: v1b3m <vibenjamin6@gmail.com> --------- Co-authored-by: gitstart-twenty <gitstart-twenty@users.noreply.github.com> Co-authored-by: v1b3m <vibenjamin6@gmail.com>
This commit is contained in:
@ -0,0 +1,21 @@
|
||||
import { ReactNode } from 'react';
|
||||
import {
|
||||
ApolloClient,
|
||||
NormalizedCacheObject,
|
||||
useApolloClient,
|
||||
} from '@apollo/client';
|
||||
|
||||
import { ApolloMetadataClientContext } from '@/object-metadata/context/ApolloClientMetadataContext';
|
||||
|
||||
export const TestApolloMetadataClientProvider = ({
|
||||
children,
|
||||
}: {
|
||||
children: ReactNode;
|
||||
}) => {
|
||||
const client = useApolloClient() as ApolloClient<NormalizedCacheObject>;
|
||||
return (
|
||||
<ApolloMetadataClientContext.Provider value={client}>
|
||||
{client ? children : ''}
|
||||
</ApolloMetadataClientContext.Provider>
|
||||
);
|
||||
};
|
||||
@ -0,0 +1,50 @@
|
||||
import { gql } from '@apollo/client';
|
||||
|
||||
export const query = gql`
|
||||
mutation CreateOneObjectMetadataItem($input: CreateOneObjectInput!) {
|
||||
createOneObject(input: $input) {
|
||||
id
|
||||
dataSourceId
|
||||
nameSingular
|
||||
namePlural
|
||||
labelSingular
|
||||
labelPlural
|
||||
description
|
||||
icon
|
||||
isCustom
|
||||
isActive
|
||||
createdAt
|
||||
updatedAt
|
||||
labelIdentifierFieldMetadataId
|
||||
imageIdentifierFieldMetadataId
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export const variables = {
|
||||
input: {
|
||||
object: {
|
||||
labelPlural: 'View Filters',
|
||||
labelSingular: 'View Filter',
|
||||
nameSingular: 'viewFilter',
|
||||
namePlural: 'viewFilters',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export const responseData = {
|
||||
id: '',
|
||||
dataSourceId: '',
|
||||
nameSingular: 'viewFilter',
|
||||
namePlural: 'viewFilters',
|
||||
labelSingular: 'View Filter',
|
||||
labelPlural: 'View Filters',
|
||||
description: '',
|
||||
icon: '',
|
||||
isCustom: false,
|
||||
isActive: true,
|
||||
createdAt: '',
|
||||
updatedAt: '',
|
||||
labelIdentifierFieldMetadataId: '',
|
||||
imageIdentifierFieldMetadataId: '',
|
||||
};
|
||||
@ -0,0 +1,45 @@
|
||||
import { gql } from '@apollo/client';
|
||||
|
||||
export const query = gql`
|
||||
mutation CreateOneRelationMetadata($input: CreateOneRelationInput!) {
|
||||
createOneRelation(input: $input) {
|
||||
id
|
||||
relationType
|
||||
fromObjectMetadataId
|
||||
toObjectMetadataId
|
||||
fromFieldMetadataId
|
||||
toFieldMetadataId
|
||||
createdAt
|
||||
updatedAt
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export const variables = {
|
||||
input: {
|
||||
relation: {
|
||||
fromDescription: null,
|
||||
fromIcon: undefined,
|
||||
fromLabel: 'label',
|
||||
fromName: 'label',
|
||||
fromObjectMetadataId: 'objectMetadataId',
|
||||
relationType: 'ONE_TO_ONE',
|
||||
toDescription: null,
|
||||
toIcon: undefined,
|
||||
toLabel: 'Another label',
|
||||
toName: 'anotherLabel',
|
||||
toObjectMetadataId: 'objectMetadataId1',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export const responseData = {
|
||||
id: '',
|
||||
relationType: 'ONE_TO_ONE',
|
||||
fromObjectMetadataId: 'objectMetadataId',
|
||||
toObjectMetadataId: 'objectMetadataId1',
|
||||
fromFieldMetadataId: '',
|
||||
toFieldMetadataId: '',
|
||||
createdAt: '',
|
||||
updatedAt: '',
|
||||
};
|
||||
@ -0,0 +1,41 @@
|
||||
import { gql } from '@apollo/client';
|
||||
|
||||
export const query = gql`
|
||||
mutation DeleteOneObjectMetadataItem($idToDelete: ID!) {
|
||||
deleteOneObject(input: { id: $idToDelete }) {
|
||||
id
|
||||
dataSourceId
|
||||
nameSingular
|
||||
namePlural
|
||||
labelSingular
|
||||
labelPlural
|
||||
description
|
||||
icon
|
||||
isCustom
|
||||
isActive
|
||||
createdAt
|
||||
updatedAt
|
||||
labelIdentifierFieldMetadataId
|
||||
imageIdentifierFieldMetadataId
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export const variables = { idToDelete: 'idToDelete' };
|
||||
|
||||
export const responseData = {
|
||||
id: '',
|
||||
dataSourceId: '',
|
||||
nameSingular: '',
|
||||
namePlural: '',
|
||||
labelSingular: '',
|
||||
labelPlural: '',
|
||||
description: '',
|
||||
icon: '',
|
||||
isCustom: false,
|
||||
isActive: true,
|
||||
createdAt: '',
|
||||
updatedAt: '',
|
||||
labelIdentifierFieldMetadataId: '',
|
||||
imageIdentifierFieldMetadataId: '',
|
||||
};
|
||||
@ -0,0 +1,107 @@
|
||||
import { gql } from '@apollo/client';
|
||||
|
||||
const baseFields = `
|
||||
id
|
||||
type
|
||||
name
|
||||
label
|
||||
description
|
||||
icon
|
||||
isCustom
|
||||
isActive
|
||||
isNullable
|
||||
createdAt
|
||||
updatedAt
|
||||
`;
|
||||
|
||||
export const queries = {
|
||||
eraseMetadataField: gql`
|
||||
mutation DeleteOneFieldMetadataItem($idToDelete: ID!) {
|
||||
deleteOneField(input: { id: $idToDelete }) {
|
||||
${baseFields}
|
||||
}
|
||||
}
|
||||
`,
|
||||
activateMetadataField: gql`
|
||||
mutation UpdateOneFieldMetadataItem(
|
||||
$idToUpdate: ID!
|
||||
$updatePayload: UpdateFieldInput!
|
||||
) {
|
||||
updateOneField(input: { id: $idToUpdate, update: $updatePayload }) {
|
||||
${baseFields}
|
||||
}
|
||||
}
|
||||
`,
|
||||
createMetadataField: gql`
|
||||
mutation CreateOneFieldMetadataItem($input: CreateOneFieldMetadataInput!) {
|
||||
createOneField(input: $input) {
|
||||
${baseFields}
|
||||
defaultValue
|
||||
options
|
||||
}
|
||||
}
|
||||
`,
|
||||
};
|
||||
|
||||
const fieldId = '2c43466a-fe9e-4005-8d08-c5836067aa6c';
|
||||
export const objectMetadataId = '25611fce-6637-4089-b0ca-91afeec95784';
|
||||
|
||||
export const variables = {
|
||||
eraseMetadataField: { idToDelete: fieldId },
|
||||
activateMetadataField: {
|
||||
idToUpdate: fieldId,
|
||||
updatePayload: { isActive: true, label: undefined },
|
||||
},
|
||||
createMetadataField: {
|
||||
input: {
|
||||
field: {
|
||||
defaultValue: undefined,
|
||||
description: null,
|
||||
icon: undefined,
|
||||
label: 'fieldLabel',
|
||||
name: 'fieldLabel',
|
||||
options: undefined,
|
||||
objectMetadataId,
|
||||
type: 'TEXT',
|
||||
},
|
||||
},
|
||||
},
|
||||
disableMetadataField: {
|
||||
idToUpdate: fieldId,
|
||||
updatePayload: { isActive: false, label: undefined },
|
||||
},
|
||||
editMetadataField: {
|
||||
idToUpdate: '2c43466a-fe9e-4005-8d08-c5836067aa6c',
|
||||
updatePayload: {
|
||||
defaultValue: undefined,
|
||||
description: null,
|
||||
icon: undefined,
|
||||
label: 'New label',
|
||||
name: 'newLabel',
|
||||
options: undefined,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const defaultResponseData = {
|
||||
id: '2c43466a-fe9e-4005-8d08-c5836067aa6c',
|
||||
type: 'type',
|
||||
name: 'name',
|
||||
label: 'label',
|
||||
description: 'description',
|
||||
icon: 'icon',
|
||||
isCustom: false,
|
||||
isActive: true,
|
||||
isNullable: false,
|
||||
createdAt: '1977-09-28T13:56:55.157Z',
|
||||
updatedAt: '1996-10-10T08:27:57.117Z',
|
||||
};
|
||||
|
||||
export const responseData = {
|
||||
default: defaultResponseData,
|
||||
createMetadataField: {
|
||||
...defaultResponseData,
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
},
|
||||
};
|
||||
@ -0,0 +1,94 @@
|
||||
import { gql } from '@apollo/client';
|
||||
|
||||
export const query = gql`
|
||||
query ObjectMetadataItems(
|
||||
$objectFilter: objectFilter
|
||||
$fieldFilter: fieldFilter
|
||||
) {
|
||||
objects(paging: { first: 1000 }, filter: $objectFilter) {
|
||||
edges {
|
||||
node {
|
||||
id
|
||||
dataSourceId
|
||||
nameSingular
|
||||
namePlural
|
||||
labelSingular
|
||||
labelPlural
|
||||
description
|
||||
icon
|
||||
isCustom
|
||||
isActive
|
||||
isSystem
|
||||
createdAt
|
||||
updatedAt
|
||||
labelIdentifierFieldMetadataId
|
||||
imageIdentifierFieldMetadataId
|
||||
fields(paging: { first: 1000 }, filter: $fieldFilter) {
|
||||
edges {
|
||||
node {
|
||||
id
|
||||
type
|
||||
name
|
||||
label
|
||||
description
|
||||
icon
|
||||
isCustom
|
||||
isActive
|
||||
isSystem
|
||||
isNullable
|
||||
createdAt
|
||||
updatedAt
|
||||
fromRelationMetadata {
|
||||
id
|
||||
relationType
|
||||
toObjectMetadata {
|
||||
id
|
||||
dataSourceId
|
||||
nameSingular
|
||||
namePlural
|
||||
isSystem
|
||||
}
|
||||
toFieldMetadataId
|
||||
}
|
||||
toRelationMetadata {
|
||||
id
|
||||
relationType
|
||||
fromObjectMetadata {
|
||||
id
|
||||
dataSourceId
|
||||
nameSingular
|
||||
namePlural
|
||||
isSystem
|
||||
}
|
||||
fromFieldMetadataId
|
||||
}
|
||||
defaultValue
|
||||
options
|
||||
}
|
||||
}
|
||||
pageInfo {
|
||||
hasNextPage
|
||||
hasPreviousPage
|
||||
startCursor
|
||||
endCursor
|
||||
}
|
||||
totalCount
|
||||
}
|
||||
}
|
||||
}
|
||||
pageInfo {
|
||||
hasNextPage
|
||||
hasPreviousPage
|
||||
startCursor
|
||||
endCursor
|
||||
}
|
||||
totalCount
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export const variables = { objectFilter: undefined, fieldFilter: undefined };
|
||||
|
||||
export const responseData = {
|
||||
objects: { edges: [] },
|
||||
};
|
||||
@ -0,0 +1,54 @@
|
||||
import { gql } from '@apollo/client';
|
||||
|
||||
export const query = gql`
|
||||
mutation UpdateOneObjectMetadataItem(
|
||||
$idToUpdate: ID!
|
||||
$updatePayload: UpdateObjectInput!
|
||||
) {
|
||||
updateOneObject(input: { id: $idToUpdate, update: $updatePayload }) {
|
||||
id
|
||||
dataSourceId
|
||||
nameSingular
|
||||
namePlural
|
||||
labelSingular
|
||||
labelPlural
|
||||
description
|
||||
icon
|
||||
isCustom
|
||||
isActive
|
||||
createdAt
|
||||
updatedAt
|
||||
labelIdentifierFieldMetadataId
|
||||
imageIdentifierFieldMetadataId
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export const variables = {
|
||||
idToUpdate: 'idToUpdate',
|
||||
updatePayload: {
|
||||
description: 'newDescription',
|
||||
icon: undefined,
|
||||
labelPlural: 'labelPlural',
|
||||
labelSingular: 'labelSingular',
|
||||
namePlural: 'labelPlural',
|
||||
nameSingular: 'labelSingular',
|
||||
},
|
||||
};
|
||||
|
||||
export const responseData = {
|
||||
id: 'idToUpdate',
|
||||
dataSourceId: 'dataSourceId',
|
||||
nameSingular: 'nameSingular',
|
||||
namePlural: 'namePlural',
|
||||
labelSingular: 'labelSingular',
|
||||
labelPlural: 'labelPlural',
|
||||
description: 'newDescription',
|
||||
icon: '',
|
||||
isCustom: false,
|
||||
isActive: true,
|
||||
createdAt: '',
|
||||
updatedAt: '',
|
||||
labelIdentifierFieldMetadataId: '',
|
||||
imageIdentifierFieldMetadataId: '',
|
||||
};
|
||||
@ -0,0 +1,72 @@
|
||||
import { renderHook } from '@testing-library/react';
|
||||
|
||||
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
import { Nullable } from '~/types/Nullable';
|
||||
|
||||
describe('useColumnDefinitionsFromFieldMetadata', () => {
|
||||
it('should return empty definitions if no object is passed', () => {
|
||||
const { result } = renderHook(
|
||||
(objectMetadataItem?: Nullable<ObjectMetadataItem>) => {
|
||||
return useColumnDefinitionsFromFieldMetadata(objectMetadataItem);
|
||||
},
|
||||
);
|
||||
|
||||
expect(Array.isArray(result.current.columnDefinitions)).toBe(true);
|
||||
expect(Array.isArray(result.current.filterDefinitions)).toBe(true);
|
||||
expect(Array.isArray(result.current.sortDefinitions)).toBe(true);
|
||||
expect(result.current.columnDefinitions.length).toBe(0);
|
||||
expect(result.current.filterDefinitions.length).toBe(0);
|
||||
expect(result.current.sortDefinitions.length).toBe(0);
|
||||
});
|
||||
|
||||
it('should return empty definitions if object has no fields matching criteria', () => {
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
const { result } = renderHook(
|
||||
(objectMetadataItem?: Nullable<ObjectMetadataItem>) => {
|
||||
return useColumnDefinitionsFromFieldMetadata(objectMetadataItem);
|
||||
},
|
||||
{
|
||||
initialProps: mockObjectMetadataItems[0],
|
||||
},
|
||||
);
|
||||
|
||||
expect(result.current.columnDefinitions.length).toBe(0);
|
||||
expect(result.current.filterDefinitions.length).toBe(0);
|
||||
expect(result.current.sortDefinitions.length).toBe(0);
|
||||
});
|
||||
|
||||
it('should return expected definitions', () => {
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
const { result } = renderHook(
|
||||
(objectMetadataItem?: Nullable<ObjectMetadataItem>) => {
|
||||
return useColumnDefinitionsFromFieldMetadata(objectMetadataItem);
|
||||
},
|
||||
{
|
||||
initialProps: mockObjectMetadataItems[1],
|
||||
},
|
||||
);
|
||||
|
||||
const { columnDefinitions, filterDefinitions, sortDefinitions } =
|
||||
result.current;
|
||||
|
||||
expect(columnDefinitions.length).toBe(3);
|
||||
expect(filterDefinitions.length).toBe(3);
|
||||
expect(sortDefinitions.length).toBe(3);
|
||||
|
||||
expect(columnDefinitions[0].label).toBe('Expiration date');
|
||||
expect(columnDefinitions[1].label).toBe('Name');
|
||||
expect(columnDefinitions[2].label).toBe('Revocation date');
|
||||
|
||||
expect(filterDefinitions[0].label).toBe('Expiration date');
|
||||
expect(filterDefinitions[1].label).toBe('Name');
|
||||
expect(filterDefinitions[2].label).toBe('Revocation date');
|
||||
|
||||
expect(sortDefinitions[0].label).toBe('Expiration date');
|
||||
expect(sortDefinitions[1].label).toBe('Name');
|
||||
expect(sortDefinitions[2].label).toBe('Revocation date');
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,59 @@
|
||||
import { ReactNode } from 'react';
|
||||
import { MockedProvider } from '@apollo/client/testing';
|
||||
import { act, renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useCreateOneObjectRecordMetadataItem } from '@/object-metadata/hooks/useCreateOneObjectMetadataItem';
|
||||
|
||||
import { TestApolloMetadataClientProvider } from '../__mocks__/ApolloMetadataClientProvider';
|
||||
import {
|
||||
query,
|
||||
responseData,
|
||||
variables,
|
||||
} from '../__mocks__/useCreateOneObjectRecordMetadataItem';
|
||||
|
||||
const mocks = [
|
||||
{
|
||||
request: {
|
||||
query,
|
||||
variables,
|
||||
},
|
||||
result: jest.fn(() => ({
|
||||
data: {
|
||||
createOneObject: responseData,
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
|
||||
const Wrapper = ({ children }: { children: ReactNode }) => (
|
||||
<RecoilRoot>
|
||||
<MockedProvider mocks={mocks} addTypename={false}>
|
||||
<TestApolloMetadataClientProvider>
|
||||
{children}
|
||||
</TestApolloMetadataClientProvider>
|
||||
</MockedProvider>
|
||||
</RecoilRoot>
|
||||
);
|
||||
|
||||
describe('useCreateOneObjectRecordMetadataItem', () => {
|
||||
it('should work as expected', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useCreateOneObjectRecordMetadataItem(),
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
},
|
||||
);
|
||||
|
||||
await act(async () => {
|
||||
const res = await result.current.createOneObjectMetadataItem({
|
||||
labelPlural: 'View Filters',
|
||||
labelSingular: 'View Filter',
|
||||
nameSingular: 'viewFilter',
|
||||
namePlural: 'viewFilters',
|
||||
});
|
||||
|
||||
expect(res.data).toEqual({ createOneObject: responseData });
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,64 @@
|
||||
import { ReactNode } from 'react';
|
||||
import { MockedProvider } from '@apollo/client/testing';
|
||||
import { act, renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useCreateOneRelationMetadataItem } from '@/object-metadata/hooks/useCreateOneRelationMetadataItem';
|
||||
import { RelationMetadataType } from '~/generated/graphql';
|
||||
|
||||
import { TestApolloMetadataClientProvider } from '../__mocks__/ApolloMetadataClientProvider';
|
||||
import {
|
||||
query,
|
||||
responseData,
|
||||
variables,
|
||||
} from '../__mocks__/useCreateOneRelationMetadataItem';
|
||||
|
||||
const mocks = [
|
||||
{
|
||||
request: {
|
||||
query,
|
||||
variables,
|
||||
},
|
||||
result: jest.fn(() => ({
|
||||
data: {
|
||||
createOneRelation: responseData,
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
|
||||
const Wrapper = ({ children }: { children: ReactNode }) => (
|
||||
<RecoilRoot>
|
||||
<MockedProvider mocks={mocks} addTypename={false}>
|
||||
<TestApolloMetadataClientProvider>
|
||||
{children}
|
||||
</TestApolloMetadataClientProvider>
|
||||
</MockedProvider>
|
||||
</RecoilRoot>
|
||||
);
|
||||
|
||||
describe('useCreateOneRelationMetadataItem', () => {
|
||||
it('should work as expected', async () => {
|
||||
const { result } = renderHook(() => useCreateOneRelationMetadataItem(), {
|
||||
wrapper: Wrapper,
|
||||
});
|
||||
|
||||
await act(async () => {
|
||||
const res = await result.current.createOneRelationMetadataItem({
|
||||
relationType: RelationMetadataType.OneToOne,
|
||||
field: {
|
||||
label: 'label',
|
||||
},
|
||||
objectMetadataId: 'objectMetadataId',
|
||||
connect: {
|
||||
field: {
|
||||
label: 'Another label',
|
||||
},
|
||||
objectMetadataId: 'objectMetadataId1',
|
||||
},
|
||||
});
|
||||
|
||||
expect(res.data).toEqual({ createOneRelation: responseData });
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,52 @@
|
||||
import { ReactNode } from 'react';
|
||||
import { MockedProvider } from '@apollo/client/testing';
|
||||
import { act, renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useDeleteOneObjectMetadataItem } from '@/object-metadata/hooks/useDeleteOneObjectMetadataItem';
|
||||
|
||||
import { TestApolloMetadataClientProvider } from '../__mocks__/ApolloMetadataClientProvider';
|
||||
import {
|
||||
query,
|
||||
responseData,
|
||||
variables,
|
||||
} from '../__mocks__/useDeleteOneObjectMetadataItem';
|
||||
|
||||
const mocks = [
|
||||
{
|
||||
request: {
|
||||
query,
|
||||
variables,
|
||||
},
|
||||
result: jest.fn(() => ({
|
||||
data: {
|
||||
deleteOneObject: responseData,
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
|
||||
const Wrapper = ({ children }: { children: ReactNode }) => (
|
||||
<RecoilRoot>
|
||||
<MockedProvider mocks={mocks} addTypename={false}>
|
||||
<TestApolloMetadataClientProvider>
|
||||
{children}
|
||||
</TestApolloMetadataClientProvider>
|
||||
</MockedProvider>
|
||||
</RecoilRoot>
|
||||
);
|
||||
|
||||
describe('useDeleteOneObjectMetadataItem', () => {
|
||||
it('should work as expected', async () => {
|
||||
const { result } = renderHook(() => useDeleteOneObjectMetadataItem(), {
|
||||
wrapper: Wrapper,
|
||||
});
|
||||
|
||||
await act(async () => {
|
||||
const res =
|
||||
await result.current.deleteOneObjectMetadataItem('idToDelete');
|
||||
|
||||
expect(res.data).toEqual({ deleteOneObject: responseData });
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,172 @@
|
||||
import { ReactNode } from 'react';
|
||||
import { MockedProvider } from '@apollo/client/testing';
|
||||
import { act, renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useFieldMetadataItem } from '@/object-metadata/hooks/useFieldMetadataItem';
|
||||
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
|
||||
import { FieldMetadataType } from '~/generated/graphql';
|
||||
|
||||
import { TestApolloMetadataClientProvider } from '../__mocks__/ApolloMetadataClientProvider';
|
||||
import {
|
||||
objectMetadataId,
|
||||
queries,
|
||||
responseData,
|
||||
variables,
|
||||
} from '../__mocks__/useFieldMetadataItem';
|
||||
|
||||
const fieldMetadataItem: FieldMetadataItem = {
|
||||
id: '2c43466a-fe9e-4005-8d08-c5836067aa6c',
|
||||
createdAt: '',
|
||||
label: 'label',
|
||||
name: 'name',
|
||||
type: FieldMetadataType.Text,
|
||||
updatedAt: '',
|
||||
};
|
||||
|
||||
const mocks = [
|
||||
{
|
||||
request: {
|
||||
query: queries.eraseMetadataField,
|
||||
variables: variables.eraseMetadataField,
|
||||
},
|
||||
result: jest.fn(() => ({
|
||||
data: {
|
||||
deleteOneField: responseData.default,
|
||||
},
|
||||
})),
|
||||
},
|
||||
{
|
||||
request: {
|
||||
query: queries.activateMetadataField,
|
||||
variables: variables.activateMetadataField,
|
||||
},
|
||||
result: jest.fn(() => ({
|
||||
data: {
|
||||
updateOneField: responseData.default,
|
||||
},
|
||||
})),
|
||||
},
|
||||
{
|
||||
request: {
|
||||
query: queries.createMetadataField,
|
||||
variables: variables.createMetadataField,
|
||||
},
|
||||
result: jest.fn(() => ({
|
||||
data: {
|
||||
createOneField: responseData.createMetadataField,
|
||||
},
|
||||
})),
|
||||
},
|
||||
{
|
||||
request: {
|
||||
query: queries.activateMetadataField,
|
||||
variables: variables.disableMetadataField,
|
||||
},
|
||||
result: jest.fn(() => ({
|
||||
data: {
|
||||
updateOneField: responseData.default,
|
||||
},
|
||||
})),
|
||||
},
|
||||
{
|
||||
request: {
|
||||
query: queries.activateMetadataField,
|
||||
variables: variables.editMetadataField,
|
||||
},
|
||||
result: jest.fn(() => ({
|
||||
data: {
|
||||
updateOneField: responseData.default,
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
|
||||
const Wrapper = ({ children }: { children: ReactNode }) => (
|
||||
<RecoilRoot>
|
||||
<MockedProvider mocks={mocks} addTypename={false}>
|
||||
<TestApolloMetadataClientProvider>
|
||||
{children}
|
||||
</TestApolloMetadataClientProvider>
|
||||
</MockedProvider>
|
||||
</RecoilRoot>
|
||||
);
|
||||
|
||||
describe('useFieldMetadataItem', () => {
|
||||
it('should activateMetadataField', async () => {
|
||||
const { result } = renderHook(() => useFieldMetadataItem(), {
|
||||
wrapper: Wrapper,
|
||||
});
|
||||
|
||||
await act(async () => {
|
||||
const res = await result.current.activateMetadataField(fieldMetadataItem);
|
||||
|
||||
expect(res.data).toEqual({
|
||||
updateOneField: responseData.default,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should createMetadataField', async () => {
|
||||
const { result } = renderHook(() => useFieldMetadataItem(), {
|
||||
wrapper: Wrapper,
|
||||
});
|
||||
|
||||
await act(async () => {
|
||||
const res = await result.current.createMetadataField({
|
||||
label: 'fieldLabel',
|
||||
objectMetadataId,
|
||||
type: FieldMetadataType.Text,
|
||||
});
|
||||
|
||||
expect(res.data).toEqual({
|
||||
createOneField: responseData.createMetadataField,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should disableMetadataField', async () => {
|
||||
const { result } = renderHook(() => useFieldMetadataItem(), {
|
||||
wrapper: Wrapper,
|
||||
});
|
||||
|
||||
await act(async () => {
|
||||
const res = await result.current.disableMetadataField(fieldMetadataItem);
|
||||
|
||||
expect(res.data).toEqual({
|
||||
updateOneField: responseData.default,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should eraseMetadataField', async () => {
|
||||
const { result } = renderHook(() => useFieldMetadataItem(), {
|
||||
wrapper: Wrapper,
|
||||
});
|
||||
|
||||
await act(async () => {
|
||||
const res = await result.current.eraseMetadataField(fieldMetadataItem);
|
||||
|
||||
expect(res.data).toEqual({
|
||||
deleteOneField: responseData.default,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should editMetadataField', async () => {
|
||||
const { result } = renderHook(() => useFieldMetadataItem(), {
|
||||
wrapper: Wrapper,
|
||||
});
|
||||
|
||||
await act(async () => {
|
||||
const res = await result.current.editMetadataField({
|
||||
id: fieldMetadataItem.id,
|
||||
label: 'New label',
|
||||
});
|
||||
|
||||
expect(res.data).toEqual({
|
||||
updateOneField: responseData.default,
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,38 @@
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot, useSetRecoilState } from 'recoil';
|
||||
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
|
||||
import { useFilterOutUnexistingObjectMetadataItems } from '../useFilterOutUnexistingObjectMetadataItems';
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
describe('useFilterOutUnexistingObjectMetadataItems', () => {
|
||||
it('should work as expected', async () => {
|
||||
const { result } = renderHook(
|
||||
() => {
|
||||
const setMetadataItems = useSetRecoilState(objectMetadataItemsState);
|
||||
|
||||
setMetadataItems(mockObjectMetadataItems.slice(1));
|
||||
return useFilterOutUnexistingObjectMetadataItems();
|
||||
},
|
||||
{
|
||||
wrapper: RecoilRoot,
|
||||
},
|
||||
);
|
||||
|
||||
const objectExists = result.current.filterOutUnexistingObjectMetadataItems(
|
||||
mockObjectMetadataItems[0],
|
||||
);
|
||||
|
||||
expect(objectExists).toBe(false);
|
||||
|
||||
const secondObjectExists =
|
||||
result.current.filterOutUnexistingObjectMetadataItems(
|
||||
mockObjectMetadataItems[1],
|
||||
);
|
||||
|
||||
expect(secondObjectExists).toBe(true);
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,54 @@
|
||||
import { ReactNode } from 'react';
|
||||
import { MockedProvider } from '@apollo/client/testing';
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useFindManyObjectMetadataItems } from '@/object-metadata/hooks/useFindManyObjectMetadataItems';
|
||||
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
||||
|
||||
import { TestApolloMetadataClientProvider } from '../__mocks__/ApolloMetadataClientProvider';
|
||||
import {
|
||||
query,
|
||||
responseData,
|
||||
variables,
|
||||
} from '../__mocks__/useFindManyObjectMetadataItems';
|
||||
|
||||
const mocks = [
|
||||
{
|
||||
request: {
|
||||
query,
|
||||
variables,
|
||||
},
|
||||
result: jest.fn(() => ({
|
||||
data: {
|
||||
objects: responseData,
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
|
||||
const Wrapper = ({ children }: { children: ReactNode }) => (
|
||||
<RecoilRoot>
|
||||
<MockedProvider mocks={mocks} addTypename={false}>
|
||||
<TestApolloMetadataClientProvider>
|
||||
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
||||
{children}
|
||||
</SnackBarProviderScope>
|
||||
</TestApolloMetadataClientProvider>
|
||||
</MockedProvider>
|
||||
</RecoilRoot>
|
||||
);
|
||||
|
||||
describe('useFindManyObjectMetadataItems', () => {
|
||||
it('should activateMetadataField', async () => {
|
||||
const { result } = renderHook(() => useFindManyObjectMetadataItems(), {
|
||||
wrapper: Wrapper,
|
||||
});
|
||||
|
||||
const { loading, error, objectMetadataItems } = result.current;
|
||||
|
||||
expect(loading).toBe(true);
|
||||
expect(error).toBeUndefined();
|
||||
expect(objectMetadataItems).toEqual([]);
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,21 @@
|
||||
import { renderHook } from '@testing-library/react';
|
||||
|
||||
import { useGetObjectOrderByField } from '@/object-metadata/hooks/useGetObjectOrderByField';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
describe('useGetObjectOrderByField', () => {
|
||||
it('should work as expected', () => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'person',
|
||||
)!;
|
||||
|
||||
const { result } = renderHook(() =>
|
||||
useGetObjectOrderByField({ objectMetadataItem })('AscNullsLast'),
|
||||
);
|
||||
expect(result.current).toEqual({
|
||||
name: { firstName: 'AscNullsLast', lastName: 'AscNullsLast' },
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,73 @@
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot, useSetRecoilState } from 'recoil';
|
||||
|
||||
import { useGetObjectRecordIdentifierByNameSingular } from '@/object-metadata/hooks/useGetObjectRecordIdentifierByNameSingular';
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
describe('useGetObjectRecordIdentifierByNameSingular', () => {
|
||||
it('should work as expected', async () => {
|
||||
const { result, rerender } = renderHook(
|
||||
({
|
||||
record,
|
||||
objectNameSingular,
|
||||
}: {
|
||||
record: any;
|
||||
objectNameSingular: string;
|
||||
}) => {
|
||||
const setMetadataItems = useSetRecoilState(objectMetadataItemsState);
|
||||
|
||||
setMetadataItems(mockObjectMetadataItems);
|
||||
|
||||
return useGetObjectRecordIdentifierByNameSingular()(
|
||||
record,
|
||||
objectNameSingular,
|
||||
);
|
||||
},
|
||||
{
|
||||
wrapper: RecoilRoot,
|
||||
initialProps: {
|
||||
record: { id: 'recordId' } as any,
|
||||
objectNameSingular: 'viewSort',
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
expect(result.current.linkToShowPage).toBe('/object/viewSort/recordId');
|
||||
|
||||
rerender({
|
||||
record: { id: 'recordId', avatarUrl: 'https://fake-url.com' },
|
||||
objectNameSingular: 'opportunity',
|
||||
});
|
||||
|
||||
expect(result.current.linkToShowPage).toBe('/opportunities/recordId');
|
||||
|
||||
rerender({
|
||||
record: {
|
||||
id: 'recordId',
|
||||
name: { firstName: 'John', lastName: 'Connor' },
|
||||
},
|
||||
objectNameSingular: 'person',
|
||||
});
|
||||
|
||||
expect(result.current.linkToShowPage).toBe('/object/person/recordId');
|
||||
expect(result.current.name).toBe('John Connor');
|
||||
expect(result.current.avatarType).toBe('rounded');
|
||||
|
||||
rerender({
|
||||
record: {
|
||||
id: 'recordId',
|
||||
domainName: 'https://cool-company.com',
|
||||
},
|
||||
objectNameSingular: 'company',
|
||||
});
|
||||
|
||||
expect(result.current.linkToShowPage).toBe('/object/company/recordId');
|
||||
expect(result.current.avatarUrl).toBe(
|
||||
'https://favicon.twenty.com/cool-company.com',
|
||||
);
|
||||
expect(result.current.avatarType).toBe('squared');
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,177 @@
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot, useSetRecoilState } from 'recoil';
|
||||
|
||||
import { useMapFieldMetadataToGraphQLQuery } from '@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery';
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
import { RelationMetadataType } from '~/generated/graphql';
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
const formatGQLString = (inputString: string) =>
|
||||
inputString.replace(/^\s*[\r\n]/gm, '');
|
||||
|
||||
const getOneToManyRelation = () => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'opportunity',
|
||||
)!;
|
||||
|
||||
return {
|
||||
field: objectMetadataItem.fields.find((field) => field.name === 'company')!,
|
||||
res: `company
|
||||
{
|
||||
id
|
||||
xLink
|
||||
{
|
||||
label
|
||||
url
|
||||
}
|
||||
linkedinLink
|
||||
{
|
||||
label
|
||||
url
|
||||
}
|
||||
domainName
|
||||
annualRecurringRevenue
|
||||
{
|
||||
amountMicros
|
||||
currencyCode
|
||||
}
|
||||
createdAt
|
||||
address
|
||||
updatedAt
|
||||
name
|
||||
accountOwnerId
|
||||
employees
|
||||
id
|
||||
idealCustomerProfile
|
||||
}`,
|
||||
};
|
||||
};
|
||||
|
||||
const getOneToOneRelationField = () => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'opportunity',
|
||||
)!;
|
||||
|
||||
const oneToManyfield = objectMetadataItem.fields.find(
|
||||
(field) => field.name === 'company',
|
||||
)!;
|
||||
|
||||
const field: FieldMetadataItem = {
|
||||
...oneToManyfield,
|
||||
toRelationMetadata: {
|
||||
...oneToManyfield.toRelationMetadata!,
|
||||
relationType: RelationMetadataType.OneToOne,
|
||||
},
|
||||
};
|
||||
|
||||
return field;
|
||||
};
|
||||
|
||||
const getOneToManyFromRelationField = () => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'person',
|
||||
)!;
|
||||
|
||||
const field = objectMetadataItem.fields.find(
|
||||
(field) => field.name === 'opportunities',
|
||||
)!;
|
||||
|
||||
return {
|
||||
field,
|
||||
res: `opportunities
|
||||
{
|
||||
edges {
|
||||
node {
|
||||
id
|
||||
personId
|
||||
pointOfContactId
|
||||
updatedAt
|
||||
companyId
|
||||
pipelineStepId
|
||||
probability
|
||||
closeDate
|
||||
amount
|
||||
{
|
||||
amountMicros
|
||||
currencyCode
|
||||
}
|
||||
id
|
||||
createdAt
|
||||
}
|
||||
}
|
||||
}`,
|
||||
};
|
||||
};
|
||||
|
||||
const getFullNameRelation = () => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'person',
|
||||
)!;
|
||||
|
||||
const field = objectMetadataItem.fields.find(
|
||||
(field) => field.name === 'name',
|
||||
)!;
|
||||
|
||||
return {
|
||||
field,
|
||||
res: `\n name\n {\n firstName\n lastName\n }\n `,
|
||||
};
|
||||
};
|
||||
|
||||
describe('useMapFieldMetadataToGraphQLQuery', () => {
|
||||
it('should work as expected', async () => {
|
||||
const { result } = renderHook(
|
||||
() => {
|
||||
const setMetadataItems = useSetRecoilState(objectMetadataItemsState);
|
||||
setMetadataItems(mockObjectMetadataItems);
|
||||
|
||||
return {
|
||||
mapFieldMetadataToGraphQLQuery: useMapFieldMetadataToGraphQLQuery(),
|
||||
};
|
||||
},
|
||||
{
|
||||
wrapper: RecoilRoot,
|
||||
},
|
||||
);
|
||||
|
||||
const oneToManyRelation = getOneToManyRelation();
|
||||
|
||||
const { mapFieldMetadataToGraphQLQuery } = result.current;
|
||||
|
||||
const oneToManyRelationFieldRes = mapFieldMetadataToGraphQLQuery(
|
||||
oneToManyRelation.field,
|
||||
);
|
||||
|
||||
expect(formatGQLString(oneToManyRelationFieldRes)).toEqual(
|
||||
oneToManyRelation.res,
|
||||
);
|
||||
|
||||
const oneToOneRelation = getOneToOneRelationField();
|
||||
|
||||
const oneToOneRelationFieldRes =
|
||||
mapFieldMetadataToGraphQLQuery(oneToOneRelation);
|
||||
|
||||
expect(formatGQLString(oneToOneRelationFieldRes)).toEqual(
|
||||
oneToManyRelation.res,
|
||||
);
|
||||
|
||||
const oneToManyFromRelation = getOneToManyFromRelationField();
|
||||
const oneToManyFromRelationFieldRes = mapFieldMetadataToGraphQLQuery(
|
||||
oneToManyFromRelation.field,
|
||||
);
|
||||
|
||||
expect(formatGQLString(oneToManyFromRelationFieldRes)).toEqual(
|
||||
oneToManyFromRelation.res,
|
||||
);
|
||||
|
||||
const fullNameRelation = getFullNameRelation();
|
||||
const fullNameFieldRes = mapFieldMetadataToGraphQLQuery(
|
||||
fullNameRelation.field,
|
||||
);
|
||||
|
||||
expect(fullNameFieldRes).toEqual(fullNameRelation.res);
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,34 @@
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
describe('useMapToObjectRecordIdentifier', () => {
|
||||
it('should work as expected', async () => {
|
||||
const { result } = renderHook(
|
||||
() => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'person',
|
||||
)!;
|
||||
|
||||
return useMapToObjectRecordIdentifier({
|
||||
objectMetadataItem,
|
||||
})({ id: 'id', name: { firstName: 'Sheldon', lastName: 'Cooper' } });
|
||||
},
|
||||
{
|
||||
wrapper: RecoilRoot,
|
||||
},
|
||||
);
|
||||
|
||||
expect(result.current).toEqual({
|
||||
id: 'id',
|
||||
name: 'Sheldon Cooper',
|
||||
avatarUrl: null,
|
||||
avatarType: 'rounded',
|
||||
linkToShowPage: '/object/person/id',
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,66 @@
|
||||
import { ReactNode } from 'react';
|
||||
import { MockedProvider } from '@apollo/client/testing';
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||
|
||||
import { TestApolloMetadataClientProvider } from '../__mocks__/ApolloMetadataClientProvider';
|
||||
|
||||
const Wrapper = ({ children }: { children: ReactNode }) => (
|
||||
<RecoilRoot>
|
||||
<MockedProvider addTypename={false}>
|
||||
<TestApolloMetadataClientProvider>
|
||||
{children}
|
||||
</TestApolloMetadataClientProvider>
|
||||
</MockedProvider>
|
||||
</RecoilRoot>
|
||||
);
|
||||
|
||||
describe('useObjectMetadataItem', () => {
|
||||
it('should return correct properties', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useObjectMetadataItem({ objectNameSingular: 'opportunity' }),
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
},
|
||||
);
|
||||
|
||||
const {
|
||||
basePathToShowPage,
|
||||
objectMetadataItem,
|
||||
labelIdentifierFieldMetadata,
|
||||
getRecordFromCache,
|
||||
findManyRecordsQuery,
|
||||
modifyRecordFromCache,
|
||||
findOneRecordQuery,
|
||||
createOneRecordMutation,
|
||||
updateOneRecordMutation,
|
||||
deleteOneRecordMutation,
|
||||
executeQuickActionOnOneRecordMutation,
|
||||
createManyRecordsMutation,
|
||||
deleteManyRecordsMutation,
|
||||
mapToObjectRecordIdentifier,
|
||||
getObjectOrderByField,
|
||||
} = result.current;
|
||||
|
||||
expect(labelIdentifierFieldMetadata).toBeUndefined();
|
||||
expect(basePathToShowPage).toBe('/object/opportunity/');
|
||||
expect(objectMetadataItem.id).toBe('20202020-cae9-4ff4-9579-f7d9fe44c937');
|
||||
expect(typeof getRecordFromCache).toBe('function');
|
||||
expect(typeof modifyRecordFromCache).toBe('function');
|
||||
expect(typeof mapToObjectRecordIdentifier).toBe('function');
|
||||
expect(typeof getObjectOrderByField).toBe('function');
|
||||
expect(findManyRecordsQuery).toHaveProperty('kind', 'Document');
|
||||
expect(findOneRecordQuery).toHaveProperty('kind', 'Document');
|
||||
expect(createOneRecordMutation).toHaveProperty('kind', 'Document');
|
||||
expect(updateOneRecordMutation).toHaveProperty('kind', 'Document');
|
||||
expect(deleteOneRecordMutation).toHaveProperty('kind', 'Document');
|
||||
expect(executeQuickActionOnOneRecordMutation).toHaveProperty(
|
||||
'kind',
|
||||
'Document',
|
||||
);
|
||||
expect(createManyRecordsMutation).toHaveProperty('kind', 'Document');
|
||||
expect(deleteManyRecordsMutation).toHaveProperty('kind', 'Document');
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,130 @@
|
||||
import { ReactNode } from 'react';
|
||||
import { MockedProvider } from '@apollo/client/testing';
|
||||
import { act, renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot, useSetRecoilState } from 'recoil';
|
||||
|
||||
import {
|
||||
query,
|
||||
responseData,
|
||||
variables,
|
||||
} from '@/object-metadata/hooks/__mocks__/useObjectMetadataItemForSettings';
|
||||
import { useObjectMetadataItemForSettings } from '@/object-metadata/hooks/useObjectMetadataItemForSettings';
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
|
||||
import { TestApolloMetadataClientProvider } from '../__mocks__/ApolloMetadataClientProvider';
|
||||
|
||||
const mocks = [
|
||||
{
|
||||
request: {
|
||||
query,
|
||||
variables,
|
||||
},
|
||||
result: jest.fn(() => ({
|
||||
data: {
|
||||
updateOneObject: responseData,
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
|
||||
const Wrapper = ({ children }: { children: ReactNode }) => (
|
||||
<RecoilRoot>
|
||||
<MockedProvider mocks={mocks} addTypename={false}>
|
||||
<TestApolloMetadataClientProvider>
|
||||
{children}
|
||||
</TestApolloMetadataClientProvider>
|
||||
</MockedProvider>
|
||||
</RecoilRoot>
|
||||
);
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
describe('useObjectMetadataItemForSettings', () => {
|
||||
it('should findActiveObjectMetadataItemBySlug', async () => {
|
||||
const { result } = renderHook(
|
||||
() => {
|
||||
const setMetadataItems = useSetRecoilState(objectMetadataItemsState);
|
||||
setMetadataItems(mockObjectMetadataItems);
|
||||
|
||||
return useObjectMetadataItemForSettings();
|
||||
},
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
},
|
||||
);
|
||||
|
||||
act(() => {
|
||||
const res = result.current.findActiveObjectMetadataItemBySlug('people');
|
||||
expect(res).toBeDefined();
|
||||
expect(res?.namePlural).toBe('people');
|
||||
});
|
||||
});
|
||||
|
||||
it('should findObjectMetadataItemById', async () => {
|
||||
const { result } = renderHook(
|
||||
() => {
|
||||
const setMetadataItems = useSetRecoilState(objectMetadataItemsState);
|
||||
setMetadataItems(mockObjectMetadataItems);
|
||||
|
||||
return useObjectMetadataItemForSettings();
|
||||
},
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
},
|
||||
);
|
||||
|
||||
act(() => {
|
||||
const res = result.current.findObjectMetadataItemById(
|
||||
'20202020-480c-434e-b4c7-e22408b97047',
|
||||
);
|
||||
expect(res).toBeDefined();
|
||||
expect(res?.namePlural).toBe('companies');
|
||||
});
|
||||
});
|
||||
|
||||
it('should findObjectMetadataItemByNamePlural', async () => {
|
||||
const { result } = renderHook(
|
||||
() => {
|
||||
const setMetadataItems = useSetRecoilState(objectMetadataItemsState);
|
||||
setMetadataItems(mockObjectMetadataItems);
|
||||
|
||||
return useObjectMetadataItemForSettings();
|
||||
},
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
},
|
||||
);
|
||||
|
||||
act(() => {
|
||||
const res =
|
||||
result.current.findObjectMetadataItemByNamePlural('opportunities');
|
||||
expect(res).toBeDefined();
|
||||
expect(res?.namePlural).toBe('opportunities');
|
||||
});
|
||||
});
|
||||
|
||||
it('should editObjectMetadataItem', async () => {
|
||||
const { result } = renderHook(
|
||||
() => {
|
||||
const setMetadataItems = useSetRecoilState(objectMetadataItemsState);
|
||||
setMetadataItems(mockObjectMetadataItems);
|
||||
|
||||
return useObjectMetadataItemForSettings();
|
||||
},
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
},
|
||||
);
|
||||
|
||||
await act(async () => {
|
||||
const res = await result.current.editObjectMetadataItem({
|
||||
id: 'idToUpdate',
|
||||
description: 'newDescription',
|
||||
labelPlural: 'labelPlural',
|
||||
labelSingular: 'labelSingular',
|
||||
});
|
||||
expect(res.data).toEqual({ updateOneObject: responseData });
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,17 @@
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useObjectNamePluralFromSingular } from '../useObjectNamePluralFromSingular';
|
||||
|
||||
describe('useObjectNamePluralFromSingular', () => {
|
||||
it('should work as expected', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useObjectNamePluralFromSingular({ objectNameSingular: 'person' }),
|
||||
{
|
||||
wrapper: RecoilRoot,
|
||||
},
|
||||
);
|
||||
|
||||
expect(result.current.objectNamePlural).toBe('people');
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,17 @@
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useObjectNameSingularFromPlural } from '../useObjectNameSingularFromPlural';
|
||||
|
||||
describe('useObjectNameSingularFromPlural', () => {
|
||||
it('should work as expected', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useObjectNameSingularFromPlural({ objectNamePlural: 'people' }),
|
||||
{
|
||||
wrapper: RecoilRoot,
|
||||
},
|
||||
);
|
||||
|
||||
expect(result.current.objectNameSingular).toBe('person');
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,38 @@
|
||||
import { ReactNode } from 'react';
|
||||
import { MockedProvider } from '@apollo/client/testing';
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useRecordOptimisticEffect } from '@/object-metadata/hooks/useRecordOptimisticEffect';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
|
||||
const mockRegisterOptimisticEffect = jest.fn();
|
||||
|
||||
jest.mock('@/apollo/optimistic-effect/hooks/useOptimisticEffect', () => ({
|
||||
useOptimisticEffect: jest.fn(() => ({
|
||||
registerOptimisticEffect: mockRegisterOptimisticEffect,
|
||||
unregisterOptimisticEffect: jest.fn(),
|
||||
})),
|
||||
}));
|
||||
|
||||
const Wrapper = ({ children }: { children: ReactNode }) => (
|
||||
<RecoilRoot>
|
||||
<MockedProvider addTypename={false}>{children}</MockedProvider>
|
||||
</RecoilRoot>
|
||||
);
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
describe('useRecordOptimisticEffect', () => {
|
||||
it('should work as expected', async () => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.namePlural === 'people',
|
||||
)!;
|
||||
|
||||
renderHook(() => useRecordOptimisticEffect({ objectMetadataItem }), {
|
||||
wrapper: Wrapper,
|
||||
});
|
||||
|
||||
expect(mockRegisterOptimisticEffect).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,55 @@
|
||||
import { ReactNode } from 'react';
|
||||
import { MockedProvider } from '@apollo/client/testing';
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useRelationMetadata } from '@/object-metadata/hooks/useRelationMetadata';
|
||||
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
|
||||
import { TestApolloMetadataClientProvider } from '../__mocks__/ApolloMetadataClientProvider';
|
||||
|
||||
const Wrapper = ({ children }: { children: ReactNode }) => (
|
||||
<RecoilRoot>
|
||||
<MockedProvider addTypename={false}>
|
||||
<TestApolloMetadataClientProvider>
|
||||
{children}
|
||||
</TestApolloMetadataClientProvider>
|
||||
</MockedProvider>
|
||||
</RecoilRoot>
|
||||
);
|
||||
|
||||
describe('useRelationMetadata', () => {
|
||||
it('should return correct properties', async () => {
|
||||
const { result, rerender } = renderHook(
|
||||
({ fieldMetadataItem }: { fieldMetadataItem?: FieldMetadataItem }) =>
|
||||
useRelationMetadata({ fieldMetadataItem }),
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
initialProps: {},
|
||||
},
|
||||
);
|
||||
|
||||
const {
|
||||
relationFieldMetadataItem,
|
||||
relationObjectMetadataItem,
|
||||
relationType,
|
||||
} = result.current;
|
||||
|
||||
expect(relationFieldMetadataItem).toBeUndefined();
|
||||
expect(relationObjectMetadataItem).toBeUndefined();
|
||||
expect(relationType).toBeUndefined();
|
||||
|
||||
const objectMetadataItems = getObjectMetadataItemsMock();
|
||||
const objectMetadata = objectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'person',
|
||||
)!;
|
||||
const fieldMetadataItem = objectMetadata.fields.find(
|
||||
(field) => field.name === 'opportunities',
|
||||
)!;
|
||||
|
||||
rerender({ fieldMetadataItem });
|
||||
|
||||
expect(result.current.relationType).toBe('ONE_TO_MANY');
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,8 @@
|
||||
import { getFieldSlug } from '@/object-metadata/utils/getFieldSlug';
|
||||
|
||||
describe('getFieldSlug', () => {
|
||||
it('should work as expected', () => {
|
||||
const res = getFieldSlug({ label: 'Pipeline Step' });
|
||||
expect(res).toBe('pipeline-step');
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,16 @@
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
import { getObjectOrderByField } from '@/object-metadata/utils/getObjectOrderByField';
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
describe('getObjectOrderByField', () => {
|
||||
it('should work as expected', () => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'person',
|
||||
)!;
|
||||
const res = getObjectOrderByField(objectMetadataItem);
|
||||
expect(res).toEqual({
|
||||
name: { firstName: 'AscNullsLast', lastName: 'AscNullsLast' },
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,15 @@
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
import { getObjectSlug } from '@/object-metadata/utils/getObjectSlug';
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
describe('getObjectSlug', () => {
|
||||
it('should work as expected', () => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'person',
|
||||
)!;
|
||||
|
||||
const res = getObjectSlug(objectMetadataItem);
|
||||
expect(res).toBe('people');
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,11 @@
|
||||
import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifierField';
|
||||
|
||||
describe('isLabelIdentifierField', () => {
|
||||
it('should work as expected', () => {
|
||||
const res = isLabelIdentifierField({
|
||||
fieldMetadataItem: { id: 'fieldId', name: 'fieldName' },
|
||||
objectMetadataItem: {},
|
||||
});
|
||||
expect(res).toBe(false);
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,15 @@
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
import { isObjectMetadataAvailableForRelation } from '@/object-metadata/utils/isObjectMetadataAvailableForRelation';
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
describe('isObjectMetadataAvailableForRelation', () => {
|
||||
it('should work as expected', () => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'person',
|
||||
)!;
|
||||
|
||||
const res = isObjectMetadataAvailableForRelation(objectMetadataItem);
|
||||
expect(res).toBe(true);
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,8 @@
|
||||
import { validateMetadataLabel } from '@/object-metadata/utils/validateMetadataLabel';
|
||||
|
||||
describe('validateMetadataLabel', () => {
|
||||
it('should work as expected', () => {
|
||||
const res = validateMetadataLabel('Pipeline Step');
|
||||
expect(res).toBe(true);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user