From b37ba3b0b7149aaf8cd57f0ef2fe5b08b8aaa5b6 Mon Sep 17 00:00:00 2001 From: SvetoslavTsenov Date: Tue, 7 May 2019 22:28:24 +0300 Subject: [PATCH 1/2] tests: replace anonymous functions --- .../e2e/modal.shared.e2e-spec.ts | 3 --- .../e2e/tab-view.e2e-spec.ts | 12 ++++++------ e2e/renderer/e2e/action-bar.e2e-spec.ts | 18 +++++++++--------- e2e/renderer/e2e/ngfor.e2e-spec.ts | 8 ++++---- e2e/renderer/e2e/ngforof.e2e-spec.ts | 8 ++++---- e2e/renderer/e2e/ngif.e2e-spec.ts | 6 +++--- 6 files changed, 26 insertions(+), 29 deletions(-) diff --git a/e2e/modal-navigation-ng/e2e/modal.shared.e2e-spec.ts b/e2e/modal-navigation-ng/e2e/modal.shared.e2e-spec.ts index 0bfbb6501..97170ff88 100644 --- a/e2e/modal-navigation-ng/e2e/modal.shared.e2e-spec.ts +++ b/e2e/modal-navigation-ng/e2e/modal.shared.e2e-spec.ts @@ -24,9 +24,6 @@ describe("modal-shared:", async function () { await screen[root](); }); - beforeEach(async function () { - }); - afterEach(async function () { if (this.currentTest.state === "failed") { await driver.logTestArtifacts(this.currentTest.title); diff --git a/e2e/nested-router-tab-view/e2e/tab-view.e2e-spec.ts b/e2e/nested-router-tab-view/e2e/tab-view.e2e-spec.ts index d40cc07dd..60d74c835 100644 --- a/e2e/nested-router-tab-view/e2e/tab-view.e2e-spec.ts +++ b/e2e/nested-router-tab-view/e2e/tab-view.e2e-spec.ts @@ -11,13 +11,13 @@ describe("tab-view:", async function () { let driver: AppiumDriver; let screen: Screen; - before(async () => { + before(async function () { nsCapabilities.testReporter.context = this; driver = await createDriver(); screen = new Screen(driver); }); - after(async () => { + after(async function () { await driver.quit(); console.log("Quit driver!"); }); @@ -28,14 +28,14 @@ describe("tab-view:", async function () { } }); - it("loaded home component and lists", async () => { + it("loaded home component and lists", async function () { await screen.navigateToHomePage(); await screen.loadedHome(); await screen.loadedPlayersList(); await screen.loadedTeamList(); }); - it("loaded tabs component, Players List and Teams List pages", async () => { + it("loaded tabs component, Players List and Teams List pages", async function () { await screen.navigateToTabsPage(); await screen.loadedTabs(); await screen.loadedPlayersList(); @@ -45,7 +45,7 @@ describe("tab-view:", async function () { await screen.loadedPlayersList(); }); - it("should navigate Player One/Team One then back separately", async () => { + it("should navigate Player One/Team One then back separately", async function () { await testPlayerNavigated(screen, screen.playerOne); await gotoTeamsTab(driver); await testTeamNavigated(screen, screen.teamOne); @@ -56,7 +56,7 @@ describe("tab-view:", async function () { await screen.loadedPlayersList(); }); - it("should navigate Player One/Team One then next Player/Team then back", async () => { + it("should navigate Player One/Team One then next Player/Team then back", async function () { await testPlayerNavigated(screen, screen.playerOne); await testPlayerNextNavigated(screen, screen.playerTwo); await gotoTeamsTab(driver); diff --git a/e2e/renderer/e2e/action-bar.e2e-spec.ts b/e2e/renderer/e2e/action-bar.e2e-spec.ts index 7b62008ff..b03dad5da 100644 --- a/e2e/renderer/e2e/action-bar.e2e-spec.ts +++ b/e2e/renderer/e2e/action-bar.e2e-spec.ts @@ -18,7 +18,7 @@ describe("Action Bar scenario", async function () { let toggleFirstButton: UIElement; let toggleSecondButton: UIElement; - before(async () => { + before(async function () { nsCapabilities.testReporter.context = this; driver = await createDriver(); await driver.driver.resetApp(); @@ -52,7 +52,7 @@ describe("Action Bar scenario", async function () { }); it("should detach first element when its condition is false", done => { - (async () => { + (async function () { await toggleFirst(); try { @@ -69,7 +69,7 @@ describe("Action Bar scenario", async function () { }); it("should detach second element when its condition is false", done => { - (async () => { + (async function () { await toggleSecond(); try { @@ -95,15 +95,15 @@ describe("Action Bar scenario", async function () { await checkOrderIsCorrect(); }); - const checkOrderIsCorrect = async () => { + const checkOrderIsCorrect = async function () { await isOnTheLeft(firstActionItem, secondActionItem); }; - const toggleFirst = async () => { + const toggleFirst = async function () { await toggleFirstButton.click(); }; - const toggleSecond = async () => { + const toggleSecond = async function () { await toggleSecondButton.click(); }; @@ -113,7 +113,7 @@ describe("Action Bar scenario", async function () { let toggleButton: UIElement; let conditional: UIElement; - before(async () => { + before(async function () { nsCapabilities.testReporter.context = this; driver = await createDriver(); await driver.driver.resetApp(); @@ -147,11 +147,11 @@ describe("Action Bar scenario", async function () { await checkOrderIsCorrect(); }); - const checkOrderIsCorrect = async () => { + const checkOrderIsCorrect = async function () { await isOnTheLeft(toggleButton, conditional); }; - const toggle = async () => { + const toggle = async function () { await toggleButton.click(); }; }); diff --git a/e2e/renderer/e2e/ngfor.e2e-spec.ts b/e2e/renderer/e2e/ngfor.e2e-spec.ts index cca35b8c1..1b9fb1331 100644 --- a/e2e/renderer/e2e/ngfor.e2e-spec.ts +++ b/e2e/renderer/e2e/ngfor.e2e-spec.ts @@ -15,7 +15,7 @@ describe("ngFor scenario", async function () { let elements: UIElement[] = []; let lastAddedElementId = 0; - before(async () => { + before(async function () { nsCapabilities.testReporter.context = this; driver = await createDriver(); await driver.driver.resetApp(); @@ -79,7 +79,7 @@ describe("ngFor scenario", async function () { await checkCorrectOrderAll(); }); - const addElement = async () => { + const addElement = async function () { await addButton.click(); lastAddedElementId += 1; @@ -103,7 +103,7 @@ describe("ngFor scenario", async function () { lastAddedElementId -= 1; }; - const checkAppendedCorrectly = async () => { + const checkAppendedCorrectly = async function () { const lastAdded = await driver.findElementByAutomationText( lastAddedElementId.toString()); @@ -112,7 +112,7 @@ describe("ngFor scenario", async function () { await isAbove(addButton, removeButton); }; - const checkCorrectOrderAll = async () => { + const checkCorrectOrderAll = async function () { for (let i = 0; i < elements.length - 1; i += 1) { await isAbove(elements[i], elements[i + 1]); } diff --git a/e2e/renderer/e2e/ngforof.e2e-spec.ts b/e2e/renderer/e2e/ngforof.e2e-spec.ts index e14e079f4..5b272ff9d 100644 --- a/e2e/renderer/e2e/ngforof.e2e-spec.ts +++ b/e2e/renderer/e2e/ngforof.e2e-spec.ts @@ -21,7 +21,7 @@ describe("ngForOf scenario", function () { let elements: ElementTuple[] = []; let lastAddedElementId = 0; - before(async () => { + before(async function () { nsCapabilities.testReporter.context = this; driver = await createDriver(); await driver.driver.resetApp(); @@ -88,7 +88,7 @@ describe("ngForOf scenario", function () { }); - const addElement = async () => { + const addElement = async function () { await addButton.click(); lastAddedElementId += 1; @@ -114,7 +114,7 @@ describe("ngForOf scenario", function () { lastAddedElementId -= 1; }; - const checkAppendedCorrectly = async () => { + const checkAppendedCorrectly = async function () { const lastAdded = await getElement(lastAddedElementId); await elementIsAbove(elements.slice(-2)[0], lastAdded); @@ -122,7 +122,7 @@ describe("ngForOf scenario", function () { await isAbove(addButton, removeButton); }; - const checkCorrectOrderAll = async () => { + const checkCorrectOrderAll = async function () { for (let i = 0; i < elements.length - 1; i += 1) { await elementIsAbove(elements[i], elements[i + 1]); } diff --git a/e2e/renderer/e2e/ngif.e2e-spec.ts b/e2e/renderer/e2e/ngif.e2e-spec.ts index c81c37a26..128dc2b74 100644 --- a/e2e/renderer/e2e/ngif.e2e-spec.ts +++ b/e2e/renderer/e2e/ngif.e2e-spec.ts @@ -10,7 +10,7 @@ import { isAbove } from "./helpers/location"; import { assert } from "chai"; -describe("ngIf scenario", () => { +describe("ngIf scenario", async function () { let driver: AppiumDriver; let toggleButton: UIElement; @@ -376,7 +376,7 @@ describe("ngIf scenario", () => { driver.findElementByAutomationText("first", 500) .then(_ => { throw new Error("first label found!"); }) - .catch(() => { + .catch(async function () { driver.findElementByAutomationText("second", 500) .then(_ => { throw new Error("second label found!"); }) .catch(() => done()); @@ -402,7 +402,7 @@ describe("ngIf scenario", () => { driver.findElementByAutomationText("first", 500) .then(_ => { throw new Error("first label found!"); }) - .catch(() => { + .catch(async function () { driver.findElementByAutomationText("second", 500) .then(_ => { throw new Error("second label found!"); }) .catch(() => done()); From b6dbe574ed6049ad97161e6503f66f59f4979ccb Mon Sep 17 00:00:00 2001 From: Alexander Vakrilov Date: Wed, 8 May 2019 16:40:03 +0300 Subject: [PATCH 2/2] fix: mark reattached view for CD (#1803) * fix: mark reattached view for CD * chore: fix AOT build error --- e2e/router/app/counter.service.ts | 13 ++++++ e2e/router/app/first/first.component.ts | 15 ++++--- e2e/router/app/second/second.component.ts | 11 ++++- e2e/router/e2e/router.e2e-spec.ts | 40 +++++++++++++++++++ e2e/router/package.json | 2 +- .../router/page-router-outlet.ts | 1 + 6 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 e2e/router/app/counter.service.ts diff --git a/e2e/router/app/counter.service.ts b/e2e/router/app/counter.service.ts new file mode 100644 index 000000000..15fe455c1 --- /dev/null +++ b/e2e/router/app/counter.service.ts @@ -0,0 +1,13 @@ +import { Injectable } from "@angular/core"; +import { BehaviorSubject } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class CounterService { + counter$ = new BehaviorSubject(0); + + tick() { + this.counter$.next(this.counter$.value + 1); + } +} \ No newline at end of file diff --git a/e2e/router/app/first/first.component.ts b/e2e/router/app/first/first.component.ts index 5d93d97b7..f76f54f91 100644 --- a/e2e/router/app/first/first.component.ts +++ b/e2e/router/app/first/first.component.ts @@ -1,10 +1,9 @@ import { Component, OnInit, OnDestroy, OnChanges, DoCheck } from "@angular/core"; -import { ActivatedRoute, Router, Route } from "@angular/router"; -import { Location } from "@angular/common"; import { RouterExtensions } from "nativescript-angular/router"; - import { Page } from "tns-core-modules/ui/page"; +import { CounterService } from "../counter.service"; + @Component({ selector: "first", template: ` @@ -21,12 +20,18 @@ import { Page } from "tns-core-modules/ui/page"; + ` }) export class FirstComponent implements OnInit, OnDestroy, DoCheck { public message: string = ""; public doCheckCount: number = 0; - constructor(private routerExt: RouterExtensions, page: Page) { + + constructor( + private routerExt: RouterExtensions, + public service: CounterService, + page: Page) { + console.log("FirstComponent - constructor() page: " + page); } @@ -42,7 +47,7 @@ export class FirstComponent implements OnInit, OnDestroy, DoCheck { this.doCheckCount++; console.log("FirstComponent - ngDoCheck(): " + this.doCheckCount); } - + reset() { this.doCheckCount = 0; } diff --git a/e2e/router/app/second/second.component.ts b/e2e/router/app/second/second.component.ts index be9baae96..6b4c6ce7f 100644 --- a/e2e/router/app/second/second.component.ts +++ b/e2e/router/app/second/second.component.ts @@ -1,10 +1,11 @@ import { Component, OnInit, OnDestroy } from "@angular/core"; -import { ActivatedRoute, Router, Route } from "@angular/router"; +import { ActivatedRoute } from "@angular/router"; import { RouterExtensions } from "nativescript-angular/router"; import { Page } from "tns-core-modules/ui/page"; import { Observable } from "rxjs"; import { map } from "rxjs/operators"; +import { CounterService } from "../counter.service"; @Component({ selector: "second", @@ -19,6 +20,8 @@ import { map } from "rxjs/operators"; + + @@ -33,7 +36,11 @@ export class SecondComponent implements OnInit, OnDestroy { public depth$: Observable; public nextDepth$: Observable; - constructor(private routerExt: RouterExtensions, private route: ActivatedRoute, page: Page) { + constructor( + private routerExt: RouterExtensions, + private route: ActivatedRoute, + public service: CounterService, + page: Page) { console.log("SecondComponent - constructor() page: " + page); this.depth$ = route.params.pipe(map(r => r["depth"])); this.nextDepth$ = route.params.pipe(map(r => +r["depth"] + 1)); diff --git a/e2e/router/e2e/router.e2e-spec.ts b/e2e/router/e2e/router.e2e-spec.ts index 0b5d1d1e2..b71926499 100644 --- a/e2e/router/e2e/router.e2e-spec.ts +++ b/e2e/router/e2e/router.e2e-spec.ts @@ -449,6 +449,46 @@ describe("Simple navigate and back should trigger only one CD on FirstComponent" }); }); +describe("Simple navigate and back should trigger only one CD on FirstComponent even with 3 changes in service", () => { + let driver: AppiumDriver; + + before(async () => { + driver = await createDriver(); + await driver.resetApp(); + }); + + it("should find First", async () => { + await assureFirstComponent(driver); + }); + + it("should reset counter", async () => { + await findAndClick(driver, "RESET"); + await driver.waitForElement("CHECK: 1"); + await driver.waitForElement("COUNTER: 0"); + }); + + it("should navigate to Second(1)/master", async () => { + await findAndClick(driver, "GO TO SECOND"); + + await assureSecondComponent(driver, 1); + await assureNestedMasterComponent(driver); + }); + + it("should increase counter", async () => { + await findAndClick(driver, "TICK"); + await findAndClick(driver, "TICK"); + await findAndClick(driver, "TICK"); + }); + + it("should navigate back to First", async () => { + await goBack(driver); + await assureFirstComponent(driver); + await driver.waitForElement("CHECK: 2"); + await driver.waitForElement("COUNTER: 3"); + }); +}); + + async function assureFirstComponent(driver: AppiumDriver) { await driver.findElementByAutomationText("FirstComponent"); } diff --git a/e2e/router/package.json b/e2e/router/package.json index b7902b35f..1e7340917 100644 --- a/e2e/router/package.json +++ b/e2e/router/package.json @@ -44,7 +44,7 @@ "nativescript-dev-typescript": "next", "nativescript-dev-webpack": "next", "tslib": "^1.7.1", - "typescript": "^3.1.6" + "typescript": "~3.1.1" }, "scripts": { "e2e": "tsc -p e2e && mocha --opts ../config/mocha.opts --recursive e2e --appiumCapsLocation ../config/appium.capabilities.json", diff --git a/nativescript-angular/router/page-router-outlet.ts b/nativescript-angular/router/page-router-outlet.ts index 63f9ea4a8..7c018487b 100644 --- a/nativescript-angular/router/page-router-outlet.ts +++ b/nativescript-angular/router/page-router-outlet.ts @@ -262,6 +262,7 @@ export class PageRouterOutlet implements OnDestroy { // tslint:disable-line:dire this.activated = ref; // reattach to ChangeDetection + this.activated.hostView.markForCheck(); this.activated.hostView.reattach(); this._activatedRoute = activatedRoute; this.markActivatedRoute(activatedRoute);