* chore(test): add protractor4 * fix lint, remove boilerplate files, fix less gen * separate scripts between package.json * ignore a2docs.css in boilerplate * remove tslint in _examples
		
			
				
	
	
		
			183 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 'use strict'; // necessary for node!
 | |
| 
 | |
| import { browser, element, by, protractor, ElementFinder, ElementArrayFinder } from 'protractor';
 | |
| import { appLang, describeIf } from '../protractor-helpers';
 | |
| 
 | |
| // THESE TESTS ARE INCOMPLETE
 | |
| describeIf(appLang.appIsTs || appLang.appIsJs, 'Form Validation Tests', function () {
 | |
| 
 | |
|   beforeAll(function () {
 | |
|     browser.get('');
 | |
|   });
 | |
| 
 | |
|   describe('Hero Form 1', () => {
 | |
|     beforeAll(() => {
 | |
|       getPage('hero-form-template1');
 | |
|     });
 | |
| 
 | |
|     tests();
 | |
|   });
 | |
| 
 | |
|   describe('Hero Form 2', () => {
 | |
|     beforeAll(() => {
 | |
|       getPage('hero-form-template2');
 | |
|     });
 | |
| 
 | |
|     tests();
 | |
|     bobTests();
 | |
|   });
 | |
| 
 | |
|   describe('Hero Form 3 (Reactive)', () => {
 | |
|     beforeAll(() => {
 | |
|       getPage('hero-form-reactive3');
 | |
|       makeNameTooLong();
 | |
|     });
 | |
| 
 | |
|     tests();
 | |
|     bobTests();
 | |
|   });
 | |
| });
 | |
| 
 | |
| //////////
 | |
| 
 | |
| const testName = 'Test Name';
 | |
| 
 | |
| let page: {
 | |
|   section: ElementFinder,
 | |
|   form: ElementFinder,
 | |
|   title: ElementFinder,
 | |
|   nameInput: ElementFinder,
 | |
|   alterEgoInput: ElementFinder,
 | |
|   powerSelect: ElementFinder,
 | |
|   errorMessages: ElementArrayFinder,
 | |
|   heroFormButtons: ElementArrayFinder,
 | |
|   heroSubmitted: ElementFinder
 | |
| };
 | |
| 
 | |
| function getPage(sectionTag: string) {
 | |
|   let section = element(by.css(sectionTag));
 | |
|   let buttons = section.all(by.css('button'));
 | |
| 
 | |
|   page = {
 | |
|     section: section,
 | |
|     form: section.element(by.css('form')),
 | |
|     title: section.element(by.css('h1')),
 | |
|     nameInput: section.element(by.css('#name')),
 | |
|     alterEgoInput: section.element(by.css('#alterEgo')),
 | |
|     powerSelect: section.element(by.css('#power')),
 | |
|     errorMessages: section.all(by.css('div.alert')),
 | |
|     heroFormButtons: buttons,
 | |
|     heroSubmitted: section.element(by.css('hero-submitted > div'))
 | |
|   };
 | |
| }
 | |
| 
 | |
| function tests() {
 | |
|   it('should display correct title', function () {
 | |
|     expect(page.title.getText()).toContain('Hero Form');
 | |
|   });
 | |
| 
 | |
|   it('should not display submitted message before submit', function () {
 | |
|     expect(page.heroSubmitted.isElementPresent(by.css('h2'))).toBe(false);
 | |
|   });
 | |
| 
 | |
|   it('should have form buttons', function () {
 | |
|     expect(page.heroFormButtons.count()).toEqual(2);
 | |
|   });
 | |
| 
 | |
|   it('should have error at start', function () {
 | |
|     expectFormIsInvalid();
 | |
|   });
 | |
| 
 | |
|   // it('showForm', function () {
 | |
|   //   page.form.getInnerHtml().then(html => console.log(html));
 | |
|   // });
 | |
| 
 | |
|   it('should have disabled submit button', function () {
 | |
|     expect(page.heroFormButtons.get(0).isEnabled()).toBe(false);
 | |
|   });
 | |
| 
 | |
|   it('resetting name to valid name should clear errors', function () {
 | |
|     const ele = page.nameInput;
 | |
|     expect(ele.isPresent()).toBe(true, 'nameInput should exist');
 | |
|     ele.clear();
 | |
|     ele.sendKeys(testName);
 | |
|     expectFormIsValid();
 | |
|   });
 | |
| 
 | |
|   it('should produce "required" error after clearing name', function () {
 | |
|     page.nameInput.clear();
 | |
|     // page.alterEgoInput.click(); // to blur ... didn't work
 | |
|     page.nameInput.sendKeys('x', protractor.Key.BACK_SPACE); // ugh!
 | |
|     expect(page.form.getAttribute('class')).toMatch('ng-invalid');
 | |
|     expect(page.errorMessages.get(0).getText()).toContain('required');
 | |
|   });
 | |
| 
 | |
|   it('should produce "at least 4 characters" error when name="x"', function () {
 | |
|     page.nameInput.clear();
 | |
|     page.nameInput.sendKeys('x'); // too short
 | |
|     expectFormIsInvalid();
 | |
|     expect(page.errorMessages.get(0).getText()).toContain('at least 4 characters');
 | |
|   });
 | |
| 
 | |
|   it('resetting name to valid name again should clear errors', function () {
 | |
|     page.nameInput.sendKeys(testName);
 | |
|     expectFormIsValid();
 | |
|   });
 | |
| 
 | |
|   it('should have enabled submit button', function () {
 | |
|     const submitBtn = page.heroFormButtons.get(0);
 | |
|     expect(submitBtn.isEnabled()).toBe(true);
 | |
|   });
 | |
| 
 | |
|   it('should hide form after submit', function () {
 | |
|     page.heroFormButtons.get(0).click();
 | |
|     expect(page.title.isDisplayed()).toBe(false);
 | |
|   });
 | |
| 
 | |
|   it('submitted form should be displayed', function () {
 | |
|     expect(page.heroSubmitted.isElementPresent(by.css('h2'))).toBe(true);
 | |
|   });
 | |
| 
 | |
|   it('submitted form should have new hero name', function () {
 | |
|     expect(page.heroSubmitted.getText()).toContain(testName);
 | |
|   });
 | |
| 
 | |
|   it('clicking edit button should reveal form again', function () {
 | |
|     const editBtn = page.heroSubmitted.element(by.css('button'));
 | |
|     editBtn.click();
 | |
|     expect(page.heroSubmitted.isElementPresent(by.css('h2')))
 | |
|       .toBe(false, 'submitted hidden again');
 | |
|     expect(page.title.isDisplayed()).toBe(true, 'can see form title');
 | |
|   });
 | |
| }
 | |
| 
 | |
| function expectFormIsValid() {
 | |
|     expect(page.form.getAttribute('class')).toMatch('ng-valid');
 | |
| }
 | |
| 
 | |
| function expectFormIsInvalid() {
 | |
|     expect(page.form.getAttribute('class')).toMatch('ng-invalid');
 | |
| }
 | |
| 
 | |
| function bobTests() {
 | |
|   const emsg = 'Someone named "Bob" cannot be a hero.';
 | |
| 
 | |
|   it('should produce "no bob" error after setting name to "Bobby"', function () {
 | |
|     page.nameInput.clear();
 | |
|     page.nameInput.sendKeys('Bobby');
 | |
|     expectFormIsInvalid();
 | |
|     expect(page.errorMessages.get(0).getText()).toBe(emsg);
 | |
|   });
 | |
| 
 | |
|   it('should be ok again with valid name', function () {
 | |
|     page.nameInput.clear();
 | |
|     page.nameInput.sendKeys(testName);
 | |
|     expectFormIsValid();
 | |
|   });
 | |
| }
 | |
| 
 | |
| function makeNameTooLong() {
 | |
|   // make the first name invalid
 | |
|   page.nameInput.sendKeys('ThisHeroNameHasWayWayTooManyLetters');
 | |
| }
 |