mirror of
https://github.com/twentyhq/twenty.git
synced 2024-12-24 04:23:57 +03:00
Add tests for modules/object-record/object-filter-dropdown
(#3399)
* Add tests for `modules/object-record/object-filter-dropdown` Co-authored-by: KlingerMatheus <klinger.matheus@gitstart.dev> * Fix linter Co-authored-by: v1b3m <vibenjamin6@gmail.com> Co-authored-by: KlingerMatheus <klinger.matheus@gitstart.dev> * Revert unwanted changes Co-authored-by: v1b3m <vibenjamin6@gmail.com> Co-authored-by: KlingerMatheus <klinger.matheus@gitstart.dev> --------- Co-authored-by: gitstart-twenty <gitstart-twenty@users.noreply.github.com> Co-authored-by: KlingerMatheus <klinger.matheus@gitstart.dev> Co-authored-by: v1b3m <vibenjamin6@gmail.com>
This commit is contained in:
parent
83c9fedcdf
commit
03b5c40e8a
@ -0,0 +1,285 @@
|
||||
import { expect } from '@storybook/test';
|
||||
import { act, renderHook, waitFor } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
||||
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
|
||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||
|
||||
const filterDropdownId = 'filterDropdownId';
|
||||
const renderHookConfig = {
|
||||
wrapper: RecoilRoot,
|
||||
};
|
||||
|
||||
const filterDefinitions: FilterDefinition[] = [
|
||||
{
|
||||
fieldMetadataId: 'id',
|
||||
label: 'definition label',
|
||||
iconName: 'icon',
|
||||
type: 'TEXT',
|
||||
},
|
||||
];
|
||||
|
||||
const mockFilter: Filter = {
|
||||
definition: filterDefinitions[0],
|
||||
displayValue: '',
|
||||
fieldMetadataId: '',
|
||||
operand: ViewFilterOperand.Is,
|
||||
value: '',
|
||||
};
|
||||
|
||||
describe('useFilterDropdown', () => {
|
||||
it('should set availableFilterDefinitions', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
|
||||
expect(result.current.availableFilterDefinitions).toEqual([]);
|
||||
|
||||
act(() => {
|
||||
result.current.setAvailableFilterDefinitions(filterDefinitions);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(result.current.availableFilterDefinitions).toEqual(
|
||||
filterDefinitions,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('should set onFilterSelect', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
|
||||
expect(result.current.onFilterSelect).toBeUndefined();
|
||||
|
||||
act(() => {
|
||||
result.current.setOnFilterSelect(
|
||||
(_currVal?: Filter) => (_filter: Filter) => {},
|
||||
);
|
||||
});
|
||||
await waitFor(() => {
|
||||
expect(typeof result.current.onFilterSelect).toBe('function');
|
||||
});
|
||||
});
|
||||
|
||||
it('should set selectedOperandInDropdown', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
const mockOperand = ViewFilterOperand.Contains;
|
||||
|
||||
expect(result.current.selectedOperandInDropdown).toBeNull();
|
||||
|
||||
act(() => {
|
||||
result.current.setSelectedOperandInDropdown(mockOperand);
|
||||
});
|
||||
|
||||
expect(result.current.selectedOperandInDropdown).toBe(mockOperand);
|
||||
});
|
||||
|
||||
it('should set selectedFilter', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
|
||||
expect(result.current.selectedFilter).toBeUndefined();
|
||||
|
||||
act(() => {
|
||||
result.current.setSelectedFilter(mockFilter);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(result.current.selectedFilter).toBe(mockFilter);
|
||||
});
|
||||
});
|
||||
|
||||
it('should set filterDefinitionUsedInDropdown', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
|
||||
expect(result.current.filterDefinitionUsedInDropdown).toBeNull();
|
||||
|
||||
act(() => {
|
||||
result.current.setFilterDefinitionUsedInDropdown(filterDefinitions[0]);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(result.current.filterDefinitionUsedInDropdown).toBe(
|
||||
filterDefinitions[0],
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('should set objectFilterDropdownSearchInput', async () => {
|
||||
const mockResult = 'value';
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
|
||||
expect(result.current.objectFilterDropdownSearchInput).toBe('');
|
||||
|
||||
act(() => {
|
||||
result.current.setObjectFilterDropdownSearchInput(mockResult);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(result.current.objectFilterDropdownSearchInput).toBe(mockResult);
|
||||
});
|
||||
});
|
||||
|
||||
it('should set objectFilterDropdownSelectedEntityId', async () => {
|
||||
const mockResult = 'value';
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
|
||||
expect(result.current.objectFilterDropdownSelectedEntityId).toBeNull();
|
||||
|
||||
act(() => {
|
||||
result.current.setObjectFilterDropdownSelectedEntityId(mockResult);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(result.current.objectFilterDropdownSelectedEntityId).toBe(
|
||||
mockResult,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('should set objectFilterDropdownSelectedRecordIds', async () => {
|
||||
const mockResult = ['id-0', 'id-1', 'id-2'];
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
|
||||
expect(result.current.objectFilterDropdownSelectedRecordIds).toHaveLength(
|
||||
0,
|
||||
);
|
||||
|
||||
act(() => {
|
||||
result.current.setObjectFilterDropdownSelectedRecordIds(mockResult);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(
|
||||
result.current.objectFilterDropdownSelectedRecordIds,
|
||||
).toStrictEqual(mockResult);
|
||||
});
|
||||
});
|
||||
|
||||
it('should set isObjectFilterDropdownOperandSelectUnfolded', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
|
||||
expect(result.current.isObjectFilterDropdownOperandSelectUnfolded).toBe(
|
||||
false,
|
||||
);
|
||||
|
||||
act(() => {
|
||||
result.current.setIsObjectFilterDropdownOperandSelectUnfolded(true);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(result.current.isObjectFilterDropdownOperandSelectUnfolded).toBe(
|
||||
true,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('should set isObjectFilterDropdownUnfolded', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
|
||||
expect(result.current.isObjectFilterDropdownUnfolded).toBe(false);
|
||||
|
||||
act(() => {
|
||||
result.current.setIsObjectFilterDropdownUnfolded(true);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(result.current.isObjectFilterDropdownUnfolded).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
it('should reset filter', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
|
||||
act(() => {
|
||||
result.current.selectFilter(mockFilter);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(result.current.selectedFilter).toStrictEqual(mockFilter);
|
||||
});
|
||||
|
||||
act(() => {
|
||||
result.current.resetFilter();
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(result.current.selectedFilter).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
it('should call onFilterSelect when a filter option is set', async () => {
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
const onFilterSelectMock = jest.fn();
|
||||
|
||||
expect(result.current.onFilterSelect).toBeUndefined();
|
||||
|
||||
act(() => {
|
||||
result.current.setOnFilterSelect(onFilterSelectMock);
|
||||
result.current.selectFilter(mockFilter);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(onFilterSelectMock).toBeDefined();
|
||||
expect(onFilterSelectMock).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle scopeId undefined on initial values', () => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error = jest.fn();
|
||||
|
||||
const renderFunction = () => {
|
||||
renderHook(() => useFilterDropdown(), renderHookConfig);
|
||||
};
|
||||
|
||||
expect(renderFunction).toThrow(Error);
|
||||
expect(renderFunction).toThrow(
|
||||
'Scope id is not provided and cannot be found in context.',
|
||||
);
|
||||
});
|
||||
|
||||
it('should scopeId have been defined on initial values', () => {
|
||||
const { result } = renderHook(
|
||||
() => useFilterDropdown({ filterDropdownId }),
|
||||
renderHookConfig,
|
||||
);
|
||||
|
||||
expect(result.current.scopeId).toBeDefined();
|
||||
});
|
||||
});
|
@ -0,0 +1,48 @@
|
||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||
import { capitalize } from '~/utils/string/capitalize';
|
||||
|
||||
import { getOperandLabel, getOperandLabelShort } from '../getOperandLabel';
|
||||
|
||||
describe('getOperandLabel', () => {
|
||||
const testCases = [
|
||||
[ViewFilterOperand.Contains, 'Contains'],
|
||||
[ViewFilterOperand.DoesNotContain, "Doesn't contain"],
|
||||
[ViewFilterOperand.GreaterThan, 'Greater than'],
|
||||
[ViewFilterOperand.LessThan, 'Less than'],
|
||||
[ViewFilterOperand.Is, 'Is'],
|
||||
[ViewFilterOperand.IsNot, 'Is not'],
|
||||
[ViewFilterOperand.IsNotNull, 'Is not null'],
|
||||
[undefined, ''], // undefined operand
|
||||
];
|
||||
|
||||
testCases.forEach(([operand, expectedLabel]) => {
|
||||
const formattedOperand = capitalize(operand || 'undefined');
|
||||
|
||||
it(`should return correct label for ViewFilterOperand.${formattedOperand}`, () => {
|
||||
const result = getOperandLabel(operand as ViewFilterOperand);
|
||||
expect(result).toBe(expectedLabel);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('getOperandLabelShort', () => {
|
||||
const testCases = [
|
||||
[ViewFilterOperand.Is, ': '],
|
||||
[ViewFilterOperand.Contains, ': '],
|
||||
[ViewFilterOperand.IsNot, ': Not'],
|
||||
[ViewFilterOperand.DoesNotContain, ': Not'],
|
||||
[ViewFilterOperand.IsNotNull, ': NotNull'],
|
||||
[ViewFilterOperand.GreaterThan, '\u00A0> '],
|
||||
[ViewFilterOperand.LessThan, '\u00A0< '],
|
||||
[undefined, ': '], // undefined operand
|
||||
];
|
||||
|
||||
testCases.forEach(([operand, expectedLabel]) => {
|
||||
const formattedOperand = capitalize(operand || 'undefined');
|
||||
|
||||
it(`should return correct short label for ViewFilterOperand.${formattedOperand}`, () => {
|
||||
const result = getOperandLabelShort(operand as ViewFilterOperand);
|
||||
expect(result).toBe(expectedLabel);
|
||||
});
|
||||
});
|
||||
});
|
@ -0,0 +1,30 @@
|
||||
import { FilterType } from '@/object-record/object-filter-dropdown/types/FilterType';
|
||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||
|
||||
import { getOperandsForFilterType } from '../getOperandsForFilterType';
|
||||
|
||||
describe('getOperandsForFilterType', () => {
|
||||
const testCases = [
|
||||
['TEXT', [ViewFilterOperand.Contains, ViewFilterOperand.DoesNotContain]],
|
||||
['EMAIL', [ViewFilterOperand.Contains, ViewFilterOperand.DoesNotContain]],
|
||||
[
|
||||
'FULL_NAME',
|
||||
[ViewFilterOperand.Contains, ViewFilterOperand.DoesNotContain],
|
||||
],
|
||||
['LINK', [ViewFilterOperand.Contains, ViewFilterOperand.DoesNotContain]],
|
||||
['CURRENCY', [ViewFilterOperand.GreaterThan, ViewFilterOperand.LessThan]],
|
||||
['NUMBER', [ViewFilterOperand.GreaterThan, ViewFilterOperand.LessThan]],
|
||||
['DATE_TIME', [ViewFilterOperand.GreaterThan, ViewFilterOperand.LessThan]],
|
||||
['RELATION', [ViewFilterOperand.Is, ViewFilterOperand.IsNot]],
|
||||
[undefined, []],
|
||||
[null, []],
|
||||
['UNKNOWN_TYPE', []],
|
||||
];
|
||||
|
||||
testCases.forEach(([filterType, expectedOperands]) => {
|
||||
it(`should return correct operands for FilterType.${filterType}`, () => {
|
||||
const result = getOperandsForFilterType(filterType as FilterType);
|
||||
expect(result).toEqual(expectedOperands);
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue
Block a user