@dynatrace/strato-components-testing 3.11.2 → 3.12.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.
Files changed (130) hide show
  1. package/esm/jest/index.js +9 -1
  2. package/esm/jest/index.js.map +2 -2
  3. package/esm/jest/mocks/create-range-mock.js +4 -22
  4. package/esm/jest/mocks/create-range-mock.js.map +2 -2
  5. package/esm/jest/mocks/fetch-mock.js +4 -14
  6. package/esm/jest/mocks/fetch-mock.js.map +2 -2
  7. package/esm/jest/mocks/framer-motion-mock.js +3 -48
  8. package/esm/jest/mocks/framer-motion-mock.js.map +3 -3
  9. package/esm/jest/mocks/intersection-observer-mock.js +4 -35
  10. package/esm/jest/mocks/intersection-observer-mock.js.map +2 -2
  11. package/esm/jest/mocks/match-media-mock.js +4 -21
  12. package/esm/jest/mocks/match-media-mock.js.map +2 -2
  13. package/esm/jest/mocks/resize-observer-mock.js +4 -18
  14. package/esm/jest/mocks/resize-observer-mock.js.map +2 -2
  15. package/esm/jest/mocks/scroll-into-view-mock.js +4 -10
  16. package/esm/jest/mocks/scroll-into-view-mock.js.map +2 -2
  17. package/esm/jest/testing-helpers/filters/filter-field.js +12 -415
  18. package/esm/jest/testing-helpers/filters/filter-field.js.map +2 -2
  19. package/esm/jest/testing-helpers/tables/datatable.js +1 -11
  20. package/esm/jest/testing-helpers/tables/datatable.js.map +2 -2
  21. package/esm/jest/testing-helpers/utils/setup-user-event.js +1 -1
  22. package/esm/jest/testing-helpers/utils/setup-user-event.js.map +2 -2
  23. package/esm/shared/mocks/create-range-mock.js +29 -0
  24. package/esm/shared/mocks/create-range-mock.js.map +7 -0
  25. package/esm/shared/mocks/fetch-mock.js +23 -0
  26. package/esm/shared/mocks/fetch-mock.js.map +7 -0
  27. package/esm/shared/mocks/framer-motion-mock.js +54 -0
  28. package/esm/shared/mocks/framer-motion-mock.js.map +7 -0
  29. package/esm/shared/mocks/intersection-observer-mock.js +39 -0
  30. package/esm/shared/mocks/intersection-observer-mock.js.map +7 -0
  31. package/esm/shared/mocks/match-media-mock.js +28 -0
  32. package/esm/shared/mocks/match-media-mock.js.map +7 -0
  33. package/esm/shared/mocks/resize-observer-mock.js +25 -0
  34. package/esm/shared/mocks/resize-observer-mock.js.map +7 -0
  35. package/esm/shared/mocks/scroll-into-view-mock.js +17 -0
  36. package/esm/shared/mocks/scroll-into-view-mock.js.map +7 -0
  37. package/esm/shared/testing-helpers/filters/filter-field.js +439 -0
  38. package/esm/shared/testing-helpers/filters/filter-field.js.map +7 -0
  39. package/esm/vitest/index.js +149 -0
  40. package/esm/vitest/index.js.map +7 -0
  41. package/esm/vitest/mocks/create-range-mock.js +10 -0
  42. package/esm/vitest/mocks/create-range-mock.js.map +7 -0
  43. package/esm/vitest/mocks/fetch-mock.js +10 -0
  44. package/esm/vitest/mocks/fetch-mock.js.map +7 -0
  45. package/esm/vitest/mocks/framer-motion-mock.js +13 -0
  46. package/esm/vitest/mocks/framer-motion-mock.js.map +7 -0
  47. package/esm/vitest/mocks/intersection-observer-mock.js +10 -0
  48. package/esm/vitest/mocks/intersection-observer-mock.js.map +7 -0
  49. package/esm/vitest/mocks/match-media-mock.js +10 -0
  50. package/esm/vitest/mocks/match-media-mock.js.map +7 -0
  51. package/esm/vitest/mocks/resize-observer-mock.js +10 -0
  52. package/esm/vitest/mocks/resize-observer-mock.js.map +7 -0
  53. package/esm/vitest/mocks/scroll-into-view-mock.js +10 -0
  54. package/esm/vitest/mocks/scroll-into-view-mock.js.map +7 -0
  55. package/esm/vitest/preset/index.js +5 -0
  56. package/esm/vitest/preset/index.js.map +7 -0
  57. package/esm/vitest/preset/vitest-preset.js +9 -0
  58. package/esm/vitest/preset/vitest-preset.js.map +7 -0
  59. package/esm/vitest/setup/index.js +77 -0
  60. package/esm/vitest/setup/index.js.map +7 -0
  61. package/esm/vitest/testing-helpers/filters/filter-field.js +24 -0
  62. package/esm/vitest/testing-helpers/filters/filter-field.js.map +7 -0
  63. package/esm/vitest/testing-helpers/utils/isFakeTimersEnabled.js +8 -0
  64. package/esm/vitest/testing-helpers/utils/isFakeTimersEnabled.js.map +7 -0
  65. package/esm/vitest/testing-helpers/utils/setup-user-event.js +16 -0
  66. package/esm/vitest/testing-helpers/utils/setup-user-event.js.map +7 -0
  67. package/jest/index.d.ts +3 -1
  68. package/jest/index.js +4 -0
  69. package/jest/mocks/create-range-mock.d.ts +4 -11
  70. package/jest/mocks/create-range-mock.js +4 -22
  71. package/jest/mocks/fetch-mock.d.ts +4 -10
  72. package/jest/mocks/fetch-mock.js +4 -14
  73. package/jest/mocks/framer-motion-mock.js +3 -46
  74. package/jest/mocks/intersection-observer-mock.d.ts +4 -11
  75. package/jest/mocks/intersection-observer-mock.js +4 -35
  76. package/jest/mocks/match-media-mock.d.ts +4 -11
  77. package/jest/mocks/match-media-mock.js +4 -21
  78. package/jest/mocks/resize-observer-mock.d.ts +4 -13
  79. package/jest/mocks/resize-observer-mock.js +4 -18
  80. package/jest/mocks/scroll-into-view-mock.d.ts +4 -10
  81. package/jest/mocks/scroll-into-view-mock.js +4 -10
  82. package/jest/testing-helpers/filters/filter-field.d.ts +5 -109
  83. package/jest/testing-helpers/filters/filter-field.js +11 -414
  84. package/jest/testing-helpers/tables/datatable.js +1 -11
  85. package/jest/testing-helpers/utils/setup-user-event.js +1 -1
  86. package/package.json +3 -3
  87. package/shared/mocks/create-range-mock.d.ts +7 -0
  88. package/shared/mocks/create-range-mock.js +47 -0
  89. package/shared/mocks/fetch-mock.d.ts +13 -0
  90. package/shared/mocks/fetch-mock.js +41 -0
  91. package/shared/mocks/framer-motion-mock.d.ts +15 -0
  92. package/shared/mocks/framer-motion-mock.js +70 -0
  93. package/shared/mocks/intersection-observer-mock.d.ts +7 -0
  94. package/shared/mocks/intersection-observer-mock.js +57 -0
  95. package/shared/mocks/match-media-mock.d.ts +7 -0
  96. package/shared/mocks/match-media-mock.js +46 -0
  97. package/shared/mocks/resize-observer-mock.d.ts +8 -0
  98. package/shared/mocks/resize-observer-mock.js +43 -0
  99. package/shared/mocks/scroll-into-view-mock.d.ts +7 -0
  100. package/shared/mocks/scroll-into-view-mock.js +35 -0
  101. package/shared/testing-helpers/filters/filter-field.d.ts +128 -0
  102. package/shared/testing-helpers/filters/filter-field.js +449 -0
  103. package/vitest/index.d.ts +32 -0
  104. package/vitest/index.js +98 -0
  105. package/vitest/mocks/create-range-mock.d.ts +5 -0
  106. package/vitest/mocks/create-range-mock.js +28 -0
  107. package/vitest/mocks/fetch-mock.d.ts +5 -0
  108. package/vitest/mocks/fetch-mock.js +28 -0
  109. package/vitest/mocks/framer-motion-mock.d.ts +27 -0
  110. package/vitest/mocks/framer-motion-mock.js +31 -0
  111. package/vitest/mocks/intersection-observer-mock.d.ts +5 -0
  112. package/vitest/mocks/intersection-observer-mock.js +28 -0
  113. package/vitest/mocks/match-media-mock.d.ts +5 -0
  114. package/vitest/mocks/match-media-mock.js +28 -0
  115. package/vitest/mocks/resize-observer-mock.d.ts +5 -0
  116. package/vitest/mocks/resize-observer-mock.js +28 -0
  117. package/vitest/mocks/scroll-into-view-mock.d.ts +5 -0
  118. package/vitest/mocks/scroll-into-view-mock.js +28 -0
  119. package/vitest/preset/index.d.ts +2 -0
  120. package/vitest/preset/index.js +23 -0
  121. package/vitest/preset/vitest-preset.d.ts +24 -0
  122. package/vitest/preset/vitest-preset.js +27 -0
  123. package/vitest/setup/index.d.ts +2 -0
  124. package/vitest/setup/index.js +40 -0
  125. package/vitest/testing-helpers/filters/filter-field.d.ts +6 -0
  126. package/vitest/testing-helpers/filters/filter-field.js +36 -0
  127. package/vitest/testing-helpers/utils/isFakeTimersEnabled.d.ts +6 -0
  128. package/vitest/testing-helpers/utils/isFakeTimersEnabled.js +26 -0
  129. package/vitest/testing-helpers/utils/setup-user-event.d.ts +7 -0
  130. package/vitest/testing-helpers/utils/setup-user-event.js +44 -0
@@ -0,0 +1,449 @@
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 filter_field_exports = {};
19
+ __export(filter_field_exports, {
20
+ FilterFieldHelper: () => FilterFieldHelper,
21
+ FilterFieldPinnedAndRecentSuggestionBase: () => FilterFieldPinnedAndRecentSuggestionBase,
22
+ FilterFieldPinnedSuggestion: () => FilterFieldPinnedSuggestion,
23
+ FilterFieldRecentSuggestion: () => FilterFieldRecentSuggestion,
24
+ createFilterFieldHelpers: () => createFilterFieldHelpers
25
+ });
26
+ module.exports = __toCommonJS(filter_field_exports);
27
+ var import_react = require("@testing-library/react");
28
+ var import_user_event = require("@testing-library/user-event");
29
+ class FilterFieldPinnedAndRecentSuggestionBase {
30
+ /** @internal */
31
+ constructor(suggestionRoot, deps) {
32
+ this.suggestionRoot = suggestionRoot;
33
+ this._deps = deps;
34
+ }
35
+ suggestionRoot;
36
+ _deps;
37
+ get pinButtonElement() {
38
+ return this.suggestionRoot.querySelector(
39
+ "button[aria-checked]"
40
+ );
41
+ }
42
+ /**
43
+ * Receives the value of the suggestion that would be applied.
44
+ */
45
+ get value() {
46
+ return this.suggestionRoot.childNodes.item(1).textContent;
47
+ }
48
+ /**
49
+ * Returns if the current suggestion is currently pinned or not.
50
+ */
51
+ get pinned() {
52
+ if (this.pinButtonElement) {
53
+ return this.pinButtonElement.getAttribute("aria-checked") === "true";
54
+ }
55
+ return false;
56
+ }
57
+ /**
58
+ * Applies the suggestion to the filter field.
59
+ */
60
+ async apply() {
61
+ await this._deps.setupUserEvent({
62
+ pointerEventsCheck: import_user_event.PointerEventsCheckLevel.Never
63
+ }).click(this.suggestionRoot);
64
+ }
65
+ get pinEnabled() {
66
+ if (this.pinButtonElement) {
67
+ return this.pinButtonElement.getAttribute("aria-disabled") === "false";
68
+ }
69
+ return false;
70
+ }
71
+ /**
72
+ * Allows the suggestion to be pinned if not pinned already.
73
+ */
74
+ async pin() {
75
+ if (this.pinned === true) {
76
+ return;
77
+ }
78
+ if (this.pinButtonElement) {
79
+ await this._deps.setupUserEvent({
80
+ pointerEventsCheck: import_user_event.PointerEventsCheckLevel.Never
81
+ }).click(this.pinButtonElement);
82
+ if (this._deps.isFakeTimersEnabled()) {
83
+ await (0, import_react.act)(async () => {
84
+ this._deps.runOnlyPendingTimers();
85
+ });
86
+ }
87
+ }
88
+ }
89
+ /**
90
+ * Allows the suggestion to be unpinned if not unpinned already.
91
+ */
92
+ async unpin() {
93
+ if (this.pinned === false) {
94
+ return;
95
+ }
96
+ if (this.pinButtonElement) {
97
+ await this._deps.setupUserEvent({
98
+ pointerEventsCheck: import_user_event.PointerEventsCheckLevel.Never
99
+ }).click(this.pinButtonElement);
100
+ if (this._deps.isFakeTimersEnabled()) {
101
+ await (0, import_react.act)(async () => {
102
+ this._deps.runOnlyPendingTimers();
103
+ });
104
+ }
105
+ }
106
+ }
107
+ }
108
+ class FilterFieldPinnedSuggestion extends FilterFieldPinnedAndRecentSuggestionBase {
109
+ /**
110
+ * Receives the value of the suggestion that would be applied.
111
+ */
112
+ get value() {
113
+ return this.suggestionRoot.childNodes.item(0).textContent;
114
+ }
115
+ }
116
+ class FilterFieldRecentSuggestion extends FilterFieldPinnedAndRecentSuggestionBase {
117
+ /**
118
+ * Receives the value of the suggestion that would be applied.
119
+ */
120
+ get value() {
121
+ return this.suggestionRoot.querySelector('[role="option"]')?.childNodes.item(0).textContent ?? null;
122
+ }
123
+ /**
124
+ * Receives time offset indicating when the filter statement has last been used.
125
+ */
126
+ get lastUsed() {
127
+ return this.suggestionRoot.querySelector('[role="option"]')?.childNodes.item(1).textContent ?? null;
128
+ }
129
+ }
130
+ class FilterFieldHelper {
131
+ /** @internal */
132
+ constructor(dataTestId, deps) {
133
+ this.dataTestId = dataTestId;
134
+ this._deps = deps;
135
+ }
136
+ dataTestId;
137
+ _deps;
138
+ get filterFieldWrapper() {
139
+ return import_react.screen.getByTestId(this.dataTestId);
140
+ }
141
+ get editorView() {
142
+ return this.filterFieldWrapper.querySelector(
143
+ ".cm-content"
144
+ )?.cmTile?.view;
145
+ }
146
+ get inputElement() {
147
+ return (0, import_react.within)(this.filterFieldWrapper).getAllByRole(
148
+ "textbox",
149
+ { hidden: true }
150
+ )[1];
151
+ }
152
+ get filterFieldElement() {
153
+ return (0, import_react.within)(this.filterFieldWrapper).getByRole(
154
+ "textbox",
155
+ {
156
+ name: "Filter field",
157
+ hidden: true
158
+ }
159
+ );
160
+ }
161
+ get placeholderElement() {
162
+ return this.filterFieldWrapper.querySelector(".cm-placeholder");
163
+ }
164
+ get suggestionsContainer() {
165
+ return import_react.screen.queryByTestId(`filterfield-suggestions-${this.dataTestId}`);
166
+ }
167
+ /** Returns the value of the native text input. */
168
+ get value() {
169
+ return this.inputElement.value;
170
+ }
171
+ /** Returns the value of the filter field. */
172
+ get filterFieldValue() {
173
+ return this.filterFieldElement.textContent || "";
174
+ }
175
+ /**
176
+ * The placeholder text shown in the filter field.
177
+ * Undefined if the placeholder is currently not rendered.
178
+ */
179
+ get placeholder() {
180
+ return this.placeholderElement?.textContent || void 0;
181
+ }
182
+ /** Focus the filter field if not already focused. */
183
+ async focus() {
184
+ if (!this.filterFieldWrapper.contains(document.activeElement)) {
185
+ await (0, import_react.act)(async () => {
186
+ this.inputElement.focus();
187
+ });
188
+ expect(
189
+ this.filterFieldWrapper.contains(document.activeElement)
190
+ ).toBeTruthy();
191
+ if (this._deps.isFakeTimersEnabled()) {
192
+ await (0, import_react.act)(async () => {
193
+ this._deps.runOnlyPendingTimers();
194
+ });
195
+ }
196
+ }
197
+ }
198
+ /** Blur the filter field by tabbing out of it. */
199
+ async blur() {
200
+ await (0, import_react.act)(async () => {
201
+ this.filterFieldElement.blur();
202
+ });
203
+ if (this._deps.isFakeTimersEnabled()) {
204
+ await (0, import_react.act)(async () => {
205
+ this._deps.runOnlyPendingTimers();
206
+ });
207
+ }
208
+ }
209
+ /** Fill a provided value into the filter field. */
210
+ async type(text, cursorIndex) {
211
+ const regEx = new RegExp(text, "g");
212
+ const matches = this.value.match(regEx);
213
+ await this.moveCursorTo(cursorIndex ?? -1);
214
+ await this._deps.setupUserEvent({
215
+ pointerEventsCheck: import_user_event.PointerEventsCheckLevel.Never
216
+ }).keyboard(text);
217
+ await (0, import_react.waitFor)(() => {
218
+ expect(this.value.match(regEx) ?? []).toHaveLength(
219
+ (matches?.length ?? 0) + 1
220
+ );
221
+ });
222
+ if (this._deps.isFakeTimersEnabled()) {
223
+ await (0, import_react.act)(async () => {
224
+ this._deps.runOnlyPendingTimers();
225
+ });
226
+ }
227
+ }
228
+ /** Clears the filter field value. */
229
+ async clear() {
230
+ if (this.value !== "") {
231
+ await this._deps.setupUserEvent({
232
+ pointerEventsCheck: import_user_event.PointerEventsCheckLevel.Never
233
+ }).click(
234
+ await (0, import_react.within)(this.filterFieldWrapper).findByRole("button", {
235
+ name: "Clear filter",
236
+ hidden: true
237
+ })
238
+ );
239
+ if (this._deps.isFakeTimersEnabled()) {
240
+ await (0, import_react.act)(async () => {
241
+ this._deps.runOnlyPendingTimers();
242
+ });
243
+ }
244
+ }
245
+ }
246
+ /**
247
+ * Moves the cursor to the given index.
248
+ * -1 moves to the end of the input.
249
+ */
250
+ async moveCursorTo(index) {
251
+ const user = this._deps.setupUserEvent({
252
+ pointerEventsCheck: import_user_event.PointerEventsCheckLevel.Never
253
+ });
254
+ if (index === -1) {
255
+ await (0, import_react.act)(async () => {
256
+ await this.focus();
257
+ });
258
+ await user.keyboard("{PageDown}");
259
+ return;
260
+ }
261
+ const editorView = this.editorView;
262
+ if (!editorView) {
263
+ console.warn("FilterField editor could not be found. Panic now.");
264
+ return;
265
+ }
266
+ await (0, import_react.act)(async () => {
267
+ await this.focus();
268
+ editorView.dispatch({
269
+ selection: {
270
+ anchor: Math.min(index, editorView.state.doc.length)
271
+ }
272
+ });
273
+ });
274
+ if (this._deps.isFakeTimersEnabled()) {
275
+ await (0, import_react.act)(async () => {
276
+ this._deps.runOnlyPendingTimers();
277
+ });
278
+ }
279
+ }
280
+ /** Open the suggestions overlay with the keyboard shortcut. */
281
+ async openSuggestions() {
282
+ await (0, import_react.act)(async () => {
283
+ await this.focus();
284
+ });
285
+ await this._deps.setupUserEvent({
286
+ pointerEventsCheck: import_user_event.PointerEventsCheckLevel.Never
287
+ }).keyboard("{Control>}{Space}{/Control}");
288
+ await (0, import_react.waitFor)(
289
+ async () => expect(this.suggestionsContainer).toBeInTheDocument()
290
+ );
291
+ if (this._deps.isFakeTimersEnabled()) {
292
+ await (0, import_react.act)(async () => {
293
+ this._deps.runOnlyPendingTimers();
294
+ });
295
+ }
296
+ }
297
+ /**
298
+ * Close the suggestions overlay using the `Escape` key.
299
+ * If the filter field is focused, the focus will stay in the filter field.
300
+ */
301
+ async closeSuggestions() {
302
+ await (0, import_react.act)(async () => {
303
+ await this.focus();
304
+ });
305
+ await this._deps.setupUserEvent({
306
+ pointerEventsCheck: import_user_event.PointerEventsCheckLevel.Never
307
+ }).keyboard("{Escape}");
308
+ if (this.suggestionsContainer !== null) {
309
+ await (0, import_react.waitForElementToBeRemoved)(() => this.suggestionsContainer);
310
+ }
311
+ }
312
+ /** Apply the suggestion with the given text. */
313
+ async applySuggestion(queryString) {
314
+ await (0, import_react.act)(async () => {
315
+ await this.focus();
316
+ });
317
+ await (0, import_react.waitFor)(() => {
318
+ expect(this.suggestionsContainer).toBeInTheDocument();
319
+ });
320
+ if (!this.suggestionsContainer) {
321
+ console.warn(
322
+ "The filter field suggestions overlay seems to be closed. Make sure to open it before applying a suggestion."
323
+ );
324
+ return;
325
+ }
326
+ const showMore = (0, import_react.within)(this.suggestionsContainer).queryByRole("option", {
327
+ name: "Show more"
328
+ });
329
+ if (showMore) {
330
+ await this._deps.setupUserEvent({
331
+ pointerEventsCheck: import_user_event.PointerEventsCheckLevel.Never
332
+ }).click(showMore);
333
+ }
334
+ let suggestions = (0, import_react.within)(this.suggestionsContainer).queryAllByTestId(
335
+ queryString,
336
+ { exact: true }
337
+ );
338
+ if (suggestions.length > 0) {
339
+ suggestions = suggestions.reduce((acc, container) => {
340
+ const suggestion = (0, import_react.within)(container).queryByRole("option");
341
+ if (suggestion) {
342
+ acc.push(suggestion);
343
+ }
344
+ return acc;
345
+ }, []);
346
+ }
347
+ if (suggestions.length === 0) {
348
+ suggestions.push(
349
+ ...(0, import_react.within)(this.suggestionsContainer).queryAllByText(
350
+ (_, element) => element?.getAttribute("role") === "option" && // The replace is needed to ignore non-breaking spaces
351
+ element.firstElementChild?.textContent?.replace(/\s+/g, " ") === queryString.replace(/\s+/g, " ")
352
+ )
353
+ );
354
+ }
355
+ if (suggestions.length === 0) {
356
+ console.warn(
357
+ `Could not query a suggestion with the given queryString '${queryString}' (trying queryByTestId and queryByText).`
358
+ );
359
+ return;
360
+ }
361
+ if (suggestions.length > 1) {
362
+ console.warn(
363
+ "Found multiple suggestions with the given testId. Will apply the first one"
364
+ );
365
+ }
366
+ await this._deps.setupUserEvent({
367
+ pointerEventsCheck: import_user_event.PointerEventsCheckLevel.Never
368
+ }).click(suggestions[0]);
369
+ }
370
+ /** Get recent suggestions */
371
+ async getRecentSuggestions() {
372
+ if (this.suggestionsContainer) {
373
+ const recentGroup = (0, import_react.within)(this.suggestionsContainer).getByRole("group", {
374
+ name: "Recently used filters"
375
+ });
376
+ const suggestions = (0, import_react.within)(recentGroup).getAllByRole(
377
+ "group",
378
+ {
379
+ hidden: true,
380
+ name(_accessibleName, element) {
381
+ return element.getAttribute(
382
+ "data-strato-filter-field-virtual-focus-type"
383
+ ) === "recent-suggestion";
384
+ }
385
+ }
386
+ );
387
+ return suggestions.map(
388
+ (el) => new FilterFieldRecentSuggestion(el, this._deps)
389
+ );
390
+ }
391
+ return [];
392
+ }
393
+ /** Get pinned suggestions */
394
+ async getPinnedSuggestions() {
395
+ if (this.suggestionsContainer) {
396
+ try {
397
+ await (0, import_react.waitFor)(
398
+ () => import_react.screen.getByRole("group", {
399
+ name: "Pinned filters",
400
+ hidden: true,
401
+ suggest: false
402
+ })
403
+ );
404
+ const pinnedGroup = (0, import_react.within)(this.suggestionsContainer).getByRole(
405
+ "group",
406
+ {
407
+ name: "Pinned filters",
408
+ hidden: true
409
+ }
410
+ );
411
+ const suggestions = (0, import_react.within)(pinnedGroup).getAllByRole(
412
+ "group",
413
+ {
414
+ hidden: true,
415
+ name(_accessibleName, element) {
416
+ return element.getAttribute(
417
+ "data-strato-filter-field-virtual-focus-type"
418
+ ) === "pinned-suggestion";
419
+ }
420
+ }
421
+ );
422
+ return suggestions.map(
423
+ (el) => new FilterFieldPinnedSuggestion(el, this._deps)
424
+ );
425
+ } catch {
426
+ return [];
427
+ }
428
+ }
429
+ return [];
430
+ }
431
+ /** Paste text at the current cursor position */
432
+ async paste(text, cursorIndex) {
433
+ await this.moveCursorTo(cursorIndex ?? -1);
434
+ await this._deps.setupUserEvent({
435
+ pointerEventsCheck: import_user_event.PointerEventsCheckLevel.Never
436
+ }).paste(text);
437
+ if (this._deps.isFakeTimersEnabled()) {
438
+ await (0, import_react.act)(async () => {
439
+ this._deps.runOnlyPendingTimers();
440
+ });
441
+ }
442
+ }
443
+ }
444
+ function createFilterFieldHelpers(deps) {
445
+ function getFilterFieldHelper(dataTestId) {
446
+ return new FilterFieldHelper(dataTestId, deps);
447
+ }
448
+ return { getFilterFieldHelper };
449
+ }
@@ -0,0 +1,32 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ export { customRender as render, type RenderWithIntlOptions, } from '../jest/custom-render.js';
3
+ export { stratoVitestPreset } from './preset/index.js';
4
+ export { getTextInputHelper, type TextInputHelper, } from '../jest/testing-helpers/forms/text-input.js';
5
+ export { getPasswordInputHelper, type PasswordInputHelper, } from '../jest/testing-helpers/forms/password-input.js';
6
+ export { getSearchInputHelper, type SearchInputHelper, } from '../jest/testing-helpers/forms/search-input.js';
7
+ export { getDataTableHelper, type DataTableHelper, type DataTablePaginationHelper, type DataTableUserActionHelper, type DataTableSortingHelper, type DataTableRowSelectionHelper, type DataTableSubRowsHelper, type DataTableInteractiveRowsHelper, type DataTableDownloadHelper, type DataTableExpandableRowHelper, } from '../jest/testing-helpers/tables/datatable.js';
8
+ export type { BaseInputHelper } from '../jest/testing-helpers/forms/base-input.js';
9
+ export { getFilterFieldHelper, FilterFieldHelper, FilterFieldPinnedAndRecentSuggestionBase, FilterFieldPinnedSuggestion, FilterFieldRecentSuggestion, } from './testing-helpers/filters/filter-field.js';
10
+ export type { _FilterFieldDeps } from './testing-helpers/filters/filter-field.js';
11
+ export { getSelectTestingHelper, type SelectTestingHelper, } from '../jest/testing-helpers/forms/select.js';
12
+ export { setupGetBoundingClientRectMock, clearGetBoundingClientRectMock, } from '../jest/mocks/bounding-client-rect-mock.js';
13
+ export { createMockElement } from '../jest/mocks/create-mock-element.js';
14
+ export { setupCanvasMeasureTextMock, clearCanvasMeasureTextMock, } from '../jest/mocks/canvas-mock.js';
15
+ export { setupOffsetWidthMock, clearOffsetWidthMock, } from '../jest/mocks/offset-width-mock.js';
16
+ export { setupOffsetHeightMock, clearOffsetHeightMock, } from '../jest/mocks/offset-height-mock.js';
17
+ export { setupDomRectMock, clearDomRectMock, } from '../jest/mocks/dom-rect-mock.js';
18
+ export { setupPointerEventMock, clearPointerEventMock, } from '../jest/mocks/pointer-event-mock.js';
19
+ export { setupScreenSizeMock, clearScreenSizeMock, } from '../jest/mocks/screen-size-mock.js';
20
+ export { setupScrollWidthMock, clearScrollWidthMock, } from '../jest/mocks/scroll-width-mock.js';
21
+ export { setupVirtualizationMock, clearVirtualizationMock, } from '../jest/mocks/virtualization-mock.js';
22
+ export { setupTextEllipsisMock, clearTextEllipsisMock, } from '../jest/mocks/text-ellipsis-mock.js';
23
+ export { setupElementFromPointMock, clearElementFromPointMock, } from '../jest/mocks/element-from-point-mock.js';
24
+ export { setupResizeObserverMock, clearResizeObserverMock, } from './mocks/resize-observer-mock.js';
25
+ export { setupMatchMediaMock, clearMatchMediaMock, } from './mocks/match-media-mock.js';
26
+ export { setupIntersectionObserverMock, clearIntersectionObserverMock, } from './mocks/intersection-observer-mock.js';
27
+ export { setupScrollIntoViewMock, clearScrollIntoViewMock, } from './mocks/scroll-into-view-mock.js';
28
+ export { setupCreateRangeMock, clearCreateRangeMock, } from './mocks/create-range-mock.js';
29
+ export { setupFetchMock, clearFetchMock } from './mocks/fetch-mock.js';
30
+ export type { MockedResponse } from '../shared/mocks/fetch-mock.js';
31
+ export { setupFramerMotionMock, clearFramerMotionMock, type FramerMotionActual, } from './mocks/framer-motion-mock.js';
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,98 @@
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 vitest_exports = {};
19
+ __export(vitest_exports, {
20
+ FilterFieldHelper: () => import_filter_field.FilterFieldHelper,
21
+ FilterFieldPinnedAndRecentSuggestionBase: () => import_filter_field.FilterFieldPinnedAndRecentSuggestionBase,
22
+ FilterFieldPinnedSuggestion: () => import_filter_field.FilterFieldPinnedSuggestion,
23
+ FilterFieldRecentSuggestion: () => import_filter_field.FilterFieldRecentSuggestion,
24
+ clearCanvasMeasureTextMock: () => import_canvas_mock.clearCanvasMeasureTextMock,
25
+ clearCreateRangeMock: () => import_create_range_mock.clearCreateRangeMock,
26
+ clearDomRectMock: () => import_dom_rect_mock.clearDomRectMock,
27
+ clearElementFromPointMock: () => import_element_from_point_mock.clearElementFromPointMock,
28
+ clearFetchMock: () => import_fetch_mock.clearFetchMock,
29
+ clearFramerMotionMock: () => import_framer_motion_mock.clearFramerMotionMock,
30
+ clearGetBoundingClientRectMock: () => import_bounding_client_rect_mock.clearGetBoundingClientRectMock,
31
+ clearIntersectionObserverMock: () => import_intersection_observer_mock.clearIntersectionObserverMock,
32
+ clearMatchMediaMock: () => import_match_media_mock.clearMatchMediaMock,
33
+ clearOffsetHeightMock: () => import_offset_height_mock.clearOffsetHeightMock,
34
+ clearOffsetWidthMock: () => import_offset_width_mock.clearOffsetWidthMock,
35
+ clearPointerEventMock: () => import_pointer_event_mock.clearPointerEventMock,
36
+ clearResizeObserverMock: () => import_resize_observer_mock.clearResizeObserverMock,
37
+ clearScreenSizeMock: () => import_screen_size_mock.clearScreenSizeMock,
38
+ clearScrollIntoViewMock: () => import_scroll_into_view_mock.clearScrollIntoViewMock,
39
+ clearScrollWidthMock: () => import_scroll_width_mock.clearScrollWidthMock,
40
+ clearTextEllipsisMock: () => import_text_ellipsis_mock.clearTextEllipsisMock,
41
+ clearVirtualizationMock: () => import_virtualization_mock.clearVirtualizationMock,
42
+ createMockElement: () => import_create_mock_element.createMockElement,
43
+ getDataTableHelper: () => import_datatable.getDataTableHelper,
44
+ getFilterFieldHelper: () => import_filter_field.getFilterFieldHelper,
45
+ getPasswordInputHelper: () => import_password_input.getPasswordInputHelper,
46
+ getSearchInputHelper: () => import_search_input.getSearchInputHelper,
47
+ getSelectTestingHelper: () => import_select.getSelectTestingHelper,
48
+ getTextInputHelper: () => import_text_input.getTextInputHelper,
49
+ render: () => import_custom_render.customRender,
50
+ setupCanvasMeasureTextMock: () => import_canvas_mock.setupCanvasMeasureTextMock,
51
+ setupCreateRangeMock: () => import_create_range_mock.setupCreateRangeMock,
52
+ setupDomRectMock: () => import_dom_rect_mock.setupDomRectMock,
53
+ setupElementFromPointMock: () => import_element_from_point_mock.setupElementFromPointMock,
54
+ setupFetchMock: () => import_fetch_mock.setupFetchMock,
55
+ setupFramerMotionMock: () => import_framer_motion_mock.setupFramerMotionMock,
56
+ setupGetBoundingClientRectMock: () => import_bounding_client_rect_mock.setupGetBoundingClientRectMock,
57
+ setupIntersectionObserverMock: () => import_intersection_observer_mock.setupIntersectionObserverMock,
58
+ setupMatchMediaMock: () => import_match_media_mock.setupMatchMediaMock,
59
+ setupOffsetHeightMock: () => import_offset_height_mock.setupOffsetHeightMock,
60
+ setupOffsetWidthMock: () => import_offset_width_mock.setupOffsetWidthMock,
61
+ setupPointerEventMock: () => import_pointer_event_mock.setupPointerEventMock,
62
+ setupResizeObserverMock: () => import_resize_observer_mock.setupResizeObserverMock,
63
+ setupScreenSizeMock: () => import_screen_size_mock.setupScreenSizeMock,
64
+ setupScrollIntoViewMock: () => import_scroll_into_view_mock.setupScrollIntoViewMock,
65
+ setupScrollWidthMock: () => import_scroll_width_mock.setupScrollWidthMock,
66
+ setupTextEllipsisMock: () => import_text_ellipsis_mock.setupTextEllipsisMock,
67
+ setupVirtualizationMock: () => import_virtualization_mock.setupVirtualizationMock,
68
+ stratoVitestPreset: () => import_preset.stratoVitestPreset
69
+ });
70
+ module.exports = __toCommonJS(vitest_exports);
71
+ var import_vitest = require("@testing-library/jest-dom/vitest");
72
+ var import_custom_render = require("../jest/custom-render.js");
73
+ var import_preset = require("./preset/index.js");
74
+ var import_text_input = require("../jest/testing-helpers/forms/text-input.js");
75
+ var import_password_input = require("../jest/testing-helpers/forms/password-input.js");
76
+ var import_search_input = require("../jest/testing-helpers/forms/search-input.js");
77
+ var import_datatable = require("../jest/testing-helpers/tables/datatable.js");
78
+ var import_filter_field = require("./testing-helpers/filters/filter-field.js");
79
+ var import_select = require("../jest/testing-helpers/forms/select.js");
80
+ var import_bounding_client_rect_mock = require("../jest/mocks/bounding-client-rect-mock.js");
81
+ var import_create_mock_element = require("../jest/mocks/create-mock-element.js");
82
+ var import_canvas_mock = require("../jest/mocks/canvas-mock.js");
83
+ var import_offset_width_mock = require("../jest/mocks/offset-width-mock.js");
84
+ var import_offset_height_mock = require("../jest/mocks/offset-height-mock.js");
85
+ var import_dom_rect_mock = require("../jest/mocks/dom-rect-mock.js");
86
+ var import_pointer_event_mock = require("../jest/mocks/pointer-event-mock.js");
87
+ var import_screen_size_mock = require("../jest/mocks/screen-size-mock.js");
88
+ var import_scroll_width_mock = require("../jest/mocks/scroll-width-mock.js");
89
+ var import_virtualization_mock = require("../jest/mocks/virtualization-mock.js");
90
+ var import_text_ellipsis_mock = require("../jest/mocks/text-ellipsis-mock.js");
91
+ var import_element_from_point_mock = require("../jest/mocks/element-from-point-mock.js");
92
+ var import_resize_observer_mock = require("./mocks/resize-observer-mock.js");
93
+ var import_match_media_mock = require("./mocks/match-media-mock.js");
94
+ var import_intersection_observer_mock = require("./mocks/intersection-observer-mock.js");
95
+ var import_scroll_into_view_mock = require("./mocks/scroll-into-view-mock.js");
96
+ var import_create_range_mock = require("./mocks/create-range-mock.js");
97
+ var import_fetch_mock = require("./mocks/fetch-mock.js");
98
+ var import_framer_motion_mock = require("./mocks/framer-motion-mock.js");
@@ -0,0 +1,5 @@
1
+ /** @public */
2
+ export declare const setupCreateRangeMock: () => void;
3
+ /** @public */
4
+ export declare const clearCreateRangeMock: () => void;
5
+ //# sourceMappingURL=create-range-mock.d.ts.map
@@ -0,0 +1,28 @@
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 create_range_mock_exports = {};
19
+ __export(create_range_mock_exports, {
20
+ clearCreateRangeMock: () => clearCreateRangeMock,
21
+ setupCreateRangeMock: () => setupCreateRangeMock
22
+ });
23
+ module.exports = __toCommonJS(create_range_mock_exports);
24
+ var import_vitest = require("vitest");
25
+ var import_create_range_mock = require("../../shared/mocks/create-range-mock.js");
26
+ const _helpers = (0, import_create_range_mock.createCreateRangeMockHelpers)(import_vitest.vi.fn);
27
+ const setupCreateRangeMock = _helpers.setupCreateRangeMock;
28
+ const clearCreateRangeMock = _helpers.clearCreateRangeMock;
@@ -0,0 +1,5 @@
1
+ /** @public */
2
+ export declare const setupFetchMock: (mockedValue?: Partial<import("../index.js").MockedResponse>) => void;
3
+ /** @public */
4
+ export declare const clearFetchMock: () => void;
5
+ //# sourceMappingURL=fetch-mock.d.ts.map
@@ -0,0 +1,28 @@
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 fetch_mock_exports = {};
19
+ __export(fetch_mock_exports, {
20
+ clearFetchMock: () => clearFetchMock,
21
+ setupFetchMock: () => setupFetchMock
22
+ });
23
+ module.exports = __toCommonJS(fetch_mock_exports);
24
+ var import_vitest = require("vitest");
25
+ var import_fetch_mock = require("../../shared/mocks/fetch-mock.js");
26
+ const _helpers = (0, import_fetch_mock.createFetchMockHelpers)(import_vitest.vi.fn);
27
+ const setupFetchMock = _helpers.setupFetchMock;
28
+ const clearFetchMock = _helpers.clearFetchMock;
@@ -0,0 +1,27 @@
1
+ /** @public */
2
+ export type FramerMotionActual = {
3
+ isValidMotionProp: (key: string) => boolean;
4
+ cubicBezier: (mX1: number, mY1: number, mX2: number, mY2: number) => (t: number) => number;
5
+ };
6
+ /**
7
+ * Mocks framer motion so children are rendered without animations for easier testing.
8
+ * Needs to be called inside 'vi.mock' at the root level of the test file (vi.mock is hoisted):
9
+ *
10
+ * vi.mock('framer-motion', async (importOriginal) =\> \{
11
+ * const actual = await importOriginal\<typeof import('framer-motion')\>();
12
+ * const \{ setupFramerMotionMock \} = await import('\@dynatrace/strato-components-testing/vitest');
13
+ * return setupFramerMotionMock(actual);
14
+ * \});
15
+ * @public
16
+ */
17
+ export declare function setupFramerMotionMock(actual: FramerMotionActual): {
18
+ motion: any;
19
+ AnimatePresence: any;
20
+ useReducedMotion: (value?: boolean) => boolean;
21
+ cubicBezier: (mX1: number, mY1: number, mX2: number, mY2: number) => (t: number) => number;
22
+ };
23
+ /**
24
+ * @public
25
+ */
26
+ export declare function clearFramerMotionMock(): void;
27
+ //# sourceMappingURL=framer-motion-mock.d.ts.map