224 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 'use strict'; // necessary for es6 output in node
 | |
| 
 | |
| import { browser, element, by } from 'protractor';
 | |
| 
 | |
| describe('NgModule', function () {
 | |
| 
 | |
|   // helpers
 | |
|   const gold = 'rgba(255, 215, 0, 1)';
 | |
|   const powderblue = 'rgba(176, 224, 230, 1)';
 | |
|   const lightgray = 'rgba(211, 211, 211, 1)';
 | |
|   const white = 'rgba(0, 0, 0, 0)';
 | |
| 
 | |
|   function getCommonsSectionStruct() {
 | |
|     const buttons = element.all(by.css('nav a'));
 | |
| 
 | |
|     return {
 | |
|       title: element.all(by.tagName('h1')).get(0),
 | |
|       subtitle: element.all(by.css('app-title p i')).get(0),
 | |
|       contactButton: buttons.get(0),
 | |
|       crisisButton: buttons.get(1),
 | |
|       heroesButton: buttons.get(2)
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   function getContactSectionStruct() {
 | |
|     const buttons = element.all(by.css('app-contact form button'));
 | |
| 
 | |
|     return {
 | |
|       header: element.all(by.css('app-contact h2')).get(0),
 | |
|       popupMessage: element.all(by.css('app-contact div')).get(0),
 | |
|       contactNameHeader: element.all(by.css('app-contact form h3')).get(0),
 | |
|       input: element.all(by.css('app-contact form input')).get(0),
 | |
|       validationError: element.all(by.css('app-contact form .alert')).get(0),
 | |
|       saveButton: buttons.get(0), // can't be tested
 | |
|       nextContactButton: buttons.get(1),
 | |
|       newContactButton: buttons.get(2)
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   function getCrisisSectionStruct() {
 | |
|     return {
 | |
|       title: element.all(by.css('ng-component h3')).get(0),
 | |
|       items: element.all(by.css('ng-component a')),
 | |
|       itemId: element.all(by.css('ng-component div')).get(0),
 | |
|       listLink: element.all(by.css('ng-component a')).get(0),
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   function getHeroesSectionStruct() {
 | |
|     return {
 | |
|       header: element.all(by.css('ng-component h2')).get(0),
 | |
|       title: element.all(by.css('ng-component h3')).get(0),
 | |
|       items: element.all(by.css('ng-component a')),
 | |
|       itemId: element.all(by.css('ng-component ng-component div div')).get(0),
 | |
|       itemInput: element.all(by.css('ng-component ng-component input')).get(0),
 | |
|       listLink: element.all(by.css('ng-component ng-component a')).get(0),
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   // tests
 | |
|   function appTitleTests(color: string, name?: string) {
 | |
|     return function() {
 | |
|       it('should have a gray header', function() {
 | |
|         const commons = getCommonsSectionStruct();
 | |
|         expect(commons.title.getCssValue('backgroundColor')).toBe(color);
 | |
|       });
 | |
| 
 | |
|       it('should welcome us', function () {
 | |
|         const commons = getCommonsSectionStruct();
 | |
|         expect(commons.subtitle.getText()).toBe('Welcome, ' + (name ||  'Sherlock Holmes'));
 | |
|       });
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   function contactTests(color: string, name?: string) {
 | |
|     return function() {
 | |
|       it('shows the contact\'s owner', function() {
 | |
|         const contacts = getContactSectionStruct();
 | |
|         expect(contacts.header.getText()).toBe('Contact of ' + (name ||  'Sherlock Holmes'));
 | |
|       });
 | |
| 
 | |
|       it('can cycle between contacts', function () {
 | |
|         const contacts = getContactSectionStruct();
 | |
|         const nextButton = contacts.nextContactButton;
 | |
|         expect(contacts.contactNameHeader.getText()).toBe('Awesome Sam Spade');
 | |
|         expect(contacts.contactNameHeader.getCssValue('backgroundColor')).toBe(color);
 | |
|         nextButton.click().then(function () {
 | |
|           expect(contacts.contactNameHeader.getText()).toBe('Awesome Nick Danger');
 | |
|           return nextButton.click();
 | |
|         }).then(function () {
 | |
|           expect(contacts.contactNameHeader.getText()).toBe('Awesome Nancy Drew');
 | |
|         });
 | |
|       });
 | |
| 
 | |
|       it('can change an existing contact', function () {
 | |
|         const contacts = getContactSectionStruct();
 | |
|         contacts.input.sendKeys('a');
 | |
|         expect(contacts.input.getCssValue('backgroundColor')).toBe(color);
 | |
|         expect(contacts.contactNameHeader.getText()).toBe('Awesome Sam Spadea');
 | |
|       });
 | |
| 
 | |
|       it('can create a new contact', function () {
 | |
|         const contacts = getContactSectionStruct();
 | |
|         const newContactButton = contacts.newContactButton;
 | |
|         newContactButton.click().then(function () {
 | |
|           expect(contacts.validationError.getText()).toBe('Name is required');
 | |
|           contacts.input.sendKeys('John Doe');
 | |
|           expect(contacts.contactNameHeader.getText()).toBe('Awesome John Doe');
 | |
|           expect(contacts.validationError.getText()).toBe('');
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   describe('index.html', function () {
 | |
|     beforeEach(function () {
 | |
|       browser.get('');
 | |
|     });
 | |
| 
 | |
|     describe('app-title', appTitleTests(white, 'Miss Marple'));
 | |
| 
 | |
|     describe('contact', contactTests(lightgray, 'Miss Marple'));
 | |
| 
 | |
|     describe('crisis center', function () {
 | |
|       beforeEach(function () {
 | |
|         getCommonsSectionStruct().crisisButton.click();
 | |
|       });
 | |
| 
 | |
|       it('shows a list of crisis', function () {
 | |
|         const crisis = getCrisisSectionStruct();
 | |
|         expect(crisis.title.getText()).toBe('Crisis List');
 | |
|         expect(crisis.items.count()).toBe(4);
 | |
|         expect(crisis.items.get(0).getText()).toBe('1 - Dragon Burning Cities');
 | |
|       });
 | |
| 
 | |
|       it('can navigate to one crisis details', function () {
 | |
|         const crisis = getCrisisSectionStruct();
 | |
|         crisis.items.get(0).click().then(function() {
 | |
|           expect(crisis.itemId.getText()).toBe('Crisis id: 1');
 | |
|           return crisis.listLink.click();
 | |
|         }).then(function () {
 | |
|           // We are back to the list
 | |
|           expect(crisis.items.count()).toBe(4);
 | |
|         });
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     describe('heroes', function () {
 | |
|       beforeEach(function () {
 | |
|         getCommonsSectionStruct().heroesButton.click();
 | |
|       });
 | |
| 
 | |
|       it('shows a list of heroes', function() {
 | |
|         const heroes = getHeroesSectionStruct();
 | |
|         expect(heroes.header.getText()).toBe('Heroes of Miss Marple');
 | |
|         expect(heroes.title.getText()).toBe('Hero List');
 | |
|         expect(heroes.items.count()).toBe(6);
 | |
|         expect(heroes.items.get(0).getText()).toBe('11 - Mr. Nice');
 | |
|       });
 | |
| 
 | |
|       it('can navigate and edit one hero details', function () {
 | |
|         const heroes = getHeroesSectionStruct();
 | |
|         heroes.items.get(0).click().then(function () {
 | |
|           expect(heroes.itemId.getText()).toBe('Id: 11');
 | |
|           heroes.itemInput.sendKeys(' try');
 | |
|           return heroes.listLink.click();
 | |
|         }).then(function () {
 | |
|           // We are back to the list
 | |
|           expect(heroes.items.count()).toBe(6);
 | |
|           expect(heroes.items.get(0).getText()).toBe('11 - Mr. Nice try');
 | |
|         });
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   // describe('index.0.html', function() {
 | |
|   //   beforeEach(function () {
 | |
|   //     browser.get('index.0.html');
 | |
|   //   });
 | |
| 
 | |
|   //   it('has a title', function () {
 | |
|   //     const title = element.all(by.tagName('h1')).get(0);
 | |
|   //     expect(title.getText()).toBe('Minimal NgModule');
 | |
|   //   });
 | |
|   // });
 | |
| 
 | |
|   // describe('index.1.html', function () {
 | |
|   //   beforeEach(function () {
 | |
|   //     browser.get('index.1.html');
 | |
|   //   });
 | |
| 
 | |
|   //   describe('app-title', appTitleTests(powderblue));
 | |
|   // });
 | |
| 
 | |
|   // describe('index.1b.html', function () {
 | |
|   //   beforeEach(function () {
 | |
|   //     browser.get('index.1b.html');
 | |
|   //   });
 | |
| 
 | |
|   //   describe('app-title', appTitleTests(powderblue));
 | |
| 
 | |
|   //   describe('contact', contactTests(powderblue));
 | |
|   // });
 | |
| 
 | |
|   // describe('index.2.html', function () {
 | |
|   //   beforeEach(function () {
 | |
|   //     browser.get('index.2.html');
 | |
|   //   });
 | |
| 
 | |
|   //   describe('app-title', appTitleTests(gold));
 | |
| 
 | |
|   //   describe('contact', contactTests(powderblue));
 | |
|   // });
 | |
| 
 | |
|   // describe('index.3.html', function () {
 | |
|   //   beforeEach(function () {
 | |
|   //     browser.get('index.3.html');
 | |
|   //   });
 | |
| 
 | |
|   //   describe('app-title', appTitleTests(gold));
 | |
|   // });
 | |
| 
 | |
| });
 |