224 lines
7.3 KiB
TypeScript
224 lines
7.3 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));
|
||
|
});
|
||
|
|
||
|
});
|