ngx-com 0.1.16 → 0.1.18
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/fesm2022/ngx-com-components-alert-testing.mjs +80 -0
- package/fesm2022/ngx-com-components-alert-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-calendar-testing.mjs +157 -0
- package/fesm2022/ngx-com-components-calendar-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-carousel-testing.mjs +121 -0
- package/fesm2022/ngx-com-components-carousel-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-checkbox-testing.mjs +113 -0
- package/fesm2022/ngx-com-components-checkbox-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-checkbox.mjs +2 -2
- package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
- package/fesm2022/ngx-com-components-code-block-testing.mjs +88 -0
- package/fesm2022/ngx-com-components-code-block-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-collapsible-testing.mjs +104 -0
- package/fesm2022/ngx-com-components-collapsible-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-confirm-testing.mjs +150 -0
- package/fesm2022/ngx-com-components-confirm-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-datepicker-testing.mjs +137 -0
- package/fesm2022/ngx-com-components-datepicker-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-dialog-testing.mjs +109 -0
- package/fesm2022/ngx-com-components-dialog-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-dialog.mjs +18 -18
- package/fesm2022/ngx-com-components-dialog.mjs.map +1 -1
- package/fesm2022/ngx-com-components-dropdown.mjs +39 -0
- package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
- package/fesm2022/ngx-com-components-form-field-testing.mjs +140 -0
- package/fesm2022/ngx-com-components-form-field-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-form-field.mjs +5 -1
- package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
- package/fesm2022/ngx-com-components-menu-testing.mjs +298 -0
- package/fesm2022/ngx-com-components-menu-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-paginator-testing.mjs +128 -0
- package/fesm2022/ngx-com-components-paginator-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-popover-testing.mjs +115 -0
- package/fesm2022/ngx-com-components-popover-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-radio-testing.mjs +157 -0
- package/fesm2022/ngx-com-components-radio-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-radio.mjs +2 -2
- package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
- package/fesm2022/ngx-com-components-segmented-control-testing.mjs +122 -0
- package/fesm2022/ngx-com-components-segmented-control-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-sort-testing.mjs +108 -0
- package/fesm2022/ngx-com-components-sort-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-switch-testing.mjs +103 -0
- package/fesm2022/ngx-com-components-switch-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-switch.mjs +2 -2
- package/fesm2022/ngx-com-components-switch.mjs.map +1 -1
- package/fesm2022/ngx-com-components-table-testing.mjs +198 -0
- package/fesm2022/ngx-com-components-table-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-tabs-testing.mjs +126 -0
- package/fesm2022/ngx-com-components-tabs-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-timepicker-testing.mjs +117 -0
- package/fesm2022/ngx-com-components-timepicker-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-toast-testing.mjs +172 -0
- package/fesm2022/ngx-com-components-toast-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-toast.mjs +4 -4
- package/fesm2022/ngx-com-components-toast.mjs.map +1 -1
- package/fesm2022/ngx-com-components-tooltip-testing.mjs +117 -0
- package/fesm2022/ngx-com-components-tooltip-testing.mjs.map +1 -0
- package/package.json +89 -1
- package/types/ngx-com-components-alert-testing.d.ts +41 -0
- package/types/ngx-com-components-calendar-testing.d.ts +80 -0
- package/types/ngx-com-components-carousel-testing.d.ts +51 -0
- package/types/ngx-com-components-checkbox-testing.d.ts +56 -0
- package/types/ngx-com-components-code-block-testing.d.ts +45 -0
- package/types/ngx-com-components-collapsible-testing.d.ts +53 -0
- package/types/ngx-com-components-confirm-testing.d.ts +78 -0
- package/types/ngx-com-components-datepicker-testing.d.ts +61 -0
- package/types/ngx-com-components-dialog-testing.d.ts +57 -0
- package/types/ngx-com-components-dropdown.d.ts +12 -0
- package/types/ngx-com-components-form-field-testing.d.ts +61 -0
- package/types/ngx-com-components-menu-testing.d.ts +167 -0
- package/types/ngx-com-components-paginator-testing.d.ts +58 -0
- package/types/ngx-com-components-popover-testing.d.ts +63 -0
- package/types/ngx-com-components-radio-testing.d.ts +86 -0
- package/types/ngx-com-components-segmented-control-testing.d.ts +66 -0
- package/types/ngx-com-components-sort-testing.d.ts +62 -0
- package/types/ngx-com-components-switch-testing.d.ts +52 -0
- package/types/ngx-com-components-table-testing.d.ts +124 -0
- package/types/ngx-com-components-tabs-testing.d.ts +67 -0
- package/types/ngx-com-components-timepicker-testing.d.ts +53 -0
- package/types/ngx-com-components-toast-testing.d.ts +93 -0
- package/types/ngx-com-components-tooltip-testing.d.ts +57 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { ComponentHarness, HarnessPredicate, parallel, TestKey } from '@angular/cdk/testing';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Harness for interacting with a menu item in tests.
|
|
5
|
+
*/
|
|
6
|
+
class ComMenuItemHarness extends ComponentHarness {
|
|
7
|
+
static hostSelector = '[comMenuItem]';
|
|
8
|
+
/**
|
|
9
|
+
* Gets a HarnessPredicate for matching menu items.
|
|
10
|
+
* @param options Filter options.
|
|
11
|
+
*/
|
|
12
|
+
static with(options = {}) {
|
|
13
|
+
return new HarnessPredicate(ComMenuItemHarness, options)
|
|
14
|
+
.addOption('text', options.text, async (harness, text) => {
|
|
15
|
+
const itemText = await harness.getText();
|
|
16
|
+
return HarnessPredicate.stringMatches(itemText, text);
|
|
17
|
+
})
|
|
18
|
+
.addOption('disabled', options.disabled, async (harness, disabled) => {
|
|
19
|
+
return (await harness.isDisabled()) === disabled;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/** Gets the item's text content. */
|
|
23
|
+
async getText() {
|
|
24
|
+
const host = await this.host();
|
|
25
|
+
return host.text();
|
|
26
|
+
}
|
|
27
|
+
/** Whether the item is disabled. */
|
|
28
|
+
async isDisabled() {
|
|
29
|
+
const host = await this.host();
|
|
30
|
+
return (await host.getAttribute('aria-disabled')) === 'true';
|
|
31
|
+
}
|
|
32
|
+
/** Clicks the menu item. */
|
|
33
|
+
async click() {
|
|
34
|
+
const host = await this.host();
|
|
35
|
+
return host.click();
|
|
36
|
+
}
|
|
37
|
+
/** Focuses the menu item. */
|
|
38
|
+
async focus() {
|
|
39
|
+
const host = await this.host();
|
|
40
|
+
return host.focus();
|
|
41
|
+
}
|
|
42
|
+
/** Whether the menu item is focused. */
|
|
43
|
+
async isFocused() {
|
|
44
|
+
const host = await this.host();
|
|
45
|
+
return host.isFocused();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Harness for interacting with a checkbox menu item in tests.
|
|
50
|
+
*/
|
|
51
|
+
class ComMenuItemCheckboxHarness extends ComponentHarness {
|
|
52
|
+
static hostSelector = '[comMenuItemCheckbox]';
|
|
53
|
+
/**
|
|
54
|
+
* Gets a HarnessPredicate for matching checkbox menu items.
|
|
55
|
+
* @param options Filter options.
|
|
56
|
+
*/
|
|
57
|
+
static with(options = {}) {
|
|
58
|
+
return new HarnessPredicate(ComMenuItemCheckboxHarness, options)
|
|
59
|
+
.addOption('text', options.text, async (harness, text) => {
|
|
60
|
+
const itemText = await harness.getText();
|
|
61
|
+
return HarnessPredicate.stringMatches(itemText, text);
|
|
62
|
+
})
|
|
63
|
+
.addOption('disabled', options.disabled, async (harness, disabled) => {
|
|
64
|
+
return (await harness.isDisabled()) === disabled;
|
|
65
|
+
})
|
|
66
|
+
.addOption('checked', options.checked, async (harness, checked) => {
|
|
67
|
+
return (await harness.isChecked()) === checked;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/** Gets the item's text content. */
|
|
71
|
+
async getText() {
|
|
72
|
+
const host = await this.host();
|
|
73
|
+
return host.text();
|
|
74
|
+
}
|
|
75
|
+
/** Whether the item is disabled. */
|
|
76
|
+
async isDisabled() {
|
|
77
|
+
const host = await this.host();
|
|
78
|
+
return (await host.getAttribute('aria-disabled')) === 'true';
|
|
79
|
+
}
|
|
80
|
+
/** Whether the item is checked. */
|
|
81
|
+
async isChecked() {
|
|
82
|
+
const host = await this.host();
|
|
83
|
+
return (await host.getAttribute('aria-checked')) === 'true';
|
|
84
|
+
}
|
|
85
|
+
/** Toggles the checkbox item by clicking it. */
|
|
86
|
+
async toggle() {
|
|
87
|
+
const host = await this.host();
|
|
88
|
+
return host.click();
|
|
89
|
+
}
|
|
90
|
+
/** Focuses the item. */
|
|
91
|
+
async focus() {
|
|
92
|
+
const host = await this.host();
|
|
93
|
+
return host.focus();
|
|
94
|
+
}
|
|
95
|
+
/** Whether the item is focused. */
|
|
96
|
+
async isFocused() {
|
|
97
|
+
const host = await this.host();
|
|
98
|
+
return host.isFocused();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Harness for interacting with a radio menu item in tests.
|
|
103
|
+
*/
|
|
104
|
+
class ComMenuItemRadioHarness extends ComponentHarness {
|
|
105
|
+
static hostSelector = '[comMenuItemRadio]';
|
|
106
|
+
/**
|
|
107
|
+
* Gets a HarnessPredicate for matching radio menu items.
|
|
108
|
+
* @param options Filter options.
|
|
109
|
+
*/
|
|
110
|
+
static with(options = {}) {
|
|
111
|
+
return new HarnessPredicate(ComMenuItemRadioHarness, options)
|
|
112
|
+
.addOption('text', options.text, async (harness, text) => {
|
|
113
|
+
const itemText = await harness.getText();
|
|
114
|
+
return HarnessPredicate.stringMatches(itemText, text);
|
|
115
|
+
})
|
|
116
|
+
.addOption('disabled', options.disabled, async (harness, disabled) => {
|
|
117
|
+
return (await harness.isDisabled()) === disabled;
|
|
118
|
+
})
|
|
119
|
+
.addOption('checked', options.checked, async (harness, checked) => {
|
|
120
|
+
return (await harness.isChecked()) === checked;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/** Gets the item's text content. */
|
|
124
|
+
async getText() {
|
|
125
|
+
const host = await this.host();
|
|
126
|
+
return host.text();
|
|
127
|
+
}
|
|
128
|
+
/** Whether the item is disabled. */
|
|
129
|
+
async isDisabled() {
|
|
130
|
+
const host = await this.host();
|
|
131
|
+
return (await host.getAttribute('aria-disabled')) === 'true';
|
|
132
|
+
}
|
|
133
|
+
/** Whether the item is checked. */
|
|
134
|
+
async isChecked() {
|
|
135
|
+
const host = await this.host();
|
|
136
|
+
return (await host.getAttribute('aria-checked')) === 'true';
|
|
137
|
+
}
|
|
138
|
+
/** Clicks the radio item. */
|
|
139
|
+
async click() {
|
|
140
|
+
const host = await this.host();
|
|
141
|
+
return host.click();
|
|
142
|
+
}
|
|
143
|
+
/** Focuses the item. */
|
|
144
|
+
async focus() {
|
|
145
|
+
const host = await this.host();
|
|
146
|
+
return host.focus();
|
|
147
|
+
}
|
|
148
|
+
/** Whether the item is focused. */
|
|
149
|
+
async isFocused() {
|
|
150
|
+
const host = await this.host();
|
|
151
|
+
return host.isFocused();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Harness for interacting with a com-menu panel in tests.
|
|
156
|
+
*/
|
|
157
|
+
class ComMenuHarness extends ComponentHarness {
|
|
158
|
+
static hostSelector = 'com-menu';
|
|
159
|
+
menuPanel = this.locatorFor('[role="menu"]');
|
|
160
|
+
/**
|
|
161
|
+
* Gets a HarnessPredicate for matching menus.
|
|
162
|
+
* @param options Filter options.
|
|
163
|
+
*/
|
|
164
|
+
static with(options = {}) {
|
|
165
|
+
return new HarnessPredicate(ComMenuHarness, options)
|
|
166
|
+
.addOption('ariaLabel', options.ariaLabel, async (harness, ariaLabel) => {
|
|
167
|
+
const label = await harness.getAriaLabel();
|
|
168
|
+
return HarnessPredicate.stringMatches(label, ariaLabel);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/** Gets the menu's aria-label. */
|
|
172
|
+
async getAriaLabel() {
|
|
173
|
+
const panel = await this.menuPanel();
|
|
174
|
+
return panel.getAttribute('aria-label');
|
|
175
|
+
}
|
|
176
|
+
/** Gets the menu panel's ID. */
|
|
177
|
+
async getMenuId() {
|
|
178
|
+
const panel = await this.menuPanel();
|
|
179
|
+
return panel.getAttribute('id');
|
|
180
|
+
}
|
|
181
|
+
/** Gets all menu items, optionally filtered. */
|
|
182
|
+
async getItems(filters = {}) {
|
|
183
|
+
return this.locatorForAll(ComMenuItemHarness.with(filters))();
|
|
184
|
+
}
|
|
185
|
+
/** Gets all checkbox menu items, optionally filtered. */
|
|
186
|
+
async getCheckboxItems(filters = {}) {
|
|
187
|
+
return this.locatorForAll(ComMenuItemCheckboxHarness.with(filters))();
|
|
188
|
+
}
|
|
189
|
+
/** Gets all radio menu items, optionally filtered. */
|
|
190
|
+
async getRadioItems(filters = {}) {
|
|
191
|
+
return this.locatorForAll(ComMenuItemRadioHarness.with(filters))();
|
|
192
|
+
}
|
|
193
|
+
/** Gets all menu item texts. */
|
|
194
|
+
async getItemLabels() {
|
|
195
|
+
const items = await this.getItems();
|
|
196
|
+
return parallel(() => items.map((item) => item.getText()));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Harness for interacting with a menu trigger in tests.
|
|
201
|
+
*/
|
|
202
|
+
class ComMenuTriggerHarness extends ComponentHarness {
|
|
203
|
+
static hostSelector = '[comMenuTrigger]';
|
|
204
|
+
documentRootLocator = this.documentRootLocatorFactory();
|
|
205
|
+
/**
|
|
206
|
+
* Gets a HarnessPredicate for matching menu triggers.
|
|
207
|
+
* @param options Filter options.
|
|
208
|
+
*/
|
|
209
|
+
static with(options = {}) {
|
|
210
|
+
return new HarnessPredicate(ComMenuTriggerHarness, options)
|
|
211
|
+
.addOption('text', options.text, async (harness, text) => {
|
|
212
|
+
const triggerText = await harness.getText();
|
|
213
|
+
return HarnessPredicate.stringMatches(triggerText, text);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/** Gets the trigger element's text. */
|
|
217
|
+
async getText() {
|
|
218
|
+
const host = await this.host();
|
|
219
|
+
return host.text();
|
|
220
|
+
}
|
|
221
|
+
/** Whether the menu is currently open. */
|
|
222
|
+
async isOpen() {
|
|
223
|
+
const host = await this.host();
|
|
224
|
+
return (await host.getAttribute('aria-expanded')) === 'true';
|
|
225
|
+
}
|
|
226
|
+
/** Opens the menu if it's closed. */
|
|
227
|
+
async open() {
|
|
228
|
+
if (!(await this.isOpen())) {
|
|
229
|
+
const host = await this.host();
|
|
230
|
+
await host.click();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/** Closes the menu if it's open. */
|
|
234
|
+
async close() {
|
|
235
|
+
if (await this.isOpen()) {
|
|
236
|
+
const host = await this.host();
|
|
237
|
+
await host.sendKeys(TestKey.ESCAPE);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/** Toggles the menu open/close state. */
|
|
241
|
+
async toggle() {
|
|
242
|
+
const host = await this.host();
|
|
243
|
+
return host.click();
|
|
244
|
+
}
|
|
245
|
+
/** Gets the menu panel harness, or null if the menu is closed. */
|
|
246
|
+
async getMenu() {
|
|
247
|
+
if (!(await this.isOpen())) {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
return this.documentRootLocator.locatorForOptional(ComMenuHarness.with({}))();
|
|
251
|
+
}
|
|
252
|
+
/** Opens the menu and gets all menu items. */
|
|
253
|
+
async getItems(filters = {}) {
|
|
254
|
+
await this.open();
|
|
255
|
+
const menu = await this.getMenu();
|
|
256
|
+
if (!menu) {
|
|
257
|
+
throw new Error('Could not find menu panel. Is the menu template correctly bound to [comMenuTrigger]?');
|
|
258
|
+
}
|
|
259
|
+
return menu.getItems(filters);
|
|
260
|
+
}
|
|
261
|
+
/** Opens the menu, finds an item by filter, and clicks it. */
|
|
262
|
+
async clickItem(filter) {
|
|
263
|
+
const items = await this.getItems(filter);
|
|
264
|
+
if (items.length === 0) {
|
|
265
|
+
throw new Error(`Could not find menu item matching filter: ${JSON.stringify(filter)}`);
|
|
266
|
+
}
|
|
267
|
+
return items[0].click();
|
|
268
|
+
}
|
|
269
|
+
/** Sends keyboard input to the trigger element. */
|
|
270
|
+
async sendKeys(...keys) {
|
|
271
|
+
const host = await this.host();
|
|
272
|
+
return host.sendKeys(...keys);
|
|
273
|
+
}
|
|
274
|
+
/** Focuses the trigger element. */
|
|
275
|
+
async focus() {
|
|
276
|
+
const host = await this.host();
|
|
277
|
+
return host.focus();
|
|
278
|
+
}
|
|
279
|
+
/** Blurs the trigger element. */
|
|
280
|
+
async blur() {
|
|
281
|
+
const host = await this.host();
|
|
282
|
+
return host.blur();
|
|
283
|
+
}
|
|
284
|
+
/** Whether the trigger element is focused. */
|
|
285
|
+
async isFocused() {
|
|
286
|
+
const host = await this.host();
|
|
287
|
+
return host.isFocused();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Testing utilities for the menu component
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Generated bundle index. Do not edit.
|
|
295
|
+
*/
|
|
296
|
+
|
|
297
|
+
export { ComMenuHarness, ComMenuItemCheckboxHarness, ComMenuItemHarness, ComMenuItemRadioHarness, ComMenuTriggerHarness };
|
|
298
|
+
//# sourceMappingURL=ngx-com-components-menu-testing.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-com-components-menu-testing.mjs","sources":["../../../projects/com/components/menu/testing/menu.harness.ts","../../../projects/com/components/menu/testing/index.ts","../../../projects/com/components/menu/testing/ngx-com-components-menu-testing.ts"],"sourcesContent":["import {\n ComponentHarness,\n HarnessPredicate,\n TestKey,\n parallel,\n} from '@angular/cdk/testing';\nimport type { BaseHarnessFilters } from '@angular/cdk/testing';\n\n/** Harness filters for ComMenuItemHarness. */\nexport interface ComMenuItemHarnessFilters extends BaseHarnessFilters {\n /** Filter by the item's text content. */\n text?: string | RegExp;\n /** Filter by whether the item is disabled. */\n disabled?: boolean;\n}\n\n/** Harness filters for ComMenuItemCheckboxHarness. */\nexport interface ComMenuItemCheckboxHarnessFilters extends BaseHarnessFilters {\n /** Filter by the item's text content. */\n text?: string | RegExp;\n /** Filter by whether the item is disabled. */\n disabled?: boolean;\n /** Filter by whether the item is checked. */\n checked?: boolean;\n}\n\n/** Harness filters for ComMenuItemRadioHarness. */\nexport interface ComMenuItemRadioHarnessFilters extends BaseHarnessFilters {\n /** Filter by the item's text content. */\n text?: string | RegExp;\n /** Filter by whether the item is disabled. */\n disabled?: boolean;\n /** Filter by whether the item is checked. */\n checked?: boolean;\n}\n\n/** Harness filters for ComMenuHarness. */\nexport interface ComMenuHarnessFilters extends BaseHarnessFilters {\n /** Filter by the menu's aria-label. */\n ariaLabel?: string | RegExp;\n}\n\n/** Harness filters for ComMenuTriggerHarness. */\nexport interface ComMenuTriggerHarnessFilters extends BaseHarnessFilters {\n /** Filter by the trigger element's text. */\n text?: string | RegExp;\n}\n\n/**\n * Harness for interacting with a menu item in tests.\n */\nexport class ComMenuItemHarness extends ComponentHarness {\n static hostSelector = '[comMenuItem]';\n\n /**\n * Gets a HarnessPredicate for matching menu items.\n * @param options Filter options.\n */\n static with(options: ComMenuItemHarnessFilters = {}): HarnessPredicate<ComMenuItemHarness> {\n return new HarnessPredicate(ComMenuItemHarness, options)\n .addOption('text', options.text, async (harness, text) => {\n const itemText = await harness.getText();\n return HarnessPredicate.stringMatches(itemText, text);\n })\n .addOption('disabled', options.disabled, async (harness, disabled) => {\n return (await harness.isDisabled()) === disabled;\n });\n }\n\n /** Gets the item's text content. */\n async getText(): Promise<string> {\n const host = await this.host();\n return host.text();\n }\n\n /** Whether the item is disabled. */\n async isDisabled(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('aria-disabled')) === 'true';\n }\n\n /** Clicks the menu item. */\n async click(): Promise<void> {\n const host = await this.host();\n return host.click();\n }\n\n /** Focuses the menu item. */\n async focus(): Promise<void> {\n const host = await this.host();\n return host.focus();\n }\n\n /** Whether the menu item is focused. */\n async isFocused(): Promise<boolean> {\n const host = await this.host();\n return host.isFocused();\n }\n}\n\n/**\n * Harness for interacting with a checkbox menu item in tests.\n */\nexport class ComMenuItemCheckboxHarness extends ComponentHarness {\n static hostSelector = '[comMenuItemCheckbox]';\n\n /**\n * Gets a HarnessPredicate for matching checkbox menu items.\n * @param options Filter options.\n */\n static with(options: ComMenuItemCheckboxHarnessFilters = {}): HarnessPredicate<ComMenuItemCheckboxHarness> {\n return new HarnessPredicate(ComMenuItemCheckboxHarness, options)\n .addOption('text', options.text, async (harness, text) => {\n const itemText = await harness.getText();\n return HarnessPredicate.stringMatches(itemText, text);\n })\n .addOption('disabled', options.disabled, async (harness, disabled) => {\n return (await harness.isDisabled()) === disabled;\n })\n .addOption('checked', options.checked, async (harness, checked) => {\n return (await harness.isChecked()) === checked;\n });\n }\n\n /** Gets the item's text content. */\n async getText(): Promise<string> {\n const host = await this.host();\n return host.text();\n }\n\n /** Whether the item is disabled. */\n async isDisabled(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('aria-disabled')) === 'true';\n }\n\n /** Whether the item is checked. */\n async isChecked(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('aria-checked')) === 'true';\n }\n\n /** Toggles the checkbox item by clicking it. */\n async toggle(): Promise<void> {\n const host = await this.host();\n return host.click();\n }\n\n /** Focuses the item. */\n async focus(): Promise<void> {\n const host = await this.host();\n return host.focus();\n }\n\n /** Whether the item is focused. */\n async isFocused(): Promise<boolean> {\n const host = await this.host();\n return host.isFocused();\n }\n}\n\n/**\n * Harness for interacting with a radio menu item in tests.\n */\nexport class ComMenuItemRadioHarness extends ComponentHarness {\n static hostSelector = '[comMenuItemRadio]';\n\n /**\n * Gets a HarnessPredicate for matching radio menu items.\n * @param options Filter options.\n */\n static with(options: ComMenuItemRadioHarnessFilters = {}): HarnessPredicate<ComMenuItemRadioHarness> {\n return new HarnessPredicate(ComMenuItemRadioHarness, options)\n .addOption('text', options.text, async (harness, text) => {\n const itemText = await harness.getText();\n return HarnessPredicate.stringMatches(itemText, text);\n })\n .addOption('disabled', options.disabled, async (harness, disabled) => {\n return (await harness.isDisabled()) === disabled;\n })\n .addOption('checked', options.checked, async (harness, checked) => {\n return (await harness.isChecked()) === checked;\n });\n }\n\n /** Gets the item's text content. */\n async getText(): Promise<string> {\n const host = await this.host();\n return host.text();\n }\n\n /** Whether the item is disabled. */\n async isDisabled(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('aria-disabled')) === 'true';\n }\n\n /** Whether the item is checked. */\n async isChecked(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('aria-checked')) === 'true';\n }\n\n /** Clicks the radio item. */\n async click(): Promise<void> {\n const host = await this.host();\n return host.click();\n }\n\n /** Focuses the item. */\n async focus(): Promise<void> {\n const host = await this.host();\n return host.focus();\n }\n\n /** Whether the item is focused. */\n async isFocused(): Promise<boolean> {\n const host = await this.host();\n return host.isFocused();\n }\n}\n\n/**\n * Harness for interacting with a com-menu panel in tests.\n */\nexport class ComMenuHarness extends ComponentHarness {\n static hostSelector = 'com-menu';\n\n private readonly menuPanel = this.locatorFor('[role=\"menu\"]');\n\n /**\n * Gets a HarnessPredicate for matching menus.\n * @param options Filter options.\n */\n static with(options: ComMenuHarnessFilters = {}): HarnessPredicate<ComMenuHarness> {\n return new HarnessPredicate(ComMenuHarness, options)\n .addOption('ariaLabel', options.ariaLabel, async (harness, ariaLabel) => {\n const label = await harness.getAriaLabel();\n return HarnessPredicate.stringMatches(label, ariaLabel);\n });\n }\n\n /** Gets the menu's aria-label. */\n async getAriaLabel(): Promise<string | null> {\n const panel = await this.menuPanel();\n return panel.getAttribute('aria-label');\n }\n\n /** Gets the menu panel's ID. */\n async getMenuId(): Promise<string | null> {\n const panel = await this.menuPanel();\n return panel.getAttribute('id');\n }\n\n /** Gets all menu items, optionally filtered. */\n async getItems(filters: ComMenuItemHarnessFilters = {}): Promise<ComMenuItemHarness[]> {\n return this.locatorForAll(ComMenuItemHarness.with(filters))();\n }\n\n /** Gets all checkbox menu items, optionally filtered. */\n async getCheckboxItems(filters: ComMenuItemCheckboxHarnessFilters = {}): Promise<ComMenuItemCheckboxHarness[]> {\n return this.locatorForAll(ComMenuItemCheckboxHarness.with(filters))();\n }\n\n /** Gets all radio menu items, optionally filtered. */\n async getRadioItems(filters: ComMenuItemRadioHarnessFilters = {}): Promise<ComMenuItemRadioHarness[]> {\n return this.locatorForAll(ComMenuItemRadioHarness.with(filters))();\n }\n\n /** Gets all menu item texts. */\n async getItemLabels(): Promise<string[]> {\n const items = await this.getItems();\n return parallel(() => items.map((item) => item.getText()));\n }\n}\n\n/**\n * Harness for interacting with a menu trigger in tests.\n */\nexport class ComMenuTriggerHarness extends ComponentHarness {\n static hostSelector = '[comMenuTrigger]';\n\n private readonly documentRootLocator = this.documentRootLocatorFactory();\n\n /**\n * Gets a HarnessPredicate for matching menu triggers.\n * @param options Filter options.\n */\n static with(options: ComMenuTriggerHarnessFilters = {}): HarnessPredicate<ComMenuTriggerHarness> {\n return new HarnessPredicate(ComMenuTriggerHarness, options)\n .addOption('text', options.text, async (harness, text) => {\n const triggerText = await harness.getText();\n return HarnessPredicate.stringMatches(triggerText, text);\n });\n }\n\n /** Gets the trigger element's text. */\n async getText(): Promise<string> {\n const host = await this.host();\n return host.text();\n }\n\n /** Whether the menu is currently open. */\n async isOpen(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('aria-expanded')) === 'true';\n }\n\n /** Opens the menu if it's closed. */\n async open(): Promise<void> {\n if (!(await this.isOpen())) {\n const host = await this.host();\n await host.click();\n }\n }\n\n /** Closes the menu if it's open. */\n async close(): Promise<void> {\n if (await this.isOpen()) {\n const host = await this.host();\n await host.sendKeys(TestKey.ESCAPE);\n }\n }\n\n /** Toggles the menu open/close state. */\n async toggle(): Promise<void> {\n const host = await this.host();\n return host.click();\n }\n\n /** Gets the menu panel harness, or null if the menu is closed. */\n async getMenu(): Promise<ComMenuHarness | null> {\n if (!(await this.isOpen())) {\n return null;\n }\n return this.documentRootLocator.locatorForOptional(ComMenuHarness.with({}))();\n }\n\n /** Opens the menu and gets all menu items. */\n async getItems(filters: ComMenuItemHarnessFilters = {}): Promise<ComMenuItemHarness[]> {\n await this.open();\n const menu = await this.getMenu();\n if (!menu) {\n throw new Error('Could not find menu panel. Is the menu template correctly bound to [comMenuTrigger]?');\n }\n return menu.getItems(filters);\n }\n\n /** Opens the menu, finds an item by filter, and clicks it. */\n async clickItem(filter: ComMenuItemHarnessFilters): Promise<void> {\n const items = await this.getItems(filter);\n if (items.length === 0) {\n throw new Error(`Could not find menu item matching filter: ${JSON.stringify(filter)}`);\n }\n return items[0]!.click();\n }\n\n /** Sends keyboard input to the trigger element. */\n async sendKeys(...keys: (string | TestKey)[]): Promise<void> {\n const host = await this.host();\n return host.sendKeys(...keys);\n }\n\n /** Focuses the trigger element. */\n async focus(): Promise<void> {\n const host = await this.host();\n return host.focus();\n }\n\n /** Blurs the trigger element. */\n async blur(): Promise<void> {\n const host = await this.host();\n return host.blur();\n }\n\n /** Whether the trigger element is focused. */\n async isFocused(): Promise<boolean> {\n const host = await this.host();\n return host.isFocused();\n }\n}\n","// Testing utilities for the menu component\n\nexport {\n ComMenuItemHarness,\n ComMenuItemCheckboxHarness,\n ComMenuItemRadioHarness,\n ComMenuHarness,\n ComMenuTriggerHarness,\n} from './menu.harness';\n\nexport type {\n ComMenuItemHarnessFilters,\n ComMenuItemCheckboxHarnessFilters,\n ComMenuItemRadioHarnessFilters,\n ComMenuHarnessFilters,\n ComMenuTriggerHarnessFilters,\n} from './menu.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Harness for interacting with a ComPaginator in tests.
|
|
5
|
+
*/
|
|
6
|
+
class ComPaginatorHarness extends ComponentHarness {
|
|
7
|
+
static hostSelector = 'com-paginator';
|
|
8
|
+
previousButton = this.locatorFor('button[aria-label="Previous page"]');
|
|
9
|
+
nextButton = this.locatorFor('button[aria-label="Next page"]');
|
|
10
|
+
firstButton = this.locatorForOptional('button[aria-label="First page"]');
|
|
11
|
+
lastButton = this.locatorForOptional('button[aria-label="Last page"]');
|
|
12
|
+
rangeLabel = this.locatorForOptional('nav > span');
|
|
13
|
+
select = this.locatorForOptional('select');
|
|
14
|
+
nav = this.locatorFor('nav[role="navigation"]');
|
|
15
|
+
/**
|
|
16
|
+
* Gets a HarnessPredicate for matching paginators.
|
|
17
|
+
* @param options Filter options.
|
|
18
|
+
*/
|
|
19
|
+
static with(options = {}) {
|
|
20
|
+
return new HarnessPredicate(ComPaginatorHarness, options)
|
|
21
|
+
.addOption('disabled', options.disabled, async (harness, disabled) => {
|
|
22
|
+
return (await harness.isDisabled()) === disabled;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/** Navigates to the first page. Throws if the first page button is not present. */
|
|
26
|
+
async goToFirstPage() {
|
|
27
|
+
const btn = await this.firstButton();
|
|
28
|
+
if (!btn) {
|
|
29
|
+
throw new Error('First page button is not present');
|
|
30
|
+
}
|
|
31
|
+
return btn.click();
|
|
32
|
+
}
|
|
33
|
+
/** Navigates to the previous page. */
|
|
34
|
+
async goToPreviousPage() {
|
|
35
|
+
const btn = await this.previousButton();
|
|
36
|
+
return btn.click();
|
|
37
|
+
}
|
|
38
|
+
/** Navigates to the next page. */
|
|
39
|
+
async goToNextPage() {
|
|
40
|
+
const btn = await this.nextButton();
|
|
41
|
+
return btn.click();
|
|
42
|
+
}
|
|
43
|
+
/** Navigates to the last page. Throws if the last page button is not present. */
|
|
44
|
+
async goToLastPage() {
|
|
45
|
+
const btn = await this.lastButton();
|
|
46
|
+
if (!btn) {
|
|
47
|
+
throw new Error('Last page button is not present');
|
|
48
|
+
}
|
|
49
|
+
return btn.click();
|
|
50
|
+
}
|
|
51
|
+
/** Navigates to a specific page (1-based). Throws if page button is not present. */
|
|
52
|
+
async goToPage(pageNumber) {
|
|
53
|
+
const btn = await this.locatorForOptional(`button[aria-label="Page ${pageNumber}"]`)();
|
|
54
|
+
if (!btn) {
|
|
55
|
+
throw new Error(`Page button for page ${pageNumber} is not present`);
|
|
56
|
+
}
|
|
57
|
+
return btn.click();
|
|
58
|
+
}
|
|
59
|
+
/** Gets the range label text. */
|
|
60
|
+
async getRangeLabel() {
|
|
61
|
+
const label = await this.rangeLabel();
|
|
62
|
+
if (!label) {
|
|
63
|
+
return '';
|
|
64
|
+
}
|
|
65
|
+
return label.text();
|
|
66
|
+
}
|
|
67
|
+
/** Gets the current page size from the select element. Throws if no select is present. */
|
|
68
|
+
async getPageSize() {
|
|
69
|
+
const selectEl = await this.select();
|
|
70
|
+
if (!selectEl) {
|
|
71
|
+
throw new Error('Page size select is not present');
|
|
72
|
+
}
|
|
73
|
+
const value = await selectEl.getProperty('value');
|
|
74
|
+
return Number(value);
|
|
75
|
+
}
|
|
76
|
+
/** Sets the page size by selecting a value. Throws if no select is present. */
|
|
77
|
+
async setPageSize(size) {
|
|
78
|
+
const selectEl = await this.select();
|
|
79
|
+
if (!selectEl) {
|
|
80
|
+
throw new Error('Page size select is not present');
|
|
81
|
+
}
|
|
82
|
+
await selectEl.setInputValue(String(size));
|
|
83
|
+
await selectEl.dispatchEvent('change');
|
|
84
|
+
}
|
|
85
|
+
/** Whether the previous page button is disabled. */
|
|
86
|
+
async isPreviousPageDisabled() {
|
|
87
|
+
const btn = await this.previousButton();
|
|
88
|
+
return (await btn.getAttribute('disabled')) !== null;
|
|
89
|
+
}
|
|
90
|
+
/** Whether the next page button is disabled. */
|
|
91
|
+
async isNextPageDisabled() {
|
|
92
|
+
const btn = await this.nextButton();
|
|
93
|
+
return (await btn.getAttribute('disabled')) !== null;
|
|
94
|
+
}
|
|
95
|
+
/** Whether the paginator is fully disabled (both prev and next buttons disabled). */
|
|
96
|
+
async isDisabled() {
|
|
97
|
+
return (await this.isPreviousPageDisabled()) && (await this.isNextPageDisabled());
|
|
98
|
+
}
|
|
99
|
+
/** Gets the aria-label of the navigation element. */
|
|
100
|
+
async getAriaLabel() {
|
|
101
|
+
const navEl = await this.nav();
|
|
102
|
+
return navEl.getAttribute('aria-label');
|
|
103
|
+
}
|
|
104
|
+
/** Whether the paginator navigation is focused. */
|
|
105
|
+
async isFocused() {
|
|
106
|
+
const host = await this.host();
|
|
107
|
+
return host.isFocused();
|
|
108
|
+
}
|
|
109
|
+
/** Focuses the paginator host element. */
|
|
110
|
+
async focus() {
|
|
111
|
+
const host = await this.host();
|
|
112
|
+
return host.focus();
|
|
113
|
+
}
|
|
114
|
+
/** Blurs the paginator host element. */
|
|
115
|
+
async blur() {
|
|
116
|
+
const host = await this.host();
|
|
117
|
+
return host.blur();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Testing utilities for the paginator component
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Generated bundle index. Do not edit.
|
|
125
|
+
*/
|
|
126
|
+
|
|
127
|
+
export { ComPaginatorHarness };
|
|
128
|
+
//# sourceMappingURL=ngx-com-components-paginator-testing.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-com-components-paginator-testing.mjs","sources":["../../../projects/com/components/paginator/testing/paginator.harness.ts","../../../projects/com/components/paginator/testing/index.ts","../../../projects/com/components/paginator/testing/ngx-com-components-paginator-testing.ts"],"sourcesContent":["import {\n ComponentHarness,\n HarnessPredicate,\n} from '@angular/cdk/testing';\nimport type { BaseHarnessFilters } from '@angular/cdk/testing';\n\n/** Harness filters for ComPaginatorHarness. */\nexport interface ComPaginatorHarnessFilters extends BaseHarnessFilters {\n /** Filter by whether the paginator is disabled. */\n disabled?: boolean;\n}\n\n/**\n * Harness for interacting with a ComPaginator in tests.\n */\nexport class ComPaginatorHarness extends ComponentHarness {\n static hostSelector = 'com-paginator';\n\n private readonly previousButton = this.locatorFor('button[aria-label=\"Previous page\"]');\n private readonly nextButton = this.locatorFor('button[aria-label=\"Next page\"]');\n private readonly firstButton = this.locatorForOptional('button[aria-label=\"First page\"]');\n private readonly lastButton = this.locatorForOptional('button[aria-label=\"Last page\"]');\n private readonly rangeLabel = this.locatorForOptional('nav > span');\n private readonly select = this.locatorForOptional('select');\n private readonly nav = this.locatorFor('nav[role=\"navigation\"]');\n\n /**\n * Gets a HarnessPredicate for matching paginators.\n * @param options Filter options.\n */\n static with(options: ComPaginatorHarnessFilters = {}): HarnessPredicate<ComPaginatorHarness> {\n return new HarnessPredicate(ComPaginatorHarness, options)\n .addOption('disabled', options.disabled, async (harness, disabled) => {\n return (await harness.isDisabled()) === disabled;\n });\n }\n\n /** Navigates to the first page. Throws if the first page button is not present. */\n async goToFirstPage(): Promise<void> {\n const btn = await this.firstButton();\n if (!btn) {\n throw new Error('First page button is not present');\n }\n return btn.click();\n }\n\n /** Navigates to the previous page. */\n async goToPreviousPage(): Promise<void> {\n const btn = await this.previousButton();\n return btn.click();\n }\n\n /** Navigates to the next page. */\n async goToNextPage(): Promise<void> {\n const btn = await this.nextButton();\n return btn.click();\n }\n\n /** Navigates to the last page. Throws if the last page button is not present. */\n async goToLastPage(): Promise<void> {\n const btn = await this.lastButton();\n if (!btn) {\n throw new Error('Last page button is not present');\n }\n return btn.click();\n }\n\n /** Navigates to a specific page (1-based). Throws if page button is not present. */\n async goToPage(pageNumber: number): Promise<void> {\n const btn = await this.locatorForOptional(`button[aria-label=\"Page ${pageNumber}\"]`)();\n if (!btn) {\n throw new Error(`Page button for page ${pageNumber} is not present`);\n }\n return btn.click();\n }\n\n /** Gets the range label text. */\n async getRangeLabel(): Promise<string> {\n const label = await this.rangeLabel();\n if (!label) {\n return '';\n }\n return label.text();\n }\n\n /** Gets the current page size from the select element. Throws if no select is present. */\n async getPageSize(): Promise<number> {\n const selectEl = await this.select();\n if (!selectEl) {\n throw new Error('Page size select is not present');\n }\n const value = await selectEl.getProperty<string>('value');\n return Number(value);\n }\n\n /** Sets the page size by selecting a value. Throws if no select is present. */\n async setPageSize(size: number): Promise<void> {\n const selectEl = await this.select();\n if (!selectEl) {\n throw new Error('Page size select is not present');\n }\n await selectEl.setInputValue(String(size));\n await selectEl.dispatchEvent('change');\n }\n\n /** Whether the previous page button is disabled. */\n async isPreviousPageDisabled(): Promise<boolean> {\n const btn = await this.previousButton();\n return (await btn.getAttribute('disabled')) !== null;\n }\n\n /** Whether the next page button is disabled. */\n async isNextPageDisabled(): Promise<boolean> {\n const btn = await this.nextButton();\n return (await btn.getAttribute('disabled')) !== null;\n }\n\n /** Whether the paginator is fully disabled (both prev and next buttons disabled). */\n async isDisabled(): Promise<boolean> {\n return (await this.isPreviousPageDisabled()) && (await this.isNextPageDisabled());\n }\n\n /** Gets the aria-label of the navigation element. */\n async getAriaLabel(): Promise<string | null> {\n const navEl = await this.nav();\n return navEl.getAttribute('aria-label');\n }\n\n /** Whether the paginator navigation is focused. */\n async isFocused(): Promise<boolean> {\n const host = await this.host();\n return host.isFocused();\n }\n\n /** Focuses the paginator host element. */\n async focus(): Promise<void> {\n const host = await this.host();\n return host.focus();\n }\n\n /** Blurs the paginator host element. */\n async blur(): Promise<void> {\n const host = await this.host();\n return host.blur();\n }\n}\n","// Testing utilities for the paginator component\n\nexport { ComPaginatorHarness } from './paginator.harness';\n\nexport type { ComPaginatorHarnessFilters } from './paginator.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { ComponentHarness, HarnessPredicate, TestKey } from '@angular/cdk/testing';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Harness for interacting with popover content in tests.
|
|
5
|
+
* This harness targets the `com-popover-content` element rendered in the overlay.
|
|
6
|
+
*/
|
|
7
|
+
class ComPopoverContentHarness extends ComponentHarness {
|
|
8
|
+
static hostSelector = 'com-popover-content';
|
|
9
|
+
dialogPanel = this.locatorFor('[role="dialog"]');
|
|
10
|
+
/**
|
|
11
|
+
* Gets a HarnessPredicate for matching popover content.
|
|
12
|
+
* @param options Filter options.
|
|
13
|
+
*/
|
|
14
|
+
static with(options = {}) {
|
|
15
|
+
return new HarnessPredicate(ComPopoverContentHarness, options);
|
|
16
|
+
}
|
|
17
|
+
/** Gets the popover dialog panel's aria-label. */
|
|
18
|
+
async getAriaLabel() {
|
|
19
|
+
const panel = await this.dialogPanel();
|
|
20
|
+
return panel.getAttribute('aria-label');
|
|
21
|
+
}
|
|
22
|
+
/** Gets the text content of the popover dialog panel. */
|
|
23
|
+
async getText() {
|
|
24
|
+
const panel = await this.dialogPanel();
|
|
25
|
+
return panel.text();
|
|
26
|
+
}
|
|
27
|
+
/** Gets the `data-side` attribute from the popover wrapper. */
|
|
28
|
+
async getSide() {
|
|
29
|
+
const wrapper = await this.locatorFor('[data-side]')();
|
|
30
|
+
return wrapper.getAttribute('data-side');
|
|
31
|
+
}
|
|
32
|
+
/** Gets the `data-state` attribute from the popover wrapper. */
|
|
33
|
+
async getState() {
|
|
34
|
+
const wrapper = await this.locatorFor('[data-state]')();
|
|
35
|
+
return wrapper.getAttribute('data-state');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Harness for interacting with a popover trigger in tests.
|
|
40
|
+
*/
|
|
41
|
+
class ComPopoverTriggerHarness extends ComponentHarness {
|
|
42
|
+
static hostSelector = '[comPopoverTrigger]';
|
|
43
|
+
documentRootLocator = this.documentRootLocatorFactory();
|
|
44
|
+
/**
|
|
45
|
+
* Gets a HarnessPredicate for matching popover triggers.
|
|
46
|
+
* @param options Filter options.
|
|
47
|
+
*/
|
|
48
|
+
static with(options = {}) {
|
|
49
|
+
return new HarnessPredicate(ComPopoverTriggerHarness, options)
|
|
50
|
+
.addOption('text', options.text, async (harness, text) => {
|
|
51
|
+
const triggerText = await harness.getText();
|
|
52
|
+
return HarnessPredicate.stringMatches(triggerText, text);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/** Gets the trigger element's text. */
|
|
56
|
+
async getText() {
|
|
57
|
+
const host = await this.host();
|
|
58
|
+
return host.text();
|
|
59
|
+
}
|
|
60
|
+
/** Whether the popover is currently open. */
|
|
61
|
+
async isOpen() {
|
|
62
|
+
const host = await this.host();
|
|
63
|
+
return (await host.getAttribute('aria-expanded')) === 'true';
|
|
64
|
+
}
|
|
65
|
+
/** Opens the popover if it's closed. */
|
|
66
|
+
async open() {
|
|
67
|
+
if (!(await this.isOpen())) {
|
|
68
|
+
const host = await this.host();
|
|
69
|
+
await host.click();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Closes the popover if it's open. */
|
|
73
|
+
async close() {
|
|
74
|
+
if (await this.isOpen()) {
|
|
75
|
+
const host = await this.host();
|
|
76
|
+
await host.sendKeys(TestKey.ESCAPE);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** Toggles the popover open/close state by clicking the trigger. */
|
|
80
|
+
async toggle() {
|
|
81
|
+
const host = await this.host();
|
|
82
|
+
return host.click();
|
|
83
|
+
}
|
|
84
|
+
/** Gets the popover content harness, or null if the popover is closed. */
|
|
85
|
+
async getPopoverContent() {
|
|
86
|
+
if (!(await this.isOpen())) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
return this.documentRootLocator.locatorForOptional(ComPopoverContentHarness.with({}))();
|
|
90
|
+
}
|
|
91
|
+
/** Focuses the trigger element. */
|
|
92
|
+
async focus() {
|
|
93
|
+
const host = await this.host();
|
|
94
|
+
return host.focus();
|
|
95
|
+
}
|
|
96
|
+
/** Blurs the trigger element. */
|
|
97
|
+
async blur() {
|
|
98
|
+
const host = await this.host();
|
|
99
|
+
return host.blur();
|
|
100
|
+
}
|
|
101
|
+
/** Whether the trigger element is focused. */
|
|
102
|
+
async isFocused() {
|
|
103
|
+
const host = await this.host();
|
|
104
|
+
return host.isFocused();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Testing utilities for the popover component
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Generated bundle index. Do not edit.
|
|
112
|
+
*/
|
|
113
|
+
|
|
114
|
+
export { ComPopoverContentHarness, ComPopoverTriggerHarness };
|
|
115
|
+
//# sourceMappingURL=ngx-com-components-popover-testing.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-com-components-popover-testing.mjs","sources":["../../../projects/com/components/popover/testing/popover.harness.ts","../../../projects/com/components/popover/testing/index.ts","../../../projects/com/components/popover/testing/ngx-com-components-popover-testing.ts"],"sourcesContent":["import {\n ComponentHarness,\n HarnessPredicate,\n TestKey,\n} from '@angular/cdk/testing';\nimport type { BaseHarnessFilters } from '@angular/cdk/testing';\n\n/** Harness filters for ComPopoverContentHarness. */\nexport type ComPopoverContentHarnessFilters = BaseHarnessFilters;\n\n/** Harness filters for ComPopoverTriggerHarness. */\nexport interface ComPopoverTriggerHarnessFilters extends BaseHarnessFilters {\n /** Filter by the trigger element's text. */\n text?: string | RegExp;\n}\n\n/**\n * Harness for interacting with popover content in tests.\n * This harness targets the `com-popover-content` element rendered in the overlay.\n */\nexport class ComPopoverContentHarness extends ComponentHarness {\n static hostSelector = 'com-popover-content';\n\n private readonly dialogPanel = this.locatorFor('[role=\"dialog\"]');\n\n /**\n * Gets a HarnessPredicate for matching popover content.\n * @param options Filter options.\n */\n static with(options: ComPopoverContentHarnessFilters = {}): HarnessPredicate<ComPopoverContentHarness> {\n return new HarnessPredicate(ComPopoverContentHarness, options);\n }\n\n /** Gets the popover dialog panel's aria-label. */\n async getAriaLabel(): Promise<string | null> {\n const panel = await this.dialogPanel();\n return panel.getAttribute('aria-label');\n }\n\n /** Gets the text content of the popover dialog panel. */\n async getText(): Promise<string> {\n const panel = await this.dialogPanel();\n return panel.text();\n }\n\n /** Gets the `data-side` attribute from the popover wrapper. */\n async getSide(): Promise<string | null> {\n const wrapper = await this.locatorFor('[data-side]')();\n return wrapper.getAttribute('data-side');\n }\n\n /** Gets the `data-state` attribute from the popover wrapper. */\n async getState(): Promise<string | null> {\n const wrapper = await this.locatorFor('[data-state]')();\n return wrapper.getAttribute('data-state');\n }\n}\n\n/**\n * Harness for interacting with a popover trigger in tests.\n */\nexport class ComPopoverTriggerHarness extends ComponentHarness {\n static hostSelector = '[comPopoverTrigger]';\n\n private readonly documentRootLocator = this.documentRootLocatorFactory();\n\n /**\n * Gets a HarnessPredicate for matching popover triggers.\n * @param options Filter options.\n */\n static with(options: ComPopoverTriggerHarnessFilters = {}): HarnessPredicate<ComPopoverTriggerHarness> {\n return new HarnessPredicate(ComPopoverTriggerHarness, options)\n .addOption('text', options.text, async (harness, text) => {\n const triggerText = await harness.getText();\n return HarnessPredicate.stringMatches(triggerText, text);\n });\n }\n\n /** Gets the trigger element's text. */\n async getText(): Promise<string> {\n const host = await this.host();\n return host.text();\n }\n\n /** Whether the popover is currently open. */\n async isOpen(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('aria-expanded')) === 'true';\n }\n\n /** Opens the popover if it's closed. */\n async open(): Promise<void> {\n if (!(await this.isOpen())) {\n const host = await this.host();\n await host.click();\n }\n }\n\n /** Closes the popover if it's open. */\n async close(): Promise<void> {\n if (await this.isOpen()) {\n const host = await this.host();\n await host.sendKeys(TestKey.ESCAPE);\n }\n }\n\n /** Toggles the popover open/close state by clicking the trigger. */\n async toggle(): Promise<void> {\n const host = await this.host();\n return host.click();\n }\n\n /** Gets the popover content harness, or null if the popover is closed. */\n async getPopoverContent(): Promise<ComPopoverContentHarness | null> {\n if (!(await this.isOpen())) {\n return null;\n }\n return this.documentRootLocator.locatorForOptional(ComPopoverContentHarness.with({}))();\n }\n\n /** Focuses the trigger element. */\n async focus(): Promise<void> {\n const host = await this.host();\n return host.focus();\n }\n\n /** Blurs the trigger element. */\n async blur(): Promise<void> {\n const host = await this.host();\n return host.blur();\n }\n\n /** Whether the trigger element is focused. */\n async isFocused(): Promise<boolean> {\n const host = await this.host();\n return host.isFocused();\n }\n}\n","// Testing utilities for the popover component\n\nexport {\n ComPopoverContentHarness,\n ComPopoverTriggerHarness,\n} from './popover.harness';\n\nexport type {\n ComPopoverContentHarnessFilters,\n ComPopoverTriggerHarnessFilters,\n} from './popover.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|