Add tests for modules/object-record/object-sort-dropdown (#3366)
Co-authored-by: gitstart-twenty <gitstart-twenty@users.noreply.github.com> Co-authored-by: RubensRafael <rubensrafael2@live.com>
This commit is contained in:
@ -0,0 +1,94 @@
|
|||||||
|
import { act, renderHook, waitFor } from '@testing-library/react';
|
||||||
|
import { RecoilRoot } from 'recoil';
|
||||||
|
|
||||||
|
import { useSortDropdown } from '@/object-record/object-sort-dropdown/hooks/useSortDropdown';
|
||||||
|
import { Sort } from '@/object-record/object-sort-dropdown/types/Sort';
|
||||||
|
import { SortDefinition } from '@/object-record/object-sort-dropdown/types/SortDefinition';
|
||||||
|
|
||||||
|
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
||||||
|
<RecoilRoot>{children}</RecoilRoot>
|
||||||
|
);
|
||||||
|
|
||||||
|
const sortDropdownId = 'sortDropdownId';
|
||||||
|
const renderHookConfig = {
|
||||||
|
wrapper: Wrapper,
|
||||||
|
};
|
||||||
|
|
||||||
|
const sortDefinitions: SortDefinition[] = [
|
||||||
|
{ fieldMetadataId: 'id', label: 'definition label', iconName: 'icon' },
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('useSortDropdown', () => {
|
||||||
|
it('should set availableSortDefinitions', () => {
|
||||||
|
const { result } = renderHook(
|
||||||
|
() => useSortDropdown({ sortDropdownId }),
|
||||||
|
renderHookConfig,
|
||||||
|
);
|
||||||
|
expect(result.current.availableSortDefinitions).toEqual([]);
|
||||||
|
act(() => {
|
||||||
|
result.current.setAvailableSortDefinitions(sortDefinitions);
|
||||||
|
});
|
||||||
|
|
||||||
|
waitFor(() => {
|
||||||
|
expect(result.current.availableSortDefinitions).toEqual(sortDefinitions);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set isSortSelected', () => {
|
||||||
|
const { result } = renderHook(
|
||||||
|
() => useSortDropdown({ sortDropdownId }),
|
||||||
|
renderHookConfig,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(result.current.isSortSelected).toBe(false);
|
||||||
|
|
||||||
|
act(() => {
|
||||||
|
result.current.setIsSortSelected(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
waitFor(() => {
|
||||||
|
expect(result.current.isSortSelected).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set onSortSelect', () => {
|
||||||
|
const mockOnSortSelect = jest.fn();
|
||||||
|
const { result } = renderHook(
|
||||||
|
() => useSortDropdown({ sortDropdownId }),
|
||||||
|
renderHookConfig,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(result.current.onSortSelect).toBeUndefined();
|
||||||
|
|
||||||
|
act(() => {
|
||||||
|
result.current.setOnSortSelect(mockOnSortSelect);
|
||||||
|
});
|
||||||
|
|
||||||
|
waitFor(() => {
|
||||||
|
expect(result.current.onSortSelect).toBe(mockOnSortSelect);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call onSortSelect when a sort option is selected', () => {
|
||||||
|
const mockOnSortSelect = jest.fn();
|
||||||
|
const sort: Sort = {
|
||||||
|
fieldMetadataId: 'id',
|
||||||
|
direction: 'asc',
|
||||||
|
definition: sortDefinitions[0],
|
||||||
|
};
|
||||||
|
|
||||||
|
const { result } = renderHook(
|
||||||
|
() => useSortDropdown({ sortDropdownId }),
|
||||||
|
renderHookConfig,
|
||||||
|
);
|
||||||
|
|
||||||
|
act(() => {
|
||||||
|
result.current.setOnSortSelect(mockOnSortSelect);
|
||||||
|
result.current.onSortSelect?.(sort);
|
||||||
|
});
|
||||||
|
|
||||||
|
waitFor(() => {
|
||||||
|
expect(mockOnSortSelect).toHaveBeenCalledWith(sort);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,79 @@
|
|||||||
|
import { Sort } from '@/object-record/object-sort-dropdown/types/Sort';
|
||||||
|
import { SortDefinition } from '@/object-record/object-sort-dropdown/types/SortDefinition';
|
||||||
|
import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy';
|
||||||
|
|
||||||
|
const sortDefinition: SortDefinition = {
|
||||||
|
fieldMetadataId: 'id',
|
||||||
|
label: 'definition label',
|
||||||
|
iconName: 'icon',
|
||||||
|
};
|
||||||
|
|
||||||
|
describe('turnSortsIntoOrderBy', () => {
|
||||||
|
it('should sort by createdAt if no sorts and createdAt field exists', () => {
|
||||||
|
const fields = [{ id: 'field1', name: 'createdAt' }];
|
||||||
|
expect(turnSortsIntoOrderBy([], fields)).toEqual({
|
||||||
|
createdAt: 'DescNullsFirst',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return empty OrderByField if no sorts and no createdAt field', () => {
|
||||||
|
expect(turnSortsIntoOrderBy([], [])).toEqual({});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should sort by first field if no sorts and createdAt field do not exists', () => {
|
||||||
|
const fields = [{ id: 'field1', name: 'field1' }];
|
||||||
|
expect(turnSortsIntoOrderBy([], fields)).toEqual({
|
||||||
|
field1: 'DescNullsFirst',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create OrderByField with single sort', () => {
|
||||||
|
const sorts: Sort[] = [
|
||||||
|
{
|
||||||
|
fieldMetadataId: 'field1',
|
||||||
|
direction: 'asc',
|
||||||
|
definition: sortDefinition,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const fields = [{ id: 'field1', name: 'field1' }];
|
||||||
|
expect(turnSortsIntoOrderBy(sorts, fields)).toEqual({
|
||||||
|
field1: 'AscNullsFirst',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create OrderByField with multiple sorts', () => {
|
||||||
|
const sorts: Sort[] = [
|
||||||
|
{
|
||||||
|
fieldMetadataId: 'field1',
|
||||||
|
direction: 'asc',
|
||||||
|
definition: sortDefinition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fieldMetadataId: 'field2',
|
||||||
|
direction: 'desc',
|
||||||
|
definition: sortDefinition,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const fields = [
|
||||||
|
{ id: 'field1', name: 'field1' },
|
||||||
|
{ id: 'field2', name: 'field2' },
|
||||||
|
];
|
||||||
|
expect(turnSortsIntoOrderBy(sorts, fields)).toEqual({
|
||||||
|
field1: 'AscNullsFirst',
|
||||||
|
field2: 'DescNullsLast',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should throw error if field not found', () => {
|
||||||
|
const sorts: Sort[] = [
|
||||||
|
{
|
||||||
|
fieldMetadataId: 'invalidField',
|
||||||
|
direction: 'asc',
|
||||||
|
definition: sortDefinition,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
expect(() => turnSortsIntoOrderBy(sorts, [])).toThrow(
|
||||||
|
'Could not find field invalidField in metadata object',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user