From 63bce9c6af85b5e25d2aaaf235a9464c5ee84e36 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 16 Aug 2021 21:46:58 +0200 Subject: [PATCH] fix(cdk/testing): require at least one argument locator functions Currently the locator functions are written with a single rest parameter which means that no arguments can be passed as well, even though it'll result in an error at runtime. These changes rework the type so that at least one argument is required to be passed in. --- src/cdk/testing/component-harness.ts | 24 ++++++++++++------------ src/cdk/testing/harness-environment.ts | 12 ++++++------ tools/public_api_guard/cdk/testing.md | 18 +++++++++--------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/cdk/testing/component-harness.ts b/src/cdk/testing/component-harness.ts index 455fd5fdd54b..72e914558545 100644 --- a/src/cdk/testing/component-harness.ts +++ b/src/cdk/testing/component-harness.ts @@ -137,8 +137,8 @@ export interface LocatorFactory { * - `await lf.locatorFor('div', DivHarness)()` gets a `TestElement` instance for `#d1` * - `await lf.locatorFor('span')()` throws because the `Promise` rejects. */ - locatorFor | string)[]>(...queries: T): - AsyncFactoryFn>; + locatorFor | string)>(...queries: [T, ...T[]]): + AsyncFactoryFn>; /** * Creates an asynchronous locator function that can be used to find a `ComponentHarness` instance @@ -161,8 +161,8 @@ export interface LocatorFactory { * - `await lf.locatorForOptional('div', DivHarness)()` gets a `TestElement` instance for `#d1` * - `await lf.locatorForOptional('span')()` gets `null`. */ - locatorForOptional | string)[]>(...queries: T): - AsyncFactoryFn | null>; + locatorForOptional | string)>(...queries: [T, ...T[]]): + AsyncFactoryFn | null>; /** * Creates an asynchronous locator function that can be used to find `ComponentHarness` instances @@ -200,8 +200,8 @@ export interface LocatorFactory { * ]` * - `await lf.locatorForAll('span')()` gets `[]`. */ - locatorForAll | string)[]>(...queries: T): - AsyncFactoryFn[]>; + locatorForAll | string)>(...queries: [T, ...T[]]): + AsyncFactoryFn[]>; /** @return A `HarnessLoader` rooted at the root element of this `LocatorFactory`. */ rootHarnessLoader(): Promise; @@ -286,8 +286,8 @@ export abstract class ComponentHarness { * - `await ch.locatorFor('div', DivHarness)()` gets a `TestElement` instance for `#d1` * - `await ch.locatorFor('span')()` throws because the `Promise` rejects. */ - protected locatorFor | string)[]>(...queries: T): - AsyncFactoryFn> { + protected locatorFor | string)>(...queries: [T, ...T[]]): + AsyncFactoryFn> { return this.locatorFactory.locatorFor(...queries); } @@ -312,8 +312,8 @@ export abstract class ComponentHarness { * - `await ch.locatorForOptional('div', DivHarness)()` gets a `TestElement` instance for `#d1` * - `await ch.locatorForOptional('span')()` gets `null`. */ - protected locatorForOptional | string)[]>(...queries: T): - AsyncFactoryFn | null> { + protected locatorForOptional | string)>(...queries: [T, ...T[]]): + AsyncFactoryFn | null> { return this.locatorFactory.locatorForOptional(...queries); } @@ -353,8 +353,8 @@ export abstract class ComponentHarness { * ]` * - `await ch.locatorForAll('span')()` gets `[]`. */ - protected locatorForAll | string)[]>(...queries: T): - AsyncFactoryFn[]> { + protected locatorForAll | string)>(...queries: [T, ...T[]]): + AsyncFactoryFn[]> { return this.locatorFactory.locatorForAll(...queries); } diff --git a/src/cdk/testing/harness-environment.ts b/src/cdk/testing/harness-environment.ts index 96aea98a417e..c11276289aff 100644 --- a/src/cdk/testing/harness-environment.ts +++ b/src/cdk/testing/harness-environment.ts @@ -57,22 +57,22 @@ export abstract class HarnessEnvironment implements HarnessLoader, LocatorFac } // Implemented as part of the `LocatorFactory` interface. - locatorFor | string)[]>(...queries: T): - AsyncFactoryFn> { + locatorFor | string)>(...queries: [T, ...T[]]): + AsyncFactoryFn> { return () => _assertResultFound( this._getAllHarnessesAndTestElements(queries), _getDescriptionForLocatorForQueries(queries)); } // Implemented as part of the `LocatorFactory` interface. - locatorForOptional | string)[]>(...queries: T): - AsyncFactoryFn | null> { + locatorForOptional | string)>(...queries: [T, ...T[]]): + AsyncFactoryFn | null> { return async () => (await this._getAllHarnessesAndTestElements(queries))[0] || null; } // Implemented as part of the `LocatorFactory` interface. - locatorForAll | string)[]>(...queries: T): - AsyncFactoryFn[]> { + locatorForAll | string)>(...queries: [T, ...T[]]): + AsyncFactoryFn[]> { return () => this._getAllHarnessesAndTestElements(queries); } diff --git a/tools/public_api_guard/cdk/testing.md b/tools/public_api_guard/cdk/testing.md index 954a3e4de266..25ee234ba56b 100644 --- a/tools/public_api_guard/cdk/testing.md +++ b/tools/public_api_guard/cdk/testing.md @@ -33,9 +33,9 @@ export abstract class ComponentHarness { host(): Promise; // (undocumented) protected readonly locatorFactory: LocatorFactory; - protected locatorFor | string)[]>(...queries: T): AsyncFactoryFn>; - protected locatorForAll | string)[]>(...queries: T): AsyncFactoryFn[]>; - protected locatorForOptional | string)[]>(...queries: T): AsyncFactoryFn | null>; + protected locatorFor | string)>(...queries: [T, ...T[]]): AsyncFactoryFn>; + protected locatorForAll | string)>(...queries: [T, ...T[]]): AsyncFactoryFn[]>; + protected locatorForOptional | string)>(...queries: [T, ...T[]]): AsyncFactoryFn | null>; protected waitForTasksOutsideAngular(): Promise; } @@ -109,11 +109,11 @@ export abstract class HarnessEnvironment implements HarnessLoader, LocatorFac // (undocumented) harnessLoaderForOptional(selector: string): Promise; // (undocumented) - locatorFor | string)[]>(...queries: T): AsyncFactoryFn>; + locatorFor | string)>(...queries: [T, ...T[]]): AsyncFactoryFn>; // (undocumented) - locatorForAll | string)[]>(...queries: T): AsyncFactoryFn[]>; + locatorForAll | string)>(...queries: [T, ...T[]]): AsyncFactoryFn[]>; // (undocumented) - locatorForOptional | string)[]>(...queries: T): AsyncFactoryFn | null>; + locatorForOptional | string)>(...queries: [T, ...T[]]): AsyncFactoryFn | null>; // (undocumented) protected rawRootElement: E; // (undocumented) @@ -156,9 +156,9 @@ export interface LocatorFactory { harnessLoaderFor(selector: string): Promise; harnessLoaderForAll(selector: string): Promise; harnessLoaderForOptional(selector: string): Promise; - locatorFor | string)[]>(...queries: T): AsyncFactoryFn>; - locatorForAll | string)[]>(...queries: T): AsyncFactoryFn[]>; - locatorForOptional | string)[]>(...queries: T): AsyncFactoryFn | null>; + locatorFor | string)>(...queries: [T, ...T[]]): AsyncFactoryFn>; + locatorForAll | string)>(...queries: [T, ...T[]]): AsyncFactoryFn[]>; + locatorForOptional | string)>(...queries: [T, ...T[]]): AsyncFactoryFn | null>; rootElement: TestElement; rootHarnessLoader(): Promise; waitForTasksOutsideAngular(): Promise;