diff --git a/.circleci/config.yml b/.circleci/config.yml index e05a392242..f279db9059 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -154,7 +154,17 @@ jobs: command: npx stencil test --e2e --screenshot --screenshot-connector=scripts/screenshot/ci.js --ci --update-screenshot || true working_directory: /tmp/workspace/core - test-angular: + test-angular-lint: + <<: *defaults + steps: + - checkout + - attach_workspace: + at: /tmp/workspace + - run: + command: npm run lint + working_directory: /tmp/workspace/angular + + test-angular-e2e: <<: *defaults steps: - checkout @@ -174,10 +184,6 @@ workflows: - build - build-core: requires: [build] - - build-angular: - requires: [build-core] - - test-angular: - requires: [build-angular] - test-core-clean-build: requires: [build-core] - test-core-lint: @@ -196,3 +202,10 @@ workflows: filters: branches: only: master + + - build-angular: + requires: [build-core] + - test-angular-lint: + requires: [build-angular] + - test-angular-e2e: + requires: [build-angular] diff --git a/angular/package.json b/angular/package.json index 15943b9b98..ed2a7f327c 100644 --- a/angular/package.json +++ b/angular/package.json @@ -28,7 +28,7 @@ "build.ng": "./node_modules/.bin/ngc", "clean": "node scripts/clean.js", "clean-generated": "node ./scripts/clean-generated.js", - "lint": "echo TODO", + "lint": "npm run lint.ts", "lint.ts": "tslint --project .", "lint.fix": "tslint --project . --fix", "prerelease": "npm run validate && np prerelease --yolo --any-branch --tag next", diff --git a/angular/src/directives/navigation/stack-controller.ts b/angular/src/directives/navigation/stack-controller.ts index 2f840314a6..e13ac8725b 100644 --- a/angular/src/directives/navigation/stack-controller.ts +++ b/angular/src/directives/navigation/stack-controller.ts @@ -106,7 +106,8 @@ export class StackController { const element = view.element; element.setAttribute('aria-hidden', 'true'); element.classList.add('ion-page-hidden'); - view.ref.changeDetectorRef.detach(); + // TODO + // view.ref.changeDetectorRef.detach(); } this.viewsSnapshot = views.slice(); } @@ -132,10 +133,11 @@ export class StackController { this.skipTransition = false; return; } - if (enteringView) { - enteringView.ref.changeDetectorRef.reattach(); - enteringView.ref.changeDetectorRef.markForCheck(); - } + // TODO + // if (enteringView) { + // enteringView.ref.changeDetectorRef.reattach(); + // enteringView.ref.changeDetectorRef.markForCheck(); + // } const enteringEl = enteringView ? enteringView.element : undefined; const leavingEl = leavingView ? leavingView.element : undefined; const containerEl = this.containerEl; diff --git a/angular/test/test-app/e2e/src/inputs.e2e-spec.ts b/angular/test/test-app/e2e/src/inputs.e2e-spec.ts index 40052c35ac..7ff20b9f9a 100644 --- a/angular/test/test-app/e2e/src/inputs.e2e-spec.ts +++ b/angular/test/test-app/e2e/src/inputs.e2e-spec.ts @@ -1,11 +1,14 @@ import { browser, element, by } from 'protractor'; -import { getProperty, setProperty } from './utils'; +import { getProperty, setProperty, handleErrorMessages } from './utils'; describe('inputs', () => { beforeEach(async () => { await browser.get('/inputs'); }); + afterEach(() => { + handleErrorMessages(); + }); it('should have default value', async () => { expect(await getProperty('ion-checkbox', 'checked')).toEqual(true); diff --git a/angular/test/test-app/e2e/src/modal.e2e-spec.ts b/angular/test/test-app/e2e/src/modal.e2e-spec.ts index 55599837fb..446509c29d 100644 --- a/angular/test/test-app/e2e/src/modal.e2e-spec.ts +++ b/angular/test/test-app/e2e/src/modal.e2e-spec.ts @@ -1,11 +1,14 @@ import { browser, element, by } from 'protractor'; -import { waitTime, getText } from './utils'; +import { waitTime, getText, handleErrorMessages } from './utils'; describe('modals', () => { beforeEach(async () => { await browser.get('/modals'); }); + afterEach(() => { + handleErrorMessages(); + }); it('should open and close', async () => { await element(by.css('#action-button')).click(); diff --git a/angular/test/test-app/e2e/src/router-link.e2e-spec.ts b/angular/test/test-app/e2e/src/router-link.e2e-spec.ts index 699997e4ce..3f08185cea 100644 --- a/angular/test/test-app/e2e/src/router-link.e2e-spec.ts +++ b/angular/test/test-app/e2e/src/router-link.e2e-spec.ts @@ -1,11 +1,15 @@ import { browser, element, by } from 'protractor'; -import { waitTime, testStack, testLifeCycle } from './utils'; +import { waitTime, testStack, testLifeCycle, handleErrorMessages } from './utils'; describe('router-link', () => { beforeEach(async () => { await browser.get('/router-link'); }); + afterEach(() => { + handleErrorMessages(); + }); + it('should have correct lifecycle counts', async () => { await testLifeCycle('app-router-link', { diff --git a/angular/test/test-app/e2e/src/utils.ts b/angular/test/test-app/e2e/src/utils.ts index 56900e9402..77afd0f952 100644 --- a/angular/test/test-app/e2e/src/utils.ts +++ b/angular/test/test-app/e2e/src/utils.ts @@ -1,4 +1,4 @@ -import { browser, by, element, ElementFinder } from 'protractor'; +import { browser } from 'protractor'; export function getProperty(selector: string, property: string) { return browser.executeScript(` @@ -32,7 +32,25 @@ export interface LifeCycleCount { ionViewDidLeave: number; } +export function handleErrorMessages() { + browser.manage().logs().get('browser').then(function(browserLog) { + let severWarnings = false; + + for (let i; i <= browserLog.length - 1; i++) { + if (browserLog[i].level.name === 'SEVERE') { + console.log('\n' + browserLog[i].level.name); + console.log('(Possibly exception) \n' + browserLog[i].message); + + severWarnings = true; + } + } + + expect(severWarnings).toBe(false); + }); +} + export async function testLifeCycle(selector: string, expected: LifeCycleCount) { + await waitTime(50); expect(await getText(`${selector} #ngOnInit`)).toEqual('1'); expect(await getText(`${selector} #ionViewWillEnter`)).toEqual(expected.ionViewWillEnter.toString()); expect(await getText(`${selector} #ionViewDidEnter`)).toEqual(expected.ionViewDidEnter.toString()); diff --git a/angular/test/test-app/src/app/modal-example/modal-example.component.ts b/angular/test/test-app/src/app/modal-example/modal-example.component.ts index 9b6babb884..303d9a9bec 100644 --- a/angular/test/test-app/src/app/modal-example/modal-example.component.ts +++ b/angular/test/test-app/src/app/modal-example/modal-example.component.ts @@ -25,6 +25,9 @@ export class ModalExampleComponent implements OnInit { } ionViewWillEnter() { + if (this.onInit !== 1) { + throw new Error('ngOnInit was not called'); + } NgZone.assertInAngularZone(); this.willEnter++; } diff --git a/angular/test/test-app/src/app/router-link-page/router-link-page.component.html b/angular/test/test-app/src/app/router-link-page/router-link-page.component.html index c79af6e48f..8077d198b0 100644 --- a/angular/test/test-app/src/app/router-link-page/router-link-page.component.html +++ b/angular/test/test-app/src/app/router-link-page/router-link-page.component.html @@ -3,11 +3,11 @@ + router-link page - - router-link page +

ngOnInit: {{onInit}}

ionViewWillEnter: {{willEnter}}

ionViewDidEnter: {{didEnter}}

diff --git a/angular/test/test-app/src/app/router-link-page/router-link-page.component.ts b/angular/test/test-app/src/app/router-link-page/router-link-page.component.ts index f54c90f41c..882b0ffa70 100644 --- a/angular/test/test-app/src/app/router-link-page/router-link-page.component.ts +++ b/angular/test/test-app/src/app/router-link-page/router-link-page.component.ts @@ -18,6 +18,9 @@ export class RouterLinkPageComponent implements OnInit { } ionViewWillEnter() { + if (this.onInit !== 1) { + throw new Error('ngOnInit was not called'); + } NgZone.assertInAngularZone(); this.willEnter++; } diff --git a/angular/test/test-app/src/app/router-link/router-link.component.ts b/angular/test/test-app/src/app/router-link/router-link.component.ts index 5022c5a1b7..4d17e02a37 100644 --- a/angular/test/test-app/src/app/router-link/router-link.component.ts +++ b/angular/test/test-app/src/app/router-link/router-link.component.ts @@ -41,6 +41,9 @@ export class RouterLinkComponent implements OnInit { } ionViewWillEnter() { + if (this.onInit !== 1) { + throw new Error('ngOnInit was not called'); + } NgZone.assertInAngularZone(); this.willEnter++; } diff --git a/angular/test/test-app/src/app/tabs/tabs.component.ts b/angular/test/test-app/src/app/tabs/tabs.component.ts index b32e527986..eb47f5a1fd 100644 --- a/angular/test/test-app/src/app/tabs/tabs.component.ts +++ b/angular/test/test-app/src/app/tabs/tabs.component.ts @@ -1,14 +1,9 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-tabs', templateUrl: './tabs.component.html', }) -export class TabsComponent implements OnInit { - - constructor() { } - - ngOnInit() { - } +export class TabsComponent { }