@dynatrace/strato-components-testing 3.6.0 → 3.7.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/esm/jest/index.js +6 -0
- package/esm/jest/index.js.map +2 -2
- package/esm/jest/mocks/structured-clone-mock.js +20 -0
- package/esm/jest/mocks/structured-clone-mock.js.map +7 -0
- package/esm/jest/setup/index.js +6 -0
- package/esm/jest/setup/index.js.map +2 -2
- package/esm/jest/testing-helpers/tables/datatable.js.map +2 -2
- package/jest/index.d.ts +1 -0
- package/jest/index.js +3 -0
- package/jest/mocks/structured-clone-mock.d.ts +12 -0
- package/jest/mocks/structured-clone-mock.js +38 -0
- package/jest/setup/index.js +3 -0
- package/package.json +2 -2
package/esm/jest/index.js
CHANGED
|
@@ -92,6 +92,10 @@ import {
|
|
|
92
92
|
setupElementFromPointMock,
|
|
93
93
|
clearElementFromPointMock
|
|
94
94
|
} from "./mocks/element-from-point-mock.js";
|
|
95
|
+
import {
|
|
96
|
+
setupStructuredCloneMock,
|
|
97
|
+
clearStructuredCloneMock
|
|
98
|
+
} from "./mocks/structured-clone-mock.js";
|
|
95
99
|
export {
|
|
96
100
|
clearCanvasMeasureTextMock,
|
|
97
101
|
clearCreateRangeMock,
|
|
@@ -109,6 +113,7 @@ export {
|
|
|
109
113
|
clearScreenSizeMock,
|
|
110
114
|
clearScrollIntoViewMock,
|
|
111
115
|
clearScrollWidthMock,
|
|
116
|
+
clearStructuredCloneMock,
|
|
112
117
|
clearTableVirtualizationMock,
|
|
113
118
|
clearTextEllipsisMock,
|
|
114
119
|
clearVirtualizationMock,
|
|
@@ -136,6 +141,7 @@ export {
|
|
|
136
141
|
setupScreenSizeMock,
|
|
137
142
|
setupScrollIntoViewMock,
|
|
138
143
|
setupScrollWidthMock,
|
|
144
|
+
setupStructuredCloneMock,
|
|
139
145
|
setupTableVirtualizationMock,
|
|
140
146
|
setupTextEllipsisMock,
|
|
141
147
|
setupVirtualizationMock,
|
package/esm/jest/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/jest/index.ts"],
|
|
4
|
-
"sourcesContent": ["// we no longer re-export @testing-library/user-event or @testing-library/react\n// export * from '@testing-library/react';\n// import userEvent from '@testing-library/user-event';\n// export { userEvent };\n\nimport '@testing-library/jest-dom';\n\nexport {\n customRender as render,\n type RenderWithIntlOptions,\n} from './custom-render.js';\n\nexport { stratoPreset } from './preset/index.js';\n\n///#region Testing Helpers\nexport {\n getTextInputHelper,\n type TextInputHelper,\n} from './testing-helpers/forms/text-input.js';\nexport {\n getPasswordInputHelper,\n type PasswordInputHelper,\n} from './testing-helpers/forms/password-input.js';\nexport {\n getSearchInputHelper,\n type SearchInputHelper,\n} from './testing-helpers/forms/search-input.js';\n\nexport {\n getDataTableHelper,\n type DataTableHelper,\n type DataTablePaginationHelper,\n type DataTableUserActionHelper,\n type DataTableSortingHelper,\n type DataTableRowSelectionHelper,\n type DataTableSubRowsHelper,\n type DataTableInteractiveRowsHelper,\n type DataTableDownloadHelper,\n type DataTableExpandableRowHelper,\n} from './testing-helpers/tables/datatable.js';\n\nexport type { BaseInputHelper } from './testing-helpers/forms/base-input.js';\n\nexport {\n getFilterFieldHelper,\n type FilterFieldHelper,\n type FilterFieldPinnedAndRecentSuggestionBase,\n type FilterFieldPinnedSuggestion,\n type FilterFieldRecentSuggestion,\n} from './testing-helpers/filters/filter-field.js';\n\nexport {\n getSelectTestingHelper,\n type SelectTestingHelper,\n} from './testing-helpers/forms/select.js';\n///#endregion Testing Helpers\n\n///#region Mocks\nexport {\n setupGetBoundingClientRectMock,\n clearGetBoundingClientRectMock,\n} from './mocks/bounding-client-rect-mock.js';\n\nexport { createMockElement } from './mocks/create-mock-element.js';\n\nexport {\n setupCanvasMeasureTextMock,\n clearCanvasMeasureTextMock,\n} from './mocks/canvas-mock.js';\n\nexport {\n setupResizeObserverMock,\n clearResizeObserverMock,\n} from './mocks/resize-observer-mock.js';\n\nexport {\n setupOffsetWidthMock,\n clearOffsetWidthMock,\n} from './mocks/offset-width-mock.js';\n\nexport {\n setupOffsetHeightMock,\n clearOffsetHeightMock,\n} from './mocks/offset-height-mock.js';\n\nexport { setupDomRectMock, clearDomRectMock } from './mocks/dom-rect-mock.js';\n\nexport {\n setupMatchMediaMock,\n clearMatchMediaMock,\n} from './mocks/match-media-mock.js';\n\nexport {\n setupPointerEventMock,\n clearPointerEventMock,\n} from './mocks/pointer-event-mock.js';\n\nexport {\n setupIntersectionObserverMock,\n clearIntersectionObserverMock,\n} from './mocks/intersection-observer-mock.js';\n\nexport {\n setupCreateRangeMock,\n clearCreateRangeMock,\n} from './mocks/create-range-mock.js';\n\nexport {\n setupScreenSizeMock,\n clearScreenSizeMock,\n} from './mocks/screen-size-mock.js';\n\nexport {\n setupScrollIntoViewMock,\n clearScrollIntoViewMock,\n} from './mocks/scroll-into-view-mock.js';\n\nexport {\n setupScrollWidthMock,\n clearScrollWidthMock,\n} from './mocks/scroll-width-mock.js';\n\nexport { setupFetchMock, clearFetchMock } from './mocks/fetch-mock.js';\n\nexport {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n setupTableVirtualizationMock,\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n clearTableVirtualizationMock,\n} from './mocks/table-virtualization-mock.js';\n\nexport {\n setupVirtualizationMock,\n clearVirtualizationMock,\n} from './mocks/virtualization-mock.js';\n\nexport {\n setupTextEllipsisMock,\n clearTextEllipsisMock,\n} from './mocks/text-ellipsis-mock.js';\n\nexport {\n setupFramerMotionMock,\n clearFramerMotionMock,\n} from './mocks/framer-motion-mock.js';\n\nexport {\n setupElementFromPointMock,\n clearElementFromPointMock,\n} from './mocks/element-from-point-mock.js';\n\n///#endregion Mocks\n"],
|
|
5
|
-
"mappings": "AAKA,OAAO;AAEP;AAAA,EACkB;AAAA,OAEX;AAEP,SAAS,oBAAoB;AAG7B;AAAA,EACE;AAAA,OAEK;AACP;AAAA,EACE;AAAA,OAEK;AACP;AAAA,EACE;AAAA,OAEK;AAEP;AAAA,EACE;AAAA,OAUK;AAIP;AAAA,EACE;AAAA,OAKK;AAEP;AAAA,EACE;AAAA,OAEK;AAIP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,yBAAyB;AAElC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,kBAAkB,wBAAwB;AAEnD;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,gBAAgB,sBAAsB;AAE/C;AAAA,EAEE;AAAA,EAEA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;",
|
|
4
|
+
"sourcesContent": ["// we no longer re-export @testing-library/user-event or @testing-library/react\n// export * from '@testing-library/react';\n// import userEvent from '@testing-library/user-event';\n// export { userEvent };\n\nimport '@testing-library/jest-dom';\n\nexport {\n customRender as render,\n type RenderWithIntlOptions,\n} from './custom-render.js';\n\nexport { stratoPreset } from './preset/index.js';\n\n///#region Testing Helpers\nexport {\n getTextInputHelper,\n type TextInputHelper,\n} from './testing-helpers/forms/text-input.js';\nexport {\n getPasswordInputHelper,\n type PasswordInputHelper,\n} from './testing-helpers/forms/password-input.js';\nexport {\n getSearchInputHelper,\n type SearchInputHelper,\n} from './testing-helpers/forms/search-input.js';\n\nexport {\n getDataTableHelper,\n type DataTableHelper,\n type DataTablePaginationHelper,\n type DataTableUserActionHelper,\n type DataTableSortingHelper,\n type DataTableRowSelectionHelper,\n type DataTableSubRowsHelper,\n type DataTableInteractiveRowsHelper,\n type DataTableDownloadHelper,\n type DataTableExpandableRowHelper,\n} from './testing-helpers/tables/datatable.js';\n\nexport type { BaseInputHelper } from './testing-helpers/forms/base-input.js';\n\nexport {\n getFilterFieldHelper,\n type FilterFieldHelper,\n type FilterFieldPinnedAndRecentSuggestionBase,\n type FilterFieldPinnedSuggestion,\n type FilterFieldRecentSuggestion,\n} from './testing-helpers/filters/filter-field.js';\n\nexport {\n getSelectTestingHelper,\n type SelectTestingHelper,\n} from './testing-helpers/forms/select.js';\n///#endregion Testing Helpers\n\n///#region Mocks\nexport {\n setupGetBoundingClientRectMock,\n clearGetBoundingClientRectMock,\n} from './mocks/bounding-client-rect-mock.js';\n\nexport { createMockElement } from './mocks/create-mock-element.js';\n\nexport {\n setupCanvasMeasureTextMock,\n clearCanvasMeasureTextMock,\n} from './mocks/canvas-mock.js';\n\nexport {\n setupResizeObserverMock,\n clearResizeObserverMock,\n} from './mocks/resize-observer-mock.js';\n\nexport {\n setupOffsetWidthMock,\n clearOffsetWidthMock,\n} from './mocks/offset-width-mock.js';\n\nexport {\n setupOffsetHeightMock,\n clearOffsetHeightMock,\n} from './mocks/offset-height-mock.js';\n\nexport { setupDomRectMock, clearDomRectMock } from './mocks/dom-rect-mock.js';\n\nexport {\n setupMatchMediaMock,\n clearMatchMediaMock,\n} from './mocks/match-media-mock.js';\n\nexport {\n setupPointerEventMock,\n clearPointerEventMock,\n} from './mocks/pointer-event-mock.js';\n\nexport {\n setupIntersectionObserverMock,\n clearIntersectionObserverMock,\n} from './mocks/intersection-observer-mock.js';\n\nexport {\n setupCreateRangeMock,\n clearCreateRangeMock,\n} from './mocks/create-range-mock.js';\n\nexport {\n setupScreenSizeMock,\n clearScreenSizeMock,\n} from './mocks/screen-size-mock.js';\n\nexport {\n setupScrollIntoViewMock,\n clearScrollIntoViewMock,\n} from './mocks/scroll-into-view-mock.js';\n\nexport {\n setupScrollWidthMock,\n clearScrollWidthMock,\n} from './mocks/scroll-width-mock.js';\n\nexport { setupFetchMock, clearFetchMock } from './mocks/fetch-mock.js';\n\nexport {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n setupTableVirtualizationMock,\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n clearTableVirtualizationMock,\n} from './mocks/table-virtualization-mock.js';\n\nexport {\n setupVirtualizationMock,\n clearVirtualizationMock,\n} from './mocks/virtualization-mock.js';\n\nexport {\n setupTextEllipsisMock,\n clearTextEllipsisMock,\n} from './mocks/text-ellipsis-mock.js';\n\nexport {\n setupFramerMotionMock,\n clearFramerMotionMock,\n} from './mocks/framer-motion-mock.js';\n\nexport {\n setupElementFromPointMock,\n clearElementFromPointMock,\n} from './mocks/element-from-point-mock.js';\n\nexport {\n setupStructuredCloneMock,\n clearStructuredCloneMock,\n} from './mocks/structured-clone-mock.js';\n///#endregion Mocks\n"],
|
|
5
|
+
"mappings": "AAKA,OAAO;AAEP;AAAA,EACkB;AAAA,OAEX;AAEP,SAAS,oBAAoB;AAG7B;AAAA,EACE;AAAA,OAEK;AACP;AAAA,EACE;AAAA,OAEK;AACP;AAAA,EACE;AAAA,OAEK;AAEP;AAAA,EACE;AAAA,OAUK;AAIP;AAAA,EACE;AAAA,OAKK;AAEP;AAAA,EACE;AAAA,OAEK;AAIP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,yBAAyB;AAElC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,kBAAkB,wBAAwB;AAEnD;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,gBAAgB,sBAAsB;AAE/C;AAAA,EAEE;AAAA,EAEA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OACK;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const pristineStructuredClone = global.structuredClone;
|
|
2
|
+
function setupStructuredCloneMock() {
|
|
3
|
+
Object.defineProperty(globalThis, "structuredClone", {
|
|
4
|
+
value: (value) => JSON.parse(JSON.stringify(value)),
|
|
5
|
+
configurable: true,
|
|
6
|
+
writable: true
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
function clearStructuredCloneMock() {
|
|
10
|
+
Object.defineProperty(globalThis, "structuredClone", {
|
|
11
|
+
value: pristineStructuredClone,
|
|
12
|
+
configurable: true,
|
|
13
|
+
writable: true
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
clearStructuredCloneMock,
|
|
18
|
+
setupStructuredCloneMock
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=structured-clone-mock.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/jest/mocks/structured-clone-mock.ts"],
|
|
4
|
+
"sourcesContent": ["const pristineStructuredClone = global.structuredClone;\n\n/**\n * Mocks `structuredClone` web API that may be missing in older jsdom versions.\n *\n * @public\n */\nexport function setupStructuredCloneMock() {\n Object.defineProperty(globalThis, 'structuredClone', {\n value: <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T,\n configurable: true,\n writable: true,\n });\n}\n\n/**\n * Clears `structuredClone` web API mock.\n *\n * @public\n */\nexport function clearStructuredCloneMock() {\n Object.defineProperty(globalThis, 'structuredClone', {\n value: pristineStructuredClone,\n configurable: true,\n writable: true,\n });\n}\n"],
|
|
5
|
+
"mappings": "AAAA,MAAM,0BAA0B,OAAO;AAOhC,SAAS,2BAA2B;AACzC,SAAO,eAAe,YAAY,mBAAmB;AAAA,IACnD,OAAO,CAAI,UAAgB,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA,IAC3D,cAAc;AAAA,IACd,UAAU;AAAA,EACZ,CAAC;AACH;AAOO,SAAS,2BAA2B;AACzC,SAAO,eAAe,YAAY,mBAAmB;AAAA,IACnD,OAAO;AAAA,IACP,cAAc;AAAA,IACd,UAAU;AAAA,EACZ,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/esm/jest/setup/index.js
CHANGED
|
@@ -36,6 +36,10 @@ import {
|
|
|
36
36
|
clearScrollIntoViewMock,
|
|
37
37
|
setupScrollIntoViewMock
|
|
38
38
|
} from "../mocks/scroll-into-view-mock.js";
|
|
39
|
+
import {
|
|
40
|
+
clearStructuredCloneMock,
|
|
41
|
+
setupStructuredCloneMock
|
|
42
|
+
} from "../mocks/structured-clone-mock.js";
|
|
39
43
|
import {
|
|
40
44
|
clearVirtualizationMock,
|
|
41
45
|
setupVirtualizationMock
|
|
@@ -53,6 +57,7 @@ beforeAll(() => {
|
|
|
53
57
|
setupScrollIntoViewMock();
|
|
54
58
|
setupVirtualizationMock();
|
|
55
59
|
setupCryptoMock();
|
|
60
|
+
setupStructuredCloneMock();
|
|
56
61
|
});
|
|
57
62
|
afterAll(() => {
|
|
58
63
|
clearResizeObserverMock();
|
|
@@ -67,5 +72,6 @@ afterAll(() => {
|
|
|
67
72
|
clearScrollIntoViewMock();
|
|
68
73
|
clearVirtualizationMock();
|
|
69
74
|
clearCryptoMock();
|
|
75
|
+
clearStructuredCloneMock();
|
|
70
76
|
});
|
|
71
77
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/jest/setup/index.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n clearCanvasMeasureTextMock,\n setupCanvasMeasureTextMock,\n} from '../mocks/canvas-mock.js';\nimport {\n clearCreateRangeMock,\n setupCreateRangeMock,\n} from '../mocks/create-range-mock.js';\nimport { clearCryptoMock, setupCryptoMock } from '../mocks/crypto-mock.js';\nimport { setupDomRectMock, clearDomRectMock } from '../mocks/dom-rect-mock.js';\nimport {\n clearIntersectionObserverMock,\n setupIntersectionObserverMock,\n} from '../mocks/intersection-observer-mock.js';\nimport {\n setupMatchMediaMock,\n clearMatchMediaMock,\n} from '../mocks/match-media-mock.js';\nimport {\n setupOffsetWidthMock,\n clearOffsetWidthMock,\n} from '../mocks/offset-width-mock.js';\nimport {\n clearPointerEventMock,\n setupPointerEventMock,\n} from '../mocks/pointer-event-mock.js';\nimport {\n setupResizeObserverMock,\n clearResizeObserverMock,\n} from '../mocks/resize-observer-mock.js';\nimport {\n setupScreenSizeMock,\n clearScreenSizeMock,\n} from '../mocks/screen-size-mock.js';\nimport {\n clearScrollIntoViewMock,\n setupScrollIntoViewMock,\n} from '../mocks/scroll-into-view-mock.js';\nimport {\n clearVirtualizationMock,\n setupVirtualizationMock,\n} from '../mocks/virtualization-mock.js';\nbeforeAll(() => {\n setupResizeObserverMock();\n setupPointerEventMock();\n setupIntersectionObserverMock();\n setupCreateRangeMock();\n setupMatchMediaMock();\n setupDomRectMock();\n setupScreenSizeMock();\n // Special TextEllipsis setup: text length always needs to be less than container width\n setupOffsetWidthMock(0);\n setupCanvasMeasureTextMock(-Infinity);\n setupScrollIntoViewMock();\n setupVirtualizationMock();\n setupCryptoMock();\n});\n\nafterAll(() => {\n clearResizeObserverMock();\n clearPointerEventMock();\n clearIntersectionObserverMock();\n clearCreateRangeMock();\n clearOffsetWidthMock();\n clearCanvasMeasureTextMock();\n clearMatchMediaMock();\n clearDomRectMock();\n clearScreenSizeMock();\n clearScrollIntoViewMock();\n clearVirtualizationMock();\n clearCryptoMock();\n});\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB,uBAAuB;AACjD,SAAS,kBAAkB,wBAAwB;AACnD;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,UAAU,MAAM;AACd,0BAAwB;AACxB,wBAAsB;AACtB,gCAA8B;AAC9B,uBAAqB;AACrB,sBAAoB;AACpB,mBAAiB;AACjB,sBAAoB;AAEpB,uBAAqB,CAAC;AACtB,6BAA2B,SAAS;AACpC,0BAAwB;AACxB,0BAAwB;AACxB,kBAAgB;
|
|
4
|
+
"sourcesContent": ["import {\n clearCanvasMeasureTextMock,\n setupCanvasMeasureTextMock,\n} from '../mocks/canvas-mock.js';\nimport {\n clearCreateRangeMock,\n setupCreateRangeMock,\n} from '../mocks/create-range-mock.js';\nimport { clearCryptoMock, setupCryptoMock } from '../mocks/crypto-mock.js';\nimport { setupDomRectMock, clearDomRectMock } from '../mocks/dom-rect-mock.js';\nimport {\n clearIntersectionObserverMock,\n setupIntersectionObserverMock,\n} from '../mocks/intersection-observer-mock.js';\nimport {\n setupMatchMediaMock,\n clearMatchMediaMock,\n} from '../mocks/match-media-mock.js';\nimport {\n setupOffsetWidthMock,\n clearOffsetWidthMock,\n} from '../mocks/offset-width-mock.js';\nimport {\n clearPointerEventMock,\n setupPointerEventMock,\n} from '../mocks/pointer-event-mock.js';\nimport {\n setupResizeObserverMock,\n clearResizeObserverMock,\n} from '../mocks/resize-observer-mock.js';\nimport {\n setupScreenSizeMock,\n clearScreenSizeMock,\n} from '../mocks/screen-size-mock.js';\nimport {\n clearScrollIntoViewMock,\n setupScrollIntoViewMock,\n} from '../mocks/scroll-into-view-mock.js';\nimport {\n clearStructuredCloneMock,\n setupStructuredCloneMock,\n} from '../mocks/structured-clone-mock.js';\nimport {\n clearVirtualizationMock,\n setupVirtualizationMock,\n} from '../mocks/virtualization-mock.js';\nbeforeAll(() => {\n setupResizeObserverMock();\n setupPointerEventMock();\n setupIntersectionObserverMock();\n setupCreateRangeMock();\n setupMatchMediaMock();\n setupDomRectMock();\n setupScreenSizeMock();\n // Special TextEllipsis setup: text length always needs to be less than container width\n setupOffsetWidthMock(0);\n setupCanvasMeasureTextMock(-Infinity);\n setupScrollIntoViewMock();\n setupVirtualizationMock();\n setupCryptoMock();\n setupStructuredCloneMock();\n});\n\nafterAll(() => {\n clearResizeObserverMock();\n clearPointerEventMock();\n clearIntersectionObserverMock();\n clearCreateRangeMock();\n clearOffsetWidthMock();\n clearCanvasMeasureTextMock();\n clearMatchMediaMock();\n clearDomRectMock();\n clearScreenSizeMock();\n clearScrollIntoViewMock();\n clearVirtualizationMock();\n clearCryptoMock();\n clearStructuredCloneMock();\n});\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB,uBAAuB;AACjD,SAAS,kBAAkB,wBAAwB;AACnD;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,UAAU,MAAM;AACd,0BAAwB;AACxB,wBAAsB;AACtB,gCAA8B;AAC9B,uBAAqB;AACrB,sBAAoB;AACpB,mBAAiB;AACjB,sBAAoB;AAEpB,uBAAqB,CAAC;AACtB,6BAA2B,SAAS;AACpC,0BAAwB;AACxB,0BAAwB;AACxB,kBAAgB;AAChB,2BAAyB;AAC3B,CAAC;AAED,SAAS,MAAM;AACb,0BAAwB;AACxB,wBAAsB;AACtB,gCAA8B;AAC9B,uBAAqB;AACrB,uBAAqB;AACrB,6BAA2B;AAC3B,sBAAoB;AACpB,mBAAiB;AACjB,sBAAoB;AACpB,0BAAwB;AACxB,0BAAwB;AACxB,kBAAgB;AAChB,2BAAyB;AAC3B,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/jest/testing-helpers/tables/datatable.ts"],
|
|
4
|
-
"sourcesContent": ["import { act, fireEvent, screen, within } from '@testing-library/react';\nimport { PointerEventsCheckLevel } from '@testing-library/user-event';\n\nimport { setupUserEvent } from '../utils/setup-user-event.js';\n\n/** @public */\nexport class DataTableSubRowsHelper {\n constructor(private readonly rootHelper: DataTableHelper) {}\n\n private async getSubRowButton(rowId: string): Promise<HTMLButtonElement> {\n try {\n return within(this.rootHelper.element).getByLabelText<HTMLButtonElement>(\n 'subrow with id',\n {\n suggest: false,\n selector: `[data-rowid=\"${CSS.escape(rowId)}\"] button`,\n exact: false,\n },\n );\n } catch {\n throw new Error(`Unable to locate subrow expander with id \"${rowId}\"`);\n }\n }\n\n private get getToggleAllSubRowsButton(): HTMLElement {\n return within(this.rootHelper.element).getByLabelText(\n /Collapse all subrows|Expand all subrows/,\n );\n }\n\n /**\n * Return the expanded state of the passed subrow id.\n */\n async getSubRowStateById(rowId: string): Promise<boolean> {\n const subRowButton = await this.getSubRowButton(rowId);\n\n return subRowButton.getAttribute('aria-expanded') === 'true';\n }\n\n /**\n * Expands the given row identified by the passed rowId if it not yet expanded.\n */\n async expandRowById(rowId: string): Promise<void> {\n const subRowButton = await this.getSubRowButton(rowId);\n\n if (subRowButton.getAttribute('aria-expanded') === 'false') {\n const userEvent = setupUserEvent();\n await userEvent.click(subRowButton);\n }\n }\n\n /**\n * Collapses the given row identified by the passed rowId if not yet collapsed.\n */\n async collapseRowById(rowId: string): Promise<void> {\n const subRowButton = await this.getSubRowButton(rowId);\n\n if (subRowButton.getAttribute('aria-expanded') === 'true') {\n const userEvent = setupUserEvent();\n await userEvent.click(subRowButton);\n }\n }\n\n /**\n * Toggles the expanded state of a given row identified by the passed rowId if not yet collapsed.\n */\n async toggleSubRowById(rowId: string): Promise<void> {\n const subRowButton = await this.getSubRowButton(rowId);\n const userEvent = setupUserEvent();\n await userEvent.click(subRowButton);\n }\n\n /**\n * Expands/Collapses all sub rows in the table.\n */\n async toggleAllSubRows(): Promise<void> {\n const toggleAllButton = this.getToggleAllSubRowsButton;\n const userEvent = setupUserEvent();\n await userEvent.click(toggleAllButton);\n }\n}\n\n/** @public */\nexport class DataTableRowSelectionHelper {\n constructor(private readonly rootHelper: DataTableHelper) {}\n\n private async getCheckboxById(id: string): Promise<HTMLInputElement> {\n return await within(\n this.rootHelper.element,\n ).findByLabelText<HTMLInputElement>(\n `Toggle row selection for row with id \"${id}\".`,\n {\n suggest: false,\n selector: 'input',\n },\n );\n }\n\n private async getCheckboxSelectAll(): Promise<HTMLInputElement> {\n return await within(\n this.rootHelper.element,\n ).findByLabelText<HTMLInputElement>(\n // A partial of both options that could be in the aria label.\n /select all rows/i,\n {\n suggest: false,\n selector: 'input',\n },\n );\n }\n\n /**\n * Ticks the selection checkbox for a row if it is not yet selected.\n */\n async selectRowById(id: string): Promise<void> {\n const checkbox = await this.getCheckboxById(id);\n\n if (checkbox) {\n if (!checkbox.checked) {\n fireEvent.click(checkbox);\n }\n }\n }\n\n /**\n * Unselects the selection checkbox for a row if it is not selected.\n */\n async deselectRowById(id: string): Promise<void> {\n const checkbox = await this.getCheckboxById(id);\n\n if (checkbox) {\n if (checkbox.checked) {\n fireEvent.click(checkbox);\n }\n }\n }\n\n /**\n * Toggles selection on the row.\n */\n async toggleSelectionRowById(id: string): Promise<void> {\n const checkbox = await this.getCheckboxById(id);\n\n if (checkbox) {\n fireEvent.click(checkbox);\n }\n }\n\n /**\n * Toggles selection on the row with the Shift key pressed (batch selection).\n */\n async shiftToggleSelectionRowById(id: string): Promise<void> {\n const checkbox = await this.getCheckboxById(id);\n\n if (checkbox) {\n fireEvent.click(checkbox, { shiftKey: true });\n }\n }\n\n /**\n * Returns the selection state for the row with the given ID.\n */\n async getSelectionStateById(id: string): Promise<boolean | 'indeterminate'> {\n const checkbox = await this.getCheckboxById(id);\n return checkbox.indeterminate === true ? 'indeterminate' : checkbox.checked;\n }\n\n /**\n * Returns a selection state for the currently shown checkboxes (current page).\n * Hint: Elements might be virtualized or not shown on this page.\n */\n async getSelectionState(): Promise<\n Record<string, boolean | 'indeterminate'>\n > {\n const rows = await within(this.rootHelper.element).findAllByRole('row', {\n hidden: true,\n });\n const selectionState: Record<string, boolean | 'indeterminate'> = {};\n for (const row of rows) {\n const rowId = row.getAttribute('data-rowid');\n if (!rowId) {\n continue;\n }\n const checkbox = within(\n this.rootHelper.element,\n ).queryByLabelText<HTMLInputElement>(\n `Toggle row selection for row with id \"${rowId}\".`,\n {\n suggest: false,\n selector: 'input',\n },\n );\n if (!checkbox) {\n // not every row has a checkbox (e.g. expanded rows)\n continue;\n }\n selectionState[rowId] = checkbox.indeterminate\n ? 'indeterminate'\n : checkbox.checked;\n }\n return selectionState;\n }\n\n async isSelectAllDisabled(): Promise<boolean> {\n const checkbox = await this.getCheckboxSelectAll();\n const disabled = checkbox.getAttribute('aria-disabled');\n return disabled === 'true';\n }\n\n async getSelectAllState(): Promise<boolean | 'indeterminate'> {\n const checkbox = await this.getCheckboxSelectAll();\n const value = checkbox.getAttribute('aria-checked');\n\n if (value === 'true') {\n return true;\n } else if (value === 'false') {\n return false;\n } else if (value === 'mixed') {\n return 'indeterminate';\n }\n\n // Type assertion guard, as the aria-checked attribute has to be on the checkbox.\n throw new Error(\n 'Could not determine the state of the select all checkbox.',\n );\n }\n\n async toggleSelectAll(): Promise<void> {\n const checkbox = await this.getCheckboxSelectAll();\n fireEvent.click(checkbox);\n }\n}\n\n/** @public */\nexport class DataTableUserActionHelper {\n /**\n * Gets the root element of the DataTable\n */\n get element(): HTMLDivElement {\n return screen.getByTestId(this.dataTestId);\n }\n\n constructor(private readonly dataTestId: string) {}\n\n /**\n * Lets you call a HeaderAction registered on the DataTable\n */\n async activateHeaderAction(\n /** Provide the rendered header string or a RegExp that matches the header cell. */\n headerName: string | RegExp,\n /** Provide the rendered actionName string or a RegExp that matches the option. */\n actionName: string | RegExp,\n ) {\n const headerCells = await within(this.element).findAllByRole(\n 'columnheader',\n { hidden: true },\n );\n const headerCell = headerCells.find(\n (element) => element.textContent === headerName,\n );\n const headerCellRow = headerCell?.getAttribute('data-header-row');\n const headerCellColumn = headerCell?.getAttribute('data-column');\n const headerButton = document.querySelector(\n `[data-testid=\"${this.dataTestId}\"] button[data-trigger=\"useraction\"][data-header-row=\"${headerCellRow}\"][data-column=\"${headerCellColumn}\"]`,\n );\n\n if (!headerButton) {\n throw new Error(`Could not find header button for ${headerName}`);\n }\n\n fireEvent.click(headerButton);\n const menuItem = await screen.findByRole('menuitem', {\n hidden: true,\n name: actionName,\n });\n fireEvent.click(menuItem);\n }\n\n /**\n * Lets you call a CellAction registered on the DataTable\n */\n async activateCellAction(\n /** Provide the rendered header id string or a RegExp that matches the header cell. */\n headerName: string | RegExp,\n /** Zero based index for the row. */\n row: number,\n /** Provide the rendered actionName string or a RegExp that matches the option. */\n actionName: string | RegExp,\n ) {\n const userEvent = setupUserEvent({\n pointerEventsCheck: PointerEventsCheckLevel.Never,\n });\n const header = await within(this.element).findByRole('columnheader', {\n hidden: true,\n name: headerName,\n });\n\n const columnIndex = header.getAttribute('data-column');\n\n const cellActionTrigger = document.querySelector(\n `[data-testid=\"${this.dataTestId}\"] [data-row=\"${row}\"] [data-column=\"${columnIndex}\"]`,\n );\n\n if (cellActionTrigger) {\n await userEvent.pointer({\n keys: '[MouseRight]',\n target: cellActionTrigger,\n });\n\n const menuItem = await screen.findByRole('menuitem', {\n hidden: true,\n name: actionName,\n });\n await userEvent.click(menuItem);\n } else {\n throw new Error(\n `No cell action for ${headerName} (index: ${columnIndex}) / ${row} was found.`,\n );\n }\n }\n\n /**\n * Lets you call a RowAction registered on the DataTable\n */\n async activateRowAction(\n /** Zero based index for the row. */\n row: number,\n /** Provide the rendered actionName string or a RegExp that matches the option. */\n actionName: string | RegExp,\n ) {\n const userEvent = setupUserEvent({\n pointerEventsCheck: PointerEventsCheckLevel.Never,\n });\n const header = this.element.querySelector(\n '[role=\"columnheader\"][data-columnid=\"DataTableRowActions\"]',\n );\n\n if (!header) {\n throw new Error('No RowActions column was found.');\n }\n\n const columnIndex = header.getAttribute('data-column');\n const rowActionsCell = document.querySelector<HTMLElement>(\n `[data-testid=\"${this.dataTestId}\"] [data-row=\"${row}\"] [data-column=\"${columnIndex}\"]`,\n );\n if (rowActionsCell) {\n // Check if the row action is directly in the cell or hidden within the menu\n const directRowActionButton = await within(rowActionsCell).findByRole(\n 'button',\n { name: actionName },\n );\n await userEvent.click(directRowActionButton);\n } else {\n throw new Error(\n `No RowActions cell (column: ${columnIndex}) / ${row} was found.`,\n );\n }\n }\n}\n\n/** @public */\nexport class DataTablePaginationHelper {\n /**\n * Gets the root element of the DataTable\n */\n private get element(): HTMLDivElement {\n return screen.getByTestId(this.dataTestId);\n }\n\n private get paginationElement(): HTMLDivElement {\n return within(this.element).getByRole('navigation', { hidden: true });\n }\n\n private get pageSizeSelect(): HTMLDivElement {\n const inputElement = within(\n this.paginationElement,\n ).getByLabelText<HTMLInputElement>(/Select page size/, {\n suggest: false,\n });\n const triggerElement =\n inputElement.closest<HTMLDivElement>('[type=\"button\"]');\n if (triggerElement) {\n return triggerElement;\n }\n throw new Error('Trigger for the pageSizeSelect was not found.');\n }\n\n private get pageIndexSelect(): HTMLDivElement {\n const inputElement = within(\n this.paginationElement,\n ).getByLabelText<HTMLInputElement>(/Select current page/, {\n suggest: false,\n });\n const triggerElement =\n inputElement.closest<HTMLDivElement>('[type=\"button\"]');\n if (triggerElement) {\n return triggerElement;\n }\n throw new Error('Trigger for the pageIndexSelect was not found.');\n }\n\n constructor(private readonly dataTestId: string) {}\n\n /**\n * Allows you to set the pageSize via the select in the DataTable Pagination.\n * @param pageSize - Target pageSize the pagination should be set to.\n */\n async setPageSizeTo(pageSize: number) {\n await act(async () => {\n fireEvent.click(this.pageSizeSelect);\n });\n\n // Get the dropDownContext for the selection.\n\n const controlsInput = this.pageSizeSelect.querySelector('[aria-controls]');\n const controlsAria = controlsInput?.getAttribute('aria-controls');\n\n if (controlsAria) {\n const portalOutletElement = document.getElementById(controlsAria);\n\n if (portalOutletElement) {\n try {\n const selectedOption = within(portalOutletElement).getByRole(\n 'option',\n {\n name: `${pageSize}`,\n hidden: true,\n },\n );\n if (selectedOption.getAttribute('aria-selected') === 'true') {\n // The option that wants to be selected is already selected,\n // we can close the select again.\n const userEvent = setupUserEvent();\n await userEvent.keyboard('{Escape /}');\n return;\n }\n\n await act(async () => {\n fireEvent.click(selectedOption);\n });\n } catch (error) {\n throw new Error(error);\n }\n }\n }\n }\n\n /**\n * Allows you to set the pageIndex via the select in the DataTable Pagination.\n * @param pageIndex - pageIndex you want to navigate to. 0 based value\n */\n async setPageIndex(pageIndex: number) {\n act(() => {\n fireEvent.click(this.pageIndexSelect);\n });\n\n // Get the dropDownContext for the selection.\n\n const controlsInput = this.pageIndexSelect.querySelector('[aria-controls]');\n const controlsAria = controlsInput?.getAttribute('aria-controls');\n\n if (controlsAria) {\n const portalOutletElement = document.getElementById(controlsAria);\n\n if (portalOutletElement) {\n try {\n const selectedOption = within(portalOutletElement).getByRole(\n 'option',\n {\n name: `${pageIndex + 1}`,\n hidden: true,\n },\n );\n if (selectedOption.getAttribute('aria-selected') === 'true') {\n // The option that wants to be selected is already selected,\n // we can close the select again.\n const userEvent = setupUserEvent();\n await userEvent.keyboard('{Escape /}');\n return;\n }\n\n act(() => {\n fireEvent.click(selectedOption);\n });\n } catch (error) {\n throw new Error(error);\n }\n }\n }\n }\n\n /**\n * Allows you to go to the next page using the \"Next page\" button.\n */\n async goToNextPage() {\n const nextButton = screen.getByRole('button', { name: /Go to next page/ });\n const userEvent = setupUserEvent();\n await userEvent.click(nextButton);\n }\n\n /**\n * Allows you to go to the previous page using the \"Previous page\" button.\n */\n async goToPreviousPage() {\n const previousButton = screen.getByRole('button', {\n name: /Go to previous page/,\n });\n const userEvent = setupUserEvent();\n await userEvent.click(previousButton);\n }\n}\n\ntype CurrentSort = Awaited<\n ReturnType<DataTableSortingHelper['getSortingDirection']>\n>;\n\ntype TargetSort = 'ascending' | 'descending' | undefined;\n\ntype SortCombination = `from-${Exclude<\n CurrentSort,\n 'other' | null\n>}-to-${Exclude<TargetSort, undefined>}`;\n\nconst getSortCombination = (\n current: CurrentSort,\n target: TargetSort,\n): SortCombination | undefined => {\n if (!current || current === 'other' || !target) {\n return undefined;\n }\n\n return `from-${current}-to-${target}`;\n};\n\n/** @public */\nexport class DataTableSortingHelper {\n /**\n * Gets the root element of the DataTable\n */\n get element(): HTMLDivElement {\n return screen.getByTestId(this.dataTestId);\n }\n\n constructor(\n private readonly dataTestId: string,\n private readonly rootHelper: DataTableHelper,\n ) {}\n\n /**\n * Get a column header by header name\n */\n async getColumnHeader(headerName: string | RegExp) {\n return (await within(this.element).findByText(headerName)).closest(\n '[role=\"columnheader\"]',\n );\n }\n\n /**\n * Will return the current sorting direction of the column provided by the parameter.\n */\n async getSortingDirection(\n /** Provide the rendered header string or a RegExp that matches the header cell. */\n headerName: string | RegExp,\n ): Promise<'none' | 'ascending' | 'descending' | 'other' | null> {\n const header = await this.getColumnHeader(headerName);\n\n if (header) {\n return header.getAttribute('aria-sort') as\n | 'none'\n | 'ascending'\n | 'descending'\n | 'other';\n }\n\n return null;\n }\n\n /**\n * Will return the current `sortDescFirst` attribute of the column provided by the parameter.\n */\n async getSortDescFirst(\n /** Provide the rendered header string or a RegExp that matches the header cell. */\n headerName: string | RegExp,\n ): Promise<boolean> {\n const header = await this.getColumnHeader(headerName);\n\n if (header) {\n return (header as HTMLElement).dataset.sortDescFirst === 'true';\n }\n return false;\n }\n\n /**\n * Lets you sort the column.\n */\n async sortColumn(\n /**\n * Header name that should be sorted.\n */\n headerName: string | RegExp,\n options?: {\n /**\n * The sorting direction needs to be specified when the column has sorting triggers located inside the actions menu.\n */\n direction?: 'ascending' | 'descending';\n /**\n * Enables multi-sorting. The table will sort by the specified column in addition to the columns that are already sorted.\n */\n multiSorting?: boolean;\n },\n ) {\n const userEvent = setupUserEvent({\n pointerEventsCheck: PointerEventsCheckLevel.Never,\n });\n\n const header = await this.getColumnHeader(headerName);\n\n const [currentSortDirection, sortDescFirst] = await Promise.all([\n this.getSortingDirection(headerName),\n this.getSortDescFirst(headerName),\n ]);\n\n const columnIndex = header?.getAttribute('data-column') || null;\n const headerRowIndex = header?.getAttribute('data-header-row') || null;\n\n if (columnIndex === null || headerRowIndex === null) {\n return;\n }\n\n const headerButtonTrigger = document.querySelector<HTMLElement>(\n `[data-testid=\"${this.dataTestId}\"] [data-header-row=\"${headerRowIndex}\"][data-column=\"${columnIndex}\"]`,\n );\n\n const actionType = headerButtonTrigger\n ?.getAttribute('aria-label')\n ?.includes('sorting')\n ? 'sortButton'\n : 'headerAction';\n\n if (!headerButtonTrigger || !actionType) {\n return;\n }\n\n if (actionType === 'headerAction') {\n const actionName = `Sort ${options?.direction}`;\n await this.rootHelper.userActions.activateHeaderAction(\n headerName,\n actionName,\n );\n\n return;\n }\n\n if (options?.multiSorting) {\n await userEvent.keyboard('[ShiftLeft>]');\n }\n\n const combination = getSortCombination(\n currentSortDirection,\n options?.direction,\n );\n if (!combination) {\n // default behaviour in case no direction was provided.\n await userEvent.click(headerButtonTrigger);\n return;\n }\n\n if (sortDescFirst) {\n switch (combination) {\n case 'from-none-to-ascending': {\n await userEvent.click(headerButtonTrigger);\n await userEvent.click(headerButtonTrigger);\n return;\n }\n case 'from-none-to-descending': {\n await userEvent.click(headerButtonTrigger);\n return;\n }\n case 'from-ascending-to-descending': {\n await userEvent.click(headerButtonTrigger);\n await userEvent.click(headerButtonTrigger);\n return;\n }\n case 'from-descending-to-ascending': {\n await userEvent.click(headerButtonTrigger);\n return;\n }\n }\n }\n\n switch (combination) {\n case 'from-none-to-ascending': {\n await userEvent.click(headerButtonTrigger);\n return;\n }\n case 'from-none-to-descending': {\n await userEvent.click(headerButtonTrigger);\n await userEvent.click(headerButtonTrigger);\n return;\n }\n case 'from-ascending-to-descending': {\n await userEvent.click(headerButtonTrigger);\n return;\n }\n case 'from-descending-to-ascending': {\n await userEvent.click(headerButtonTrigger);\n await userEvent.click(headerButtonTrigger);\n return;\n }\n }\n }\n}\n\n/** @public */\nexport class DataTableInteractiveRowsHelper {\n constructor(private readonly _rootHelper: DataTableHelper) {}\n\n /**\n * Returns the id of the currently active row or null if no rows are selected.\n */\n async getActivatedRowId(): Promise<string | null> {\n const activatedRow = await within(\n this._rootHelper.element,\n ).queryByLabelText(/Deactivate row with id/i, {\n selector: '[data-trigger=\"interactive-row\"]',\n });\n\n if (activatedRow) {\n return activatedRow.getAttribute('data-rowid') ?? null;\n }\n return null;\n }\n\n /**\n * Toggles the row identified by the given rowId as active.\n */\n async toggleActiveRow(rowId: string): Promise<void> {\n const activatedRow = await within(this._rootHelper.element).findByLabelText(\n /(Activate|Deactivate) row with id/i,\n {\n selector: `[data-rowid=\"${CSS.escape(\n rowId,\n )}\"][data-trigger=\"interactive-row\"]`,\n },\n );\n const userEvent = setupUserEvent();\n await userEvent.click(activatedRow);\n }\n}\n\n/** @public */\nexport class DataTableDownloadHelper {\n constructor(private readonly rootHelper: DataTableHelper) {}\n\n private async getDownloadMenuTrigger(): Promise<HTMLButtonElement> {\n const menuToggle = await within(\n this.rootHelper.element,\n ).getByLabelText<HTMLButtonElement>(/Download table data/, {\n suggest: false,\n selector: 'button',\n });\n\n return menuToggle;\n }\n\n private async openDownloadMenu(): Promise<void> {\n const isMenuOpen = await this.isMenuOpen();\n if (!isMenuOpen) {\n const trigger = await this.getDownloadMenuTrigger();\n fireEvent.click(trigger);\n }\n }\n\n private async isMenuOpen(): Promise<boolean> {\n const trigger = await this.getDownloadMenuTrigger();\n return trigger.getAttribute('aria-expanded') === 'true';\n }\n\n private async getMenuItem(name: string | RegExp): Promise<HTMLElement> {\n return screen.getByRole('menuitem', { suggest: false, hidden: true, name });\n }\n\n /**\n * Activates the _download all_ item in the DataTable.Toolbar menu.\n */\n async downloadAllCSV() {\n await this.openDownloadMenu();\n\n const downloadAll = await this.getMenuItem(/All/);\n fireEvent.click(downloadAll);\n }\n\n /**\n * Activates the _download current page_ item in the DataTable.Toolbar menu.\n */\n async downloadPageCSV() {\n await this.openDownloadMenu();\n\n const downloadPage = await this.getMenuItem(/Current page/);\n fireEvent.click(downloadPage);\n }\n\n /**\n * Activates the _download selected_ item in the DataTable.Toolbar menu.\n */\n async downloadSelectedRowsCSV() {\n await this.openDownloadMenu();\n\n const downloadSelected = await this.getMenuItem(/Selected rows/);\n fireEvent.click(downloadSelected);\n }\n}\n\n/** @public */\nexport class DataTableExpandableRowHelper {\n constructor(private readonly rootHelper: DataTableHelper) {}\n\n getExpandedRowIds(): Array<string> {\n const expandedRows =\n this.rootHelper.element.querySelectorAll<HTMLDivElement>(\n '[role=\"row\"][data-rowid$=\"-expanded\"]',\n );\n const result: Array<string> = [];\n for (const expandedRow of Array.from(expandedRows)) {\n const { rowid } = expandedRow.dataset;\n if (rowid) {\n result.push(rowid.replace('-expanded', ''));\n }\n }\n return result;\n }\n\n async expandRowById(rowId: string): Promise<void> {\n const rowDetailsTrigger = await within(\n this.rootHelper.element,\n ).findByLabelText(/Expand row with id/, {\n suggest: false,\n exact: false,\n selector: `[data-rowid=\"${CSS.escape(rowId)}\"] button`,\n });\n if (rowDetailsTrigger) {\n const expanded = rowDetailsTrigger.getAttribute('aria-expanded');\n if (expanded === 'false') {\n const userEvent = setupUserEvent();\n await userEvent.click(rowDetailsTrigger);\n }\n }\n }\n\n async collapseRowById(rowId: string): Promise<void> {\n const rowDetailsTrigger = await within(\n this.rootHelper.element,\n ).findByLabelText(/Collapse row with id/, {\n suggest: false,\n exact: false,\n selector: `[data-rowid=\"${CSS.escape(rowId)}\"] button`,\n });\n if (rowDetailsTrigger) {\n const expanded = rowDetailsTrigger.getAttribute('aria-expanded');\n if (expanded === 'true') {\n const userEvent = setupUserEvent();\n await userEvent.click(rowDetailsTrigger);\n }\n }\n }\n\n async toggleRowById(rowId: string): Promise<void> {\n const rowDetailsTrigger = await within(\n this.rootHelper.element,\n ).findByLabelText(/(Expand|Collapse) row with id/, {\n suggest: false,\n exact: false,\n selector: `[data-rowid=\"${CSS.escape(rowId)}\"] button`,\n });\n if (rowDetailsTrigger) {\n const userEvent = setupUserEvent();\n await userEvent.click(rowDetailsTrigger);\n }\n }\n}\n\n/** @public */\nexport class DataTableHelper {\n private get tableElement(): HTMLDivElement {\n return within(this.element).getByRole('grid', { hidden: true });\n }\n\n private getHeaderRow(index: number): Array<HTMLDivElement> {\n const headerCells = this.tableElement.querySelectorAll<HTMLDivElement>(\n `[role=\"columnheader\"][data-header-row=\"${index}\"]`,\n );\n return Array.from(headerCells);\n }\n\n private getAllCellsInBodyRow(index: number): Array<HTMLDivElement> {\n const rowCells = this.tableElement.querySelectorAll<HTMLDivElement>(\n `[data-rowgroup=\"body\"] [data-row=\"${index}\"] [role=\"cell\"]`,\n );\n return Array.from(rowCells);\n }\n\n userActions: DataTableUserActionHelper;\n pagination: DataTablePaginationHelper;\n sorting: DataTableSortingHelper;\n rowSelection: DataTableRowSelectionHelper;\n subRows: DataTableSubRowsHelper;\n interactiveRows: DataTableInteractiveRowsHelper;\n download: DataTableDownloadHelper;\n expandableRows: DataTableExpandableRowHelper;\n\n constructor(private readonly dataTestId: string) {\n this.userActions = new DataTableUserActionHelper(dataTestId);\n this.pagination = new DataTablePaginationHelper(dataTestId);\n this.sorting = new DataTableSortingHelper(dataTestId, this);\n this.rowSelection = new DataTableRowSelectionHelper(this);\n this.subRows = new DataTableSubRowsHelper(this);\n this.interactiveRows = new DataTableInteractiveRowsHelper(this);\n this.download = new DataTableDownloadHelper(this);\n this.expandableRows = new DataTableExpandableRowHelper(this);\n }\n\n /**\n * Gets the root element of the DataTable\n */\n get element(): HTMLDivElement {\n return screen.getByTestId(this.dataTestId);\n }\n\n get headerRowCount(): number {\n const headerCells = this.tableElement.querySelectorAll<HTMLDivElement>(\n '[role=\"columnheader\"]',\n );\n const uniqueRows = new Set<string>();\n for (const headerCell of Array.from(headerCells)) {\n const headerRowAttr = headerCell.dataset.headerRow;\n if (headerRowAttr) {\n uniqueRows.add(headerRowAttr);\n }\n }\n\n return uniqueRows.size;\n }\n\n getHeaderRowContent(index: number): Array<string | null> {\n return this.getHeaderRow(index).map((element) => element.textContent);\n }\n\n getRowContent(index: number): Array<string | null> {\n return this.getAllCellsInBodyRow(index).map(\n (element) => element.textContent,\n );\n }\n\n get rowCount(): number {\n const rows = this.tableElement.querySelectorAll<HTMLDivElement>(\n '[data-rowgroup=\"body\"] [role=\"row\"]:not([data-rowid*=\"expanded\"])',\n );\n return rows.length;\n }\n}\n\n/** @public */\nexport function getDataTableHelper(testid: string) {\n return new DataTableHelper(testid);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { act, fireEvent, screen, within } from '@testing-library/react';\nimport { PointerEventsCheckLevel } from '@testing-library/user-event';\n\nimport { setupUserEvent } from '../utils/setup-user-event.js';\n\n/** @public */\nexport class DataTableSubRowsHelper {\n constructor(private readonly rootHelper: DataTableHelper) {}\n\n private async getSubRowButton(rowId: string): Promise<HTMLButtonElement> {\n try {\n return within(this.rootHelper.element).getByLabelText<HTMLButtonElement>(\n 'subrow with id',\n {\n suggest: false,\n selector: `[data-rowid=\"${CSS.escape(rowId)}\"] button`,\n exact: false,\n },\n );\n } catch {\n throw new Error(`Unable to locate subrow expander with id \"${rowId}\"`);\n }\n }\n\n private get getToggleAllSubRowsButton(): HTMLElement {\n return within(this.rootHelper.element).getByLabelText(\n /Collapse all subrows|Expand all subrows/,\n );\n }\n\n /**\n * Return the expanded state of the passed subrow id.\n */\n async getSubRowStateById(rowId: string): Promise<boolean> {\n const subRowButton = await this.getSubRowButton(rowId);\n\n return subRowButton.getAttribute('aria-expanded') === 'true';\n }\n\n /**\n * Expands the given row identified by the passed rowId if it not yet expanded.\n */\n async expandRowById(rowId: string): Promise<void> {\n const subRowButton = await this.getSubRowButton(rowId);\n\n if (subRowButton.getAttribute('aria-expanded') === 'false') {\n const userEvent = setupUserEvent();\n await userEvent.click(subRowButton);\n }\n }\n\n /**\n * Collapses the given row identified by the passed rowId if not yet collapsed.\n */\n async collapseRowById(rowId: string): Promise<void> {\n const subRowButton = await this.getSubRowButton(rowId);\n\n if (subRowButton.getAttribute('aria-expanded') === 'true') {\n const userEvent = setupUserEvent();\n await userEvent.click(subRowButton);\n }\n }\n\n /**\n * Toggles the expanded state of a given row identified by the passed rowId if not yet collapsed.\n */\n async toggleSubRowById(rowId: string): Promise<void> {\n const subRowButton = await this.getSubRowButton(rowId);\n const userEvent = setupUserEvent();\n await userEvent.click(subRowButton);\n }\n\n /**\n * Expands/Collapses all sub rows in the table.\n */\n async toggleAllSubRows(): Promise<void> {\n const toggleAllButton = this.getToggleAllSubRowsButton;\n const userEvent = setupUserEvent();\n await userEvent.click(toggleAllButton);\n }\n}\n\n/** @public */\nexport class DataTableRowSelectionHelper {\n constructor(private readonly rootHelper: DataTableHelper) {}\n\n private async getCheckboxById(id: string): Promise<HTMLInputElement> {\n return await within(\n this.rootHelper.element,\n ).findByLabelText<HTMLInputElement>(\n `Toggle row selection for row with id \"${id}\".`,\n {\n suggest: false,\n selector: 'input',\n },\n );\n }\n\n private async getCheckboxSelectAll(): Promise<HTMLInputElement> {\n return await within(\n this.rootHelper.element,\n ).findByLabelText<HTMLInputElement>(\n // A partial of both options that could be in the aria label.\n /select all rows/i,\n {\n suggest: false,\n selector: 'input',\n },\n );\n }\n\n /**\n * Ticks the selection checkbox for a row if it is not yet selected.\n */\n async selectRowById(id: string): Promise<void> {\n const checkbox = await this.getCheckboxById(id);\n\n if (checkbox) {\n if (!checkbox.checked) {\n fireEvent.click(checkbox);\n }\n }\n }\n\n /**\n * Unselects the selection checkbox for a row if it is not selected.\n */\n async deselectRowById(id: string): Promise<void> {\n const checkbox = await this.getCheckboxById(id);\n\n if (checkbox) {\n if (checkbox.checked) {\n fireEvent.click(checkbox);\n }\n }\n }\n\n /**\n * Toggles selection on the row.\n */\n async toggleSelectionRowById(id: string): Promise<void> {\n const checkbox = await this.getCheckboxById(id);\n\n if (checkbox) {\n fireEvent.click(checkbox);\n }\n }\n\n /**\n * Toggles selection on the row with the Shift key pressed (batch selection).\n */\n async shiftToggleSelectionRowById(id: string): Promise<void> {\n const checkbox = await this.getCheckboxById(id);\n\n if (checkbox) {\n fireEvent.click(checkbox, { shiftKey: true });\n }\n }\n\n /**\n * Returns the selection state for the row with the given ID.\n */\n async getSelectionStateById(id: string): Promise<boolean | 'indeterminate'> {\n const checkbox = await this.getCheckboxById(id);\n return checkbox.indeterminate === true ? 'indeterminate' : checkbox.checked;\n }\n\n /**\n * Returns a selection state for the currently shown checkboxes (current page).\n * Hint: Elements might be virtualized or not shown on this page.\n */\n async getSelectionState(): Promise<\n Record<string, boolean | 'indeterminate'>\n > {\n const rows = await within(this.rootHelper.element).findAllByRole('row', {\n hidden: true,\n });\n const selectionState: Record<string, boolean | 'indeterminate'> = {};\n for (const row of rows) {\n const rowId = row.getAttribute('data-rowid');\n if (!rowId) {\n continue;\n }\n const checkbox = within(\n this.rootHelper.element,\n ).queryByLabelText<HTMLInputElement>(\n `Toggle row selection for row with id \"${rowId}\".`,\n {\n suggest: false,\n selector: 'input',\n },\n );\n if (!checkbox) {\n // not every row has a checkbox (e.g. expanded rows)\n continue;\n }\n selectionState[rowId] = checkbox.indeterminate\n ? 'indeterminate'\n : checkbox.checked;\n }\n return selectionState;\n }\n\n async isSelectAllDisabled(): Promise<boolean> {\n const checkbox = await this.getCheckboxSelectAll();\n const disabled = checkbox.getAttribute('aria-disabled');\n return disabled === 'true';\n }\n\n async getSelectAllState(): Promise<boolean | 'indeterminate'> {\n const checkbox = await this.getCheckboxSelectAll();\n const value = checkbox.getAttribute('aria-checked');\n\n if (value === 'true') {\n return true;\n } else if (value === 'false') {\n return false;\n } else if (value === 'mixed') {\n return 'indeterminate';\n }\n\n // Type assertion guard, as the aria-checked attribute has to be on the checkbox.\n throw new Error(\n 'Could not determine the state of the select all checkbox.',\n );\n }\n\n async toggleSelectAll(): Promise<void> {\n const checkbox = await this.getCheckboxSelectAll();\n fireEvent.click(checkbox);\n }\n}\n\n/** @public */\nexport class DataTableUserActionHelper {\n /**\n * Gets the root element of the DataTable\n */\n get element(): HTMLDivElement {\n return screen.getByTestId(this.dataTestId);\n }\n\n constructor(private readonly dataTestId: string) {}\n\n /**\n * Lets you call a HeaderAction registered on the DataTable\n */\n async activateHeaderAction(\n /** Provide the rendered header string or a RegExp that matches the header cell. */\n headerName: string | RegExp,\n /** Provide the rendered actionName string or a RegExp that matches the option. */\n actionName: string | RegExp,\n ) {\n const headerCells = await within(this.element).findAllByRole(\n 'columnheader',\n { hidden: true },\n );\n const headerCell = headerCells.find(\n (element) => element.textContent === headerName,\n );\n const headerCellRow = headerCell?.getAttribute('data-header-row');\n const headerCellColumn = headerCell?.getAttribute('data-column');\n const headerButton = document.querySelector(\n `[data-testid=\"${this.dataTestId}\"] button[data-trigger=\"useraction\"][data-header-row=\"${headerCellRow}\"][data-column=\"${headerCellColumn}\"]`,\n );\n\n if (!headerButton) {\n throw new Error(`Could not find header button for ${headerName}`);\n }\n\n fireEvent.click(headerButton);\n const menuItem = await screen.findByRole('menuitem', {\n hidden: true,\n name: actionName,\n });\n fireEvent.click(menuItem);\n }\n\n /**\n * Lets you call a CellAction registered on the DataTable\n */\n async activateCellAction(\n /** Provide the rendered header id string or a RegExp that matches the header cell. */\n headerName: string | RegExp,\n /** Zero based index for the row. */\n row: number,\n /** Provide the rendered actionName string or a RegExp that matches the option. */\n actionName: string | RegExp,\n ) {\n const userEvent = setupUserEvent({\n pointerEventsCheck: PointerEventsCheckLevel.Never,\n });\n const header = await within(this.element).findByRole('columnheader', {\n hidden: true,\n name: headerName,\n });\n\n const columnIndex = header.getAttribute('data-column');\n\n const cellActionTrigger = document.querySelector(\n `[data-testid=\"${this.dataTestId}\"] [data-row=\"${row}\"] [data-column=\"${columnIndex}\"]`,\n );\n\n if (cellActionTrigger) {\n await userEvent.pointer({\n keys: '[MouseRight]',\n target: cellActionTrigger,\n });\n\n const menuItem = await screen.findByRole('menuitem', {\n hidden: true,\n name: actionName,\n });\n await userEvent.click(menuItem);\n } else {\n throw new Error(\n `No cell action for ${headerName} (index: ${columnIndex}) / ${row} was found.`,\n );\n }\n }\n\n /**\n * Lets you call a RowAction registered on the DataTable\n */\n async activateRowAction(\n /** Zero based index for the row. */\n row: number,\n /** Provide the rendered actionName string or a RegExp that matches the option. */\n actionName: string | RegExp,\n ) {\n const userEvent = setupUserEvent({\n pointerEventsCheck: PointerEventsCheckLevel.Never,\n });\n const header = this.element.querySelector(\n '[role=\"columnheader\"][data-columnid=\"DataTableRowActions\"]',\n );\n\n if (!header) {\n throw new Error('No RowActions column was found.');\n }\n\n const columnIndex = header.getAttribute('data-column');\n const rowActionsCell = document.querySelector<HTMLElement>(\n `[data-testid=\"${this.dataTestId}\"] [data-row=\"${row}\"] [data-column=\"${columnIndex}\"]`,\n );\n if (rowActionsCell) {\n // Check if the row action is directly in the cell or hidden within the menu\n const directRowActionButton = await within(rowActionsCell).findByRole(\n 'button',\n { name: actionName },\n );\n await userEvent.click(directRowActionButton);\n } else {\n throw new Error(\n `No RowActions cell (column: ${columnIndex}) / ${row} was found.`,\n );\n }\n }\n}\n\n/** @public */\nexport class DataTablePaginationHelper {\n /**\n * Gets the root element of the DataTable\n */\n private get element(): HTMLDivElement {\n return screen.getByTestId(this.dataTestId);\n }\n\n private get paginationElement(): HTMLDivElement {\n return within(this.element).getByRole('navigation', { hidden: true });\n }\n\n private get pageSizeSelect(): HTMLDivElement {\n const inputElement = within(\n this.paginationElement,\n ).getByLabelText<HTMLInputElement>(/Select page size/, {\n suggest: false,\n });\n const triggerElement =\n inputElement.closest<HTMLDivElement>('[type=\"button\"]');\n if (triggerElement) {\n return triggerElement;\n }\n throw new Error('Trigger for the pageSizeSelect was not found.');\n }\n\n private get pageIndexSelect(): HTMLDivElement {\n const inputElement = within(\n this.paginationElement,\n ).getByLabelText<HTMLInputElement>(/Select current page/, {\n suggest: false,\n });\n const triggerElement =\n inputElement.closest<HTMLDivElement>('[type=\"button\"]');\n if (triggerElement) {\n return triggerElement;\n }\n throw new Error('Trigger for the pageIndexSelect was not found.');\n }\n\n constructor(private readonly dataTestId: string) {}\n\n /**\n * Allows you to set the pageSize via the select in the DataTable Pagination.\n * @param pageSize - Target pageSize the pagination should be set to.\n */\n async setPageSizeTo(pageSize: number) {\n await act(async () => {\n fireEvent.click(this.pageSizeSelect);\n });\n\n // Get the dropDownContext for the selection.\n\n const controlsInput = this.pageSizeSelect.querySelector('[aria-controls]');\n const controlsAria = controlsInput?.getAttribute('aria-controls');\n\n if (controlsAria) {\n const portalOutletElement = document.getElementById(controlsAria);\n\n if (portalOutletElement) {\n try {\n const selectedOption = within(portalOutletElement).getByRole(\n 'option',\n {\n name: `${pageSize}`,\n hidden: true,\n },\n );\n if (selectedOption.getAttribute('aria-selected') === 'true') {\n // The option that wants to be selected is already selected,\n // we can close the select again.\n const userEvent = setupUserEvent();\n await userEvent.keyboard('{Escape /}');\n return;\n }\n\n await act(async () => {\n fireEvent.click(selectedOption);\n });\n } catch (error) {\n throw new Error(error);\n }\n }\n }\n }\n\n /**\n * Allows you to set the pageIndex via the select in the DataTable Pagination.\n * @param pageIndex - pageIndex you want to navigate to. 0 based value\n */\n async setPageIndex(pageIndex: number) {\n act(() => {\n fireEvent.click(this.pageIndexSelect);\n });\n\n // Get the dropDownContext for the selection.\n\n const controlsInput = this.pageIndexSelect.querySelector('[aria-controls]');\n const controlsAria = controlsInput?.getAttribute('aria-controls');\n\n if (controlsAria) {\n const portalOutletElement = document.getElementById(controlsAria);\n\n if (portalOutletElement) {\n try {\n const selectedOption = within(portalOutletElement).getByRole(\n 'option',\n {\n name: `${pageIndex + 1}`,\n hidden: true,\n },\n );\n if (selectedOption.getAttribute('aria-selected') === 'true') {\n // The option that wants to be selected is already selected,\n // we can close the select again.\n const userEvent = setupUserEvent();\n await userEvent.keyboard('{Escape /}');\n return;\n }\n\n act(() => {\n fireEvent.click(selectedOption);\n });\n } catch (error) {\n throw new Error(error);\n }\n }\n }\n }\n\n /**\n * Allows you to go to the next page using the \"Next page\" button.\n */\n async goToNextPage() {\n const nextButton = screen.getByRole('button', { name: /Go to next page/ });\n const userEvent = setupUserEvent();\n await userEvent.click(nextButton);\n }\n\n /**\n * Allows you to go to the previous page using the \"Previous page\" button.\n */\n async goToPreviousPage() {\n const previousButton = screen.getByRole('button', {\n name: /Go to previous page/,\n });\n const userEvent = setupUserEvent();\n await userEvent.click(previousButton);\n }\n}\n\ntype CurrentSort = Awaited<\n ReturnType<DataTableSortingHelper['getSortingDirection']>\n>;\n\ntype TargetSort = 'ascending' | 'descending' | undefined;\n\ntype SortCombination = `from-${Exclude<\n CurrentSort,\n 'other' | null\n>}-to-${Exclude<TargetSort, undefined>}`;\n\nconst getSortCombination = (\n current: CurrentSort,\n target: TargetSort,\n): SortCombination | undefined => {\n if (!current || current === 'other' || !target) {\n return undefined;\n }\n\n return `from-${current}-to-${target}`;\n};\n\n/** @public */\nexport class DataTableSortingHelper {\n /**\n * Gets the root element of the DataTable\n */\n get element(): HTMLDivElement {\n return screen.getByTestId(this.dataTestId);\n }\n\n constructor(\n private readonly dataTestId: string,\n private readonly rootHelper: DataTableHelper,\n ) {}\n\n /**\n * Get a column header by header name\n */\n async getColumnHeader(headerName: string | RegExp) {\n return (await within(this.element).findByText(headerName)).closest(\n '[role=\"columnheader\"]',\n );\n }\n\n /**\n * Will return the current sorting direction of the column provided by the parameter.\n */\n async getSortingDirection(\n /** Provide the rendered header string or a RegExp that matches the header cell. */\n headerName: string | RegExp,\n ): Promise<'none' | 'ascending' | 'descending' | 'other' | null> {\n const header = await this.getColumnHeader(headerName);\n if (header) {\n return header.getAttribute('aria-sort') as\n | 'none'\n | 'ascending'\n | 'descending'\n | 'other';\n }\n\n return null;\n }\n\n /**\n * Will return the current `sortDescFirst` attribute of the column provided by the parameter.\n */\n async getSortDescFirst(\n /** Provide the rendered header string or a RegExp that matches the header cell. */\n headerName: string | RegExp,\n ): Promise<boolean> {\n const header = await this.getColumnHeader(headerName);\n\n if (header) {\n return (header as HTMLElement).dataset.sortDescFirst === 'true';\n }\n return false;\n }\n\n /**\n * Lets you sort the column.\n */\n async sortColumn(\n /**\n * Header name that should be sorted.\n */\n headerName: string | RegExp,\n options?: {\n /**\n * The sorting direction needs to be specified when the column has sorting triggers located inside the actions menu.\n */\n direction?: 'ascending' | 'descending';\n /**\n * Enables multi-sorting. The table will sort by the specified column in addition to the columns that are already sorted.\n */\n multiSorting?: boolean;\n },\n ) {\n const userEvent = setupUserEvent({\n pointerEventsCheck: PointerEventsCheckLevel.Never,\n });\n\n const header = await this.getColumnHeader(headerName);\n\n const [currentSortDirection, sortDescFirst] = await Promise.all([\n this.getSortingDirection(headerName),\n this.getSortDescFirst(headerName),\n ]);\n\n const columnIndex = header?.getAttribute('data-column') || null;\n const headerRowIndex = header?.getAttribute('data-header-row') || null;\n\n if (columnIndex === null || headerRowIndex === null) {\n return;\n }\n\n const headerButtonTrigger = document.querySelector<HTMLElement>(\n `[data-testid=\"${this.dataTestId}\"] [data-header-row=\"${headerRowIndex}\"][data-column=\"${columnIndex}\"]`,\n );\n\n const actionType = headerButtonTrigger\n ?.getAttribute('aria-label')\n ?.includes('sorting')\n ? 'sortButton'\n : 'headerAction';\n\n if (!headerButtonTrigger || !actionType) {\n return;\n }\n\n if (actionType === 'headerAction') {\n const actionName = `Sort ${options?.direction}`;\n await this.rootHelper.userActions.activateHeaderAction(\n headerName,\n actionName,\n );\n\n return;\n }\n\n if (options?.multiSorting) {\n await userEvent.keyboard('[ShiftLeft>]');\n }\n\n const combination = getSortCombination(\n currentSortDirection,\n options?.direction,\n );\n if (!combination) {\n // default behaviour in case no direction was provided.\n await userEvent.click(headerButtonTrigger);\n return;\n }\n\n if (sortDescFirst) {\n switch (combination) {\n case 'from-none-to-ascending': {\n await userEvent.click(headerButtonTrigger);\n await userEvent.click(headerButtonTrigger);\n return;\n }\n case 'from-none-to-descending': {\n await userEvent.click(headerButtonTrigger);\n return;\n }\n case 'from-ascending-to-descending': {\n await userEvent.click(headerButtonTrigger);\n await userEvent.click(headerButtonTrigger);\n return;\n }\n case 'from-descending-to-ascending': {\n await userEvent.click(headerButtonTrigger);\n return;\n }\n }\n }\n\n switch (combination) {\n case 'from-none-to-ascending': {\n await userEvent.click(headerButtonTrigger);\n return;\n }\n case 'from-none-to-descending': {\n await userEvent.click(headerButtonTrigger);\n await userEvent.click(headerButtonTrigger);\n return;\n }\n case 'from-ascending-to-descending': {\n await userEvent.click(headerButtonTrigger);\n return;\n }\n case 'from-descending-to-ascending': {\n await userEvent.click(headerButtonTrigger);\n await userEvent.click(headerButtonTrigger);\n return;\n }\n }\n }\n}\n\n/** @public */\nexport class DataTableInteractiveRowsHelper {\n constructor(private readonly _rootHelper: DataTableHelper) {}\n\n /**\n * Returns the id of the currently active row or null if no rows are selected.\n */\n async getActivatedRowId(): Promise<string | null> {\n const activatedRow = await within(\n this._rootHelper.element,\n ).queryByLabelText(/Deactivate row with id/i, {\n selector: '[data-trigger=\"interactive-row\"]',\n });\n\n if (activatedRow) {\n return activatedRow.getAttribute('data-rowid') ?? null;\n }\n return null;\n }\n\n /**\n * Toggles the row identified by the given rowId as active.\n */\n async toggleActiveRow(rowId: string): Promise<void> {\n const activatedRow = await within(this._rootHelper.element).findByLabelText(\n /(Activate|Deactivate) row with id/i,\n {\n selector: `[data-rowid=\"${CSS.escape(\n rowId,\n )}\"][data-trigger=\"interactive-row\"]`,\n },\n );\n const userEvent = setupUserEvent();\n await userEvent.click(activatedRow);\n }\n}\n\n/** @public */\nexport class DataTableDownloadHelper {\n constructor(private readonly rootHelper: DataTableHelper) {}\n\n private async getDownloadMenuTrigger(): Promise<HTMLButtonElement> {\n const menuToggle = await within(\n this.rootHelper.element,\n ).getByLabelText<HTMLButtonElement>(/Download table data/, {\n suggest: false,\n selector: 'button',\n });\n\n return menuToggle;\n }\n\n private async openDownloadMenu(): Promise<void> {\n const isMenuOpen = await this.isMenuOpen();\n if (!isMenuOpen) {\n const trigger = await this.getDownloadMenuTrigger();\n fireEvent.click(trigger);\n }\n }\n\n private async isMenuOpen(): Promise<boolean> {\n const trigger = await this.getDownloadMenuTrigger();\n return trigger.getAttribute('aria-expanded') === 'true';\n }\n\n private async getMenuItem(name: string | RegExp): Promise<HTMLElement> {\n return screen.getByRole('menuitem', { suggest: false, hidden: true, name });\n }\n\n /**\n * Activates the _download all_ item in the DataTable.Toolbar menu.\n */\n async downloadAllCSV() {\n await this.openDownloadMenu();\n\n const downloadAll = await this.getMenuItem(/All/);\n fireEvent.click(downloadAll);\n }\n\n /**\n * Activates the _download current page_ item in the DataTable.Toolbar menu.\n */\n async downloadPageCSV() {\n await this.openDownloadMenu();\n\n const downloadPage = await this.getMenuItem(/Current page/);\n fireEvent.click(downloadPage);\n }\n\n /**\n * Activates the _download selected_ item in the DataTable.Toolbar menu.\n */\n async downloadSelectedRowsCSV() {\n await this.openDownloadMenu();\n\n const downloadSelected = await this.getMenuItem(/Selected rows/);\n fireEvent.click(downloadSelected);\n }\n}\n\n/** @public */\nexport class DataTableExpandableRowHelper {\n constructor(private readonly rootHelper: DataTableHelper) {}\n\n getExpandedRowIds(): Array<string> {\n const expandedRows =\n this.rootHelper.element.querySelectorAll<HTMLDivElement>(\n '[role=\"row\"][data-rowid$=\"-expanded\"]',\n );\n const result: Array<string> = [];\n for (const expandedRow of Array.from(expandedRows)) {\n const { rowid } = expandedRow.dataset;\n if (rowid) {\n result.push(rowid.replace('-expanded', ''));\n }\n }\n return result;\n }\n\n async expandRowById(rowId: string): Promise<void> {\n const rowDetailsTrigger = await within(\n this.rootHelper.element,\n ).findByLabelText(/Expand row with id/, {\n suggest: false,\n exact: false,\n selector: `[data-rowid=\"${CSS.escape(rowId)}\"] button`,\n });\n if (rowDetailsTrigger) {\n const expanded = rowDetailsTrigger.getAttribute('aria-expanded');\n if (expanded === 'false') {\n const userEvent = setupUserEvent();\n await userEvent.click(rowDetailsTrigger);\n }\n }\n }\n\n async collapseRowById(rowId: string): Promise<void> {\n const rowDetailsTrigger = await within(\n this.rootHelper.element,\n ).findByLabelText(/Collapse row with id/, {\n suggest: false,\n exact: false,\n selector: `[data-rowid=\"${CSS.escape(rowId)}\"] button`,\n });\n if (rowDetailsTrigger) {\n const expanded = rowDetailsTrigger.getAttribute('aria-expanded');\n if (expanded === 'true') {\n const userEvent = setupUserEvent();\n await userEvent.click(rowDetailsTrigger);\n }\n }\n }\n\n async toggleRowById(rowId: string): Promise<void> {\n const rowDetailsTrigger = await within(\n this.rootHelper.element,\n ).findByLabelText(/(Expand|Collapse) row with id/, {\n suggest: false,\n exact: false,\n selector: `[data-rowid=\"${CSS.escape(rowId)}\"] button`,\n });\n if (rowDetailsTrigger) {\n const userEvent = setupUserEvent();\n await userEvent.click(rowDetailsTrigger);\n }\n }\n}\n\n/** @public */\nexport class DataTableHelper {\n private get tableElement(): HTMLDivElement {\n return within(this.element).getByRole('grid', { hidden: true });\n }\n\n private getHeaderRow(index: number): Array<HTMLDivElement> {\n const headerCells = this.tableElement.querySelectorAll<HTMLDivElement>(\n `[role=\"columnheader\"][data-header-row=\"${index}\"]`,\n );\n return Array.from(headerCells);\n }\n\n private getAllCellsInBodyRow(index: number): Array<HTMLDivElement> {\n const rowCells = this.tableElement.querySelectorAll<HTMLDivElement>(\n `[data-rowgroup=\"body\"] [data-row=\"${index}\"] [role=\"cell\"]`,\n );\n return Array.from(rowCells);\n }\n\n userActions: DataTableUserActionHelper;\n pagination: DataTablePaginationHelper;\n sorting: DataTableSortingHelper;\n rowSelection: DataTableRowSelectionHelper;\n subRows: DataTableSubRowsHelper;\n interactiveRows: DataTableInteractiveRowsHelper;\n download: DataTableDownloadHelper;\n expandableRows: DataTableExpandableRowHelper;\n\n constructor(private readonly dataTestId: string) {\n this.userActions = new DataTableUserActionHelper(dataTestId);\n this.pagination = new DataTablePaginationHelper(dataTestId);\n this.sorting = new DataTableSortingHelper(dataTestId, this);\n this.rowSelection = new DataTableRowSelectionHelper(this);\n this.subRows = new DataTableSubRowsHelper(this);\n this.interactiveRows = new DataTableInteractiveRowsHelper(this);\n this.download = new DataTableDownloadHelper(this);\n this.expandableRows = new DataTableExpandableRowHelper(this);\n }\n\n /**\n * Gets the root element of the DataTable\n */\n get element(): HTMLDivElement {\n return screen.getByTestId(this.dataTestId);\n }\n\n get headerRowCount(): number {\n const headerCells = this.tableElement.querySelectorAll<HTMLDivElement>(\n '[role=\"columnheader\"]',\n );\n const uniqueRows = new Set<string>();\n for (const headerCell of Array.from(headerCells)) {\n const headerRowAttr = headerCell.dataset.headerRow;\n if (headerRowAttr) {\n uniqueRows.add(headerRowAttr);\n }\n }\n\n return uniqueRows.size;\n }\n\n getHeaderRowContent(index: number): Array<string | null> {\n return this.getHeaderRow(index).map((element) => element.textContent);\n }\n\n getRowContent(index: number): Array<string | null> {\n return this.getAllCellsInBodyRow(index).map(\n (element) => element.textContent,\n );\n }\n\n get rowCount(): number {\n const rows = this.tableElement.querySelectorAll<HTMLDivElement>(\n '[data-rowgroup=\"body\"] [role=\"row\"]:not([data-rowid*=\"expanded\"])',\n );\n return rows.length;\n }\n}\n\n/** @public */\nexport function getDataTableHelper(testid: string) {\n return new DataTableHelper(testid);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/jest/index.d.ts
CHANGED
|
@@ -28,3 +28,4 @@ export { setupVirtualizationMock, clearVirtualizationMock, } from './mocks/virtu
|
|
|
28
28
|
export { setupTextEllipsisMock, clearTextEllipsisMock, } from './mocks/text-ellipsis-mock.js';
|
|
29
29
|
export { setupFramerMotionMock, clearFramerMotionMock, } from './mocks/framer-motion-mock.js';
|
|
30
30
|
export { setupElementFromPointMock, clearElementFromPointMock, } from './mocks/element-from-point-mock.js';
|
|
31
|
+
export { setupStructuredCloneMock, clearStructuredCloneMock, } from './mocks/structured-clone-mock.js';
|
package/jest/index.js
CHANGED
|
@@ -33,6 +33,7 @@ __export(jest_exports, {
|
|
|
33
33
|
clearScreenSizeMock: () => import_screen_size_mock.clearScreenSizeMock,
|
|
34
34
|
clearScrollIntoViewMock: () => import_scroll_into_view_mock.clearScrollIntoViewMock,
|
|
35
35
|
clearScrollWidthMock: () => import_scroll_width_mock.clearScrollWidthMock,
|
|
36
|
+
clearStructuredCloneMock: () => import_structured_clone_mock.clearStructuredCloneMock,
|
|
36
37
|
clearTableVirtualizationMock: () => import_table_virtualization_mock.clearTableVirtualizationMock,
|
|
37
38
|
clearTextEllipsisMock: () => import_text_ellipsis_mock.clearTextEllipsisMock,
|
|
38
39
|
clearVirtualizationMock: () => import_virtualization_mock.clearVirtualizationMock,
|
|
@@ -60,6 +61,7 @@ __export(jest_exports, {
|
|
|
60
61
|
setupScreenSizeMock: () => import_screen_size_mock.setupScreenSizeMock,
|
|
61
62
|
setupScrollIntoViewMock: () => import_scroll_into_view_mock.setupScrollIntoViewMock,
|
|
62
63
|
setupScrollWidthMock: () => import_scroll_width_mock.setupScrollWidthMock,
|
|
64
|
+
setupStructuredCloneMock: () => import_structured_clone_mock.setupStructuredCloneMock,
|
|
63
65
|
setupTableVirtualizationMock: () => import_table_virtualization_mock.setupTableVirtualizationMock,
|
|
64
66
|
setupTextEllipsisMock: () => import_text_ellipsis_mock.setupTextEllipsisMock,
|
|
65
67
|
setupVirtualizationMock: () => import_virtualization_mock.setupVirtualizationMock,
|
|
@@ -95,3 +97,4 @@ var import_virtualization_mock = require("./mocks/virtualization-mock.js");
|
|
|
95
97
|
var import_text_ellipsis_mock = require("./mocks/text-ellipsis-mock.js");
|
|
96
98
|
var import_framer_motion_mock = require("./mocks/framer-motion-mock.js");
|
|
97
99
|
var import_element_from_point_mock = require("./mocks/element-from-point-mock.js");
|
|
100
|
+
var import_structured_clone_mock = require("./mocks/structured-clone-mock.js");
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mocks `structuredClone` web API that may be missing in older jsdom versions.
|
|
3
|
+
*
|
|
4
|
+
* @public
|
|
5
|
+
*/
|
|
6
|
+
export declare function setupStructuredCloneMock(): void;
|
|
7
|
+
/**
|
|
8
|
+
* Clears `structuredClone` web API mock.
|
|
9
|
+
*
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export declare function clearStructuredCloneMock(): void;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var structured_clone_mock_exports = {};
|
|
19
|
+
__export(structured_clone_mock_exports, {
|
|
20
|
+
clearStructuredCloneMock: () => clearStructuredCloneMock,
|
|
21
|
+
setupStructuredCloneMock: () => setupStructuredCloneMock
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(structured_clone_mock_exports);
|
|
24
|
+
const pristineStructuredClone = global.structuredClone;
|
|
25
|
+
function setupStructuredCloneMock() {
|
|
26
|
+
Object.defineProperty(globalThis, "structuredClone", {
|
|
27
|
+
value: (value) => JSON.parse(JSON.stringify(value)),
|
|
28
|
+
configurable: true,
|
|
29
|
+
writable: true
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function clearStructuredCloneMock() {
|
|
33
|
+
Object.defineProperty(globalThis, "structuredClone", {
|
|
34
|
+
value: pristineStructuredClone,
|
|
35
|
+
configurable: true,
|
|
36
|
+
writable: true
|
|
37
|
+
});
|
|
38
|
+
}
|
package/jest/setup/index.js
CHANGED
|
@@ -9,6 +9,7 @@ var import_pointer_event_mock = require("../mocks/pointer-event-mock.js");
|
|
|
9
9
|
var import_resize_observer_mock = require("../mocks/resize-observer-mock.js");
|
|
10
10
|
var import_screen_size_mock = require("../mocks/screen-size-mock.js");
|
|
11
11
|
var import_scroll_into_view_mock = require("../mocks/scroll-into-view-mock.js");
|
|
12
|
+
var import_structured_clone_mock = require("../mocks/structured-clone-mock.js");
|
|
12
13
|
var import_virtualization_mock = require("../mocks/virtualization-mock.js");
|
|
13
14
|
beforeAll(() => {
|
|
14
15
|
(0, import_resize_observer_mock.setupResizeObserverMock)();
|
|
@@ -23,6 +24,7 @@ beforeAll(() => {
|
|
|
23
24
|
(0, import_scroll_into_view_mock.setupScrollIntoViewMock)();
|
|
24
25
|
(0, import_virtualization_mock.setupVirtualizationMock)();
|
|
25
26
|
(0, import_crypto_mock.setupCryptoMock)();
|
|
27
|
+
(0, import_structured_clone_mock.setupStructuredCloneMock)();
|
|
26
28
|
});
|
|
27
29
|
afterAll(() => {
|
|
28
30
|
(0, import_resize_observer_mock.clearResizeObserverMock)();
|
|
@@ -37,4 +39,5 @@ afterAll(() => {
|
|
|
37
39
|
(0, import_scroll_into_view_mock.clearScrollIntoViewMock)();
|
|
38
40
|
(0, import_virtualization_mock.clearVirtualizationMock)();
|
|
39
41
|
(0, import_crypto_mock.clearCryptoMock)();
|
|
42
|
+
(0, import_structured_clone_mock.clearStructuredCloneMock)();
|
|
40
43
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynatrace/strato-components-testing",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.7.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"types": "./index.d.ts",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"@dynatrace/strato-components": "^3.
|
|
40
|
+
"@dynatrace/strato-components": "^3.7.0",
|
|
41
41
|
"@testing-library/react": "^16.0.0",
|
|
42
42
|
"@testing-library/user-event": "^14.0.0",
|
|
43
43
|
"framer-motion": "^11.3.19 || ^12.0.0",
|