@databiosphere/findable-ui 29.0.2 → 30.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +22 -0
- package/lib/common/categories/config/types.d.ts +28 -0
- package/lib/common/categories/config/utils.d.ts +31 -0
- package/lib/common/categories/config/utils.js +29 -0
- package/lib/common/categories/models/range/typeGuards.d.ts +14 -0
- package/lib/common/categories/models/range/typeGuards.js +18 -0
- package/lib/common/categories/models/range/types.d.ts +15 -0
- package/lib/common/categories/models/range/types.js +1 -0
- package/lib/common/categories/models/range/utils.d.ts +23 -0
- package/lib/common/categories/models/range/utils.js +41 -0
- package/lib/common/categories/models/select/utils.d.ts +8 -0
- package/lib/common/categories/models/select/utils.js +16 -0
- package/lib/common/categories/models/types.d.ts +6 -0
- package/lib/common/categories/models/types.js +1 -0
- package/lib/common/categories/views/common/types.d.ts +10 -0
- package/lib/common/categories/views/common/types.js +1 -0
- package/lib/common/categories/views/range/typeGuards.d.ts +8 -0
- package/lib/common/categories/views/range/typeGuards.js +8 -0
- package/lib/common/categories/views/range/types.d.ts +19 -0
- package/lib/common/categories/views/range/types.js +1 -0
- package/lib/common/categories/views/range/utils.d.ts +12 -0
- package/lib/common/categories/views/range/utils.js +24 -0
- package/lib/common/categories/views/select/typeGuards.d.ts +8 -0
- package/lib/common/categories/views/select/typeGuards.js +8 -0
- package/lib/common/categories/views/select/types.d.ts +7 -0
- package/lib/common/categories/views/select/types.js +1 -0
- package/lib/common/categories/views/types.d.ts +13 -0
- package/lib/common/categories/views/types.js +8 -0
- package/lib/common/entities.d.ts +5 -2
- package/lib/components/DataDictionary/components/Table/components/BasicCell/basicCell.d.ts +3 -2
- package/lib/components/DataDictionary/components/Table/components/BasicCell/basicCell.js +6 -2
- package/lib/components/DataDictionary/components/Table/components/BasicCell/utils.d.ts +9 -0
- package/lib/components/DataDictionary/components/Table/components/BasicCell/utils.js +12 -0
- package/lib/components/DataDictionary/dataDictionary.styles.js +2 -3
- package/lib/components/Filter/components/Filter/filter.d.ts +2 -2
- package/lib/components/Filter/components/Filter/filter.js +11 -3
- package/lib/components/Filter/components/Filter/stories/args.d.ts +5 -0
- package/lib/components/Filter/components/Filter/stories/args.js +19 -0
- package/lib/components/Filter/components/Filter/stories/filter.stories.d.ts +8 -0
- package/lib/components/Filter/components/Filter/stories/filter.stories.js +21 -0
- package/lib/components/Filter/components/FilterMenu/filterMenu.js +2 -2
- package/lib/components/Filter/components/FilterMenu/filterMenu.styles.d.ts +1 -1
- package/lib/components/Filter/components/FilterMenu/filterMenu.styles.js +1 -1
- package/lib/components/Filter/components/FilterRange/constants.d.ts +0 -2
- package/lib/components/Filter/components/FilterRange/constants.js +0 -5
- package/lib/components/Filter/components/FilterRange/filterRange.d.ts +1 -1
- package/lib/components/Filter/components/FilterRange/filterRange.js +50 -21
- package/lib/components/Filter/components/FilterRange/filterRange.styles.js +58 -10
- package/lib/components/Filter/components/FilterRange/hooks/UseFilterRange/constants.d.ts +5 -0
- package/lib/components/Filter/components/FilterRange/hooks/UseFilterRange/constants.js +5 -0
- package/lib/components/Filter/components/FilterRange/hooks/UseFilterRange/hook.d.ts +2 -2
- package/lib/components/Filter/components/FilterRange/hooks/UseFilterRange/hook.js +32 -7
- package/lib/components/Filter/components/FilterRange/hooks/UseFilterRange/schema.d.ts +6 -0
- package/lib/components/Filter/components/FilterRange/hooks/UseFilterRange/schema.js +50 -0
- package/lib/components/Filter/components/FilterRange/hooks/UseFilterRange/types.d.ts +26 -3
- package/lib/components/Filter/components/FilterRange/hooks/UseFilterRange/types.js +6 -1
- package/lib/components/Filter/components/FilterRange/hooks/UseFilterRange/utils.d.ts +15 -0
- package/lib/components/Filter/components/FilterRange/hooks/UseFilterRange/utils.js +25 -0
- package/lib/components/Filter/components/FilterRange/stories/args.d.ts +3 -0
- package/lib/components/Filter/components/FilterRange/stories/args.js +13 -0
- package/lib/components/Filter/components/FilterRange/stories/filterRange.stories.js +2 -2
- package/lib/components/Filter/components/FilterRange/types.d.ts +10 -6
- package/lib/components/Filter/components/FilterRange/types.js +1 -6
- package/lib/components/Filter/components/FilterRange/utils.d.ts +8 -0
- package/lib/components/Filter/components/FilterRange/utils.js +15 -0
- package/lib/components/Filter/components/FilterTag/stories/args.d.ts +5 -0
- package/lib/components/Filter/components/FilterTag/stories/args.js +17 -0
- package/lib/components/Filter/components/FilterTag/stories/filterTag.stories.d.ts +8 -0
- package/lib/components/Filter/components/FilterTag/stories/filterTag.stories.js +21 -0
- package/lib/components/Filter/components/FilterTag/utils.d.ts +10 -0
- package/lib/components/Filter/components/FilterTag/utils.js +40 -0
- package/lib/components/Filter/components/Filters/filters.d.ts +2 -2
- package/lib/components/Filter/components/Filters/filters.js +15 -8
- package/lib/components/Filter/components/Filters/stories/args.d.ts +3 -0
- package/lib/components/Filter/components/Filters/stories/args.js +15 -0
- package/lib/components/Filter/components/Filters/stories/constants.d.ts +22 -0
- package/lib/components/Filter/components/Filters/stories/constants.js +134 -0
- package/lib/components/Filter/components/Filters/stories/filters.stories.d.ts +6 -0
- package/lib/components/Filter/components/Filters/stories/filters.stories.js +15 -0
- package/lib/components/Filter/components/SearchAllFilters/components/VariableSizeList/VariableSizeList.d.ts +1 -1
- package/lib/components/Filter/components/SearchAllFilters/components/VariableSizeList/VariableSizeList.js +5 -5
- package/lib/components/Filter/components/SearchAllFilters/components/VariableSizeListItem/variableSizeListItem.js +2 -1
- package/lib/components/Filter/components/SearchAllFilters/searchAllFilters.d.ts +3 -2
- package/lib/components/Filter/components/SearchAllFilters/searchAllFilters.js +6 -4
- package/lib/components/Filter/components/VariableSizeListItem/variableSizeListItem.js +2 -1
- package/lib/components/Index/components/EntitiesView/components/ChartView/utils.js +2 -0
- package/lib/components/Index/table/hook.js +4 -0
- package/lib/components/Table/columnDef/accessorFn/typeGuards.d.ts +9 -0
- package/lib/components/Table/columnDef/accessorFn/typeGuards.js +10 -0
- package/lib/components/Table/common/utils.d.ts +2 -2
- package/lib/components/Table/common/utils.js +28 -13
- package/lib/components/Table/components/TableCell/components/ChipCell/chipCell.d.ts +3 -0
- package/lib/components/Table/components/TableCell/components/ChipCell/chipCell.js +8 -0
- package/lib/components/Table/components/TableCell/components/LinkCell/linkCell.d.ts +4 -0
- package/lib/components/Table/components/TableCell/components/LinkCell/linkCell.js +21 -0
- package/lib/components/Table/components/TableCell/components/LinkCell/stories/args.d.ts +6 -0
- package/lib/components/Table/components/TableCell/components/LinkCell/stories/args.js +27 -0
- package/lib/components/Table/components/TableCell/components/LinkCell/stories/linkCell.stories.d.ts +9 -0
- package/lib/components/Table/components/TableCell/components/LinkCell/stories/linkCell.stories.js +18 -0
- package/lib/components/Table/components/TableCell/components/LinkCell/stories/types.d.ts +3 -0
- package/lib/components/Table/components/TableCell/components/LinkCell/stories/types.js +1 -0
- package/lib/components/Table/components/TableCell/components/LinkCell/utils.d.ts +22 -0
- package/lib/components/Table/components/TableCell/components/LinkCell/utils.js +45 -0
- package/lib/components/Table/featureOptions/facetedColumn/getFacetedMinMaxValues.d.ts +8 -0
- package/lib/components/Table/featureOptions/facetedColumn/getFacetedMinMaxValues.js +46 -0
- package/lib/components/common/Link/typeGuards.d.ts +13 -0
- package/lib/components/common/Link/typeGuards.js +21 -0
- package/lib/config/entities.d.ts +2 -11
- package/lib/hooks/useCategoryFilter.d.ts +8 -13
- package/lib/hooks/useCategoryFilter.js +31 -28
- package/lib/providers/exploreState/entities.d.ts +5 -3
- package/lib/providers/exploreState/payloads/entities.d.ts +6 -2
- package/lib/providers/exploreState.d.ts +3 -2
- package/lib/providers/exploreState.js +1 -1
- package/lib/tests/utils.d.ts +24 -0
- package/lib/tests/utils.js +34 -0
- package/lib/theme/common/components.js +19 -1
- package/lib/views/ExploreView/exploreView.js +10 -8
- package/package.json +2 -1
- package/src/common/categories/config/types.ts +42 -0
- package/src/common/categories/config/utils.ts +47 -0
- package/src/common/categories/models/range/typeGuards.ts +24 -0
- package/src/common/categories/models/range/types.ts +17 -0
- package/src/common/categories/models/range/utils.ts +51 -0
- package/src/common/categories/models/select/utils.ts +23 -0
- package/src/common/categories/models/types.ts +7 -0
- package/src/common/categories/views/common/types.ts +11 -0
- package/src/common/categories/views/range/typeGuards.ts +13 -0
- package/src/common/categories/views/range/types.ts +21 -0
- package/src/common/categories/views/range/utils.ts +35 -0
- package/src/common/categories/views/select/typeGuards.ts +13 -0
- package/src/common/categories/views/select/types.ts +8 -0
- package/src/common/categories/views/types.ts +15 -0
- package/src/common/entities.ts +10 -5
- package/src/components/DataDictionary/components/Table/components/BasicCell/basicCell.tsx +12 -4
- package/src/components/DataDictionary/components/Table/components/BasicCell/utils.ts +13 -0
- package/src/components/DataDictionary/dataDictionary.styles.ts +2 -3
- package/src/components/Filter/components/Filter/filter.tsx +38 -13
- package/src/components/Filter/components/Filter/stories/args.ts +24 -0
- package/src/components/Filter/components/Filter/stories/filter.stories.tsx +32 -0
- package/src/components/Filter/components/FilterMenu/filterMenu.styles.ts +1 -1
- package/src/components/Filter/components/FilterMenu/filterMenu.tsx +7 -3
- package/src/components/Filter/components/FilterRange/constants.ts +0 -7
- package/src/components/Filter/components/FilterRange/filterRange.styles.ts +58 -14
- package/src/components/Filter/components/FilterRange/filterRange.tsx +112 -40
- package/src/components/Filter/components/FilterRange/hooks/UseFilterRange/constants.ts +5 -0
- package/src/components/Filter/components/FilterRange/hooks/UseFilterRange/hook.ts +51 -10
- package/src/components/Filter/components/FilterRange/hooks/UseFilterRange/schema.ts +60 -0
- package/src/components/Filter/components/FilterRange/hooks/UseFilterRange/types.ts +34 -3
- package/src/components/Filter/components/FilterRange/hooks/UseFilterRange/utils.ts +32 -0
- package/src/components/Filter/components/FilterRange/stories/args.ts +16 -0
- package/src/components/Filter/components/FilterRange/stories/filterRange.stories.tsx +2 -2
- package/src/components/Filter/components/FilterRange/types.ts +12 -6
- package/src/components/Filter/components/FilterRange/utils.ts +16 -0
- package/src/components/Filter/components/FilterTag/stories/args.ts +22 -0
- package/src/components/Filter/components/FilterTag/stories/filterTag.stories.tsx +32 -0
- package/src/components/Filter/components/FilterTag/utils.ts +57 -0
- package/src/components/Filter/components/Filters/filters.tsx +21 -12
- package/src/components/Filter/components/Filters/stories/args.ts +24 -0
- package/src/components/Filter/components/Filters/stories/constants.ts +151 -0
- package/src/components/Filter/components/Filters/stories/filters.stories.tsx +24 -0
- package/src/components/Filter/components/SearchAllFilters/components/VariableSizeList/VariableSizeList.tsx +32 -29
- package/src/components/Filter/components/SearchAllFilters/components/VariableSizeListItem/variableSizeListItem.tsx +9 -1
- package/src/components/Filter/components/SearchAllFilters/searchAllFilters.tsx +12 -6
- package/src/components/Filter/components/VariableSizeListItem/variableSizeListItem.tsx +2 -1
- package/src/components/Index/components/EntitiesView/components/ChartView/utils.ts +2 -0
- package/src/components/Index/table/hook.ts +4 -0
- package/src/components/Table/columnDef/accessorFn/typeGuards.ts +15 -0
- package/src/components/Table/common/utils.ts +37 -16
- package/src/components/Table/components/TableCell/components/ChipCell/chipCell.tsx +14 -0
- package/src/components/Table/components/TableCell/components/LinkCell/linkCell.tsx +64 -0
- package/src/components/Table/components/TableCell/components/LinkCell/stories/args.ts +35 -0
- package/src/components/Table/components/TableCell/components/LinkCell/stories/linkCell.stories.tsx +32 -0
- package/src/components/Table/components/TableCell/components/LinkCell/stories/types.ts +4 -0
- package/src/components/Table/components/TableCell/components/LinkCell/utils.ts +59 -0
- package/src/components/Table/featureOptions/facetedColumn/getFacetedMinMaxValues.ts +64 -0
- package/src/components/common/Link/typeGuards.ts +35 -0
- package/src/config/entities.ts +1 -14
- package/src/hooks/useCategoryFilter.ts +56 -53
- package/src/providers/exploreState/entities.ts +3 -3
- package/src/providers/exploreState/initializer/utils.ts +1 -1
- package/src/providers/exploreState/payloads/entities.ts +5 -2
- package/src/providers/exploreState.tsx +5 -3
- package/src/tests/utils.ts +44 -0
- package/src/theme/common/components.ts +19 -1
- package/src/views/ExploreView/exploreView.tsx +17 -22
- package/tests/filter.test.tsx +100 -0
- package/tests/filterRange.test.tsx +331 -46
- package/tests/filters.test.tsx +61 -0
- package/tests/getFacetedMinMaxValues.test.ts +166 -0
- package/tests/linkCell.test.tsx +89 -0
- package/lib/components/DataDictionary/components/Table/components/BasicCell/types.d.ts +0 -3
- package/lib/components/Filter/components/Filter/filter.stories.d.ts +0 -25
- package/lib/components/Filter/components/Filter/filter.stories.js +0 -42
- package/lib/components/Filter/components/FilterTag/filterTag.stories.d.ts +0 -16
- package/lib/components/Filter/components/FilterTag/filterTag.stories.js +0 -17
- package/lib/components/Filter/components/Filters/filters.stories.d.ts +0 -6
- package/lib/components/Filter/components/Filters/filters.stories.js +0 -91
- package/src/components/DataDictionary/components/Table/components/BasicCell/types.ts +0 -7
- package/src/components/Filter/components/Filter/filter.stories.tsx +0 -52
- package/src/components/Filter/components/FilterTag/filterTag.stories.tsx +0 -23
- package/src/components/Filter/components/Filters/filters.stories.tsx +0 -101
- package/tests/filterRangeMock.test.tsx +0 -38
- /package/lib/{components/DataDictionary/components/Table/components/BasicCell → common/categories/config}/types.js +0 -0
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { jest } from "@jest/globals";
|
|
1
2
|
import { composeStories } from "@storybook/react";
|
|
2
|
-
import { fireEvent, render, screen } from "@testing-library/react";
|
|
3
|
+
import { fireEvent, render, screen, waitFor } from "@testing-library/react";
|
|
3
4
|
import React from "react";
|
|
5
|
+
import { VIEW_KIND } from "../src/common/categories/views/types";
|
|
4
6
|
import * as stories from "../src/components/Filter/components/FilterRange/stories/filterRange.stories";
|
|
5
7
|
import { MUI_CLASSES } from "../src/tests/mui/constants";
|
|
6
8
|
import { TEST_IDS } from "../src/tests/testIds";
|
|
9
|
+
import { getButton, getLabelText, getText } from "../src/tests/utils";
|
|
7
10
|
import { getClassNames } from "../src/utils/tests";
|
|
8
11
|
|
|
9
12
|
const BETWEEN = "Between";
|
|
@@ -12,76 +15,358 @@ const LESS_THAN = "Less Than";
|
|
|
12
15
|
|
|
13
16
|
const { Default } = composeStories(stories);
|
|
14
17
|
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
const TEST_VALUES = {
|
|
19
|
+
CATEGORY_KEY: Default.args.categoryKey,
|
|
20
|
+
MAX: Default.args.max,
|
|
21
|
+
MIN: Default.args.min,
|
|
22
|
+
ON_FILTER: jest.fn(),
|
|
23
|
+
SELECTED_MAX: 226,
|
|
24
|
+
SELECTED_MIN: 112,
|
|
25
|
+
UNIT: Default.args.unit,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const LABEL_TEXTS = {
|
|
29
|
+
GREATER_THAN: `Greater Than (${TEST_VALUES.UNIT})`,
|
|
30
|
+
LESS_THAN: `Less Than (${TEST_VALUES.UNIT})`,
|
|
31
|
+
MAX: `Max (${TEST_VALUES.UNIT})`,
|
|
32
|
+
MIN: `Min (${TEST_VALUES.UNIT})`,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const HELPER_TEXTS = {
|
|
36
|
+
GREATER_THAN: `Allowed values: \u2265 ${TEST_VALUES.MIN} and \u2264 ${TEST_VALUES.MAX}`,
|
|
37
|
+
LESS_THAN: `Allowed values: \u2265 ${TEST_VALUES.MIN} and \u2264 ${TEST_VALUES.MAX}`,
|
|
38
|
+
MAX: `Max allowed: ${TEST_VALUES.MAX}`,
|
|
39
|
+
MIN: `Min allowed: ${TEST_VALUES.MIN}`,
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const ERROR_TEXTS = {
|
|
43
|
+
MIN_MAX_ERROR: "Min must be less than max",
|
|
44
|
+
REQUIRED_ERROR: "Value is required",
|
|
45
|
+
TYPE_ERROR: "Value must be a number",
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const DESCRIBE_TITLES = {
|
|
49
|
+
BETWEEN: "Operator BETWEEN",
|
|
50
|
+
GREATER_THAN: "Operator GREATER THAN",
|
|
51
|
+
LESS_THAN: "Operator LESS THAN",
|
|
52
|
+
};
|
|
17
53
|
|
|
54
|
+
/**
|
|
55
|
+
* Tests for the FilterRange component.
|
|
56
|
+
* Excludes tests for min/max values outside of allowed range; the allowed range is not currently validated.
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
describe("FilterRange", () => {
|
|
18
60
|
beforeEach(() => {
|
|
19
|
-
|
|
20
|
-
filterEl = screen.getByTestId(TEST_IDS.FILTER_RANGE);
|
|
61
|
+
jest.clearAllMocks();
|
|
21
62
|
});
|
|
22
63
|
|
|
23
|
-
describe("
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
64
|
+
describe("UI rendering for operator modes", () => {
|
|
65
|
+
let filterEl: HTMLFormElement;
|
|
66
|
+
|
|
67
|
+
beforeEach(() => {
|
|
68
|
+
render(<Default />);
|
|
69
|
+
filterEl = screen.getByTestId(TEST_IDS.FILTER_RANGE);
|
|
70
|
+
expect(filterEl).toBeDefined();
|
|
28
71
|
});
|
|
29
72
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
73
|
+
describe(DESCRIBE_TITLES.BETWEEN, () => {
|
|
74
|
+
it("renders the toggle buttons with correct text", () => {
|
|
75
|
+
expect(getButton(BETWEEN)).toBeDefined();
|
|
76
|
+
expect(getButton(LESS_THAN)).toBeDefined();
|
|
77
|
+
expect(getButton(GREATER_THAN)).toBeDefined();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("renders BETWEEN toggle button as selected", () => {
|
|
81
|
+
expect(getClassNames(getButton(BETWEEN))).toContain(
|
|
82
|
+
MUI_CLASSES.SELECTED
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("renders BETWEEN input fields with correct labels", () => {
|
|
87
|
+
expect(filterEl.querySelectorAll("label")).toHaveLength(2);
|
|
88
|
+
expect(filterEl.querySelectorAll("input")).toHaveLength(2);
|
|
89
|
+
expect(getLabelText(LABEL_TEXTS.MIN)).toBeDefined();
|
|
90
|
+
expect(getLabelText(LABEL_TEXTS.MAX)).toBeDefined();
|
|
91
|
+
expect(getText(LABEL_TEXTS.MIN)).toBeDefined();
|
|
92
|
+
expect(getText(LABEL_TEXTS.MAX)).toBeDefined();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("renders helper text for each input", () => {
|
|
96
|
+
expect(getText(HELPER_TEXTS.MIN)).toBeDefined();
|
|
97
|
+
expect(getText(HELPER_TEXTS.MAX)).toBeDefined();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("renders filter button", () => {
|
|
101
|
+
expect(getFilterButton()).toBeDefined();
|
|
102
|
+
});
|
|
34
103
|
});
|
|
35
104
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
105
|
+
describe(DESCRIBE_TITLES.LESS_THAN, () => {
|
|
106
|
+
beforeEach(() => {
|
|
107
|
+
fireEvent.click(getButton(LESS_THAN));
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("renders LESS THAN toggle button as selected", () => {
|
|
111
|
+
expect(getClassNames(getButton(LESS_THAN))).toContain(
|
|
112
|
+
MUI_CLASSES.SELECTED
|
|
113
|
+
);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("renders LESS THAN input field with correct label", () => {
|
|
117
|
+
expect(filterEl.querySelectorAll("label")).toHaveLength(1);
|
|
118
|
+
expect(filterEl.querySelectorAll("input")).toHaveLength(1);
|
|
119
|
+
expect(getLabelText(LABEL_TEXTS.LESS_THAN)).toBeDefined();
|
|
120
|
+
expect(getText(LABEL_TEXTS.LESS_THAN)).toBeDefined();
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it("renders helper text", () => {
|
|
124
|
+
expect(getText(HELPER_TEXTS.LESS_THAN)).toBeDefined();
|
|
125
|
+
});
|
|
43
126
|
});
|
|
44
127
|
|
|
45
|
-
|
|
46
|
-
|
|
128
|
+
describe(DESCRIBE_TITLES.GREATER_THAN, () => {
|
|
129
|
+
beforeEach(() => {
|
|
130
|
+
fireEvent.click(getButton(GREATER_THAN));
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it("renders GREATER THAN toggle button as selected", () => {
|
|
134
|
+
expect(getClassNames(getButton(GREATER_THAN))).toContain(
|
|
135
|
+
MUI_CLASSES.SELECTED
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("renders GREATER THAN input field with correct label", () => {
|
|
140
|
+
expect(filterEl.querySelectorAll("label")).toHaveLength(1);
|
|
141
|
+
expect(filterEl.querySelectorAll("input")).toHaveLength(1);
|
|
142
|
+
expect(getLabelText(LABEL_TEXTS.GREATER_THAN)).toBeDefined();
|
|
143
|
+
expect(getText(LABEL_TEXTS.GREATER_THAN)).toBeDefined();
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it("renders helper text", () => {
|
|
147
|
+
expect(getText(HELPER_TEXTS.GREATER_THAN)).toBeDefined();
|
|
148
|
+
});
|
|
47
149
|
});
|
|
48
150
|
});
|
|
49
151
|
|
|
50
|
-
describe("
|
|
51
|
-
|
|
52
|
-
|
|
152
|
+
describe("Input rendering for selectedMin and selectedMax combinations", () => {
|
|
153
|
+
it("renders both min and max inputs with selected values when both selectedMin and selectedMax are defined", () => {
|
|
154
|
+
render(
|
|
155
|
+
<Default
|
|
156
|
+
selectedMax={TEST_VALUES.SELECTED_MAX}
|
|
157
|
+
selectedMin={TEST_VALUES.SELECTED_MIN}
|
|
158
|
+
/>
|
|
159
|
+
);
|
|
160
|
+
expect(getClassNames(getButton(BETWEEN))).toContain(MUI_CLASSES.SELECTED);
|
|
161
|
+
expect(getLabelText<HTMLInputElement>(LABEL_TEXTS.MIN).value).toEqual(
|
|
162
|
+
TEST_VALUES.SELECTED_MIN.toString()
|
|
163
|
+
);
|
|
164
|
+
expect(getLabelText<HTMLInputElement>(LABEL_TEXTS.MAX).value).toEqual(
|
|
165
|
+
TEST_VALUES.SELECTED_MAX.toString()
|
|
166
|
+
);
|
|
53
167
|
});
|
|
54
168
|
|
|
55
|
-
it("renders
|
|
169
|
+
it("renders min input with selected value when only selectedMin is defined", () => {
|
|
170
|
+
render(
|
|
171
|
+
<Default selectedMax={null} selectedMin={TEST_VALUES.SELECTED_MIN} />
|
|
172
|
+
);
|
|
173
|
+
expect(getClassNames(getButton(GREATER_THAN))).toContain(
|
|
174
|
+
MUI_CLASSES.SELECTED
|
|
175
|
+
);
|
|
56
176
|
expect(
|
|
57
|
-
|
|
58
|
-
).
|
|
177
|
+
getLabelText<HTMLInputElement>(LABEL_TEXTS.GREATER_THAN).value
|
|
178
|
+
).toEqual(TEST_VALUES.SELECTED_MIN.toString());
|
|
59
179
|
});
|
|
60
180
|
|
|
61
|
-
it("renders
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
expect(
|
|
181
|
+
it("renders max input with selected value when only selectedMax is defined", () => {
|
|
182
|
+
render(
|
|
183
|
+
<Default selectedMax={TEST_VALUES.SELECTED_MAX} selectedMin={null} />
|
|
184
|
+
);
|
|
185
|
+
expect(getClassNames(getButton(LESS_THAN))).toContain(
|
|
186
|
+
MUI_CLASSES.SELECTED
|
|
187
|
+
);
|
|
188
|
+
expect(
|
|
189
|
+
getLabelText<HTMLInputElement>(LABEL_TEXTS.LESS_THAN).value
|
|
190
|
+
).toEqual(TEST_VALUES.SELECTED_MAX.toString());
|
|
66
191
|
});
|
|
67
192
|
});
|
|
68
193
|
|
|
69
|
-
describe("
|
|
70
|
-
|
|
71
|
-
|
|
194
|
+
describe("Filter button interaction", () => {
|
|
195
|
+
describe(DESCRIBE_TITLES.BETWEEN, () => {
|
|
196
|
+
it("calls onFilter with correct values when min and max are selected", async () => {
|
|
197
|
+
render(
|
|
198
|
+
<Default
|
|
199
|
+
selectedMin={TEST_VALUES.SELECTED_MIN}
|
|
200
|
+
selectedMax={TEST_VALUES.SELECTED_MAX}
|
|
201
|
+
onFilter={TEST_VALUES.ON_FILTER}
|
|
202
|
+
/>
|
|
203
|
+
);
|
|
204
|
+
fireEvent.click(getFilterButton());
|
|
205
|
+
await waitFor(() => {
|
|
206
|
+
expect(TEST_VALUES.ON_FILTER).toHaveBeenCalledTimes(1);
|
|
207
|
+
expect(TEST_VALUES.ON_FILTER).toHaveBeenCalledWith(
|
|
208
|
+
TEST_VALUES.CATEGORY_KEY,
|
|
209
|
+
[TEST_VALUES.SELECTED_MIN, TEST_VALUES.SELECTED_MAX],
|
|
210
|
+
true,
|
|
211
|
+
undefined,
|
|
212
|
+
VIEW_KIND.RANGE
|
|
213
|
+
);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it("calls onFilter with correct values when only min is selected", async () => {
|
|
218
|
+
render(
|
|
219
|
+
<Default
|
|
220
|
+
selectedMin={TEST_VALUES.SELECTED_MIN}
|
|
221
|
+
selectedMax={null}
|
|
222
|
+
onFilter={TEST_VALUES.ON_FILTER}
|
|
223
|
+
/>
|
|
224
|
+
);
|
|
225
|
+
fireEvent.click(getFilterButton());
|
|
226
|
+
await waitFor(() => {
|
|
227
|
+
expect(TEST_VALUES.ON_FILTER).toHaveBeenCalledWith(
|
|
228
|
+
TEST_VALUES.CATEGORY_KEY,
|
|
229
|
+
[TEST_VALUES.SELECTED_MIN, null],
|
|
230
|
+
true,
|
|
231
|
+
undefined,
|
|
232
|
+
VIEW_KIND.RANGE
|
|
233
|
+
);
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it("calls onFilter with correct values when only max is selected", async () => {
|
|
238
|
+
render(
|
|
239
|
+
<Default
|
|
240
|
+
selectedMin={null}
|
|
241
|
+
selectedMax={TEST_VALUES.SELECTED_MAX}
|
|
242
|
+
onFilter={TEST_VALUES.ON_FILTER}
|
|
243
|
+
/>
|
|
244
|
+
);
|
|
245
|
+
fireEvent.click(getFilterButton());
|
|
246
|
+
await waitFor(() => {
|
|
247
|
+
expect(TEST_VALUES.ON_FILTER).toHaveBeenCalledWith(
|
|
248
|
+
TEST_VALUES.CATEGORY_KEY,
|
|
249
|
+
[null, TEST_VALUES.SELECTED_MAX],
|
|
250
|
+
true,
|
|
251
|
+
undefined,
|
|
252
|
+
VIEW_KIND.RANGE
|
|
253
|
+
);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
72
256
|
});
|
|
257
|
+
});
|
|
73
258
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
259
|
+
describe("Error states", () => {
|
|
260
|
+
const STRING_VALUE = { target: { value: "test" } }; // Updater of input value from number to string value "test".
|
|
261
|
+
|
|
262
|
+
describe(DESCRIBE_TITLES.BETWEEN, () => {
|
|
263
|
+
it("shows error when min and max are missing", async () => {
|
|
264
|
+
render(<Default selectedMin={null} selectedMax={null} />);
|
|
265
|
+
fireEvent.click(getFilterButton());
|
|
266
|
+
await waitFor(() => {
|
|
267
|
+
expect(TEST_VALUES.ON_FILTER).toHaveBeenCalledTimes(0);
|
|
268
|
+
expect(getText("Min or Max is required")).toBeDefined();
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it("shows error when min is not a number", async () => {
|
|
273
|
+
render(
|
|
274
|
+
<Default
|
|
275
|
+
selectedMin={TEST_VALUES.SELECTED_MIN}
|
|
276
|
+
selectedMax={TEST_VALUES.SELECTED_MAX}
|
|
277
|
+
/>
|
|
278
|
+
);
|
|
279
|
+
fireEvent.change(getLabelText(LABEL_TEXTS.MIN), STRING_VALUE);
|
|
280
|
+
fireEvent.click(getFilterButton());
|
|
281
|
+
await waitFor(() => {
|
|
282
|
+
expect(TEST_VALUES.ON_FILTER).toHaveBeenCalledTimes(0);
|
|
283
|
+
expect(getText(ERROR_TEXTS.TYPE_ERROR)).toBeDefined();
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it("shows error when max is not a number", async () => {
|
|
288
|
+
render(
|
|
289
|
+
<Default
|
|
290
|
+
selectedMin={TEST_VALUES.SELECTED_MIN}
|
|
291
|
+
selectedMax={TEST_VALUES.SELECTED_MAX}
|
|
292
|
+
/>
|
|
293
|
+
);
|
|
294
|
+
fireEvent.change(getLabelText(LABEL_TEXTS.MAX), STRING_VALUE);
|
|
295
|
+
fireEvent.click(getFilterButton());
|
|
296
|
+
await waitFor(() => {
|
|
297
|
+
expect(TEST_VALUES.ON_FILTER).toHaveBeenCalledTimes(0);
|
|
298
|
+
expect(getText(ERROR_TEXTS.TYPE_ERROR)).toBeDefined();
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
it("shows error when min is greater than max", async () => {
|
|
303
|
+
render(
|
|
304
|
+
<Default
|
|
305
|
+
selectedMin={TEST_VALUES.SELECTED_MAX}
|
|
306
|
+
selectedMax={TEST_VALUES.SELECTED_MIN}
|
|
307
|
+
/>
|
|
308
|
+
);
|
|
309
|
+
fireEvent.click(getFilterButton());
|
|
310
|
+
await waitFor(() => {
|
|
311
|
+
expect(TEST_VALUES.ON_FILTER).toHaveBeenCalledTimes(0);
|
|
312
|
+
expect(getText(ERROR_TEXTS.MIN_MAX_ERROR)).toBeDefined();
|
|
313
|
+
});
|
|
314
|
+
});
|
|
78
315
|
});
|
|
79
316
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
317
|
+
describe(DESCRIBE_TITLES.LESS_THAN, () => {
|
|
318
|
+
beforeEach(() => {
|
|
319
|
+
render(<Default selectedMin={null} selectedMax={null} />);
|
|
320
|
+
fireEvent.click(getButton(LESS_THAN));
|
|
321
|
+
});
|
|
322
|
+
it("shows error when required max is missing", async () => {
|
|
323
|
+
fireEvent.click(getFilterButton());
|
|
324
|
+
await waitFor(() => {
|
|
325
|
+
expect(TEST_VALUES.ON_FILTER).toHaveBeenCalledTimes(0);
|
|
326
|
+
expect(getText(ERROR_TEXTS.REQUIRED_ERROR)).toBeDefined();
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
it("shows error when required max is not a number", async () => {
|
|
331
|
+
fireEvent.change(getLabelText(LABEL_TEXTS.LESS_THAN), STRING_VALUE);
|
|
332
|
+
fireEvent.click(getFilterButton());
|
|
333
|
+
await waitFor(() => {
|
|
334
|
+
expect(TEST_VALUES.ON_FILTER).toHaveBeenCalledTimes(0);
|
|
335
|
+
expect(getText(ERROR_TEXTS.TYPE_ERROR)).toBeDefined();
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
describe(DESCRIBE_TITLES.GREATER_THAN, () => {
|
|
341
|
+
beforeEach(() => {
|
|
342
|
+
render(<Default selectedMin={null} selectedMax={null} />);
|
|
343
|
+
fireEvent.click(getButton(GREATER_THAN));
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
it("shows error when required min is missing", async () => {
|
|
347
|
+
fireEvent.click(getFilterButton());
|
|
348
|
+
await waitFor(() => {
|
|
349
|
+
expect(TEST_VALUES.ON_FILTER).toHaveBeenCalledTimes(0);
|
|
350
|
+
expect(getText(ERROR_TEXTS.REQUIRED_ERROR)).toBeDefined();
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
it("shows error when required min is not a number", async () => {
|
|
355
|
+
fireEvent.change(getLabelText(LABEL_TEXTS.GREATER_THAN), STRING_VALUE);
|
|
356
|
+
fireEvent.click(getFilterButton());
|
|
357
|
+
await waitFor(() => {
|
|
358
|
+
expect(TEST_VALUES.ON_FILTER).toHaveBeenCalledTimes(0);
|
|
359
|
+
expect(getText(ERROR_TEXTS.TYPE_ERROR)).toBeDefined();
|
|
360
|
+
});
|
|
361
|
+
});
|
|
85
362
|
});
|
|
86
363
|
});
|
|
87
364
|
});
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Retrieves the filter button.
|
|
368
|
+
* @returns The filter button element.
|
|
369
|
+
*/
|
|
370
|
+
function getFilterButton(): HTMLElement {
|
|
371
|
+
return getButton("Filter");
|
|
372
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { jest } from "@jest/globals";
|
|
2
|
+
import { composeStories } from "@storybook/react";
|
|
3
|
+
import { render, screen } from "@testing-library/react";
|
|
4
|
+
import React from "react";
|
|
5
|
+
import { CategoryView } from "../src/common/categories/views/types";
|
|
6
|
+
import { CategoryFilter } from "../src/components/Filter/components/Filters/filters";
|
|
7
|
+
import * as stories from "../src/components/Filter/components/Filters/stories/filters.stories";
|
|
8
|
+
import { TEST_IDS } from "../src/tests/testIds";
|
|
9
|
+
import { getButton, getStartsWithRegex, getText } from "../src/tests/utils";
|
|
10
|
+
|
|
11
|
+
const { Default } = composeStories(stories);
|
|
12
|
+
|
|
13
|
+
const CATEGORY_FILTERS = Default.args.categoryFilters;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Tests for the Filters component.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
describe("Filters", () => {
|
|
20
|
+
let filtersEl: HTMLElement;
|
|
21
|
+
|
|
22
|
+
describe("UI rendering", () => {
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
jest.clearAllMocks();
|
|
25
|
+
render(<Default />);
|
|
26
|
+
filtersEl = screen.getByTestId(TEST_IDS.FILTERS);
|
|
27
|
+
expect(filtersEl).toBeDefined();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("renders all category filter labels", () => {
|
|
31
|
+
for (const { label } of CATEGORY_FILTERS || []) {
|
|
32
|
+
if (!label) continue;
|
|
33
|
+
expect(getText(label)).toBeDefined();
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("renders all category view filters", () => {
|
|
38
|
+
const CATEGORY_VIEWS = getCategoryViews(CATEGORY_FILTERS);
|
|
39
|
+
expect(screen.getAllByRole("button")).toHaveLength(CATEGORY_VIEWS.length);
|
|
40
|
+
for (const { label } of CATEGORY_VIEWS) {
|
|
41
|
+
expect(getButton(getStartsWithRegex(label))).toBeDefined();
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("renders nothing if categoryFilters is empty", () => {
|
|
47
|
+
render(<Default categoryFilters={[]} />);
|
|
48
|
+
expect(screen.queryAllByRole("button")).toHaveLength(0);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Returns all category views from the given category filters.
|
|
54
|
+
* @param categoryFilters - Array of category filters.
|
|
55
|
+
* @returns Array of category views.
|
|
56
|
+
*/
|
|
57
|
+
function getCategoryViews(
|
|
58
|
+
categoryFilters: CategoryFilter[] = []
|
|
59
|
+
): CategoryView[] {
|
|
60
|
+
return categoryFilters.flatMap(({ categoryViews }) => categoryViews);
|
|
61
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { Row, RowData, RowModel, Table } from "@tanstack/react-table";
|
|
2
|
+
import { getFacetedMinMaxValues } from "../src/components/Table/featureOptions/facetedColumn/getFacetedMinMaxValues";
|
|
3
|
+
|
|
4
|
+
describe("getFacetedMinMaxValues", () => {
|
|
5
|
+
test.each([
|
|
6
|
+
{
|
|
7
|
+
expected: [10, 30],
|
|
8
|
+
name: "returns correct min and max for all valid numbers",
|
|
9
|
+
rows: [makeRow([10]), makeRow([20]), makeRow([30])],
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
expected: [5, 100],
|
|
13
|
+
name: "skips null and NaN values",
|
|
14
|
+
rows: [
|
|
15
|
+
makeRow([null]),
|
|
16
|
+
makeRow([15, NaN]),
|
|
17
|
+
makeRow([5, 25]),
|
|
18
|
+
makeRow([undefined, 100]),
|
|
19
|
+
],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
expected: [10, 30],
|
|
23
|
+
name: "skips non-numeric strings and includes numeric strings",
|
|
24
|
+
rows: [makeRow(["10", "not-a-number"]), makeRow([20]), makeRow(["30"])],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
expected: undefined,
|
|
28
|
+
name: "returns undefined if all values are null or NaN",
|
|
29
|
+
rows: [
|
|
30
|
+
makeRow([null]),
|
|
31
|
+
makeRow([undefined]),
|
|
32
|
+
makeRow([NaN]),
|
|
33
|
+
makeRow([null, NaN]),
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
expected: [-1000, 50000],
|
|
38
|
+
name: "handles negative, zero, and large numbers",
|
|
39
|
+
rows: [makeRow([-1000]), makeRow([0]), makeRow([50000]), makeRow([42])],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
expected: [10, 60],
|
|
43
|
+
name: "computes min and max across multiple values per row",
|
|
44
|
+
rows: [makeRow([10, 20]), makeRow([30, 40]), makeRow([50, 60])],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
expected: [10, 60],
|
|
48
|
+
name: "computes min and max across mixed arrays with null, undefined, and non-numeric value",
|
|
49
|
+
rows: [
|
|
50
|
+
makeRow([10, null, 20]),
|
|
51
|
+
makeRow([30, undefined, 40]),
|
|
52
|
+
makeRow([50, 60, "not-a-number"]),
|
|
53
|
+
makeRow([null, null, null]),
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
expected: [10, 10],
|
|
58
|
+
name: "returns [value, value] for a single row/value",
|
|
59
|
+
rows: [makeRow([10])],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
expected: undefined,
|
|
63
|
+
name: "returns undefined if all rows are empty arrays",
|
|
64
|
+
rows: [makeRow([]), makeRow([])],
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
expected: undefined,
|
|
68
|
+
name: "returns undefined if all values are non-numeric strings",
|
|
69
|
+
rows: [makeRow(["foo"]), makeRow(["bar"]), makeRow(["baz"])],
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
expected: [0, 0],
|
|
73
|
+
name: "handles negative zero correctly",
|
|
74
|
+
rows: [makeRow([-0]), makeRow([0]), makeRow([0])],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
expected: [-Infinity, Infinity],
|
|
78
|
+
name: "handles Infinity and -Infinity as values",
|
|
79
|
+
rows: [makeRow([Infinity]), makeRow([-Infinity]), makeRow([10])],
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
expected: [0, 42],
|
|
83
|
+
name: "handles mixed valid and invalid types",
|
|
84
|
+
rows: [makeRow([null, "5", {}, [], 42, undefined, "abc", 0])],
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
expected: undefined,
|
|
88
|
+
name: "returns undefined for no rows",
|
|
89
|
+
rows: [],
|
|
90
|
+
},
|
|
91
|
+
])("$name", ({ expected, rows }) => {
|
|
92
|
+
const COLUMN_ID = "columnId";
|
|
93
|
+
const result = getExpected(makeTable(rows, COLUMN_ID), COLUMN_ID);
|
|
94
|
+
expect(result).toEqual(expected);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("returns undefined if column does not exist", () => {
|
|
98
|
+
const COLUMN_ID = "missing";
|
|
99
|
+
const ROWS = [makeRow([1]), makeRow([2])];
|
|
100
|
+
const expected = getExpected(makeTable(ROWS, "foo"), COLUMN_ID);
|
|
101
|
+
expect(expected).toBeUndefined();
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("returns undefined if facetedRowModel is undefined", () => {
|
|
105
|
+
const COLUMN_ID = "foo";
|
|
106
|
+
const table = {
|
|
107
|
+
getColumn: (): {
|
|
108
|
+
getFacetedRowModel: () => RowModel<RowData> | undefined;
|
|
109
|
+
} => ({
|
|
110
|
+
getFacetedRowModel: (): undefined => undefined,
|
|
111
|
+
}),
|
|
112
|
+
} as unknown as Table<RowData>;
|
|
113
|
+
const expected = getExpected(table, COLUMN_ID);
|
|
114
|
+
expect(expected).toBeUndefined();
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Helper function to get the expected result from the getFacetedMinMaxValues function.
|
|
120
|
+
* @param table - The table to get the expected result from.
|
|
121
|
+
* @param columnId - The column id to get the expected result from.
|
|
122
|
+
* @returns The expected result from the getFacetedMinMaxValues function.
|
|
123
|
+
*/
|
|
124
|
+
function getExpected(
|
|
125
|
+
table: Table<RowData>,
|
|
126
|
+
columnId: string
|
|
127
|
+
): [number, number] | undefined {
|
|
128
|
+
return getFacetedMinMaxValues()(table, columnId)();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Helper function to create a faceted row model.
|
|
133
|
+
* @param rows - The rows to create the faceted row model from.
|
|
134
|
+
* @returns The faceted row model.
|
|
135
|
+
*/
|
|
136
|
+
function makeFacetedRowModel(rows: Row<RowData>[]): RowModel<RowData> {
|
|
137
|
+
return {
|
|
138
|
+
flatRows: rows,
|
|
139
|
+
} as unknown as RowModel<RowData>;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Helper function to create a row with a specific set of values.
|
|
144
|
+
* @param values - The values to set for the row.
|
|
145
|
+
* @returns The row.
|
|
146
|
+
*/
|
|
147
|
+
function makeRow(values: unknown[]): Row<RowData> {
|
|
148
|
+
return {
|
|
149
|
+
getUniqueValues: <TValue>() => values as TValue[],
|
|
150
|
+
} as unknown as Row<RowData>;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Helper function to create a table with a specific set of rows.
|
|
155
|
+
* @param rows - The rows to set for the table.
|
|
156
|
+
* @param columnId - The column id to set for the table.
|
|
157
|
+
* @returns The table.
|
|
158
|
+
*/
|
|
159
|
+
function makeTable(rows: Row<RowData>[], columnId: string): Table<RowData> {
|
|
160
|
+
return {
|
|
161
|
+
getColumn: (id: string) =>
|
|
162
|
+
id === columnId
|
|
163
|
+
? { getFacetedRowModel: () => makeFacetedRowModel(rows) }
|
|
164
|
+
: undefined,
|
|
165
|
+
} as unknown as Table<RowData>;
|
|
166
|
+
}
|