174 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
'use strict'; // necessary for node!
 | 
						|
 | 
						|
import { browser, element, by, protractor, ElementFinder, ElementArrayFinder } from 'protractor';
 | 
						|
 | 
						|
// THESE TESTS ARE INCOMPLETE
 | 
						|
describe('Form Validation Tests', function () {
 | 
						|
 | 
						|
  beforeAll(function () {
 | 
						|
    browser.get('');
 | 
						|
  });
 | 
						|
 | 
						|
  describe('Template-driven form', () => {
 | 
						|
    beforeAll(() => {
 | 
						|
      getPage('hero-form-template');
 | 
						|
    });
 | 
						|
 | 
						|
    tests('Template-Driven Form');
 | 
						|
  });
 | 
						|
 | 
						|
  describe('Reactive form', () => {
 | 
						|
    beforeAll(() => {
 | 
						|
      getPage('hero-form-reactive');
 | 
						|
    });
 | 
						|
 | 
						|
    tests('Reactive Form');
 | 
						|
    bobTests();
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
//////////
 | 
						|
 | 
						|
const testName = 'Test Name';
 | 
						|
 | 
						|
let page: {
 | 
						|
  section: ElementFinder,
 | 
						|
  form: ElementFinder,
 | 
						|
  title: ElementFinder,
 | 
						|
  nameInput: ElementFinder,
 | 
						|
  alterEgoInput: ElementFinder,
 | 
						|
  powerSelect: ElementFinder,
 | 
						|
  powerOption: 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')),
 | 
						|
    powerOption: section.element(by.css('#power option')),
 | 
						|
    errorMessages: section.all(by.css('div.alert')),
 | 
						|
    heroFormButtons: buttons,
 | 
						|
    heroSubmitted: section.element(by.css('.submitted-message'))
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
function tests(title: string) {
 | 
						|
 | 
						|
  it('should display correct title', function () {
 | 
						|
    expect(page.title.getText()).toContain(title);
 | 
						|
  });
 | 
						|
 | 
						|
  it('should not display submitted message before submit', function () {
 | 
						|
    expect(page.heroSubmitted.isElementPresent(by.css('p'))).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.heroFormButtons.get(0).isDisplayed()).toBe(false);
 | 
						|
  });
 | 
						|
 | 
						|
  it('submitted form should be displayed', function () {
 | 
						|
    expect(page.heroSubmitted.isElementPresent(by.css('p'))).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 newFormBtn = page.heroSubmitted.element(by.css('button'));
 | 
						|
    newFormBtn.click();
 | 
						|
    expect(page.heroSubmitted.isElementPresent(by.css('p')))
 | 
						|
      .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 = 'Name cannot be Bob.';
 | 
						|
 | 
						|
  it('should produce "no bob" error after setting name to "Bobby"', function () {
 | 
						|
    // Re-populate select element
 | 
						|
    page.powerSelect.click();
 | 
						|
    page.powerOption.click();
 | 
						|
 | 
						|
    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();
 | 
						|
  });
 | 
						|
}
 |