Skip to content

Commit 619a53d

Browse files
authored
test(multiple): generate additional tests for angular-aria directives, harness and patterns (#33162)
* test(aria/accordion): generate additional tests for Accordion directives and patterns * test(aria/grid): generate additional methods and tests for Grid harness * test(aria/listbox): generate additional tests for Listbox directives, harness, and patterns * test(aria/menu): generate additional methods and tests for Menu harness * test(aria/tabs): generate additional tests for Tab directives and patterns * test(aria/toolbar): generate additional tests for Toolbar directives, harnesses and patterns * test(aria/tree): generate additional methods and tests for Tree harness
1 parent 7798bb7 commit 619a53d

25 files changed

Lines changed: 468 additions & 45 deletions

File tree

goldens/aria/grid/testing/index.api.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ export class GridCellHarness extends ContentContainerComponentHarness {
1717
getText(): Promise<string>;
1818
// (undocumented)
1919
static hostSelector: string;
20+
isActive(): Promise<boolean>;
2021
isDisabled(): Promise<boolean>;
22+
isFocused(): Promise<boolean>;
2123
isSelected(): Promise<boolean>;
2224
static with(options?: GridCellHarnessFilters): HarnessPredicate<GridCellHarness>;
2325
}

goldens/aria/listbox/testing/index.api.md

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,17 @@ import { BaseHarnessFilters } from '@angular/cdk/testing';
88
import { ComponentHarness } from '@angular/cdk/testing';
99
import { HarnessPredicate } from '@angular/cdk/testing';
1010

11-
// @public (undocumented)
11+
// @public
1212
export class ListboxHarness extends ComponentHarness {
1313
blur(): Promise<void>;
14-
// (undocumented)
1514
focus(): Promise<void>;
16-
// (undocumented)
15+
getActiveDescendantId(): Promise<string | null>;
1716
getOptions(filters?: ListboxOptionHarnessFilters): Promise<ListboxOptionHarness[]>;
18-
// (undocumented)
1917
getOrientation(): Promise<'vertical' | 'horizontal'>;
2018
// (undocumented)
2119
static hostSelector: string;
22-
// (undocumented)
2320
isDisabled(): Promise<boolean>;
24-
// (undocumented)
2521
isMulti(): Promise<boolean>;
26-
// (undocumented)
2722
static with(options?: ListboxHarnessFilters): HarnessPredicate<ListboxHarness>;
2823
}
2924

@@ -32,19 +27,14 @@ export interface ListboxHarnessFilters extends BaseHarnessFilters {
3227
disabled?: boolean;
3328
}
3429

35-
// @public (undocumented)
30+
// @public
3631
export class ListboxOptionHarness extends ComponentHarness {
37-
// (undocumented)
3832
click(): Promise<void>;
39-
// (undocumented)
4033
getText(): Promise<string>;
4134
// (undocumented)
4235
static hostSelector: string;
43-
// (undocumented)
4436
isDisabled(): Promise<boolean>;
45-
// (undocumented)
4637
isSelected(): Promise<boolean>;
47-
// (undocumented)
4838
static with(options?: ListboxOptionHarnessFilters): HarnessPredicate<ListboxOptionHarness>;
4939
}
5040

goldens/aria/menu/testing/index.api.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export class MenuHarness extends ComponentHarness {
1616
_getTrigger(): Promise<TestElement | null>;
1717
// (undocumented)
1818
static hostSelector: string;
19+
isMenuBar(): Promise<boolean>;
1920
isOpen(): Promise<boolean>;
2021
open(): Promise<void>;
2122
// (undocumented)
@@ -32,10 +33,12 @@ export class MenuItemHarness extends ComponentHarness {
3233
click(): Promise<void>;
3334
getSubmenu(): Promise<MenuHarness | null>;
3435
getText(): Promise<string>;
36+
hasSubmenu(): Promise<boolean>;
3537
// (undocumented)
3638
static hostSelector: string;
3739
isDisabled(): Promise<boolean>;
3840
isExpanded(): Promise<boolean>;
41+
isFocused(): Promise<boolean>;
3942
// (undocumented)
4043
static with(options?: MenuItemHarnessFilters): HarnessPredicate<MenuItemHarness>;
4144
}

goldens/aria/toolbar/testing/index.api.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ export class ToolbarWidgetHarness extends ContentContainerComponentHarness<strin
4444
static hostSelector: string;
4545
isActive(): Promise<boolean>;
4646
isDisabled(): Promise<boolean>;
47+
isSelected(): Promise<boolean>;
4748
static with(options?: ToolbarWidgetHarnessFilters): HarnessPredicate<ToolbarWidgetHarness>;
4849
}
4950

5051
// @public
5152
export interface ToolbarWidgetHarnessFilters extends BaseHarnessFilters {
5253
active?: boolean;
54+
selected?: boolean;
5355
text?: string | RegExp;
5456
}
5557

goldens/aria/tree/testing/index.api.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,17 @@ export interface TreeHarnessFilters extends BaseHarnessFilters {
3232

3333
// @public
3434
export class TreeItemHarness extends ContentContainerComponentHarness<string> {
35+
blur(): Promise<void>;
3536
click(): Promise<void>;
37+
focus(): Promise<void>;
3638
getLevel(): Promise<number>;
3739
getText(): Promise<string>;
3840
// (undocumented)
3941
static hostSelector: string;
42+
isActive(): Promise<boolean>;
4043
isDisabled(): Promise<boolean>;
4144
isExpanded(): Promise<boolean>;
45+
isFocused(): Promise<boolean>;
4246
isSelected(): Promise<boolean>;
4347
static with(options?: TreeItemHarnessFilters): HarnessPredicate<TreeItemHarness>;
4448
}

src/aria/accordion/accordion.spec.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -293,23 +293,23 @@ describe('AccordionGroup', () => {
293293
});
294294

295295
it('should update collection order when items are shuffled', async () => {
296-
const groupDebugElement = fixture.debugElement.query(By.directive(AccordionGroup));
297-
const groupDirective = groupDebugElement.injector.get(AccordionGroup);
298-
299-
let orderedItems = groupDirective._collection.orderedItems();
300-
expect(orderedItems.length).toBe(3);
301-
expect(orderedItems[0].element.textContent?.trim()).toBe('Item 1 Header');
302-
expect(orderedItems[2].element.textContent?.trim()).toBe('Item 3 Header');
296+
// Verify initial DOM order
297+
expect(triggerElements.length).toBe(3);
298+
expect(triggerElements[0].textContent?.trim()).toBe('Item 1 Header');
299+
expect(triggerElements[2].textContent?.trim()).toBe('Item 3 Header');
303300

301+
// Shuffle (reverse) data
304302
const items = testComponent.items().reverse();
305303
testComponent.items.set([...items]);
306304
fixture.detectChanges();
307305
await waitForMicrotasks();
308306

309-
orderedItems = groupDirective._collection.orderedItems();
310-
expect(orderedItems.length).toBe(3);
311-
expect(orderedItems[0].element.textContent?.trim()).toBe('Item 3 Header');
312-
expect(orderedItems[2].element.textContent?.trim()).toBe('Item 1 Header');
307+
// Re-query elements to check new DOM order
308+
setupTriggerAndPanels();
309+
310+
expect(triggerElements.length).toBe(3);
311+
expect(triggerElements[0].textContent?.trim()).toBe('Item 3 Header');
312+
expect(triggerElements[2].textContent?.trim()).toBe('Item 1 Header');
313313
});
314314

315315
describe('wrap behavior', () => {

src/aria/grid/testing/grid-harness.spec.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,19 @@ describe('Grid Harness', () => {
9797
const rows = await loader.getAllHarnesses(GridRowHarness);
9898
expect(await rows[0].getCellTextByIndex()).toEqual(['Cell 1.1', 'Cell 1.2']);
9999
});
100+
101+
it('reports the active state of a cell', async () => {
102+
const cell = await loader.getHarness(GridCellHarness.with({text: 'Cell 1.1'}));
103+
expect(await cell.isActive()).toBeTrue();
104+
});
105+
106+
it('reports the focused state of a cell', async () => {
107+
const cell = await loader.getHarness(GridCellHarness.with({text: 'Cell 1.1'}));
108+
expect(await cell.isFocused()).toBeFalse();
109+
110+
await cell.focus();
111+
expect(await cell.isFocused()).toBeTrue();
112+
});
100113
});
101114

102115
@Component({

src/aria/grid/testing/grid-harness.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,18 @@ export class GridCellHarness extends ContentContainerComponentHarness {
7979
const host = await this.host();
8080
return host.blur();
8181
}
82+
83+
/** Whether the cell is active. */
84+
async isActive(): Promise<boolean> {
85+
const host = await this.host();
86+
return (await host.getAttribute('data-active')) === 'true';
87+
}
88+
89+
/** Whether the cell is focused. */
90+
async isFocused(): Promise<boolean> {
91+
const host = await this.host();
92+
return host.isFocused();
93+
}
8294
}
8395

8496
/** Harness for interacting with a standard ngGridRow in tests. */

src/aria/listbox/listbox.spec.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -434,21 +434,23 @@ describe('Listbox', () => {
434434
],
435435
});
436436

437-
let orderedItems = listboxInstance._collection.orderedItems();
438-
expect(orderedItems.length).toBe(3);
439-
expect(orderedItems[0].element.textContent?.trim()).toBe('Item 1');
440-
expect(orderedItems[2].element.textContent?.trim()).toBe('Item 3');
437+
// Verify initial DOM order
438+
expect(optionElements.length).toBe(3);
439+
expect(optionElements[0].textContent?.trim()).toBe('Item 1');
440+
expect(optionElements[2].textContent?.trim()).toBe('Item 3');
441441

442442
const testComponent = fixture.componentInstance as ListboxExample;
443443
const items = testComponent.options().reverse();
444444
testComponent.options.set([...items]);
445445
fixture.detectChanges();
446446
await waitForMicrotasks();
447447

448-
orderedItems = listboxInstance._collection.orderedItems();
449-
expect(orderedItems.length).toBe(3);
450-
expect(orderedItems[0].element.textContent?.trim()).toBe('Item 3');
451-
expect(orderedItems[2].element.textContent?.trim()).toBe('Item 1');
448+
// Re-query elements to check new DOM order
449+
defineTestVariables(fixture);
450+
451+
expect(optionElements.length).toBe(3);
452+
expect(optionElements[0].textContent?.trim()).toBe('Item 3');
453+
expect(optionElements[2].textContent?.trim()).toBe('Item 1');
452454
});
453455
});
454456

src/aria/listbox/testing/listbox-harness.spec.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,22 @@ describe('Listbox Harness', () => {
8383
expect(orientation).toBe('horizontal');
8484
});
8585

86+
it('gets the active descendant ID', async () => {
87+
TestBed.resetTestingModule();
88+
TestBed.configureTestingModule({
89+
imports: [ListboxActiveDescendantTestComponent],
90+
});
91+
const customFixture = TestBed.createComponent(ListboxActiveDescendantTestComponent);
92+
customFixture.detectChanges();
93+
const customLoader = TestbedHarnessEnvironment.loader(customFixture);
94+
95+
const listbox = await customLoader.getHarness(ListboxHarness);
96+
const options = await listbox.getOptions();
97+
98+
await options[0].click();
99+
expect(await listbox.getActiveDescendantId()).toBe('apple-id');
100+
});
101+
86102
it('clicks an option inside the listbox', async () => {
87103
const option = await loader.getHarness(ListboxOptionHarness.with({text: 'Apple'}));
88104

@@ -91,3 +107,14 @@ describe('Listbox Harness', () => {
91107
expect(await option.isSelected()).toBeTrue();
92108
});
93109
});
110+
111+
@Component({
112+
imports: [Listbox, Option],
113+
template: `
114+
<ul ngListbox focusMode="activedescendant">
115+
<li ngOption [value]="1" id="apple-id">Apple</li>
116+
<li ngOption [value]="2" id="banana-id">Banana</li>
117+
</ul>
118+
`,
119+
})
120+
class ListboxActiveDescendantTestComponent {}

0 commit comments

Comments
 (0)