Optimize Component tests; Fix e2e execution
							parent
							
								
									704f426eea
								
							
						
					
					
						commit
						38a53b4001
					
				|  | @ -13,6 +13,7 @@ export class TaskEditPage extends AbstractHeaderPage { | |||
|   assigneeName = element(by.id('assignee_name')); | ||||
|   assigneeEmail = element(by.id('assignee_email')); | ||||
|   saveButton = element(by.id('save')); | ||||
|   cancelButton = element(by.id('cancel')); | ||||
| 
 | ||||
|   constructor(newTask: boolean) { | ||||
|     super(); | ||||
|  | @ -56,7 +57,12 @@ export class TaskEditPage extends AbstractHeaderPage { | |||
|     return new TaskOverviewPage; | ||||
|   } | ||||
| 
 | ||||
|   validateInput(elementId: string, value: string) { | ||||
|   cancelSubmitTask() : TaskOverviewPage { | ||||
|     this.cancelButton.click(); | ||||
|     return new TaskOverviewPage(); | ||||
|   } | ||||
| 
 | ||||
|   static validateInput(elementId: string, value: string) { | ||||
|     const input = element(by.id(elementId)); | ||||
|     expect(input.getAttribute('value')).toBe(value); | ||||
|   } | ||||
|  |  | |||
|  | @ -16,6 +16,8 @@ describe('Edit Task Form', function () { | |||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   const newTitle = 'Ersten Prototyp mit Angular 4.0 entwickelt'; | ||||
| 
 | ||||
|   it('should load task with its values in edit form', () => { | ||||
|     browser.get('/tasks'); | ||||
|     const taskOverviewPage = new TaskOverviewPage; | ||||
|  | @ -23,16 +25,15 @@ describe('Edit Task Form', function () { | |||
|     const taskEditPage = taskOverviewPage.clickTask(dbTask.title); | ||||
|     // check for correct url - test input field values
 | ||||
|     taskEditPage.validateCurrentUrl('tasks/edit/' + dbTask.id); | ||||
|     taskEditPage.validateInput('title', dbTask.title); | ||||
|     taskEditPage.validateInput('description', dbTask.description); | ||||
|     taskEditPage.validateInput('state', dbTask.state); | ||||
|     taskEditPage.validateInput('assignee_name', dbTask.assignee['name']) | ||||
|     taskEditPage.validateInput('assignee_email', dbTask.assignee['email']) | ||||
|     TaskEditPage.validateInput('title', dbTask.title); | ||||
|     TaskEditPage.validateInput('description', dbTask.description); | ||||
|     TaskEditPage.validateInput('state', dbTask.state); | ||||
|     TaskEditPage.validateInput('assignee_name', dbTask.assignee['name']) | ||||
|     TaskEditPage.validateInput('assignee_email', dbTask.assignee['email']) | ||||
|   }); | ||||
| 
 | ||||
|   it('should have updated title in overview after edit, but same task id as before', () => { | ||||
|     browser.get('/tasks/edit/' + dbTask.id); | ||||
|     const newTitle = 'Ersten Prototyp mit Angular 4.0 entwickelt'; | ||||
|     const taskEditPage = new TaskEditPage(false); | ||||
|     taskEditPage.clearEnterTitle(newTitle); | ||||
|     let taskOverviewPage = taskEditPage.submitTaskForm(); | ||||
|  | @ -41,5 +42,12 @@ describe('Edit Task Form', function () { | |||
|     taskOverviewPage.clickTask(newTitle).validateCurrentUrl('tasks/edit/' + dbTask.id); | ||||
|   }); | ||||
| 
 | ||||
|   it('should have return to Overview after cancel button click', () => { | ||||
|     browser.get('/tasks/edit/' + dbTask.id); | ||||
|     const taskEditPage = new TaskEditPage(false); | ||||
|     const taskOverviewPage = taskEditPage.cancelSubmitTask(); | ||||
|     taskOverviewPage.verifyNewTask(newTitle); | ||||
|   }); | ||||
| 
 | ||||
| }); | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,11 +6,11 @@ | |||
|   "scripts": { | ||||
|     "ng": "ng", | ||||
|     "start": "concurrently \"node projects-server/server.js db=projects-server/db.json\" \"ng serve\" ", | ||||
|     "starte2e": "concurrently \"node projects-server/server.js db=projects-server/test.json\" \"ng serve --env=e2e\" ", | ||||
|     "starte2e": "cp ./projects-server/safe/test.json ./projects-server/test.json && concurrently \"node projects-server/server.js db=projects-server/test.json\" \"ng serve --env=e2e\" ", | ||||
|     "lint": "tslint \"src/**/*.ts\" --project src/tsconfig.json --type-check && tslint \"e2e/**/*.ts\" --project e2e/tsconfig.json --type-check", | ||||
|     "test": "ng test", | ||||
|     "pree2e": "cp ./projects-server/safe/test.json ./projects-server/test.json && webdriver-manager update --standalone false --gecko false", | ||||
|     "e2e": "concurrently \"node projects-server/server.js db=projects-server/test.json\" \"ng e2e --env=e2e\" ", | ||||
|     "pree2e": "webdriver-manager update --standalone false --gecko false", | ||||
|     "e2e": "cp ./projects-server/safe/test.json ./projects-server/test.json && concurrently \"node projects-server/server.js db=projects-server/test.json\" \"ng e2e --env=e2e\" ", | ||||
|     "install-server": "npm install --prefix ./projects-server ./projects-server", | ||||
|     "e2e-screenshots": "protractor ./protractor-html-reporter.conf.js", | ||||
|     "postinstall": "npm run install-server" | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ import {BlogEntryComponent} from "./blog-entry.component"; | |||
| import {BlogEntry} from "./blog-entry"; | ||||
| import {BlogComponent} from "../blog.component"; | ||||
| import {RouterTestingModule} from "@angular/router/testing"; | ||||
| import {Component} from "@angular/core"; | ||||
| import {MockBlogComponent} from "../../mocks/mock-blog.component"; | ||||
| 
 | ||||
| describe('Blog Entry Isolated Test', () => { | ||||
| 
 | ||||
|  | @ -52,38 +52,12 @@ describe('Blog Entry Isolated Test', () => { | |||
| 
 | ||||
|       const blogDelete = element.querySelector('div /deep/ .blog-delete > button').textContent; | ||||
|       expect(blogDelete).toBe("Entfernen") | ||||
| 
 | ||||
|       // keine Überprüfung der id, die lediglich im EventListener des Delete Button hinterlegt ist, möglich!
 | ||||
|       // nur durch click-Event auslösen, was jedoch BlogComponent vorraussetzt
 | ||||
| 
 | ||||
|     }); | ||||
|   }); | ||||
| 
 | ||||
| 
 | ||||
|   describe('BlogEntryComp -> BlogComp Dependent Test', () => { | ||||
| 
 | ||||
| 
 | ||||
|     it('should remove entry from BlogComponent on "delete" button click', () => { | ||||
|       TestBed.configureTestingModule({ | ||||
|         declarations: [BlogEntryComponent, MockBlogComponent] | ||||
|       }); | ||||
| 
 | ||||
|       const entryFixture = TestBed.createComponent(BlogEntryComponent); | ||||
|       const entryInstance: BlogEntryComponent = entryFixture.componentInstance; | ||||
| 
 | ||||
|       const blogFixture = TestBed.createComponent(MockBlogComponent); | ||||
| 
 | ||||
|       const blogInstance: any = blogFixture.componentInstance; | ||||
| 
 | ||||
|       const blogEntry: BlogEntry = blogInstance.entries[0]; | ||||
|       entryInstance.entry = blogEntry; | ||||
|       entryInstance.blogComponent = blogInstance; | ||||
| 
 | ||||
|       const oldLength = blogInstance.entries.length; | ||||
|       entryFixture.nativeElement.querySelector('div /deep/ .blog-delete > button').click(); | ||||
|       expect(blogInstance.entries.length).toBe(oldLength - 1); | ||||
|     }); | ||||
| 
 | ||||
|     it('should remove entry from BlogComponent on "delete" button click : OVERRIDE BLOG TEMPLATE', () => { | ||||
| 
 | ||||
|       TestBed.overrideComponent(BlogComponent, { | ||||
|  | @ -103,13 +77,38 @@ describe('Blog Entry Isolated Test', () => { | |||
|       const blogFixture = TestBed.createComponent(BlogComponent); | ||||
|       const blogInstance: BlogComponent = blogFixture.componentInstance; | ||||
| 
 | ||||
|       const blogEntry: BlogEntry = blogInstance.entries[0]; | ||||
|       entryInstance.entry = blogEntry; | ||||
|       entryInstance.entry = blogInstance.entries[0]; | ||||
|       entryInstance.blogComponent = blogInstance; | ||||
| 
 | ||||
|       const oldLength = blogInstance.entries.length; | ||||
|       entryFixture.nativeElement.querySelector('div /deep/ .blog-delete > button').click(); | ||||
|       expect(blogInstance.entries.length).toBe(oldLength - 1); | ||||
| 
 | ||||
|       for (let entry in blogInstance.entries) { | ||||
|         expect(entry).not.toBe(entryInstance.entry); | ||||
|       } | ||||
|     }); | ||||
| 
 | ||||
|     it('should remove entry from BlogComponent on "delete" button click : MOCK BLOG COMPONENT', () => { | ||||
|       TestBed.configureTestingModule({ | ||||
|         declarations: [BlogEntryComponent, MockBlogComponent] | ||||
|       }); | ||||
| 
 | ||||
|       const entryFixture = TestBed.createComponent(BlogEntryComponent); | ||||
|       const entryInstance: BlogEntryComponent = entryFixture.componentInstance; | ||||
| 
 | ||||
|       const blogFixture = TestBed.createComponent(MockBlogComponent); | ||||
|       const blogInstance: any = blogFixture.componentInstance; | ||||
| 
 | ||||
|       entryInstance.entry = blogInstance.entries[0]; | ||||
|       entryInstance.blogComponent = blogInstance; | ||||
| 
 | ||||
|       const oldLength = blogInstance.entries.length; | ||||
|       entryFixture.nativeElement.querySelector('div /deep/ .blog-delete > button').click(); | ||||
|       expect(blogInstance.entries.length).toBe(oldLength - 1); | ||||
|       for (let entry in blogInstance.entries) { | ||||
|         expect(entry).not.toBe(entryInstance.entry); | ||||
|       } | ||||
|     }); | ||||
| 
 | ||||
|   }); | ||||
|  | @ -117,20 +116,6 @@ describe('Blog Entry Isolated Test', () => { | |||
| }); | ||||
| 
 | ||||
| 
 | ||||
| // Mocked Blog Component
 | ||||
| @Component({ | ||||
|   selector: 'blog', | ||||
|   template: '<blog-entry></blog-entry>' | ||||
| }) | ||||
| export class MockBlogComponent { | ||||
| 
 | ||||
|   entries = [{}, {}]; | ||||
| 
 | ||||
|   deleteBlogEntry(id) { | ||||
|     this.entries.splice(0, 1); | ||||
|   } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -53,6 +53,10 @@ export class BlogComponent { | |||
|     this.entries.push(entry); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * Löscht den Eintrag mit der gegebenen ID aus der Liste | ||||
|    * @param id - Objekt-ID des zu löschenden Eintrags | ||||
|    */ | ||||
|   deleteBlogEntry(id: number) { | ||||
|     let entryIndex = this.entries.findIndex(entry => entry.id === id); | ||||
|     if (entryIndex >= 0) { | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ import {LoginComponent} from "./login.component"; | |||
| import {RouterTestingModule} from "@angular/router/testing"; | ||||
| import {LoginService} from "../services/login-service/login-service"; | ||||
| import {FormsModule} from "@angular/forms"; | ||||
| import {MockLoginService} from "../mocks/mock-login-service.spec"; | ||||
| import {MockEmptyClass} from "../mocks/mock-empty-class"; | ||||
| import Spy = jasmine.Spy; | ||||
| 
 | ||||
| 
 | ||||
|  | @ -14,14 +14,13 @@ describe('Login Component Template Driven Form Test with Spy', () => { | |||
|       imports: [FormsModule, RouterTestingModule.withRoutes([])], | ||||
|       declarations: [LoginComponent], | ||||
|       providers: [ | ||||
|         {provide: LoginService, useClass: MockLoginService} | ||||
|         {provide: LoginService, useClass: MockEmptyClass} | ||||
|       ], | ||||
|     }) | ||||
|   }); | ||||
| 
 | ||||
| 
 | ||||
|   it('should be possible to request login', () => { | ||||
| 
 | ||||
|     const inputUser = 'testuser'; | ||||
|     const inputPass = 'testpass'; | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,15 @@ | |||
| import {Component} from "@angular/core"; | ||||
| 
 | ||||
| @Component({ | ||||
|   selector: 'blog', | ||||
|   template: '<blog-entry *ngFor="let entry of entries" [entry]="entry" [blogComponent]="this"></blog-entry>' | ||||
| }) | ||||
| export class MockBlogComponent { | ||||
| 
 | ||||
|   entries = [{id: 1}, {id: 2}]; | ||||
| 
 | ||||
|   deleteBlogEntry(id) { | ||||
|     this.entries.splice(0, 1); | ||||
|   } | ||||
| 
 | ||||
| } | ||||
|  | @ -0,0 +1,3 @@ | |||
| export class MockEmptyClass { | ||||
| 
 | ||||
| } | ||||
|  | @ -1,3 +0,0 @@ | |||
| export class MockLoginService { | ||||
| 
 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue