From 5530ba56dcde587d20259a774e123a0d488e0d59 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 1 Oct 2020 19:10:16 -0400 Subject: [PATCH 1/3] feat(@schematics/angular): generate E2E tests with native promise support This change adjusts the E2E schematic to generate a protractor configuration with the selenium promise manager disabled. It also adjusts the generated test files to use native promises and async/await to control test execution. --- .../angular/e2e/files/protractor.conf.js.template | 1 + .../angular/e2e/files/src/app.e2e-spec.ts.template | 6 +++--- .../schematics/angular/e2e/files/src/app.po.ts.template | 8 ++++---- .../schematics/angular/e2e/files/tsconfig.json.template | 1 - .../angular/workspace/files/package.json.template | 3 +-- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/schematics/angular/e2e/files/protractor.conf.js.template b/packages/schematics/angular/e2e/files/protractor.conf.js.template index f238c0bbebe9..361e7f0cdfa1 100644 --- a/packages/schematics/angular/e2e/files/protractor.conf.js.template +++ b/packages/schematics/angular/e2e/files/protractor.conf.js.template @@ -16,6 +16,7 @@ exports.config = { browserName: 'chrome' }, directConnect: true, + SELENIUM_PROMISE_MANAGER: false, baseUrl: 'http://localhost:4200/', framework: 'jasmine', jasmineNodeOpts: { diff --git a/packages/schematics/angular/e2e/files/src/app.e2e-spec.ts.template b/packages/schematics/angular/e2e/files/src/app.e2e-spec.ts.template index 06f874bf1328..ff74d504d21d 100644 --- a/packages/schematics/angular/e2e/files/src/app.e2e-spec.ts.template +++ b/packages/schematics/angular/e2e/files/src/app.e2e-spec.ts.template @@ -8,9 +8,9 @@ describe('workspace-project App', () => { page = new AppPage(); }); - it('should display welcome message', () => { - page.navigateTo(); - expect(page.getTitleText()).toEqual('<%= relatedAppName %> app is running!'); + it('should display welcome message', async () => { + await page.navigateTo(); + expect(await page.getTitleText()).toEqual('<%= relatedAppName %> app is running!'); }); afterEach(async () => { diff --git a/packages/schematics/angular/e2e/files/src/app.po.ts.template b/packages/schematics/angular/e2e/files/src/app.po.ts.template index 61b39d9a066f..16143fc955d4 100644 --- a/packages/schematics/angular/e2e/files/src/app.po.ts.template +++ b/packages/schematics/angular/e2e/files/src/app.po.ts.template @@ -1,11 +1,11 @@ import { browser, by, element } from 'protractor'; export class AppPage { - navigateTo(): Promise { - return browser.get(browser.baseUrl) as Promise; + async navigateTo(): Promise { + return browser.get(browser.baseUrl); } - getTitleText(): Promise { - return element(by.css('<%= rootSelector %> .content span')).getText() as Promise; + async getTitleText(): Promise { + return element(by.css('<%= rootSelector %> .content span')).getText(); } } diff --git a/packages/schematics/angular/e2e/files/tsconfig.json.template b/packages/schematics/angular/e2e/files/tsconfig.json.template index 61594f0058f0..64fe9862db78 100644 --- a/packages/schematics/angular/e2e/files/tsconfig.json.template +++ b/packages/schematics/angular/e2e/files/tsconfig.json.template @@ -7,7 +7,6 @@ "target": "es2018", "types": [ "jasmine", - "jasminewd2", "node" ] } diff --git a/packages/schematics/angular/workspace/files/package.json.template b/packages/schematics/angular/workspace/files/package.json.template index c1bcd75259e3..9e7825f8bcb5 100644 --- a/packages/schematics/angular/workspace/files/package.json.template +++ b/packages/schematics/angular/workspace/files/package.json.template @@ -25,8 +25,7 @@ "devDependencies": { "@angular/cli": "<%= '~' + version %>", "@angular/compiler-cli": "<%= latestVersions.Angular %>",<% if (!minimal) { %> - "@types/jasmine": "~3.5.0", - "@types/jasminewd2": "~2.0.3",<% } %> + "@types/jasmine": "~3.5.0",<% } %> "@types/node": "^12.11.1",<% if (!minimal) { %> "codelyzer": "^6.0.0", "jasmine-core": "~3.6.0", From 8087404c18222661aa692d77f6e2c0a4db562532 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 1 Oct 2020 20:47:34 -0400 Subject: [PATCH 2/3] test: update browser tests to support protractor with native promises --- .../e2e/assets/protractor-saucelabs.conf.js | 1 + tests/legacy-cli/e2e/tests/misc/browsers.ts | 12 +----------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/tests/legacy-cli/e2e/assets/protractor-saucelabs.conf.js b/tests/legacy-cli/e2e/assets/protractor-saucelabs.conf.js index d6ffbdb5aff7..5e06ee2c0b68 100644 --- a/tests/legacy-cli/e2e/assets/protractor-saucelabs.conf.js +++ b/tests/legacy-cli/e2e/assets/protractor-saucelabs.conf.js @@ -67,6 +67,7 @@ exports.config = { // Only allow one session at a time to prevent over saturation of Saucelabs sessions. maxSessions: 1, + SELENIUM_PROMISE_MANAGER: false, baseUrl: 'http://localhost:2000/', framework: 'jasmine', jasmineNodeOpts: { diff --git a/tests/legacy-cli/e2e/tests/misc/browsers.ts b/tests/legacy-cli/e2e/tests/misc/browsers.ts index 2f0931f66d37..9f5e897ded75 100644 --- a/tests/legacy-cli/e2e/tests/misc/browsers.ts +++ b/tests/legacy-cli/e2e/tests/misc/browsers.ts @@ -46,17 +46,7 @@ export default async function () { // Leading and trailing space is not removed await replaceInFile( 'e2e/src/app.e2e-spec.ts', - '\'should display welcome message\',', - '\'should display welcome message\', async', - ); - await replaceInFile( - 'e2e/src/app.e2e-spec.ts', - 'page.navigateTo();', - 'await page.navigateTo();', - ); - await replaceInFile( - 'e2e/src/app.e2e-spec.ts', - 'page.getTitleText()', + 'await page.getTitleText()', '(await page.getTitleText()).trim()', ); From 531d0f66bac119806eab8b2c207f37bb7f77e5a3 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 1 Oct 2020 21:02:39 -0400 Subject: [PATCH 3/3] test: update E2E tests to support protractor with native promises --- .../e2e/tests/build/lazy-load-syntax.ts | 6 ++--- tests/legacy-cli/e2e/tests/build/rollup.ts | 6 ++--- .../generate/library/library-consumption.ts | 6 ++--- tests/legacy-cli/e2e/tests/i18n/legacy.ts | 18 +++++++-------- .../e2e/tests/misc/third-party-decorators.ts | 22 +++++++++---------- 5 files changed, 29 insertions(+), 29 deletions(-) diff --git a/tests/legacy-cli/e2e/tests/build/lazy-load-syntax.ts b/tests/legacy-cli/e2e/tests/build/lazy-load-syntax.ts index e04587e4c67c..8426c8a354d0 100644 --- a/tests/legacy-cli/e2e/tests/build/lazy-load-syntax.ts +++ b/tests/legacy-cli/e2e/tests/build/lazy-load-syntax.ts @@ -56,9 +56,9 @@ export default async function () { import { browser, logging, element, by } from 'protractor'; describe('workspace-project App', () => { - it('should display lazy route', () => { - browser.get(browser.baseUrl + '/lazy'); - expect(element(by.css('app-lazy-comp p')).getText()).toEqual('lazy-comp works!'); + it('should display lazy route', async () => { + await browser.get(browser.baseUrl + '/lazy'); + expect(await element(by.css('app-lazy-comp p')).getText()).toEqual('lazy-comp works!'); }); afterEach(async () => { diff --git a/tests/legacy-cli/e2e/tests/build/rollup.ts b/tests/legacy-cli/e2e/tests/build/rollup.ts index 96b16f968439..8b480092b64a 100644 --- a/tests/legacy-cli/e2e/tests/build/rollup.ts +++ b/tests/legacy-cli/e2e/tests/build/rollup.ts @@ -35,9 +35,9 @@ export default async function () { import { browser, logging, element, by } from 'protractor'; describe('workspace-project App', () => { - it('should display lazy route', () => { - browser.get(browser.baseUrl + '/lazy'); - expect(element(by.css('app-lazy p')).getText()).toEqual('lazy works!'); + it('should display lazy route', async () => { + await browser.get(browser.baseUrl + '/lazy'); + expect(await element(by.css('app-lazy p')).getText()).toEqual('lazy works!'); }); afterEach(async () => { diff --git a/tests/legacy-cli/e2e/tests/generate/library/library-consumption.ts b/tests/legacy-cli/e2e/tests/generate/library/library-consumption.ts index ff222d77cda4..9b6798690dd5 100644 --- a/tests/legacy-cli/e2e/tests/generate/library/library-consumption.ts +++ b/tests/legacy-cli/e2e/tests/generate/library/library-consumption.ts @@ -52,9 +52,9 @@ export default async function () { page = new AppPage(); }); - it('should display text from library component', () => { - page.navigateTo(); - expect(element(by.css('lib-my-lib p')).getText()).toEqual('my-lib works!'); + it('should display text from library component', async () => { + await page.navigateTo(); + expect(await element(by.css('lib-my-lib p')).getText()).toEqual('my-lib works!'); }); afterEach(async () => { diff --git a/tests/legacy-cli/e2e/tests/i18n/legacy.ts b/tests/legacy-cli/e2e/tests/i18n/legacy.ts index 06142a9ffe23..238945af8c46 100644 --- a/tests/legacy-cli/e2e/tests/i18n/legacy.ts +++ b/tests/legacy-cli/e2e/tests/i18n/legacy.ts @@ -125,7 +125,7 @@ export async function setupI18nConfig(useLocalize = true, format: keyof typeof f import { browser, logging, element, by } from 'protractor'; describe('workspace-project App', () => { - const getParagraph = (name: string) => element(by.css('app-root p#' + name)).getText(); + const getParagraph = async (name: string) => element(by.css('app-root p#' + name)).getText(); beforeEach(() => browser.get(browser.baseUrl)); afterEach(async () => { // Assert that there are no errors emitted from the browser @@ -135,17 +135,17 @@ export async function setupI18nConfig(useLocalize = true, format: keyof typeof f } as logging.Entry)); }); - it('should display welcome message', () => - expect(getParagraph('hello')).toEqual('${translation.hello}')); + it('should display welcome message', async () => + expect(await getParagraph('hello')).toEqual('${translation.hello}')); - it('should display locale', () => - expect(getParagraph('locale')).toEqual('${lang}')); + it('should display locale', async () => + expect(await getParagraph('locale')).toEqual('${lang}')); - it('should display localized date', () => - expect(getParagraph('date')).toEqual('${translation.date}')); + it('should display localized date', async () => + expect(await getParagraph('date')).toEqual('${translation.date}')); - it('should display pluralized message', () => - expect(getParagraph('plural')).toEqual('${translation.plural}')); + it('should display pluralized message', async () => + expect(await getParagraph('plural')).toEqual('${translation.plural}')); }); `); } diff --git a/tests/legacy-cli/e2e/tests/misc/third-party-decorators.ts b/tests/legacy-cli/e2e/tests/misc/third-party-decorators.ts index ad4505d93481..8f6bb0fcf1f9 100644 --- a/tests/legacy-cli/e2e/tests/misc/third-party-decorators.ts +++ b/tests/legacy-cli/e2e/tests/misc/third-party-decorators.ts @@ -16,11 +16,11 @@ export default function () { './e2e/src/app.po.ts': ` import { browser, by, element } from 'protractor'; export class AppPage { - navigateTo() { return browser.get('/'); } + async navigateTo() { return browser.get('/'); } getIncrementButton() { return element(by.buttonText('Increment')); } getDecrementButton() { return element(by.buttonText('Decrement')); } getResetButton() { return element(by.buttonText('Reset Counter')); } - getCounter() { return element(by.xpath('/html/body/app-root/div/span')).getText(); } + async getCounter() { return element(by.xpath('/html/body/app-root/div/span')).getText(); } } `, './e2e/src/app.e2e-spec.ts': ` @@ -33,15 +33,15 @@ export default function () { page = new AppPage(); }); - it('should operate counter', () => { - page.navigateTo(); - page.getIncrementButton().click(); - page.getIncrementButton().click(); - expect(page.getCounter()).toEqual('2'); - page.getDecrementButton().click(); - expect(page.getCounter()).toEqual('1'); - page.getResetButton().click(); - expect(page.getCounter()).toEqual('0'); + it('should operate counter', async () => { + await page.navigateTo(); + await page.getIncrementButton().click(); + await page.getIncrementButton().click(); + expect(await page.getCounter()).toEqual('2'); + await page.getDecrementButton().click(); + expect(await page.getCounter()).toEqual('1'); + await page.getResetButton().click(); + expect(await page.getCounter()).toEqual('0'); }); }); `,