Skip to content

Commit 725a2b3

Browse files
andrewseguinmmalerba
authored andcommitted
feat(material-experimental): add progress spinner test harness… (#16622)
* feat(material-experimental): add progress spinner test harness skeleton * use number coercion * fix build * address feedback
1 parent 8b5afcc commit 725a2b3

File tree

4 files changed

+122
-0
lines changed

4 files changed

+122
-0
lines changed

.github/CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
/src/material-experimental/mdc-chips/** @mmalerba
9595
/src/material-experimental/mdc-helpers/** @mmalerba
9696
/src/material-experimental/mdc-menu/** @crisbeto
97+
/src/material-experimental/mdc-progress-spinner/** @andrewseguin
9798
/src/material-experimental/mdc-progress-bar/** @andrewseguin
9899
# Note to implementer: please repossess
99100
/src/material-experimental/mdc-radio/** @mmalerba
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package(default_visibility = ["//visibility:public"])
2+
3+
load("//tools:defaults.bzl", "ng_test_library", "ts_library")
4+
5+
ts_library(
6+
name = "harness",
7+
srcs = glob(
8+
["harness/**/*.ts"],
9+
exclude = ["**/*.spec.ts"],
10+
),
11+
deps = [
12+
"//src/cdk-experimental/testing",
13+
"//src/cdk/coercion",
14+
"//src/material/progress-spinner",
15+
],
16+
)
17+
18+
ng_test_library(
19+
name = "progress_spinner_tests_lib",
20+
srcs = glob(
21+
["**/*.spec.ts"],
22+
),
23+
deps = [
24+
":harness",
25+
"//src/cdk-experimental/testing",
26+
"//src/cdk-experimental/testing/testbed",
27+
"//src/cdk/testing",
28+
"//src/material/progress-spinner",
29+
],
30+
)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import {HarnessLoader} from '@angular/cdk-experimental/testing';
2+
import {TestbedHarnessEnvironment} from '@angular/cdk-experimental/testing/testbed';
3+
import {Component} from '@angular/core';
4+
import {ComponentFixture, TestBed} from '@angular/core/testing';
5+
import {MatProgressSpinnerModule, ProgressSpinnerMode} from '@angular/material/progress-spinner';
6+
7+
import {MatProgressSpinnerHarness} from './progress-spinner-harness';
8+
9+
let fixture: ComponentFixture<ProgressSpinnerHarnessTest>;
10+
let loader: HarnessLoader;
11+
let progressSpinnerHarness: typeof MatProgressSpinnerHarness;
12+
13+
describe('MatProgressSpinnerHarness', () => {
14+
beforeEach(async () => {
15+
await TestBed
16+
.configureTestingModule({
17+
imports: [MatProgressSpinnerModule],
18+
declarations: [ProgressSpinnerHarnessTest],
19+
})
20+
.compileComponents();
21+
22+
fixture = TestBed.createComponent(ProgressSpinnerHarnessTest);
23+
fixture.detectChanges();
24+
loader = TestbedHarnessEnvironment.loader(fixture);
25+
progressSpinnerHarness = MatProgressSpinnerHarness;
26+
});
27+
28+
runTests();
29+
});
30+
31+
function runTests() {
32+
it('should load all progress spinner harnesses', async () => {
33+
const progressSpinners = await loader.getAllHarnesses(progressSpinnerHarness);
34+
expect(progressSpinners.length).toBe(2);
35+
});
36+
37+
it('should get the value', async () => {
38+
fixture.componentInstance.value = 50;
39+
const [determinate, indeterminate] = await loader.getAllHarnesses(progressSpinnerHarness);
40+
expect(await determinate.getValue()).toBe(50);
41+
expect(await indeterminate.getValue()).toBe(null);
42+
});
43+
44+
it('should get the mode', async () => {
45+
const [determinate, indeterminate] = await loader.getAllHarnesses(progressSpinnerHarness);
46+
expect<ProgressSpinnerMode>(await determinate.getMode()).toBe('determinate');
47+
expect<ProgressSpinnerMode>(await indeterminate.getMode()).toBe('indeterminate');
48+
});
49+
}
50+
51+
@Component({
52+
template: `
53+
<mat-progress-spinner mode="determinate" [value]="value"></mat-progress-spinner>
54+
<mat-progress-spinner mode="indeterminate"></mat-progress-spinner>
55+
`
56+
})
57+
class ProgressSpinnerHarnessTest {
58+
value: number;
59+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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.io/license
7+
*/
8+
9+
import {ComponentHarness} from '@angular/cdk-experimental/testing';
10+
import {ProgressSpinnerMode} from '@angular/material/progress-spinner';
11+
import {coerceNumberProperty} from '@angular/cdk/coercion';
12+
13+
/**
14+
* Harness for interacting with a standard mat-progress-spinner in tests.
15+
* @dynamic
16+
*/
17+
export class MatProgressSpinnerHarness extends ComponentHarness {
18+
static hostSelector = 'mat-progress-spinner';
19+
20+
/** Gets a promise for the progress spinner's value. */
21+
async getValue(): Promise<number|null> {
22+
const host = await this.host();
23+
const ariaValue = await host.getAttribute('aria-valuenow');
24+
return ariaValue ? coerceNumberProperty(ariaValue) : null;
25+
}
26+
27+
/** Gets a promise for the progress spinner's mode. */
28+
async getMode(): Promise<ProgressSpinnerMode> {
29+
const modeAttr = (await this.host()).getAttribute('mode');
30+
return await modeAttr as ProgressSpinnerMode;
31+
}
32+
}

0 commit comments

Comments
 (0)