diff --git a/karma.conf.js b/karma.conf.js index 9f54a8f..435fa8f 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,32 +1,36 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: "", - frameworks: ["jasmine", "@angular-devkit/build-angular"], - plugins: [ - require("karma-jasmine"), - require("karma-chrome-launcher"), - require("karma-jasmine-html-reporter"), - require("karma-coverage-istanbul-reporter"), - require("@angular-devkit/build-angular/plugins/karma"), - ], - client: { - clearContext: false, // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - dir: require("path").join(__dirname, "./coverage/frontend"), - reports: ["html", "lcovonly", "text-summary"], - fixWebpackSourcePaths: true, - }, - reporters: ["progress", "kjhtml"], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ["Chrome"], - singleRun: false, - restartOnFileChange: true, - }); -}; +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +const process = require('process'); +process.env.CHROME_BIN = require('puppeteer').executablePath(); + +module.exports = function (config) { + config.set({ + basePath: '', + files: ['src/assets/env.js'], + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('karma-spec-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false, // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require("path").join(__dirname, "./coverage/frontend"), + reports: ["html", "lcovonly", "text-summary"], + fixWebpackSourcePaths: true, + }, + reporters: ['progress', 'kjhtml', 'spec'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['ChromeHeadless'], + singleRun: true + }); +}; diff --git a/package.json b/package.json index 4c44fbb..37c9287 100644 --- a/package.json +++ b/package.json @@ -1,60 +1,62 @@ -{ - "name": "frontend", - "version": "0.0.0", - "scripts": { - "ng": "ng", - "start": "ng serve", - "build": "ng build", - "test": "ng test", - "lint": "ng lint", - "e2e": "ng e2e" - }, - "private": true, - "dependencies": { - "@angular/animations": "~9.1.9", - "@angular/common": "~9.1.9", - "@angular/compiler": "~9.1.9", - "@angular/core": "~9.1.9", - "@angular/forms": "~9.1.9", - "@angular/localize": "~9.1.9", - "@angular/platform-browser": "~9.1.9", - "@angular/platform-browser-dynamic": "~9.1.9", - "@angular/router": "~9.1.9", - "@ng-bootstrap/ng-bootstrap": "^6.0.0", - "bootstrap": "^4.4.0", - "chart.js": "^2.9.3", - "component": "^1.1.0", - "rxjs": "~6.5.4", - "tslib": "^1.10.0", - "zone.js": "~0.10.2" - }, - "devDependencies": { - "@angular-devkit/build-angular": "~0.901.7", - "@angular/cli": "~9.1.7", - "@angular/compiler-cli": "~9.1.9", - "@types/jasmine": "~3.5.0", - "@types/jasminewd2": "~2.0.3", - "@types/node": "^12.11.1", - "codelyzer": "^5.1.2", - "jasmine-core": "~3.5.0", - "jasmine-spec-reporter": "~4.2.1", - "karma": "~5.0.0", - "karma-chrome-launcher": "~3.1.0", - "karma-coverage-istanbul-reporter": "~2.1.0", - "karma-jasmine": "~3.0.1", - "karma-jasmine-html-reporter": "^1.4.2", - "prettier": "2.0.5", - "protractor": "~7.0.0", - "ts-node": "~8.3.0", - "tslint": "~6.1.0", - "typescript": "~3.8.3" - }, - "description": "This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.7.", - "main": "karma.conf.js", - "repository": { - "type": "git", - "url": "https://git.informatik.fh-nuernberg.de/scrum-taskboard/frontend.git" - }, - "author": "", - "license": "ISC" -} +{ + "name": "frontend", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "~9.1.9", + "@angular/common": "~9.1.9", + "@angular/compiler": "~9.1.9", + "@angular/core": "~9.1.9", + "@angular/forms": "~9.1.9", + "@angular/localize": "~9.1.9", + "@angular/platform-browser": "~9.1.9", + "@angular/platform-browser-dynamic": "~9.1.9", + "@angular/router": "~9.1.9", + "@ng-bootstrap/ng-bootstrap": "^6.0.0", + "bootstrap": "^4.4.0", + "chart.js": "^2.9.3", + "component": "^1.1.0", + "rxjs": "~6.5.4", + "tslib": "^1.10.0", + "zone.js": "~0.10.2" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.901.7", + "@angular/cli": "~9.1.7", + "@angular/compiler-cli": "~9.1.9", + "@types/jasmine": "~3.5.0", + "@types/jasminewd2": "~2.0.3", + "@types/node": "^12.11.1", + "codelyzer": "^5.1.2", + "jasmine-core": "~3.5.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~5.0.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage-istanbul-reporter": "~2.1.0", + "karma-jasmine": "~3.0.1", + "karma-jasmine-html-reporter": "^1.4.2", + "prettier": "2.0.5", + "karma-spec-reporter": "0.0.32", + "protractor": "~7.0.0", + "puppeteer": "^5.1.0", + "ts-node": "~8.3.0", + "tslint": "~6.1.0", + "typescript": "~3.8.3" + }, + "description": "This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.7.", + "main": "karma.conf.js", + "repository": { + "type": "git", + "url": "https://git.informatik.fh-nuernberg.de/scrum-taskboard/frontend.git" + }, + "author": "", + "license": "ISC" +} diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index c1b0427..ba5f532 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,33 +1,29 @@ -import { TestBed, async } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { AppComponent } from './app.component'; - -describe('AppComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [RouterTestingModule], - declarations: [AppComponent], - }).compileComponents(); - })); - - it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.debugElement.componentInstance; - expect(app).toBeTruthy(); - }); - - it(`should have as title 'frontend'`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.debugElement.componentInstance; - expect(app.title).toEqual('frontend'); - }); - - it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.debugElement.nativeElement; - expect(compiled.querySelector('.content span').textContent).toContain( - 'frontend app is running!' - ); - }); -}); +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + ], + declarations: [ + AppComponent, + ], + }).compileComponents(); + })); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); + + it('should render router-outlet', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('router-outlet').textContent).toBeDefined(); + }); +}); diff --git a/src/app/components/backlog/backlog.component.spec.ts b/src/app/components/backlog/backlog.component.spec.ts new file mode 100644 index 0000000..dbc8eed --- /dev/null +++ b/src/app/components/backlog/backlog.component.spec.ts @@ -0,0 +1,28 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { BacklogComponent } from './backlog.component'; +import { BackendService } from '../../services/backend.service'; +import { HttpClientModule } from '@angular/common/http'; + +describe('BacklogComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + HttpClientModule, + ], + declarations: [ + BacklogComponent, + ], + providers: [ + BackendService, + ] + }).compileComponents(); + })); + + it('should create the component', () => { + const fixture = TestBed.createComponent(BacklogComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); +}); diff --git a/src/app/components/dashboard/dashboard.component.spec.ts b/src/app/components/dashboard/dashboard.component.spec.ts new file mode 100644 index 0000000..2d39e56 --- /dev/null +++ b/src/app/components/dashboard/dashboard.component.spec.ts @@ -0,0 +1,35 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { BackendService } from '../../services/backend.service'; +import { HttpClientModule } from '@angular/common/http'; +import { DashboardComponent } from './dashboard.component'; + +describe('DashboardComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + HttpClientModule, + ], + declarations: [ + DashboardComponent, + ], + providers: [ + BackendService, + ] + }).compileComponents(); + })); + + it('should create the component', () => { + const fixture = TestBed.createComponent(DashboardComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); + + it('should parse dates correctly', () => { + const fixture = TestBed.createComponent(DashboardComponent); + const app = fixture.componentInstance; + expect(app.toDateString('2020-07-01T14:30:20')).toEqual('1.7.2020'); + expect(app.toDateString('2020-11-23T07:30:20')).toEqual('23.11.2020'); + }); +}); diff --git a/src/app/components/sprint-form/sprint-form.component.spec.ts b/src/app/components/sprint-form/sprint-form.component.spec.ts new file mode 100644 index 0000000..fef25ea --- /dev/null +++ b/src/app/components/sprint-form/sprint-form.component.spec.ts @@ -0,0 +1,36 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HttpClientModule } from '@angular/common/http'; +import { BackendService } from '../../services/backend.service'; +import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { SprintFormComponent } from './sprint-form.component'; + +describe('SprintFormComponent', () => { + let component: SprintFormComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + HttpClientModule, + NgbModule, + ], + declarations: [ SprintFormComponent ], + providers: [ + BackendService, + NgbActiveModal, + ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SprintFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create the component', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/sprint-table/sprint-table.component.spec.ts b/src/app/components/sprint-table/sprint-table.component.spec.ts new file mode 100644 index 0000000..3776c34 --- /dev/null +++ b/src/app/components/sprint-table/sprint-table.component.spec.ts @@ -0,0 +1,28 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { BackendService } from '../../services/backend.service'; +import { HttpClientModule } from '@angular/common/http'; +import { SprintTableComponent } from './sprint-table.component'; + +describe('SprintTableComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + HttpClientModule, + ], + declarations: [ + SprintTableComponent, + ], + providers: [ + BackendService, + ] + }).compileComponents(); + })); + + it('should create the component', () => { + const fixture = TestBed.createComponent(SprintTableComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); +}); diff --git a/src/app/components/tabels/task/task-table.component.spec.ts b/src/app/components/tabels/task/task-table.component.spec.ts new file mode 100644 index 0000000..9aef0b6 --- /dev/null +++ b/src/app/components/tabels/task/task-table.component.spec.ts @@ -0,0 +1,28 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { BackendService } from '../../services/backend.service'; +import { HttpClientModule } from '@angular/common/http'; +import { TaskTableComponent } from './task-table.component'; + +describe('TaskTableComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + HttpClientModule, + ], + declarations: [ + TaskTableComponent, + ], + providers: [ + BackendService, + ] + }).compileComponents(); + })); + + it('should create the component', () => { + const fixture = TestBed.createComponent(TaskTableComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); +}); diff --git a/src/app/components/tabels/userstory/userstory-table.component.spec.ts b/src/app/components/tabels/userstory/userstory-table.component.spec.ts new file mode 100644 index 0000000..9b306a5 --- /dev/null +++ b/src/app/components/tabels/userstory/userstory-table.component.spec.ts @@ -0,0 +1,28 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { BackendService } from '../../../services/backend.service'; +import { HttpClientModule } from '@angular/common/http'; +import { UserstoryTableComponent } from './userstory-table.component'; + +describe('UserstoryTableComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + HttpClientModule, + ], + declarations: [ + UserstoryTableComponent, + ], + providers: [ + BackendService, + ] + }).compileComponents(); + })); + + it('should create the component', () => { + const fixture = TestBed.createComponent(UserstoryTableComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); +}); diff --git a/src/app/components/task-form/task-form.component.spec.ts b/src/app/components/task-form/task-form.component.spec.ts index 6f3b6c1..22c7432 100644 --- a/src/app/components/task-form/task-form.component.spec.ts +++ b/src/app/components/task-form/task-form.component.spec.ts @@ -1,24 +1,36 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { TaskFormComponent } from './task-form.component'; - -describe('TaskFormComponent', () => { - let component: TaskFormComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [TaskFormComponent], - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(TaskFormComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TaskFormComponent } from './task-form.component'; +import { HttpClientModule } from '@angular/common/http'; +import { BackendService } from '../../services/backend.service'; +import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap'; + +describe('TaskFormComponent', () => { + let component: TaskFormComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + HttpClientModule, + NgbModule, + ], + declarations: [TaskFormComponent], + providers: [ + BackendService, + NgbActiveModal, + ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TaskFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create the component', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/userstory-form/userstory-form.component.spec.ts b/src/app/components/userstory-form/userstory-form.component.spec.ts new file mode 100644 index 0000000..cf68016 --- /dev/null +++ b/src/app/components/userstory-form/userstory-form.component.spec.ts @@ -0,0 +1,36 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HttpClientModule } from '@angular/common/http'; +import { BackendService } from '../../services/backend.service'; +import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { UserstoryFormComponent } from './userstory-form.component'; + +describe('UserstoryFormComponent', () => { + let component: UserstoryFormComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + HttpClientModule, + NgbModule, + ], + declarations: [ UserstoryFormComponent ], + providers: [ + BackendService, + NgbActiveModal, + ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserstoryFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create the component', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/userstory-inner-table/userstory-inner-table.component.spec.ts b/src/app/components/userstory-inner-table/userstory-inner-table.component.spec.ts new file mode 100644 index 0000000..66d55db --- /dev/null +++ b/src/app/components/userstory-inner-table/userstory-inner-table.component.spec.ts @@ -0,0 +1,28 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { BackendService } from '../../services/backend.service'; +import { HttpClientModule } from '@angular/common/http'; +import { UserstoryInnerTableComponent } from './userstory-inner-table.component'; + +describe('UserstoryInnerTableComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + HttpClientModule, + ], + declarations: [ + UserstoryInnerTableComponent, + ], + providers: [ + BackendService, + ] + }).compileComponents(); + })); + + it('should create the component', () => { + const fixture = TestBed.createComponent(UserstoryInnerTableComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); +}); diff --git a/src/app/services/sorting.service.spec.ts b/src/app/services/sorting.service.spec.ts new file mode 100644 index 0000000..f1b9fda --- /dev/null +++ b/src/app/services/sorting.service.spec.ts @@ -0,0 +1,39 @@ +import { sortByDateAscending, sortByNumberAscending, sortByStringAscending } from './sorting.service'; + +describe('SortingService', () => { + + it('should sort correctly by number', () => { + const items = [7, 3, 2, 6, 4, 8, 0]; + sortByNumberAscending(items, x => x); + expect(items).toEqual([0, 2, 3, 4, 6, 7, 8]); + }); + + it('should sort strings by length correctly', () => { + const items = ['aaaaa', 'a', 'aaa']; + sortByNumberAscending(items, x => x.length); + expect(items).toEqual(['a', 'aaa', 'aaaaa']); + }); + + it('should sort strings alphanumerically', () => { + const items = ['biz', 'bar', 'foo']; + sortByStringAscending(items, x => x); + expect(items).toEqual(['bar', 'biz', 'foo']); + }); + + it('should sort dates correctly', () => { + const items = [ + new Date(2020, 2, 10, 13, 30), + new Date(2020, 2, 10, 12, 30), + new Date(2019, 4, 4), + new Date(2020, 2, 11, 13, 30), + ]; + sortByDateAscending(items, x => x); + expect(items).toEqual([ + new Date(2019, 4, 4), + new Date(2020, 2, 10, 12, 30), + new Date(2020, 2, 10, 13, 30), + new Date(2020, 2, 11, 13, 30), + ]); + }); + +}); diff --git a/src/app/services/sorting.service.ts b/src/app/services/sorting.service.ts index 4231c91..7907ad9 100644 --- a/src/app/services/sorting.service.ts +++ b/src/app/services/sorting.service.ts @@ -1,24 +1,24 @@ -import { Priority } from './backend.service'; - -export function sortByNumberAscending(items: T[], key: (T) => number) { - return items.sort((a, b) => key(a) - key(b)); -} - -export function sortByStringAscending(items: T[], key: (T) => string) { - return items.sort((a, b) => key(a).localeCompare(key(b))); -} - -export function sortByDateAscending(items: T[], key: (T) => Date) { - return items.sort((a, b) => key(b) - key(a)); -} - -export function getNumberForPriority(priority: Priority): number { - switch (priority) { - case Priority.High: - return 2; - case Priority.Medium: - return 1; - case Priority.Low: - return 0; - } -} +import { Priority } from './backend.service'; + +export function sortByNumberAscending(items: T[], key: (T) => number) { + return items.sort((a, b) => key(a) - key(b)); +} + +export function sortByStringAscending(items: T[], key: (T) => string) { + return items.sort((a, b) => key(a).localeCompare(key(b))); +} + +export function sortByDateAscending(items: T[], key: (T) => Date) { + return items.sort((a, b) => (key(a) as any) - (key(b) as any)); +} + +export function getNumberForPriority(priority: Priority): number { + switch (priority) { + case Priority.High: + return 2; + case Priority.Medium: + return 1; + case Priority.Low: + return 0; + } +}