Skip to content

Commit 8acaebb

Browse files
committed
docs: update examples with a11y queries
1 parent 4f0878f commit 8acaebb

14 files changed

+57
-55
lines changed

README.md

+8-6
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ counter.component.ts
9797
selector: 'counter',
9898
template: `
9999
<button (click)="decrement()">-</button>
100-
<span data-testid="count">Current Count: {{ counter }}</span>
100+
<span>Current Count: {{ counter }}</span>
101101
<button (click)="increment()">+</button>
102102
`,
103103
})
@@ -117,8 +117,8 @@ export class CounterComponent {
117117
counter.component.spec.ts
118118

119119
```typescript
120-
import { render, screen } from '@testing-library/angular';
121-
import CounterComponent from './counter.component.ts';
120+
import { render, screen, fireEvent } from '@testing-library/angular';
121+
import { CounterComponent } from './counter.component.ts';
122122

123123
describe('Counter', () => {
124124
test('should render counter', async () => {
@@ -128,11 +128,12 @@ describe('Counter', () => {
128128
});
129129

130130
test('should increment the counter on click', async () => {
131-
const { click } = await render(CounterComponent, { componentProperties: { counter: 5 } });
131+
await render(CounterComponent, { componentProperties: { counter: 5 } });
132132

133-
click(screen.getByText('+'));
133+
const incrementButton = screen.getByRole('button', { name: /increment/i });
134+
fireEvent.click(incrementControl);
134135

135-
expect(getByText('Current Count: 6'));
136+
expect(screen.getByText('Current Count: 6'));
136137
});
137138
});
138139
```
@@ -194,6 +195,7 @@ Thanks goes to these people ([emoji key][emojis]):
194195

195196
<!-- markdownlint-enable -->
196197
<!-- prettier-ignore-end -->
198+
197199
<!-- ALL-CONTRIBUTORS-LIST:END -->
198200

199201
This project follows the [all-contributors][all-contributors] specification.

src/app/examples/00-single-component.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { SingleComponent } from './00-single-component';
55
test('renders the current value and can increment and decrement', async () => {
66
await render(SingleComponent);
77

8-
const incrementControl = screen.getByText('Increment');
9-
const decrementControl = screen.getByText('Decrement');
8+
const incrementControl = screen.getByRole('button', { name: /increment/i });
9+
const decrementControl = screen.getByRole('button', { name: /decrement/i });
1010
const valueControl = screen.getByTestId('value');
1111

1212
expect(valueControl.textContent).toBe('0');

src/app/examples/01-nested-component.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ test('renders the current value and can increment and decrement', async () => {
77
declarations: [NestedButtonComponent, NestedValueComponent],
88
});
99

10-
const incrementControl = screen.getByText('Increment');
11-
const decrementControl = screen.getByText('Decrement');
10+
const incrementControl = screen.getByRole('button', { name: /increment/i });
11+
const decrementControl = screen.getByRole('button', { name: /decrement/i });
1212
const valueControl = screen.getByTestId('value');
1313

1414
expect(valueControl.textContent).toBe('0');

src/app/examples/02-input-output.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ test('is possible to set input and listen for output', async () => {
1414
},
1515
});
1616

17-
const incrementControl = screen.getByText('Increment');
17+
const incrementControl = screen.getByRole('button', { name: /increment/i });
18+
const sendControl = screen.getByRole('button', { name: /send/i });
1819
const valueControl = screen.getByTestId('value');
19-
const sendControl = screen.getByText('Send');
2020

2121
expect(valueControl.textContent).toBe('47');
2222

src/app/examples/03-forms.spec.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ test('is possible to fill in a form and verify error messages (with the help of
88
imports: [ReactiveFormsModule],
99
});
1010

11-
const nameControl = screen.getByLabelText('Name');
12-
const scoreControl = screen.getByLabelText(/score/i);
13-
const colorControl = screen.getByLabelText('color', { exact: false });
11+
const nameControl = screen.getByRole('textbox', { name: /name/i });
12+
const scoreControl = screen.getByRole('spinbutton', { name: /score/i });
13+
const colorControl = screen.getByRole('combobox', { name: /color/i });
1414
const errors = screen.getByRole('alert');
1515

1616
expect(errors).toContainElement(screen.queryByText('name is required'));
@@ -38,7 +38,7 @@ test('is possible to fill in a form and verify error messages (with the help of
3838
expect(scoreControl).toHaveValue(7);
3939
expect(colorControl).toHaveValue('G');
4040

41-
const form = screen.getByTestId('my-form');
41+
const form = screen.getByRole('form');
4242
expect(form).toHaveFormValues({
4343
name: 'Tim',
4444
score: 7,

src/app/examples/03-forms.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { FormBuilder, Validators, ReactiveFormsModule, ValidationErrors } from '
44
@Component({
55
selector: 'app-fixture',
66
template: `
7-
<form [formGroup]="form" data-testid="my-form">
7+
<form [formGroup]="form" name="form">
88
<div>
99
<label for="name">Name</label>
1010
<input type="text" id="name" name="name" formControlName="name" required />

src/app/examples/04-forms-with-material.spec.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ test('is possible to fill in a form and verify error messages (with the help of
99
imports: [ReactiveFormsModule, MaterialModule],
1010
});
1111

12-
const nameControl = screen.getByPlaceholderText('Name');
13-
const scoreControl = screen.getByPlaceholderText(/score/i);
14-
const colorControl = screen.getByPlaceholderText('color', { exact: false });
12+
const nameControl = screen.getByLabelText(/name/i);
13+
const scoreControl = screen.getByRole('spinbutton', { name: /score/i });
14+
const colorControl = screen.getByRole('listbox', { name: /color/i });
1515
const errors = screen.getByRole('alert');
1616

1717
expect(errors).toContainElement(screen.queryByText('name is required'));
@@ -35,7 +35,7 @@ test('is possible to fill in a form and verify error messages (with the help of
3535
expect(nameControl).toHaveValue('Tim');
3636
expect(scoreControl).toHaveValue(7);
3737

38-
const form = screen.getByTestId('my-form');
38+
const form = screen.getByRole('form');
3939
expect(form).toHaveFormValues({
4040
name: 'Tim',
4141
score: 7,

src/app/examples/04-forms-with-material.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { FormBuilder, Validators, ReactiveFormsModule, ValidationErrors } from '
44
@Component({
55
selector: 'app-fixture',
66
template: `
7-
<form [formGroup]="form" data-testid="my-form">
7+
<form [formGroup]="form" name="form">
88
<mat-form-field>
99
<input matInput placeholder="Name" name="name" formControlName="name" required />
1010
</mat-form-field>

src/app/examples/05-component-provider.spec.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ test('renders the current value and can increment and decrement', async () => {
1414
],
1515
});
1616

17-
const incrementControl = screen.getByText('Increment');
18-
const decrementControl = screen.getByText('Decrement');
17+
const incrementControl = screen.getByRole('button', { name: /increment/i });
18+
const decrementControl = screen.getByRole('button', { name: /decrement/i });
1919
const valueControl = screen.getByTestId('value');
2020

2121
expect(valueControl.textContent).toBe('0');
@@ -44,8 +44,8 @@ test('renders the current value and can increment and decrement with a mocked je
4444
],
4545
});
4646

47-
const incrementControl = screen.getByText('Increment');
48-
const decrementControl = screen.getByText('Decrement');
47+
const incrementControl = screen.getByRole('button', { name: /increment/i });
48+
const decrementControl = screen.getByRole('button', { name: /decrement/i });
4949
const valueControl = screen.getByTestId('value');
5050

5151
expect(valueControl.textContent).toBe('50');
@@ -63,8 +63,8 @@ test('renders the current value and can increment and decrement with provideMock
6363
componentProviders: [provideMock(CounterService)],
6464
});
6565

66-
const incrementControl = screen.getByText('Increment');
67-
const decrementControl = screen.getByText('Decrement');
66+
const incrementControl = screen.getByRole('button', { name: /increment/i });
67+
const decrementControl = screen.getByRole('button', { name: /decrement/i });
6868

6969
fireEvent.click(incrementControl);
7070
fireEvent.click(incrementControl);

src/app/examples/06-with-ngrx-store.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ test('works with ngrx store', async () => {
1717
],
1818
});
1919

20-
const incrementControl = screen.getByText('Increment');
21-
const decrementControl = screen.getByText('Decrement');
20+
const incrementControl = screen.getByRole('button', { name: /increment/i });
21+
const decrementControl = screen.getByRole('button', { name: /decrement/i });
2222
const valueControl = screen.getByTestId('value');
2323

2424
expect(valueControl.textContent).toBe('0');

src/app/examples/07-with-ngrx-mock-store.spec.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ test('works with provideMockStore', async () => {
2121
const store = TestBed.inject(MockStore);
2222
store.dispatch = jest.fn();
2323

24-
screen.getByText('Four');
25-
fireEvent.click(screen.getByText('Seven'));
24+
fireEvent.click(screen.getByRole('listitem', { name: /seven/i }));
2625

2726
expect(store.dispatch).toBeCalledWith({ type: '[Item List] send', item: 'Seven' });
2827
});

src/app/examples/07-with-ngrx-mock-store.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const selectItems = createSelector(
1010
selector: 'app-fixture',
1111
template: `
1212
<ul>
13-
<li *ngFor="let item of items | async" (click)="send(item)">{{ item }}</li>
13+
<li *ngFor="let item of items | async" (click)="send(item)" [attr.aria-label]="item">{{ item }}</li>
1414
</ul>
1515
`,
1616
})

src/app/examples/09-router.spec.ts

+22-21
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,19 @@ test('it can navigate to routes', async () => {
2424

2525
expect(screen.queryByText(/Detail one/i)).not.toBeInTheDocument();
2626

27-
await navigate(screen.getByText(/Load one/));
28-
expect(screen.queryByText(/Detail one/i)).toBeInTheDocument();
27+
await navigate(screen.getByRole('link', { name: /load one/i }));
28+
expect(screen.queryByRole('heading', { name: /Detail one/i })).toBeInTheDocument();
2929

30-
await navigate(screen.getByText(/Load three/));
31-
expect(screen.queryByText(/Detail one/i)).not.toBeInTheDocument();
32-
expect(screen.queryByText(/Detail three/i)).toBeInTheDocument();
30+
await navigate(screen.getByRole('link', { name: /load three/i }));
31+
expect(screen.queryByRole('heading', { name: /Detail one/i })).not.toBeInTheDocument();
32+
expect(screen.queryByRole('heading', { name: /Detail three/i })).toBeInTheDocument();
3333

34-
await navigate(screen.getByText(/Back to parent/));
35-
expect(screen.queryByText(/Detail three/i)).not.toBeInTheDocument();
34+
await navigate(screen.getByRole('link', { name: /back to parent/i }));
35+
expect(screen.queryByRole('heading', { name: /Detail three/i })).not.toBeInTheDocument();
3636

37-
await navigate(screen.getByText(/Load two/));
38-
expect(screen.queryByText(/Detail two/i)).toBeInTheDocument();
39-
await navigate(screen.getByText(/hidden x/));
37+
await navigate(screen.getByRole('link', { name: /load two/i }));
38+
expect(screen.queryByRole('heading', { name: /Detail two/i })).toBeInTheDocument();
39+
await navigate(screen.getByRole('link', { name: /hidden x/i }));
4040
expect(screen.queryByText(/You found the treasure!/i)).toBeInTheDocument();
4141
});
4242

@@ -61,21 +61,22 @@ test('it can navigate to routes with a base path', async () => {
6161
],
6262
});
6363

64-
expect(screen.queryByText(/Detail one/i)).not.toBeInTheDocument();
64+
expect(screen.queryByRole('heading', { name: /Detail one/i })).not.toBeInTheDocument();
6565

66-
await navigate(screen.getByText(/Load one/), basePath);
67-
expect(screen.queryByText(/Detail one/i)).toBeInTheDocument();
66+
await navigate(screen.getByRole('link', { name: /load one/i }), basePath);
67+
expect(screen.queryByRole('heading', { name: /Detail one/i })).toBeInTheDocument();
6868

69-
await navigate(screen.getByText(/Load three/), basePath);
70-
expect(screen.queryByText(/Detail one/i)).not.toBeInTheDocument();
71-
expect(screen.queryByText(/Detail three/i)).toBeInTheDocument();
69+
await navigate(screen.getByRole('link', { name: /load three/i }), basePath);
70+
expect(screen.queryByRole('heading', { name: /Detail one/i })).not.toBeInTheDocument();
71+
expect(screen.queryByRole('heading', { name: /Detail three/i })).toBeInTheDocument();
7272

73-
await navigate(screen.getByText(/Back to parent/));
74-
expect(screen.queryByText(/Detail three/i)).not.toBeInTheDocument();
73+
await navigate(screen.getByRole('link', { name: /back to parent/i }));
74+
expect(screen.queryByRole('heading', { name: /Detail three/i })).not.toBeInTheDocument();
7575

76-
await navigate('base/detail/two?text=Hello&subtext=World'); // possible to just use strings
77-
expect(screen.queryByText(/Detail two/i)).toBeInTheDocument();
78-
expect(screen.queryByText(/Hello World/i)).toBeInTheDocument();
76+
// It's possible to just use strings
77+
await navigate('base/detail/two?text=Hello&subtext=World');
78+
expect(screen.queryByRole('heading', { name: /Detail two/i })).toBeInTheDocument();
79+
expect(screen.getByText(/Hello World/i)).toBeInTheDocument();
7980

8081
await navigate('/hidden-detail', basePath);
8182
expect(screen.queryByText(/You found the treasure!/i)).toBeInTheDocument();

src/app/examples/11-ng-content.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { render, screen } from '@testing-library/angular';
33

44
import { CellComponent } from './11-ng-content';
55

6-
test('it is posible to test ng-content without selector', async () => {
6+
test('it is possible to test ng-content without selector', async () => {
77
const projection = 'it should be showed into a p element!';
88

99
TestBed.overrideComponent(CellComponent, { set: { selector: 'cell' } });

0 commit comments

Comments
 (0)