remove premade tests and testconfig
parent
dc735e8091
commit
cf971413b3
|
@ -1,28 +0,0 @@
|
||||||
# This file is a template, and might need editing before it works on your project.
|
|
||||||
# Official framework image. Look for the different tagged releases at:
|
|
||||||
# https://hub.docker.com/r/library/node/tags/
|
|
||||||
image: node:latest
|
|
||||||
|
|
||||||
# Pick zero or more services to be used on all builds.
|
|
||||||
# Only needed when using a docker container to run your tests in.
|
|
||||||
# Check out: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-service
|
|
||||||
services:
|
|
||||||
- mysql:latest
|
|
||||||
- redis:latest
|
|
||||||
- postgres:latest
|
|
||||||
|
|
||||||
# This folder is cached between builds
|
|
||||||
# http://docs.gitlab.com/ce/ci/yaml/README.html#cache
|
|
||||||
cache:
|
|
||||||
paths:
|
|
||||||
- node_modules/
|
|
||||||
|
|
||||||
test_async:
|
|
||||||
script:
|
|
||||||
- npm install
|
|
||||||
- node ./specs/start.js ./specs/async.spec.js
|
|
||||||
|
|
||||||
test_db:
|
|
||||||
script:
|
|
||||||
- npm install
|
|
||||||
- node ./specs/start.js ./specs/db-postgres.spec.js
|
|
|
@ -44,11 +44,6 @@
|
||||||
"config": "./protractor.conf.js"
|
"config": "./protractor.conf.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"test": {
|
|
||||||
"karma": {
|
|
||||||
"config": "./karma.conf.js"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"styleExt": "css",
|
"styleExt": "css",
|
||||||
"prefixInterfaces": false,
|
"prefixInterfaces": false,
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
import { browser, element, by } from 'protractor';
|
|
||||||
|
|
||||||
describe('Dashboard', function() {
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
browser.get('/')
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should display the correct heading', () => {
|
|
||||||
const heading = element(by.css('h1')).getText();
|
|
||||||
const headings = element.all(by.css('h1')).getText();
|
|
||||||
console.log(headings)
|
|
||||||
heading.then((headingText) => {
|
|
||||||
console.log(headingText);
|
|
||||||
});
|
|
||||||
expect(heading).toEqual('Dashboard');
|
|
||||||
expect(headings).toContain('Dashboard');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should redirect to /dashboard', () => {
|
|
||||||
expect(browser.getCurrentUrl()).toContain('/dashboard');
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
|
@ -1,12 +0,0 @@
|
||||||
import { browser} from 'protractor';
|
|
||||||
import * as fs from 'fs';
|
|
||||||
|
|
||||||
declare var Buffer, module: any;
|
|
||||||
|
|
||||||
export function takeScreenshot(filename: string) {
|
|
||||||
return browser.takeScreenshot().then((data) => {
|
|
||||||
const stream = fs.createWriteStream(filename);
|
|
||||||
stream.write(new Buffer(data, 'base64'));
|
|
||||||
stream.end();
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
import {takeScreenshot} from '../helpers/take_screenshot';
|
|
||||||
import { browser } from 'protractor';
|
|
||||||
import {EditTaskPage} from './edit-task.po';
|
|
||||||
|
|
||||||
describe('Edit Tasks', function() {
|
|
||||||
|
|
||||||
let page: EditTaskPage;
|
|
||||||
beforeEach(() => {
|
|
||||||
page = new EditTaskPage();
|
|
||||||
page.navigateToNewPage();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should change page when accepting alert', () => {
|
|
||||||
page.fillForm('New Task', 'BACKLOG');
|
|
||||||
page.cancel();
|
|
||||||
page.getAlert().accept(); // Klick auf OK
|
|
||||||
expect(browser.getCurrentUrl()).not.toContain(page.newUrl);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should stay on page when discarding alert', () => {
|
|
||||||
page.fillForm('New Task', 'IN_PROGRESS');
|
|
||||||
page.cancel();
|
|
||||||
page.getAlert().dismiss(); // Klick auf Abbrechen
|
|
||||||
expect(browser.getCurrentUrl()).toContain(page.newUrl);
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,34 +0,0 @@
|
||||||
import { browser, element, by, protractor} from 'protractor';
|
|
||||||
|
|
||||||
export class EditTaskPage {
|
|
||||||
newUrl = '/tasks/new';
|
|
||||||
navigateToNewPage() {
|
|
||||||
return browser.get(this.newUrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
navigateToEditPage(id: number) {
|
|
||||||
return browser.get(`tasks/edit/${id}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
fillForm(title: string, state: string) {
|
|
||||||
element(by.name('title')).sendKeys(title);
|
|
||||||
element(by.name('state')).element(by.css(`[value="${state}"]`))
|
|
||||||
.click();
|
|
||||||
//Firefox HACK:
|
|
||||||
browser.actions().sendKeys( protractor.Key.ENTER ).perform();
|
|
||||||
}
|
|
||||||
|
|
||||||
save() {
|
|
||||||
element(by.id('save')).click();
|
|
||||||
}
|
|
||||||
|
|
||||||
cancel() {
|
|
||||||
return element(by.id('cancel')).click();
|
|
||||||
}
|
|
||||||
|
|
||||||
getAlert() {
|
|
||||||
return browser.switchTo().alert();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
import { browser, element, by } from 'protractor';
|
|
||||||
import {takeScreenshot} from '../helpers/take_screenshot';
|
|
||||||
|
|
||||||
describe('Task List (without Page Object)', () => {
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
browser.get('/tasks')
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should allow searching for tasks', () => {
|
|
||||||
element(by.css('#search-tasks')).sendKeys('Ersten');
|
|
||||||
browser.sleep(500);
|
|
||||||
const count = element.all(by.className('task-list-entry')).count();
|
|
||||||
expect(count).toEqual(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should work with no search results', () => {
|
|
||||||
element(by.css('#search-tasks')).sendKeys('Ich existiere nicht');
|
|
||||||
browser.sleep(500);
|
|
||||||
const count = element.all(by.className('task-list-entry')).count();
|
|
||||||
expect(count).toEqual(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
|
@ -1,54 +0,0 @@
|
||||||
|
|
||||||
import {takeScreenshot} from '../helpers/take_screenshot';
|
|
||||||
import {TaskListPage} from './task-list.po';
|
|
||||||
import { browser } from 'protractor';
|
|
||||||
|
|
||||||
|
|
||||||
describe('TaskList', function () {
|
|
||||||
|
|
||||||
let page: TaskListPage;
|
|
||||||
beforeEach(() => {
|
|
||||||
page = new TaskListPage();
|
|
||||||
page.navigateTo();
|
|
||||||
});
|
|
||||||
|
|
||||||
xit('should allow to create new tasks (forgot to press save)', () => {
|
|
||||||
|
|
||||||
const editPage = page.gotoNewTaskView();
|
|
||||||
editPage.fillForm('New Task', 'BACKLOG');
|
|
||||||
// editPage.save();
|
|
||||||
|
|
||||||
expect(page.checkTaskDisplayed('New Task')).not.toBeNull();
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should allow searching for tasks', () => {
|
|
||||||
page.searchForTasks('Ersten');
|
|
||||||
expect(page.getTaskCount()).toEqual(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should work with no search results', () => {
|
|
||||||
page.searchForTasks('Ich existiere nicht.');
|
|
||||||
expect(page.getTaskCount()).toEqual(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
it('should allow to create new tasks', () => {
|
|
||||||
const taskTitle = `New Task ${new Date().getTime()}`;
|
|
||||||
const editPage = page.gotoNewTaskView();
|
|
||||||
editPage.fillForm(taskTitle, 'IN_PROGRESS');
|
|
||||||
editPage.save();
|
|
||||||
takeScreenshot('createTaskFailure.png');
|
|
||||||
page.checkTaskDisplayed(taskTitle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should add new tasks to the displayed list', () => {
|
|
||||||
page.getTaskCount().then(count => {
|
|
||||||
const editPage = page.gotoNewTaskView();
|
|
||||||
editPage.fillForm('New Task', 'IN_PROGRESS');
|
|
||||||
editPage.save();
|
|
||||||
expect(page.getTaskCount()).toEqual(count + 1);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
|
@ -1,32 +0,0 @@
|
||||||
import { browser, element, by} from 'protractor';
|
|
||||||
import { ExpectedConditions as EC} from 'protractor';
|
|
||||||
import {EditTaskPage} from './edit-task.po';
|
|
||||||
|
|
||||||
export class TaskListPage {
|
|
||||||
|
|
||||||
navigateTo() {
|
|
||||||
return browser.get('/tasks');
|
|
||||||
}
|
|
||||||
|
|
||||||
searchForTasks(term: string) {
|
|
||||||
element(by.css('#search-tasks')).sendKeys(term);
|
|
||||||
browser.sleep(500);
|
|
||||||
}
|
|
||||||
|
|
||||||
getTaskCount() {
|
|
||||||
return element.all(by.className('task-list-entry')).count();
|
|
||||||
}
|
|
||||||
|
|
||||||
gotoNewTaskView() {
|
|
||||||
element(by.linkText('Neue Aufgabe anlegen')).click();
|
|
||||||
return new EditTaskPage();
|
|
||||||
}
|
|
||||||
|
|
||||||
checkTaskDisplayed(text: string) {
|
|
||||||
const taskLink = element(by.linkText(text));
|
|
||||||
browser.wait(EC.presenceOf(taskLink), 10000);
|
|
||||||
return taskLink.isDisplayed();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
{
|
|
||||||
"compileOnSave": false,
|
|
||||||
"compilerOptions": {
|
|
||||||
"declaration": false,
|
|
||||||
"emitDecoratorMetadata": true,
|
|
||||||
"experimentalDecorators": true,
|
|
||||||
"module": "commonjs",
|
|
||||||
"moduleResolution": "node",
|
|
||||||
"outDir": "../dist/out-tsc-e2e",
|
|
||||||
"sourceMap": true,
|
|
||||||
"target": "es5",
|
|
||||||
"typeRoots": [
|
|
||||||
"../node_modules/@types"
|
|
||||||
],
|
|
||||||
"types": [
|
|
||||||
"jasmine", "node"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
// Karma configuration file, see link for more information
|
|
||||||
// https://karma-runner.github.io/0.13/config/configuration-file.html
|
|
||||||
|
|
||||||
module.exports = function (config) {
|
|
||||||
config.set({
|
|
||||||
basePath: '',
|
|
||||||
frameworks: ['jasmine', 'angular-cli'],
|
|
||||||
plugins: [
|
|
||||||
require('karma-jasmine'),
|
|
||||||
require('karma-chrome-launcher'),
|
|
||||||
require('karma-remap-istanbul'),
|
|
||||||
require('karma-spec-reporter'),
|
|
||||||
require('angular-cli/plugins/karma')
|
|
||||||
],
|
|
||||||
files: [
|
|
||||||
{ pattern: './src/test.ts', watched: false }
|
|
||||||
],
|
|
||||||
preprocessors: {
|
|
||||||
'./src/test.ts': ['angular-cli']
|
|
||||||
},
|
|
||||||
mime: {
|
|
||||||
'text/x-typescript': ['ts','tsx']
|
|
||||||
},
|
|
||||||
remapIstanbulReporter: {
|
|
||||||
reports: {
|
|
||||||
html: 'coverage',
|
|
||||||
lcovonly: './coverage/coverage.lcov'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
angularCli: {
|
|
||||||
config: './angular-cli.json',
|
|
||||||
environment: 'dev'
|
|
||||||
},
|
|
||||||
reporters: config.angularCli && config.angularCli.codeCoverage
|
|
||||||
? ['spec', 'karma-remap-istanbul']
|
|
||||||
: ['spec'],
|
|
||||||
port: 9876,
|
|
||||||
colors: true,
|
|
||||||
logLevel: config.LOG_INFO,
|
|
||||||
autoWatch: true,
|
|
||||||
browsers: ['Chrome'],
|
|
||||||
singleRun: false
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -44,16 +44,6 @@
|
||||||
"@types/node": "^6.0.42",
|
"@types/node": "^6.0.42",
|
||||||
"angular-cli": "1.0.0-beta.25.5",
|
"angular-cli": "1.0.0-beta.25.5",
|
||||||
"codelyzer": "~2.0.0-beta.1",
|
"codelyzer": "~2.0.0-beta.1",
|
||||||
"jasmine-core": "2.5.2",
|
|
||||||
"jasmine-spec-reporter": "2.5.0",
|
|
||||||
"karma-spec-reporter": "0.0.26",
|
|
||||||
"karma": "1.2.0",
|
|
||||||
"karma-chrome-launcher": "^2.0.0",
|
|
||||||
"karma-cli": "^1.0.1",
|
|
||||||
"karma-jasmine": "^1.0.2",
|
|
||||||
"karma-remap-istanbul": "^0.2.1",
|
|
||||||
"protractor": "~4.0.13",
|
|
||||||
"protractor-jasmine2-screenshot-reporter": "^0.3.2",
|
|
||||||
"ts-node": "1.2.1",
|
"ts-node": "1.2.1",
|
||||||
"tslint": "^4.3.0",
|
"tslint": "^4.3.0",
|
||||||
"typescript": "~2.0.3"
|
"typescript": "~2.0.3"
|
||||||
|
|
|
@ -1,32 +0,0 @@
|
||||||
// Protractor configuration file, see link for more information
|
|
||||||
// https://github.com/angular/protractor/blob/master/lib/config.ts
|
|
||||||
|
|
||||||
/*global jasmine */
|
|
||||||
var SpecReporter = require('jasmine-spec-reporter');
|
|
||||||
|
|
||||||
exports.config = {
|
|
||||||
allScriptsTimeout: 11000,
|
|
||||||
specs: [
|
|
||||||
'./e2e/**/*.e2e-spec.ts'
|
|
||||||
],
|
|
||||||
capabilities: {
|
|
||||||
'browserName': 'chrome'
|
|
||||||
},
|
|
||||||
directConnect: true,
|
|
||||||
baseUrl: 'http://localhost:4200/',
|
|
||||||
framework: 'jasmine',
|
|
||||||
jasmineNodeOpts: {
|
|
||||||
showColors: true,
|
|
||||||
defaultTimeoutInterval: 30000,
|
|
||||||
print: function() {}
|
|
||||||
},
|
|
||||||
useAllAngular2AppRoots: true,
|
|
||||||
beforeLaunch: function() {
|
|
||||||
require('ts-node').register({
|
|
||||||
project: 'e2e'
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onPrepare: function() {
|
|
||||||
jasmine.getEnv().addReporter(new SpecReporter());
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,25 +0,0 @@
|
||||||
import {EmailValidatorDirective} from "./app-validators";
|
|
||||||
|
|
||||||
|
|
||||||
describe('EMail-Validator', () => {
|
|
||||||
let validator = null;
|
|
||||||
beforeEach(() => {
|
|
||||||
validator = new EmailValidatorDirective();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should accept valid email addresses', () => {
|
|
||||||
const control = <any> {value: "foo@bar.com"};
|
|
||||||
const result = validator.validate(control);
|
|
||||||
expect(result).toBe(null);
|
|
||||||
});
|
|
||||||
it('should not accept invalid email addresses', () => {
|
|
||||||
const control = <any> {value: "foobar.com"};
|
|
||||||
const result = validator.validate(control);
|
|
||||||
expect(result['invalidEMail']).toBeTruthy();
|
|
||||||
});
|
|
||||||
it('should accept empty email addresses', () => {
|
|
||||||
const control = <any> {value: ""};
|
|
||||||
const result = validator.validate(control);
|
|
||||||
expect(result).toBeNull();
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,90 +0,0 @@
|
||||||
import {TestBed, inject, fakeAsync} from '@angular/core/testing';
|
|
||||||
import { BaseRequestOptions, Http, ConnectionBackend, Response, ResponseOptions, RequestMethod } from '@angular/http';
|
|
||||||
import {TaskService} from './task.service';
|
|
||||||
import {MockBackend} from '@angular/http/testing/mock_backend';
|
|
||||||
import {TaskStore} from '../stores/task.store';
|
|
||||||
import {SOCKET_IO} from '../../app.tokens';
|
|
||||||
import {mockIO} from '../../mocks/mock-socket';
|
|
||||||
|
|
||||||
describe('Task-Service', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
TestBed.configureTestingModule({
|
|
||||||
providers: [
|
|
||||||
TaskService,
|
|
||||||
TaskStore,
|
|
||||||
{provide: SOCKET_IO, useValue: mockIO},
|
|
||||||
BaseRequestOptions,
|
|
||||||
MockBackend,
|
|
||||||
{provide: Http, useFactory: (mockBackend: ConnectionBackend,
|
|
||||||
defaultOptions: BaseRequestOptions) => {
|
|
||||||
return new Http(mockBackend, defaultOptions);
|
|
||||||
}, deps: [MockBackend, BaseRequestOptions]},
|
|
||||||
]
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
let taskService: TaskService;
|
|
||||||
let taskStore: TaskStore;
|
|
||||||
let mockBackend: MockBackend;
|
|
||||||
|
|
||||||
beforeEach(inject([TaskService, TaskStore, MockBackend],
|
|
||||||
(_taskService, _taskStore, _mockBackend) => {
|
|
||||||
taskService = _taskService;
|
|
||||||
taskStore = _taskStore;
|
|
||||||
mockBackend = _mockBackend;
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
const saveTask = (task, expectedUrl = null, expectedMethod = null) => {
|
|
||||||
mockBackend.connections.subscribe(connection => {
|
|
||||||
if (expectedUrl) {
|
|
||||||
expect(connection.request.url).toBe(expectedUrl);
|
|
||||||
}
|
|
||||||
if (expectedMethod) {
|
|
||||||
expect(connection.request.method).toBe(expectedMethod);
|
|
||||||
}
|
|
||||||
const response = new ResponseOptions({body: JSON.stringify(task)});
|
|
||||||
connection.mockRespond(new Response(response));
|
|
||||||
});
|
|
||||||
taskService.saveTask(task).subscribe();
|
|
||||||
};
|
|
||||||
|
|
||||||
it('should trigger a HTTP-POST for new Tasks', (() => {
|
|
||||||
const task = {title: 'Task 1'};
|
|
||||||
mockBackend.connections.subscribe(connection => {
|
|
||||||
const expectedUrl = 'http://localhost:3000/api/tasks/';
|
|
||||||
expect(connection.request.url).toBe(expectedUrl);
|
|
||||||
expect(connection.request.method).toBe(RequestMethod.Post);
|
|
||||||
const response = new ResponseOptions({body: JSON.stringify(task)});
|
|
||||||
connection.mockRespond(new Response(response));
|
|
||||||
});
|
|
||||||
taskService.saveTask(task).subscribe();
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('should trigger a HTTP-POST for new Tasks', (() => {
|
|
||||||
const task = {title: 'Task 1'};
|
|
||||||
saveTask(task, 'http://localhost:3000/api/tasks/', RequestMethod.Post);
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('should do a HTTP-Put for existing Tasks', (() => {
|
|
||||||
const task = {id: 1, title: 'Existing Task'};
|
|
||||||
saveTask(task, 'http://localhost:3000/api/tasks/1', RequestMethod.Put);
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('should add the Task to the store', (() => {
|
|
||||||
const spy = spyOn(taskStore, 'dispatch').and.callThrough();
|
|
||||||
saveTask({title: 'Task 1'});
|
|
||||||
const dispatchedAction = spy.calls.mostRecent().args[0];
|
|
||||||
expect(dispatchedAction.type).toEqual('ADD');
|
|
||||||
expect(dispatchedAction.data.title).toEqual('Task 1');
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('should save the Task in store', (() => {
|
|
||||||
const spy = spyOn(taskStore, 'dispatch').and.callThrough();
|
|
||||||
saveTask({id: 1, title: 'Task 1'});
|
|
||||||
const dispatchedAction = spy.calls.mostRecent().args[0];
|
|
||||||
expect(dispatchedAction.type).toEqual('EDIT');
|
|
||||||
expect(dispatchedAction.data.title).toEqual('Task 1');
|
|
||||||
}));
|
|
||||||
|
|
||||||
});
|
|
|
@ -1,71 +0,0 @@
|
||||||
|
|
||||||
import {NgForm, FormsModule, ReactiveFormsModule} from '@angular/forms';
|
|
||||||
|
|
||||||
|
|
||||||
import {
|
|
||||||
ComponentFixture
|
|
||||||
} from '@angular/core/testing'
|
|
||||||
|
|
||||||
import {By} from '@angular/platform-browser';
|
|
||||||
import {ShowErrorComponent} from './show-error.component';
|
|
||||||
import {TestBed} from '@angular/core/testing';
|
|
||||||
|
|
||||||
export class FakeForm {
|
|
||||||
constructor(private control: any) {
|
|
||||||
}
|
|
||||||
|
|
||||||
get(str: string) {
|
|
||||||
return this.control;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
describe('ShowError Component', () => {
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
TestBed.configureTestingModule({
|
|
||||||
imports: [FormsModule, ReactiveFormsModule],
|
|
||||||
declarations: [ShowErrorComponent],
|
|
||||||
providers: [NgForm]
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
let fixture: ComponentFixture<ShowErrorComponent>;
|
|
||||||
|
|
||||||
it('should display "required" error for touched controls', (done) => {
|
|
||||||
fixture = TestBed.createComponent(ShowErrorComponent);
|
|
||||||
fixture.whenStable().then(() => {
|
|
||||||
const showErrorCmp: ShowErrorComponent = fixture.componentInstance;
|
|
||||||
const element = fixture.nativeElement;
|
|
||||||
(<any>showErrorCmp).form = new FakeForm({
|
|
||||||
touched: true,
|
|
||||||
errors: {
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
(<any>showErrorCmp).displayName = 'Vorname';
|
|
||||||
fixture.detectChanges(); //Change-Detection auslösen
|
|
||||||
expect(element.querySelector('.alert-danger').textContent)
|
|
||||||
.toContain('Vorname ist ein Pflichtfeld');
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should display no errors for untouched controls', () => {
|
|
||||||
fixture = TestBed.createComponent(ShowErrorComponent);
|
|
||||||
|
|
||||||
const showErrorCmp: ShowErrorComponent = fixture.componentInstance;
|
|
||||||
const fakeControl: any = {touched: false, errors: {required: true}};
|
|
||||||
(<any>showErrorCmp).form = new FakeForm(fakeControl);
|
|
||||||
fixture.detectChanges();
|
|
||||||
expect(fixture.nativeElement.querySelector('.alert-danger')).toBeNull();
|
|
||||||
expect(fixture.debugElement.query(By.css('.alert-danger'))).toBeNull();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,100 +0,0 @@
|
||||||
import {TaskService} from '../../services/task-service/task.service';
|
|
||||||
|
|
||||||
import {RouterTestingModule} from '@angular/router/testing';
|
|
||||||
|
|
||||||
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
|
|
||||||
|
|
||||||
import {TestBed, inject} from '@angular/core/testing';
|
|
||||||
import {EditTaskComponent} from './edit-task.component';
|
|
||||||
import {ShowErrorComponent} from '../../show-error/show-error.component';
|
|
||||||
import {APPLICATION_VALIDATORS} from '../../models/app-validators';
|
|
||||||
import {ActivatedRoute, Router} from '@angular/router';
|
|
||||||
import {fakeAsync, tick} from '@angular/core/testing/fake_async';
|
|
||||||
import {Title} from '@angular/platform-browser';
|
|
||||||
import {Component} from '@angular/core';
|
|
||||||
import {ReactiveFormsModule, FormsModule} from '@angular/forms';
|
|
||||||
import {MockTaskService} from '../../mocks/mock-task-service';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
template: '<router-outlet></router-outlet>'
|
|
||||||
})
|
|
||||||
class TestComponent {
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('EditTask Component', () => {
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
TestBed.configureTestingModule({
|
|
||||||
imports: [FormsModule, RouterTestingModule.withRoutes([
|
|
||||||
{path: 'new', component: EditTaskComponent},
|
|
||||||
{path: 'edit/:id', component: EditTaskComponent}
|
|
||||||
],
|
|
||||||
)],
|
|
||||||
declarations: [EditTaskComponent, ShowErrorComponent, APPLICATION_VALIDATORS, TestComponent],
|
|
||||||
providers: [
|
|
||||||
Title,
|
|
||||||
{provide: TaskService, useClass: MockTaskService},
|
|
||||||
]
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
let taskService: TaskService;
|
|
||||||
beforeEach(inject([TaskService], (_taskService) => {
|
|
||||||
taskService = _taskService;
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('should load the correct task in Edit-Mode', fakeAsync(() => {
|
|
||||||
const fixture = TestBed.createComponent(EditTaskComponent);
|
|
||||||
const route = TestBed.get(ActivatedRoute);
|
|
||||||
(<any>route.params).next({id: '42'});
|
|
||||||
|
|
||||||
const element = fixture.nativeElement;
|
|
||||||
|
|
||||||
const spy = spyOn(taskService, 'getTask');
|
|
||||||
const fakeTask = {title: 'Task1', assignee: {name: 'John'}};
|
|
||||||
spy.and.returnValue(new BehaviorSubject(fakeTask));
|
|
||||||
|
|
||||||
fixture.autoDetectChanges(true);
|
|
||||||
fixture.whenStable().then(() => {
|
|
||||||
tick();
|
|
||||||
expect(spy).toHaveBeenCalledWith('42');
|
|
||||||
const titleInput = element.querySelector('#title');
|
|
||||||
expect(titleInput.value).toBe(fakeTask.title);
|
|
||||||
|
|
||||||
const assigneeInput = element.querySelector('#assignee_name');
|
|
||||||
expect(assigneeInput.value).toBe(fakeTask.assignee.name);
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
|
|
||||||
|
|
||||||
it('should load the correct task (with router)', fakeAsync(() => {
|
|
||||||
const fixture = TestBed.createComponent(TestComponent);
|
|
||||||
const router = TestBed.get(Router);
|
|
||||||
router.navigateByUrl('edit/42');
|
|
||||||
|
|
||||||
const spy = spyOn(taskService, 'getTask');
|
|
||||||
const fakeTask = {title: 'Task1', assignee: {name: 'John'}};
|
|
||||||
spy.and.returnValue(new BehaviorSubject(fakeTask));
|
|
||||||
fixture.whenStable().then(() => {
|
|
||||||
tick();
|
|
||||||
expect(spy).toHaveBeenCalledWith('42');
|
|
||||||
const titleInput = fixture.nativeElement.querySelector('#title');
|
|
||||||
expect(titleInput.value).toBe(fakeTask.title);
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('should work without passing URL-Parameter', fakeAsync(() => {
|
|
||||||
const fixture = TestBed.createComponent(TestComponent);
|
|
||||||
const router = TestBed.get(Router);
|
|
||||||
router.navigateByUrl('new');
|
|
||||||
const spy = spyOn(taskService, 'getTask');
|
|
||||||
fixture.whenStable().then(() => {
|
|
||||||
tick();
|
|
||||||
expect(spy).not.toHaveBeenCalled();
|
|
||||||
const titleInput = fixture.nativeElement.querySelector('#title');
|
|
||||||
expect(titleInput.value).toBe('');
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
|
@ -1,88 +0,0 @@
|
||||||
import {TaskService} from '../../services/task-service/task.service';
|
|
||||||
|
|
||||||
import {RouterTestingModule} from '@angular/router/testing';
|
|
||||||
|
|
||||||
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
|
|
||||||
|
|
||||||
import {TestBed, inject, fakeAsync, tick} from '@angular/core/testing';
|
|
||||||
import {TaskItemComponent} from './task-item.component';
|
|
||||||
import {TaskListComponent} from './task-list.component';
|
|
||||||
import {ReactiveFormsModule} from '@angular/forms';
|
|
||||||
import {MockTaskService} from '../../mocks/mock-task-service';
|
|
||||||
import {setInputValue} from '../../testing/test-helper';
|
|
||||||
|
|
||||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 4000;
|
|
||||||
|
|
||||||
describe('TaskList Component', () => {
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
TestBed.configureTestingModule({
|
|
||||||
imports: [ReactiveFormsModule, RouterTestingModule.withRoutes([])],
|
|
||||||
declarations: [TaskListComponent, TaskItemComponent],
|
|
||||||
providers: [
|
|
||||||
{provide: TaskService, useClass: MockTaskService},
|
|
||||||
]
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
let taskService: TaskService;
|
|
||||||
beforeEach(inject([TaskService], (_taskService: TaskService) => {
|
|
||||||
taskService = _taskService;
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('should display TaskItems in the List', () => {
|
|
||||||
const fixture = TestBed.createComponent(TaskListComponent);
|
|
||||||
const element = fixture.nativeElement;
|
|
||||||
|
|
||||||
(<BehaviorSubject<any>>taskService.tasks$).next([
|
|
||||||
{id: 1, title: 'Task1', description: 'Hello Karma'},
|
|
||||||
{id: 2, title: 'Task2', description: 'Hello Jasmine'}
|
|
||||||
]);
|
|
||||||
|
|
||||||
fixture.detectChanges(); //trigger change detection
|
|
||||||
|
|
||||||
expect(element.querySelectorAll('.task-list-entry').length).toBe(2);
|
|
||||||
expect(element.querySelector('.task-list-entry').textContent)
|
|
||||||
.toContain('Hello Karma');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should display TaskItems in the List (with TestBed.get)', () => {
|
|
||||||
const fixture = TestBed.createComponent(TaskListComponent);
|
|
||||||
const taskService = TestBed.get(TaskService);
|
|
||||||
const element = fixture.nativeElement;
|
|
||||||
|
|
||||||
(<BehaviorSubject<any>>taskService.tasks$).next([
|
|
||||||
{id: 1, title: 'Task1', description: 'Hello Karma'},
|
|
||||||
{id: 2, title: 'Task2', description: 'Hello Jasmine'}
|
|
||||||
]);
|
|
||||||
|
|
||||||
fixture.detectChanges(); //trigger change detection
|
|
||||||
|
|
||||||
expect(element.querySelectorAll('.task-list-entry').length).toBe(2);
|
|
||||||
expect(element.querySelector('.task-list-entry').textContent)
|
|
||||||
.toContain('Hello Karma');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should call deleteTask when clicking the trash-bin', fakeAsync(() => {
|
|
||||||
const fixture = TestBed.createComponent(TaskListComponent);
|
|
||||||
|
|
||||||
// Task-Liste füllen
|
|
||||||
const task = {id: 42, title: 'Task 1'};
|
|
||||||
(<BehaviorSubject<any>>taskService.tasks$).next([task]);
|
|
||||||
fixture.detectChanges(); //trigger change detection
|
|
||||||
|
|
||||||
// Spy programmieren
|
|
||||||
const spy = spyOn(taskService, 'deleteTask');
|
|
||||||
spy.and.returnValue(new BehaviorSubject<any>({}));
|
|
||||||
|
|
||||||
// Task löschen
|
|
||||||
const trash = fixture.nativeElement.querySelector('.glyphicon-trash');
|
|
||||||
trash.click();
|
|
||||||
|
|
||||||
// Spy auswerten
|
|
||||||
const deleteArguments = spy.calls.mostRecent().args;
|
|
||||||
expect(deleteArguments[0]).toBe(task);
|
|
||||||
expect(taskService.deleteTask).toHaveBeenCalledWith(task);
|
|
||||||
}));
|
|
||||||
|
|
||||||
});
|
|
|
@ -1,11 +0,0 @@
|
||||||
import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter';
|
|
||||||
|
|
||||||
export function dispatchEvent(element: any, eventType: any) {
|
|
||||||
getDOM().dispatchEvent(element, getDOM().createEvent(eventType));
|
|
||||||
}
|
|
||||||
|
|
||||||
export function setInputValue(input: any, value: any) {
|
|
||||||
input.value = value;
|
|
||||||
dispatchEvent(input, 'input');
|
|
||||||
dispatchEvent(input, 'blur');
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
import './polyfills.ts';
|
|
||||||
|
|
||||||
import 'zone.js/dist/long-stack-trace-zone';
|
|
||||||
import 'zone.js/dist/proxy.js';
|
|
||||||
import 'zone.js/dist/sync-test';
|
|
||||||
import 'zone.js/dist/jasmine-patch';
|
|
||||||
import 'zone.js/dist/async-test';
|
|
||||||
import 'zone.js/dist/fake-async-test';
|
|
||||||
import { getTestBed } from '@angular/core/testing';
|
|
||||||
import {
|
|
||||||
BrowserDynamicTestingModule,
|
|
||||||
platformBrowserDynamicTesting
|
|
||||||
} from '@angular/platform-browser-dynamic/testing';
|
|
||||||
import 'rxjs/Rx';
|
|
||||||
|
|
||||||
|
|
||||||
// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
|
|
||||||
declare var __karma__: any;
|
|
||||||
declare var require: any;
|
|
||||||
|
|
||||||
// Prevent Karma from running prematurely.
|
|
||||||
__karma__.loaded = function () {};
|
|
||||||
|
|
||||||
// First, initialize the Angular testing environment.
|
|
||||||
getTestBed().initTestEnvironment(
|
|
||||||
BrowserDynamicTestingModule,
|
|
||||||
platformBrowserDynamicTesting()
|
|
||||||
);
|
|
||||||
// Then we find all the tests.
|
|
||||||
const context = require.context('./', true, /\.spec\.ts$/);
|
|
||||||
// And load the modules.
|
|
||||||
context.keys().map(context);
|
|
||||||
// Finally, start Karma to run the tests.
|
|
||||||
__karma__.start();
|
|
Loading…
Reference in New Issue