Skip to content

Commit d22355b

Browse files
committed
feat(aria/accordion): introduce accordion harness
1 parent 046e1a2 commit d22355b

File tree

8 files changed

+401
-0
lines changed

8 files changed

+401
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
## API Report File for "@angular/aria_accordion_testing"
2+
3+
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4+
5+
```ts
6+
7+
import { BaseHarnessFilters } from '@angular/cdk/testing';
8+
import { ComponentHarness } from '@angular/cdk/testing';
9+
import { HarnessPredicate } from '@angular/cdk/testing';
10+
11+
// @public
12+
export class AccordionGroupHarness extends ComponentHarness {
13+
getPanels(filters?: AccordionPanelHarnessFilters): Promise<AccordionPanelHarness[]>;
14+
getTriggers(filters?: AccordionTriggerHarnessFilters): Promise<AccordionTriggerHarness[]>;
15+
static hostSelector: string;
16+
static with(options?: AccordionGroupHarnessFilters): HarnessPredicate<AccordionGroupHarness>;
17+
}
18+
19+
// @public
20+
export interface AccordionGroupHarnessFilters extends BaseHarnessFilters {
21+
}
22+
23+
// @public
24+
export class AccordionPanelHarness extends ComponentHarness {
25+
getText(): Promise<string>;
26+
static hostSelector: string;
27+
isExpanded(): Promise<boolean>;
28+
static with(options?: AccordionPanelHarnessFilters): HarnessPredicate<AccordionPanelHarness>;
29+
}
30+
31+
// @public
32+
export interface AccordionPanelHarnessFilters extends BaseHarnessFilters {
33+
trigger?: AccordionTriggerHarness;
34+
}
35+
36+
// @public
37+
export class AccordionTriggerHarness extends ComponentHarness {
38+
blur(): Promise<void>;
39+
click(): Promise<void>;
40+
focus(): Promise<void>;
41+
getText(): Promise<string>;
42+
static hostSelector: string;
43+
isDisabled(): Promise<boolean>;
44+
isExpanded(): Promise<boolean>;
45+
isFocused(): Promise<boolean>;
46+
static with(options?: AccordionTriggerHarnessFilters): HarnessPredicate<AccordionTriggerHarness>;
47+
}
48+
49+
// @public
50+
export interface AccordionTriggerHarnessFilters extends BaseHarnessFilters {
51+
disabled?: boolean;
52+
expanded?: boolean;
53+
text?: string | RegExp;
54+
}
55+
56+
// (No @packageDocumentation comment for this package)
57+
58+
```

src/aria/accordion/BUILD.bazel

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ ng_project(
1313
"//src/aria/private",
1414
"//src/cdk/a11y",
1515
"//src/cdk/bidi",
16+
"//src/cdk/testing",
1617
],
1718
)
1819

@@ -26,7 +27,9 @@ ng_project(
2627
":accordion",
2728
"//:node_modules/@angular/core",
2829
"//:node_modules/@angular/platform-browser",
30+
"//src/cdk/testing",
2931
"//src/cdk/testing/private",
32+
"//src/cdk/testing/testbed",
3033
],
3134
)
3235

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
load("//tools:defaults.bzl", "ng_project", "ng_web_test_suite", "ts_project")
2+
3+
package(default_visibility = ["//visibility:public"])
4+
5+
ts_project(
6+
name = "testing",
7+
srcs = glob(
8+
["**/*.ts"],
9+
exclude = ["**/*.spec.ts"],
10+
),
11+
deps = [
12+
"//:node_modules/@angular/core",
13+
"//src/cdk/testing",
14+
],
15+
)
16+
17+
filegroup(
18+
name = "source-files",
19+
srcs = glob(["**/*.ts"]),
20+
)
21+
22+
ng_project(
23+
name = "unit_tests_lib",
24+
testonly = True,
25+
srcs = glob(["**/*.spec.ts"]),
26+
deps = [
27+
":testing",
28+
"//:node_modules/@angular/core",
29+
"//:node_modules/@angular/platform-browser",
30+
"//src/aria/accordion",
31+
"//src/cdk/testing",
32+
"//src/cdk/testing/private",
33+
"//src/cdk/testing/testbed",
34+
],
35+
)
36+
37+
ng_web_test_suite(
38+
name = "unit_tests",
39+
deps = [
40+
":unit_tests_lib",
41+
],
42+
)
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/**
2+
* @license
3+
* Copyright Google LLC All Rights Reserved.
4+
*
5+
* Use of this source code is governed by an MIT-style license that can be
6+
* found in the LICENSE file at https://angular.dev/license
7+
*/
8+
9+
import {Component} from '@angular/core';
10+
import {TestBed} from '@angular/core/testing';
11+
import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed';
12+
import {
13+
AccordionTriggerHarness,
14+
AccordionPanelHarness,
15+
AccordionGroupHarness,
16+
} from './accordion-harness';
17+
import {AccordionGroup, AccordionPanel, AccordionTrigger} from '../index';
18+
19+
describe('Accordion Harnesses', () => {
20+
let fixture: any;
21+
let loader: any;
22+
23+
@Component({
24+
imports: [AccordionGroup, AccordionPanel, AccordionTrigger],
25+
template: `
26+
<div ngAccordionGroup>
27+
<div #panel1="ngAccordionPanel" ngAccordionPanel>Content 1</div>
28+
<button ngAccordionTrigger [panel]="panel1">Section 1</button>
29+
30+
<div #panel2="ngAccordionPanel" ngAccordionPanel>Content 2</div>
31+
<button ngAccordionTrigger [panel]="panel2" disabled>Section 2</button>
32+
</div>
33+
`,
34+
})
35+
class AccordionHarnessTestComponent {}
36+
37+
beforeEach(() => {
38+
TestBed.configureTestingModule({
39+
imports: [AccordionHarnessTestComponent],
40+
});
41+
fixture = TestBed.createComponent(AccordionHarnessTestComponent);
42+
fixture.detectChanges();
43+
loader = TestbedHarnessEnvironment.loader(fixture);
44+
});
45+
46+
it('should find all accordion triggers', async () => {
47+
const triggers = await loader.getAllHarnesses(AccordionTriggerHarness);
48+
expect(triggers.length).toBe(2);
49+
});
50+
51+
it('should support focusing and blurring accordion triggers', async () => {
52+
const trigger = await loader.getHarness(AccordionTriggerHarness.with({text: 'Section 1'}));
53+
await trigger.focus();
54+
expect(await trigger.isFocused()).toBeTrue();
55+
56+
await trigger.blur();
57+
expect(await trigger.isFocused()).toBeFalse();
58+
});
59+
60+
it('should correctly report the disabled state of a trigger', async () => {
61+
const activeTrigger = await loader.getHarness(
62+
AccordionTriggerHarness.with({text: 'Section 1'}),
63+
);
64+
const disabledTrigger = await loader.getHarness(
65+
AccordionTriggerHarness.with({text: 'Section 2'}),
66+
);
67+
68+
expect(await activeTrigger.isDisabled()).toBeFalse();
69+
expect(await disabledTrigger.isDisabled()).toBeTrue();
70+
});
71+
72+
it('should correctly report the expanded state of a trigger', async () => {
73+
const trigger = await loader.getHarness(AccordionTriggerHarness.with({text: 'Section 1'}));
74+
expect(await trigger.isExpanded()).toBeFalse();
75+
76+
await trigger.click();
77+
expect(await trigger.isExpanded()).toBeTrue();
78+
});
79+
80+
it('should filter triggers by disabled state', async () => {
81+
const disabledTriggers = await loader.getAllHarnesses(
82+
AccordionTriggerHarness.with({disabled: true}),
83+
);
84+
expect(disabledTriggers.length).toBe(1);
85+
expect(await disabledTriggers[0].getText()).toBe('Section 2');
86+
});
87+
88+
it('should filter triggers by expanded state', async () => {
89+
const trigger = await loader.getHarness(AccordionTriggerHarness.with({text: 'Section 1'}));
90+
await trigger.click();
91+
92+
const expandedTriggers = await loader.getAllHarnesses(
93+
AccordionTriggerHarness.with({expanded: true}),
94+
);
95+
expect(expandedTriggers.length).toBe(1);
96+
expect(await expandedTriggers[0].getText()).toBe('Section 1');
97+
});
98+
99+
it('should find the panel associated with a specific trigger', async () => {
100+
const trigger = await loader.getHarness(AccordionTriggerHarness.with({text: 'Section 1'}));
101+
const panel = await loader.getHarness(AccordionPanelHarness.with({trigger}));
102+
103+
expect(await panel.getText()).toBe('Content 1');
104+
});
105+
106+
it('should correctly report the expanded state of an accordion panel', async () => {
107+
const trigger = await loader.getHarness(AccordionTriggerHarness.with({text: 'Section 1'}));
108+
const panel = await loader.getHarness(AccordionPanelHarness.with({trigger}));
109+
110+
expect(await panel.isExpanded()).toBeFalse();
111+
112+
await trigger.click();
113+
expect(await panel.isExpanded()).toBeTrue();
114+
});
115+
116+
it('should find accordion group and list scoped triggers and panels', async () => {
117+
const group = await loader.getHarness(AccordionGroupHarness);
118+
const triggers = await group.getTriggers();
119+
const panels = await group.getPanels();
120+
121+
expect(triggers.length).toBe(2);
122+
expect(panels.length).toBe(2);
123+
});
124+
});

0 commit comments

Comments
 (0)