From 68faa52098ab160c6771952885807552a3ba9eeb Mon Sep 17 00:00:00 2001 From: Florian Hartwich Date: Tue, 18 Apr 2017 00:16:04 +0200 Subject: [PATCH] Post-Comment-Final --- .../e2e/page-object/abstract-header.po.ts | 39 ++++++-- .../e2e/page-object/abstract-page.po.ts | 14 +++ .../e2e/task/create-new-task.e2e-spec.ts | 7 +- .../e2e/task/edit-task.e2e-spec.ts | 7 ++ project-manager/projects-server/test.json | 11 ++- .../src/app/mocks/mock-task-item.component.ts | 11 +++ .../edit-task/edit-task.component.spec.ts | 96 +------------------ ...nt.spec.ts => task-list.component.spec.ts} | 12 +-- 8 files changed, 82 insertions(+), 115 deletions(-) create mode 100644 project-manager/src/app/mocks/mock-task-item.component.ts rename project-manager/src/app/tasks/task-list/{task-overview.component.spec.ts => task-list.component.spec.ts} (90%) diff --git a/project-manager/e2e/page-object/abstract-header.po.ts b/project-manager/e2e/page-object/abstract-header.po.ts index d809747..664a4ad 100644 --- a/project-manager/e2e/page-object/abstract-header.po.ts +++ b/project-manager/e2e/page-object/abstract-header.po.ts @@ -1,23 +1,42 @@ import {element, by} from "protractor"; import {AbstractPage} from "./abstract-page.po"; +/** + * PageObject Klasse zur Repräsentation jeder + * Seite mit Navigations Header und weiteren Router-Outlets + * + * @author FHartwich + */ export class AbstractHeaderPage extends AbstractPage { + /** + * Überschrift auf der Seite + * @type {ElementFinder} + */ + head = element(by.css('h1')); + + /** + * Schnellzugriff Dropdown Button + * @type {ElementFinder} + */ + schnellzugriffBtn = element(by.className('dropdown')); + + /** + * Validierung der gegebenen Seiten-Überschrift + * @param headline - zu validierende Überschrift + */ validatePageHeadline(headline: string) { - const head = element(by.css('h1')); - expect(head.getText()).toBe(headline); - } - - clickBrandLink(linkText: string) { - const headerEntry = element(by.linkText(linkText)); - headerEntry.click() + expect(this.head.getText()).toBe(headline); } + /** + * Klick auf ein Element im Schnellzugriff Dropdown + * @param linkText - Link-Bezeichnung aus dem Menü + */ clickSchnellzugriffFollowedBy(linkText: string) { // starts with css Selector: https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors - const schnellzugriffBtn = element(by.className('dropdown')); - schnellzugriffBtn.click(); - schnellzugriffBtn.element(by.linkText(linkText)).click(); + this.schnellzugriffBtn.click(); + this.schnellzugriffBtn.element(by.linkText(linkText)).click(); } } diff --git a/project-manager/e2e/page-object/abstract-page.po.ts b/project-manager/e2e/page-object/abstract-page.po.ts index d4125d3..f6de299 100644 --- a/project-manager/e2e/page-object/abstract-page.po.ts +++ b/project-manager/e2e/page-object/abstract-page.po.ts @@ -1,9 +1,23 @@ import {browser} from "protractor"; +/** + * PageObject Klasse, als Grundlage für Browserinteraktion + * + * @author FHartwich + */ export class AbstractPage { + /** + * baseUrl aus der Protractor Konfiguration + * @type {string} + */ baseUrl: string = browser.baseUrl + '/'; + /** + * prüft ob die aktuelle URL mit dem gegebene Pfad + * übereinstimmt + * @param urlEnding - URL Appendix + */ validateCurrentUrl(urlEnding: string) { expect(browser.getCurrentUrl()).toBe(this.baseUrl + urlEnding); } diff --git a/project-manager/e2e/task/create-new-task.e2e-spec.ts b/project-manager/e2e/task/create-new-task.e2e-spec.ts index 74eeb3b..aaff394 100644 --- a/project-manager/e2e/task/create-new-task.e2e-spec.ts +++ b/project-manager/e2e/task/create-new-task.e2e-spec.ts @@ -2,6 +2,12 @@ import {browser} from 'protractor'; import {TaskOverviewPage} from "../page-object/task/task-overview.po"; import {TaskEditPage} from "../page-object/task/task-edit.po"; +/** + * E2E Testsuite für seitenübergreifende + * Interaktionen beim Erstellen einer neuen Aufagbe + * + * @author FHartwich + */ describe('Create New Task Form', function () { it('should redirect to "New Task Form" and contain new entry in list after creation with valid title and assignee-email', () => { @@ -24,7 +30,6 @@ describe('Create New Task Form', function () { const taskEditPage = new TaskEditPage(true); taskEditPage.clearEnterTitle(testTitle); taskEditPage.clearEnterDescription(''); - browser.pause(); taskEditPage.validateError('title'); }); diff --git a/project-manager/e2e/task/edit-task.e2e-spec.ts b/project-manager/e2e/task/edit-task.e2e-spec.ts index 46c6bbc..2ec7f01 100644 --- a/project-manager/e2e/task/edit-task.e2e-spec.ts +++ b/project-manager/e2e/task/edit-task.e2e-spec.ts @@ -2,6 +2,13 @@ import {browser} from 'protractor'; import {TaskOverviewPage} from "../page-object/task/task-overview.po"; import {TaskEditPage} from "../page-object/task/task-edit.po"; + +/** + * E2E Test für die seitenübergreifende Interaktion beim + * Bearbeiten von Aufgaben + * + * @author FHartwich + */ describe('Edit Task Form', function () { const dbTask = { diff --git a/project-manager/projects-server/test.json b/project-manager/projects-server/test.json index 7506597..568c627 100644 --- a/project-manager/projects-server/test.json +++ b/project-manager/projects-server/test.json @@ -2,7 +2,7 @@ "tasks": [ { "id": 3, - "title": "Ersten Prototyp mit Angular 2.0 entwickeln", + "title": "Ersten Prototyp mit Angular 4.0 entwickelt", "description": "Der Prototyp soll zeigen, wie Routing und HTTP-Anbindung umgesetzt werden können.", "tags": [], "state": "IN_PROGRESS", @@ -57,6 +57,15 @@ "state": "IN_PROGRESS", "title": "New Task", "id": 9 + }, + { + "assignee": { + "email": "testuser@test.com" + }, + "tags": [], + "state": "BACKLOG", + "title": "valid title", + "id": 10 } ] } \ No newline at end of file diff --git a/project-manager/src/app/mocks/mock-task-item.component.ts b/project-manager/src/app/mocks/mock-task-item.component.ts new file mode 100644 index 0000000..3ad38bd --- /dev/null +++ b/project-manager/src/app/mocks/mock-task-item.component.ts @@ -0,0 +1,11 @@ +import {Component} from "@angular/core"; + +@Component({ + selector: 'pjm-task-item', + template: '', + inputs: ['task', 'selected'], + outputs: ['taskSelected', 'taskDelete'], +}) +export class MockTaskItemComponent { + +} diff --git a/project-manager/src/app/tasks/edit-task/edit-task.component.spec.ts b/project-manager/src/app/tasks/edit-task/edit-task.component.spec.ts index 72541e4..95a518e 100644 --- a/project-manager/src/app/tasks/edit-task/edit-task.component.spec.ts +++ b/project-manager/src/app/tasks/edit-task/edit-task.component.spec.ts @@ -1,17 +1,10 @@ import {TaskService} from '../../services/task-service/task.service'; - import {RouterTestingModule} from '@angular/router/testing'; - -import {BehaviorSubject} from 'rxjs/BehaviorSubject'; - -import {TestBed, inject} from '@angular/core/testing'; +import {TestBed} from '@angular/core/testing'; import {EditTaskComponent} from './edit-task.component'; import {ShowErrorComponent} from '../../show-error/show-error.component'; import {APPLICATION_VALIDATORS} from '../../models/app-validators'; -import {ActivatedRoute, Router} from '@angular/router'; -import {fakeAsync, tick} from '@angular/core/testing'; import {Title} from '@angular/platform-browser'; -import {Component} from '@angular/core'; import {FormsModule} from '@angular/forms'; import {MockTaskService} from '../../mocks/mock-task-service'; import {generateRandomString} from "../../test/test.helper"; @@ -112,91 +105,4 @@ describe('EditTask Component', () => { }); - /** - * Hinweis: Die folgende TestSuite entstammt dem ursprünglichen edit-task.component.spec.ts Tests - * dieses Projektes und ist geistiges Eigentum vom Chritoph Höller, dem Ersteller des Ausgangsprojektes - */ - describe('Routing', () => { - - @Component({ - template: '' - }) - class TestComponent { - } - - let taskService: TaskService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [FormsModule, RouterTestingModule.withRoutes([ - {path: 'new', component: EditTaskComponent}, - {path: 'edit/:id', component: EditTaskComponent} - ], - )], - declarations: [EditTaskComponent, ShowErrorComponent, APPLICATION_VALIDATORS, TestComponent], - providers: [ - Title, - {provide: TaskService, useClass: MockTaskService}, - ] - }); - }); - - beforeEach(inject([TaskService], (_taskService) => { - taskService = _taskService; - })); - - it('should load the correct task in Edit-Mode', fakeAsync(() => { - const fixture = TestBed.createComponent(EditTaskComponent); - const route = TestBed.get(ActivatedRoute); - (route.params).next({id: '42'}); - - const element = fixture.nativeElement; - - const spy = spyOn(taskService, 'getTask'); - const fakeTask = {title: 'Task1', assignee: {name: 'John'}}; - spy.and.returnValue(new BehaviorSubject(fakeTask)); - - fixture.autoDetectChanges(true); - fixture.whenStable().then(() => { - tick(); - expect(spy).toHaveBeenCalledWith('42'); - const titleInput = element.querySelector('#title'); - expect(titleInput.value).toBe(fakeTask.title); - - const assigneeInput = element.querySelector('#assignee_name'); - expect(assigneeInput.value).toBe(fakeTask.assignee.name); - }); - })); - - - it('should load the correct task (with router)', fakeAsync(() => { - const fixture = TestBed.createComponent(TestComponent); - const router = TestBed.get(Router); - router.navigateByUrl('edit/42'); - - const spy = spyOn(taskService, 'getTask'); - const fakeTask = {title: 'Task1', assignee: {name: 'John'}}; - spy.and.returnValue(new BehaviorSubject(fakeTask)); - fixture.whenStable().then(() => { - tick(); - expect(spy).toHaveBeenCalledWith('42'); - const titleInput = fixture.nativeElement.querySelector('#title'); - expect(titleInput.value).toBe(fakeTask.title); - }); - })); - - it('should work without passing URL-Parameter', fakeAsync(() => { - const fixture = TestBed.createComponent(TestComponent); - const router = TestBed.get(Router); - router.navigateByUrl('new'); - const spy = spyOn(taskService, 'getTask'); - fixture.whenStable().then(() => { - tick(); - expect(spy).not.toHaveBeenCalled(); - const titleInput = fixture.nativeElement.querySelector('#title'); - expect(titleInput.value).toBe(''); - }); - })); - }); - }); diff --git a/project-manager/src/app/tasks/task-list/task-overview.component.spec.ts b/project-manager/src/app/tasks/task-list/task-list.component.spec.ts similarity index 90% rename from project-manager/src/app/tasks/task-list/task-overview.component.spec.ts rename to project-manager/src/app/tasks/task-list/task-list.component.spec.ts index 3b08404..2a26724 100644 --- a/project-manager/src/app/tasks/task-list/task-overview.component.spec.ts +++ b/project-manager/src/app/tasks/task-list/task-list.component.spec.ts @@ -3,24 +3,21 @@ import {Router} from "@angular/router"; import {ReactiveFormsModule} from "@angular/forms"; import {inject} from "@angular/core/testing"; import {TaskListComponent} from "./task-list.component"; -import {TaskItemComponent} from "./task-item.component"; - import {RouterTestingModule} from "@angular/router/testing"; import {MockTaskService} from "../../mocks/mock-task-service"; import {TaskService} from "../../services/task-service/task.service"; - - +import {MockTaskItemComponent} from '../../mocks/mock-task-item.component' describe('Task Overview Component Routing', () => { + let component: TaskListComponent; let fixture; let router; beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ReactiveFormsModule, RouterTestingModule.withRoutes([])], - declarations: [TaskListComponent, TaskItemComponent], - providers: [ {provide: TaskService, useClass: MockTaskService} - ] + declarations: [TaskListComponent, MockTaskItemComponent], + providers: [ {provide: TaskService, useClass: MockTaskService} ] }); fixture = TestBed.createComponent(TaskListComponent); component = fixture.componentInstance; @@ -35,7 +32,6 @@ describe('Task Overview Component Routing', () => { it('should call Router.navigate with id to open quickedit ',() => { fixture.whenStable().then(() => { let taskId = 12; - let spyNavigation = spyOn(router, 'navigate'); component.selectTask(taskId);