Skip to content

Commit 5ca01a3

Browse files
committed
address comments
1 parent 7d83aca commit 5ca01a3

File tree

4 files changed

+51
-27
lines changed

4 files changed

+51
-27
lines changed

src/cdk/testing/protractor/protractor-harness-environment.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,31 @@ import {HarnessEnvironment, HarnessLoader, TestElement} from '@angular/cdk/testi
1010
import {by, element as protractorElement, ElementArrayFinder, ElementFinder} from 'protractor';
1111
import {ProtractorElement} from './protractor-element';
1212

13-
/** The default query function that respects shadow boundaries. */
14-
const defaultQueryFn = (selector: string, root: ElementFinder) => root.all(by.css(selector));
13+
/** Options to configure the environment. */
14+
export interface ProtractorHarnessEnvironmentOptions {
15+
/** The query function used to find DOM elements. */
16+
queryFn: (selector: string, root: ElementFinder) => ElementArrayFinder;
17+
}
18+
19+
/** The default environment options. */
20+
const defaultEnvironmentOptions: ProtractorHarnessEnvironmentOptions = {
21+
queryFn: (selector: string, root: ElementFinder) => root.all(by.css(selector))
22+
};
1523

1624
/** A `HarnessEnvironment` implementation for Protractor. */
1725
export class ProtractorHarnessEnvironment extends HarnessEnvironment<ElementFinder> {
18-
protected constructor(rawRootElement: ElementFinder,
19-
private _queryFn: (selector: string, root: ElementFinder) => ElementArrayFinder =
20-
defaultQueryFn) {
26+
/** The options for this environment. */
27+
private _options: ProtractorHarnessEnvironmentOptions;
28+
29+
protected constructor(
30+
rawRootElement: ElementFinder, options?: ProtractorHarnessEnvironmentOptions) {
2131
super(rawRootElement);
32+
this._options = {...defaultEnvironmentOptions, ...options};
2233
}
2334

2435
/** Creates a `HarnessLoader` rooted at the document root. */
25-
static loader(queryFn?: (selector: string, root: ElementFinder) => ElementArrayFinder):
26-
HarnessLoader {
27-
return new ProtractorHarnessEnvironment(protractorElement(by.css('body')), queryFn);
36+
static loader(options?: ProtractorHarnessEnvironmentOptions): HarnessLoader {
37+
return new ProtractorHarnessEnvironment(protractorElement(by.css('body')), options);
2838
}
2939

3040
async forceStabilize(): Promise<void> {}
@@ -43,11 +53,11 @@ export class ProtractorHarnessEnvironment extends HarnessEnvironment<ElementFind
4353
}
4454

4555
protected createEnvironment(element: ElementFinder): HarnessEnvironment<ElementFinder> {
46-
return new ProtractorHarnessEnvironment(element, this._queryFn);
56+
return new ProtractorHarnessEnvironment(element, this._options);
4757
}
4858

4959
protected async getAllRawElements(selector: string): Promise<ElementFinder[]> {
50-
const elementArrayFinder = this._queryFn(selector, this.rawRootElement);
60+
const elementArrayFinder = this._options.queryFn(selector, this.rawRootElement);
5161
const length = await elementArrayFinder.count();
5262
const elements: ElementFinder[] = [];
5363
for (let i = 0; i < length; i++) {

src/cdk/testing/testbed/testbed-harness-environment.ts

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,36 +19,49 @@ import {takeWhile} from 'rxjs/operators';
1919
import {TaskState, TaskStateZoneInterceptor} from './task-state-zone-interceptor';
2020
import {UnitTestElement} from './unit-test-element';
2121

22-
/** The default query function that respects shadow boundaries. */
23-
const defaultQueryFn = (selector: string, root: Element) => root.querySelectorAll(selector);
22+
/** Options to configure the environment. */
23+
export interface TestbedHarnessEnvironmentOptions {
24+
/** The query function used to find DOM elements. */
25+
queryFn: (selector: string, root: Element) => ArrayLike<Element>;
26+
}
27+
28+
/** The default environment options. */
29+
const defaultEnvironmentOptions: TestbedHarnessEnvironmentOptions = {
30+
queryFn: (selector: string, root: Element) => root.querySelectorAll(selector)
31+
};
2432

2533
/** A `HarnessEnvironment` implementation for Angular's Testbed. */
2634
export class TestbedHarnessEnvironment extends HarnessEnvironment<Element> {
35+
/** Whether the environment has been destroyed. */
2736
private _destroyed = false;
2837

2938
/** Observable that emits whenever the test task state changes. */
3039
private _taskState: Observable<TaskState>;
3140

41+
/** The options for this environment. */
42+
private _options: TestbedHarnessEnvironmentOptions;
43+
3244
protected constructor(rawRootElement: Element, private _fixture: ComponentFixture<unknown>,
33-
private _queryFn: (selector: string, root: Element) => ArrayLike<Element> = defaultQueryFn) {
45+
options?: TestbedHarnessEnvironmentOptions) {
3446
super(rawRootElement);
47+
this._options = {...defaultEnvironmentOptions, ...options};
3548
this._taskState = TaskStateZoneInterceptor.setup();
3649
_fixture.componentRef.onDestroy(() => this._destroyed = true);
3750
}
3851

3952
/** Creates a `HarnessLoader` rooted at the given fixture's root element. */
40-
static loader(fixture: ComponentFixture<unknown>,
41-
queryFn?: (selector: string, root: Element) => ArrayLike<Element>): HarnessLoader {
42-
return new TestbedHarnessEnvironment(fixture.nativeElement, fixture, queryFn);
53+
static loader(fixture: ComponentFixture<unknown>, options?: TestbedHarnessEnvironmentOptions):
54+
HarnessLoader {
55+
return new TestbedHarnessEnvironment(fixture.nativeElement, fixture, options);
4356
}
4457

4558
/**
4659
* Creates a `HarnessLoader` at the document root. This can be used if harnesses are
4760
* located outside of a fixture (e.g. overlays appended to the document body).
4861
*/
4962
static documentRootLoader(fixture: ComponentFixture<unknown>,
50-
queryFn?: (selector: string, root: Element) => ArrayLike<Element>): HarnessLoader {
51-
return new TestbedHarnessEnvironment(document.body, fixture, queryFn);
63+
options?: TestbedHarnessEnvironmentOptions): HarnessLoader {
64+
return new TestbedHarnessEnvironment(document.body, fixture, options);
5265
}
5366

5467
/**
@@ -59,8 +72,8 @@ export class TestbedHarnessEnvironment extends HarnessEnvironment<Element> {
5972
*/
6073
static async harnessForFixture<T extends ComponentHarness>(
6174
fixture: ComponentFixture<unknown>, harnessType: ComponentHarnessConstructor<T>,
62-
queryFn?: (selector: string, root: Element) => ArrayLike<Element>): Promise<T> {
63-
const environment = new TestbedHarnessEnvironment(fixture.nativeElement, fixture, queryFn);
75+
options?: TestbedHarnessEnvironmentOptions): Promise<T> {
76+
const environment = new TestbedHarnessEnvironment(fixture.nativeElement, fixture, options);
6477
await environment.forceStabilize();
6578
return environment.createComponentHarness(harnessType, fixture.nativeElement);
6679
}
@@ -101,11 +114,11 @@ export class TestbedHarnessEnvironment extends HarnessEnvironment<Element> {
101114
}
102115

103116
protected createEnvironment(element: Element): HarnessEnvironment<Element> {
104-
return new TestbedHarnessEnvironment(element, this._fixture, this._queryFn);
117+
return new TestbedHarnessEnvironment(element, this._fixture, this._options);
105118
}
106119

107120
protected async getAllRawElements(selector: string): Promise<Element[]> {
108121
await this.forceStabilize();
109-
return Array.from(this._queryFn(selector, this.rawRootElement));
122+
return Array.from(this._options.queryFn(selector, this.rawRootElement));
110123
}
111124
}

src/cdk/testing/tests/protractor.e2e.spec.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import {browser, by, element as protractorElement, ElementFinder} from 'protract
1010
import {MainComponentHarness} from './harnesses/main-component-harness';
1111
import {SubComponentHarness, SubComponentSpecialHarness} from './harnesses/sub-component-harness';
1212

13-
// TODO: is there some better way to do this?
13+
// Kagekiri is available globally in the browser. We declare it here so we can use it in the
14+
// browser-side script passed to `by.js`.
1415
declare const kagekiri: {
1516
querySelectorAll: (selector: string, root: Element) => NodeListOf<Element>;
1617
};
@@ -473,14 +474,14 @@ describe('ProtractorHarnessEnvironment', () => {
473474
});
474475

475476
it('should pierce shadow boundary when using piercing query', async () => {
476-
const harness = await ProtractorHarnessEnvironment.loader(piercingQueryFn)
477+
const harness = await ProtractorHarnessEnvironment.loader({queryFn: piercingQueryFn})
477478
.getHarness(MainComponentHarness);
478479
const shadows = await harness.shadows();
479480
expect(await Promise.all(shadows.map(el => el.text()))).toEqual(['Shadow 1', 'Shadow 2']);
480481
});
481482

482483
it('should allow querying across shadow boundary', async () => {
483-
const harness = await ProtractorHarnessEnvironment.loader(piercingQueryFn)
484+
const harness = await ProtractorHarnessEnvironment.loader({queryFn: piercingQueryFn})
484485
.getHarness(MainComponentHarness);
485486
expect(await (await harness.deepShadow()).text()).toBe('Shadow 2');
486487
});

src/cdk/testing/tests/testbed.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,14 +513,14 @@ describe('TestbedHarnessEnvironment', () => {
513513

514514
it('should pierce shadow boundary when using piercing query', async () => {
515515
const harness = await TestbedHarnessEnvironment
516-
.harnessForFixture(fixture, MainComponentHarness, piercingQuerySelectorAll);
516+
.harnessForFixture(fixture, MainComponentHarness, {queryFn: piercingQuerySelectorAll});
517517
const shadows = await harness.shadows();
518518
expect(await Promise.all(shadows.map(el => el.text()))).toEqual(['Shadow 1', 'Shadow 2']);
519519
});
520520

521521
it('should allow querying across shadow boundary', async () => {
522522
const harness = await TestbedHarnessEnvironment
523-
.harnessForFixture(fixture, MainComponentHarness, piercingQuerySelectorAll);
523+
.harnessForFixture(fixture, MainComponentHarness, {queryFn: piercingQuerySelectorAll});
524524
expect(await (await harness.deepShadow()).text()).toBe('Shadow 2');
525525
});
526526
});

0 commit comments

Comments
 (0)