@dynatrace/strato-components-testing 1.18.0 → 3.1.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 (117) hide show
  1. package/esm/jest/index.js +102 -3
  2. package/esm/jest/index.js.map +2 -2
  3. package/esm/jest/mocks/create-mock-element.js +81 -0
  4. package/esm/jest/mocks/create-mock-element.js.map +7 -0
  5. package/esm/jest/mocks/create-range-mock.js +28 -0
  6. package/esm/jest/mocks/create-range-mock.js.map +7 -0
  7. package/esm/jest/mocks/crypto-mock.js +20 -0
  8. package/esm/jest/mocks/crypto-mock.js.map +7 -0
  9. package/esm/jest/mocks/dom-rect-mock.js.map +2 -2
  10. package/esm/jest/mocks/element-from-point-mock.js +12 -0
  11. package/esm/jest/mocks/element-from-point-mock.js.map +7 -0
  12. package/esm/jest/mocks/fetch-mock.js +20 -0
  13. package/esm/jest/mocks/fetch-mock.js.map +7 -0
  14. package/esm/jest/mocks/framer-motion-mock.js +59 -0
  15. package/esm/jest/mocks/framer-motion-mock.js.map +7 -0
  16. package/esm/jest/mocks/intersection-observer-mock.js +40 -0
  17. package/esm/jest/mocks/intersection-observer-mock.js.map +7 -0
  18. package/esm/jest/mocks/match-media-mock.js +27 -0
  19. package/esm/jest/mocks/match-media-mock.js.map +7 -0
  20. package/esm/jest/mocks/offset-height-mock.js +21 -0
  21. package/esm/jest/mocks/offset-height-mock.js.map +7 -0
  22. package/esm/jest/mocks/offset-width-mock.js +21 -0
  23. package/esm/jest/mocks/offset-width-mock.js.map +7 -0
  24. package/esm/jest/mocks/pointer-event-mock.js +24 -0
  25. package/esm/jest/mocks/pointer-event-mock.js.map +7 -0
  26. package/esm/jest/mocks/screen-size-mock.js +16 -0
  27. package/esm/jest/mocks/screen-size-mock.js.map +7 -0
  28. package/esm/jest/mocks/scroll-into-view-mock.js +16 -0
  29. package/esm/jest/mocks/scroll-into-view-mock.js.map +7 -0
  30. package/esm/jest/mocks/streamdown.mock.js +8 -0
  31. package/esm/jest/mocks/streamdown.mock.js.map +7 -0
  32. package/esm/jest/mocks/table-virtualization-mock.js +87 -0
  33. package/esm/jest/mocks/table-virtualization-mock.js.map +7 -0
  34. package/esm/jest/mocks/virtualization-mock.js +155 -0
  35. package/esm/jest/mocks/virtualization-mock.js.map +7 -0
  36. package/esm/jest/preset/jest-preset.js +2 -1
  37. package/esm/jest/preset/jest-preset.js.map +2 -2
  38. package/esm/jest/setup/index.js +51 -0
  39. package/esm/jest/setup/index.js.map +2 -2
  40. package/esm/jest/testing-helpers/filters/filter-field.js +424 -0
  41. package/esm/jest/testing-helpers/filters/filter-field.js.map +7 -0
  42. package/esm/jest/testing-helpers/forms/base-input.js +32 -0
  43. package/esm/jest/testing-helpers/forms/base-input.js.map +7 -0
  44. package/esm/jest/testing-helpers/forms/password-input.js +29 -0
  45. package/esm/jest/testing-helpers/forms/password-input.js.map +7 -0
  46. package/esm/jest/testing-helpers/forms/search-input.js +27 -0
  47. package/esm/jest/testing-helpers/forms/search-input.js.map +7 -0
  48. package/esm/jest/testing-helpers/forms/select.js +131 -0
  49. package/esm/jest/testing-helpers/forms/select.js.map +7 -0
  50. package/esm/jest/testing-helpers/forms/text-input.js +24 -0
  51. package/esm/jest/testing-helpers/forms/text-input.js.map +7 -0
  52. package/esm/jest/testing-helpers/tables/datatable.js +794 -0
  53. package/esm/jest/testing-helpers/tables/datatable.js.map +7 -0
  54. package/esm/jest/testing-helpers/utils/isFakeTimersEnabled.js +9 -0
  55. package/esm/jest/testing-helpers/utils/isFakeTimersEnabled.js.map +7 -0
  56. package/esm/jest/testing-helpers/utils/setup-user-event.js +15 -0
  57. package/esm/jest/testing-helpers/utils/setup-user-event.js.map +7 -0
  58. package/jest/index.d.ts +22 -1
  59. package/jest/index.js +54 -3
  60. package/jest/mocks/create-mock-element.d.ts +15 -0
  61. package/jest/mocks/create-mock-element.js +99 -0
  62. package/jest/mocks/create-range-mock.d.ts +11 -0
  63. package/jest/mocks/create-range-mock.js +46 -0
  64. package/jest/mocks/crypto-mock.d.ts +12 -0
  65. package/jest/mocks/crypto-mock.js +48 -0
  66. package/jest/mocks/dom-rect-mock.d.ts +1 -0
  67. package/jest/mocks/element-from-point-mock.d.ts +11 -0
  68. package/jest/{setup.js → mocks/element-from-point-mock.js} +10 -16
  69. package/jest/mocks/fetch-mock.d.ts +10 -0
  70. package/jest/mocks/fetch-mock.js +38 -0
  71. package/jest/mocks/framer-motion-mock.d.ts +18 -0
  72. package/jest/mocks/framer-motion-mock.js +75 -0
  73. package/jest/mocks/intersection-observer-mock.d.ts +11 -0
  74. package/jest/mocks/intersection-observer-mock.js +58 -0
  75. package/jest/mocks/match-media-mock.d.ts +11 -0
  76. package/jest/mocks/match-media-mock.js +45 -0
  77. package/jest/mocks/offset-height-mock.d.ts +10 -0
  78. package/jest/mocks/offset-height-mock.js +39 -0
  79. package/jest/mocks/offset-width-mock.d.ts +10 -0
  80. package/jest/mocks/offset-width-mock.js +39 -0
  81. package/jest/mocks/pointer-event-mock.d.ts +10 -0
  82. package/jest/mocks/pointer-event-mock.js +42 -0
  83. package/jest/mocks/screen-size-mock.d.ts +10 -0
  84. package/jest/mocks/screen-size-mock.js +34 -0
  85. package/jest/mocks/scroll-into-view-mock.d.ts +10 -0
  86. package/jest/mocks/scroll-into-view-mock.js +34 -0
  87. package/jest/mocks/streamdown.mock.d.ts +2 -0
  88. package/jest/mocks/streamdown.mock.js +26 -0
  89. package/jest/mocks/table-virtualization-mock.d.ts +15 -0
  90. package/jest/mocks/table-virtualization-mock.js +102 -0
  91. package/jest/mocks/virtualization-mock.d.ts +9 -0
  92. package/jest/mocks/virtualization-mock.js +170 -0
  93. package/jest/preset/jest-preset.d.ts +2 -3
  94. package/jest/preset/jest-preset.js +2 -1
  95. package/jest/setup/index.js +27 -0
  96. package/jest/testing-helpers/filters/filter-field.d.ts +109 -0
  97. package/jest/testing-helpers/filters/filter-field.js +436 -0
  98. package/jest/testing-helpers/forms/base-input.d.ts +17 -0
  99. package/jest/testing-helpers/forms/base-input.js +50 -0
  100. package/jest/testing-helpers/forms/password-input.d.ts +16 -0
  101. package/jest/testing-helpers/forms/password-input.js +47 -0
  102. package/jest/testing-helpers/forms/search-input.d.ts +20 -0
  103. package/jest/testing-helpers/forms/search-input.js +45 -0
  104. package/jest/testing-helpers/forms/select.d.ts +65 -0
  105. package/jest/testing-helpers/forms/select.js +159 -0
  106. package/jest/testing-helpers/forms/text-input.d.ts +19 -0
  107. package/jest/testing-helpers/forms/text-input.js +42 -0
  108. package/jest/testing-helpers/tables/datatable.d.ts +239 -0
  109. package/jest/testing-helpers/tables/datatable.js +812 -0
  110. package/jest/testing-helpers/utils/isFakeTimersEnabled.d.ts +5 -0
  111. package/jest/testing-helpers/utils/isFakeTimersEnabled.js +27 -0
  112. package/jest/testing-helpers/utils/setup-user-event.d.ts +6 -0
  113. package/jest/testing-helpers/utils/setup-user-event.js +43 -0
  114. package/package.json +12 -3
  115. package/esm/jest/setup.js +0 -24
  116. package/esm/jest/setup.js.map +0 -7
  117. package/jest/setup.d.ts +0 -14
@@ -0,0 +1,131 @@
1
+ import { screen, within } from "@testing-library/react";
2
+ import userEvent from "@testing-library/user-event";
3
+ class SelectTestingHelper {
4
+ constructor(dataTestId) {
5
+ this.dataTestId = dataTestId;
6
+ }
7
+ /**
8
+ * Gets the root element of the select.
9
+ */
10
+ get element() {
11
+ return screen.getByTestId(this.dataTestId);
12
+ }
13
+ /**
14
+ * Gets the trigger element of the select.
15
+ */
16
+ get trigger() {
17
+ const triggerElement = this.element.querySelector('div[type="button"]');
18
+ if (triggerElement) {
19
+ return triggerElement;
20
+ }
21
+ throw new Error("Trigger element for the select was not found.");
22
+ }
23
+ /**
24
+ * Gets the text value of the trigger display value of the select.
25
+ */
26
+ get displayValue() {
27
+ const displayValue = this.trigger.textContent;
28
+ if (displayValue) {
29
+ return displayValue;
30
+ }
31
+ throw new Error("Could not get display value.");
32
+ }
33
+ /**
34
+ * Gets the overlay (content) of the select.
35
+ */
36
+ get overlay() {
37
+ const selectInputAriaControls = within(this.trigger).getByRole("combobox", { hidden: true }).getAttribute("aria-controls");
38
+ const listboxElement = document.querySelector(
39
+ `[role="listbox"][id="${selectInputAriaControls}"]`
40
+ );
41
+ if (listboxElement) {
42
+ return listboxElement.parentElement;
43
+ }
44
+ throw new Error("Could not find the overlay element for the select.");
45
+ }
46
+ /**
47
+ * Gets the text value of the select filter in the overlay.
48
+ */
49
+ get filterValue() {
50
+ const filter = within(this.overlay).getByPlaceholderText(
51
+ "Search"
52
+ );
53
+ return filter.value;
54
+ }
55
+ /**
56
+ * Gets the currently selected option(s).
57
+ */
58
+ get selectedOptions() {
59
+ const selectedOptions = within(
60
+ this.element
61
+ ).getAllByRole("option", { hidden: true });
62
+ return selectedOptions.map((option) => option.value);
63
+ }
64
+ /**
65
+ * Gets the open state of the select overlay.
66
+ */
67
+ get openState() {
68
+ return within(this.trigger).getByRole("combobox", { hidden: true }).getAttribute("aria-expanded") === "true";
69
+ }
70
+ /**
71
+ * Gets the option with the corresponding label.
72
+ */
73
+ getOption(label) {
74
+ const option = within(this.overlay).getByRole("option", {
75
+ name: label
76
+ });
77
+ return option;
78
+ }
79
+ /**
80
+ * Selects the option with the corresponding label.
81
+ */
82
+ async selectOption(label) {
83
+ await this.open();
84
+ const option = within(this.overlay).getByRole("option", {
85
+ name: label
86
+ });
87
+ await userEvent.click(option);
88
+ }
89
+ /**
90
+ * Opens the select overlay.
91
+ */
92
+ async open() {
93
+ if (!this.openState) {
94
+ await userEvent.click(this.trigger);
95
+ }
96
+ }
97
+ /**
98
+ * Closes the select overlay.
99
+ */
100
+ async close() {
101
+ if (this.openState) {
102
+ await userEvent.click(this.trigger);
103
+ }
104
+ }
105
+ /**
106
+ * Types in the filter of the select.
107
+ */
108
+ async typeInFilter(text) {
109
+ await this.open();
110
+ const user = userEvent.setup();
111
+ const filter = within(this.overlay).getByPlaceholderText("Search");
112
+ await user.click(filter);
113
+ await user.keyboard(text);
114
+ }
115
+ /**
116
+ * Clears the filter / search of the select overlay.
117
+ */
118
+ async clearFilter() {
119
+ await this.open();
120
+ const filter = within(this.overlay).getByPlaceholderText("Search");
121
+ await userEvent.clear(filter);
122
+ }
123
+ }
124
+ function getSelectTestingHelper(dataTestId) {
125
+ return new SelectTestingHelper(dataTestId);
126
+ }
127
+ export {
128
+ SelectTestingHelper,
129
+ getSelectTestingHelper
130
+ };
131
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/jest/testing-helpers/forms/select.ts"],
4
+ "sourcesContent": ["import { screen, within } from '@testing-library/react';\nimport userEvent from '@testing-library/user-event';\n\n/**\n * Helper class for interacting with the select.\n * @public\n */\nexport class SelectTestingHelper {\n constructor(protected dataTestId: string) {}\n\n /**\n * Gets the root element of the select.\n */\n get element(): HTMLDivElement {\n return screen.getByTestId(this.dataTestId);\n }\n\n /**\n * Gets the trigger element of the select.\n */\n get trigger(): HTMLDivElement {\n const triggerElement =\n this.element.querySelector<HTMLDivElement>('div[type=\"button\"]');\n if (triggerElement) {\n return triggerElement;\n }\n throw new Error('Trigger element for the select was not found.');\n }\n\n /**\n * Gets the text value of the trigger display value of the select.\n */\n get displayValue(): string {\n const displayValue = this.trigger.textContent;\n\n if (displayValue) {\n return displayValue;\n }\n\n throw new Error('Could not get display value.');\n }\n\n /**\n * Gets the overlay (content) of the select.\n */\n get overlay(): HTMLDivElement {\n // Get the aria-controls attribute that connects the combobx to the listbox in\n // the overlay. It's the only unique identifier that we have that the overlay\n // is actually connected to the trigger.\n const selectInputAriaControls = within(this.trigger)\n .getByRole('combobox', { hidden: true })\n .getAttribute('aria-controls');\n\n // Get the listbox that is connected to the combobox of the trigger.\n const listboxElement = document.querySelector(\n `[role=\"listbox\"][id=\"${selectInputAriaControls}\"]`,\n );\n\n // Get the parent element of the listbox (the actual overlay).\n if (listboxElement) {\n return listboxElement.parentElement as HTMLDivElement;\n }\n\n throw new Error('Could not find the overlay element for the select.');\n }\n\n /**\n * Gets the text value of the select filter in the overlay.\n */\n get filterValue(): string {\n const filter = within(this.overlay).getByPlaceholderText<HTMLInputElement>(\n 'Search',\n );\n return filter.value;\n }\n\n /**\n * Gets the currently selected option(s).\n */\n get selectedOptions(): Array<string> {\n const selectedOptions = within(\n this.element,\n ).getAllByRole<HTMLOptionElement>('option', { hidden: true });\n\n return selectedOptions.map((option) => option.value);\n }\n\n /**\n * Gets the open state of the select overlay.\n */\n get openState(): boolean {\n return (\n within(this.trigger)\n .getByRole('combobox', { hidden: true })\n .getAttribute('aria-expanded') === 'true'\n );\n }\n\n /**\n * Gets the option with the corresponding label.\n */\n getOption(label: string): HTMLOptionElement {\n const option = within(this.overlay).getByRole<HTMLOptionElement>('option', {\n name: label,\n });\n\n return option;\n }\n\n /**\n * Selects the option with the corresponding label.\n */\n async selectOption(label: string) {\n await this.open();\n\n const option = within(this.overlay).getByRole<HTMLOptionElement>('option', {\n name: label,\n });\n\n await userEvent.click(option);\n }\n\n /**\n * Opens the select overlay.\n */\n async open() {\n if (!this.openState) {\n await userEvent.click(this.trigger);\n }\n }\n\n /**\n * Closes the select overlay.\n */\n async close() {\n if (this.openState) {\n await userEvent.click(this.trigger);\n }\n }\n\n /**\n * Types in the filter of the select.\n */\n async typeInFilter(text: string) {\n await this.open();\n const user = userEvent.setup();\n\n const filter = within(this.overlay).getByPlaceholderText('Search');\n await user.click(filter);\n await user.keyboard(text);\n }\n\n /**\n * Clears the filter / search of the select overlay.\n */\n async clearFilter() {\n await this.open();\n\n const filter = within(this.overlay).getByPlaceholderText('Search');\n await userEvent.clear(filter);\n }\n}\n\n/**\n * Helper function that returns the select element with its testing utilities.\n * @public\n */\nexport function getSelectTestingHelper(\n dataTestId: string,\n): SelectTestingHelper {\n return new SelectTestingHelper(dataTestId);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,24 @@
1
+ import { within } from "@testing-library/react";
2
+ import { BaseInputHelper } from "./base-input.js";
3
+ import { setupUserEvent } from "../utils/setup-user-event.js";
4
+ class TextInputHelper extends BaseInputHelper {
5
+ /**
6
+ * Helper that will let you call a specific prefix or suffix button
7
+ * within the TextInput component.
8
+ */
9
+ async clickButton(name) {
10
+ const button = within(this.inputWrapper).getByRole("button", {
11
+ hidden: true,
12
+ name
13
+ });
14
+ await setupUserEvent().click(button);
15
+ }
16
+ }
17
+ function getTextInputHelper(dataTestId) {
18
+ return new TextInputHelper(dataTestId);
19
+ }
20
+ export {
21
+ TextInputHelper,
22
+ getTextInputHelper
23
+ };
24
+ //# sourceMappingURL=text-input.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/jest/testing-helpers/forms/text-input.ts"],
4
+ "sourcesContent": ["import { within } from '@testing-library/react';\n\nimport { BaseInputHelper } from './base-input.js';\nimport { setupUserEvent } from '../utils/setup-user-event.js';\n\n/**\n * Helper class for interacting with the text input\n * @public\n */\nexport class TextInputHelper extends BaseInputHelper {\n /**\n * Helper that will let you call a specific prefix or suffix button\n * within the TextInput component.\n */\n async clickButton(name: string) {\n const button = within(this.inputWrapper).getByRole('button', {\n hidden: true,\n name,\n });\n\n await setupUserEvent().click(button);\n }\n}\n\n/**\n * Helper function that returns the text input element with its testing utilities.\n * @public\n */\nexport function getTextInputHelper(\n /** The accessible test id used to locate the input wrapper. */\n dataTestId: string,\n): TextInputHelper {\n return new TextInputHelper(dataTestId);\n}\n"],
5
+ "mappings": "AAAA,SAAS,cAAc;AAEvB,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAMxB,MAAM,wBAAwB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnD,MAAM,YAAY,MAAc;AAC9B,UAAM,SAAS,OAAO,KAAK,YAAY,EAAE,UAAU,UAAU;AAAA,MAC3D,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAED,UAAM,eAAe,EAAE,MAAM,MAAM;AAAA,EACrC;AACF;AAMO,SAAS,mBAEd,YACiB;AACjB,SAAO,IAAI,gBAAgB,UAAU;AACvC;",
6
+ "names": []
7
+ }