From 561dadd2c5b1478286d4034f66ed0d82909f5e00 Mon Sep 17 00:00:00 2001 From: Jakob Fahr Date: Tue, 14 Jul 2020 11:00:33 +0200 Subject: [PATCH 1/2] Add some unittests. npm i && ng test to run --- karma.conf.js | 12 ++++-- package.json | 4 +- src/app/app.component.spec.ts | 14 ++----- .../backlog/backlog.component.spec.ts | 28 +++++++++++++ .../dashboard/dashboard.component.spec.ts | 35 +++++++++++++++++ .../sprint-form/sprint-form.component.spec.ts | 36 +++++++++++++++++ .../sprint-table.component.spec.ts | 28 +++++++++++++ .../task-form/task-form.component.spec.ts | 17 ++++++-- .../task-table/task-table.component.spec.ts | 28 +++++++++++++ .../userstory-form.component.spec.ts | 36 +++++++++++++++++ .../userstory-inner-table.component.spec.ts | 28 +++++++++++++ .../userstory-table.component.spec.ts | 28 +++++++++++++ src/app/services/sorting.service.spec.ts | 39 +++++++++++++++++++ 13 files changed, 315 insertions(+), 18 deletions(-) create mode 100644 src/app/components/backlog/backlog.component.spec.ts create mode 100644 src/app/components/dashboard/dashboard.component.spec.ts create mode 100644 src/app/components/sprint-form/sprint-form.component.spec.ts create mode 100644 src/app/components/sprint-table/sprint-table.component.spec.ts create mode 100644 src/app/components/task-table/task-table.component.spec.ts create mode 100644 src/app/components/userstory-form/userstory-form.component.spec.ts create mode 100644 src/app/components/userstory-inner-table/userstory-inner-table.component.spec.ts create mode 100644 src/app/components/userstory-table/userstory-table.component.spec.ts create mode 100644 src/app/services/sorting.service.spec.ts diff --git a/karma.conf.js b/karma.conf.js index d26663c..241866a 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,15 +1,20 @@ // 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: { @@ -20,13 +25,12 @@ module.exports = function (config) { reports: ['html', 'lcovonly', 'text-summary'], fixWebpackSourcePaths: true }, - reporters: ['progress', 'kjhtml'], + reporters: ['progress', 'kjhtml', 'spec'], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true + browsers: ['ChromeHeadless'], + singleRun: true }); }; diff --git a/package.json b/package.json index c10a72f..42d3873 100644 --- a/package.json +++ b/package.json @@ -32,9 +32,9 @@ "@angular-devkit/build-angular": "~0.901.7", "@angular/cli": "~9.1.7", "@angular/compiler-cli": "~9.1.9", - "@types/node": "^12.11.1", "@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", @@ -43,7 +43,9 @@ "karma-coverage-istanbul-reporter": "~2.1.0", "karma-jasmine": "~3.0.1", "karma-jasmine-html-reporter": "^1.4.2", + "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" diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 340d7f2..08748c4 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -6,10 +6,10 @@ describe('AppComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ - RouterTestingModule + RouterTestingModule, ], declarations: [ - AppComponent + AppComponent, ], }).compileComponents(); })); @@ -20,16 +20,10 @@ describe('AppComponent', () => { 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', () => { + it('should render router-outlet', () => { const fixture = TestBed.createComponent(AppComponent); fixture.detectChanges(); const compiled = fixture.debugElement.nativeElement; - expect(compiled.querySelector('.content span').textContent).toContain('frontend app is running!'); + 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/task-form/task-form.component.spec.ts b/src/app/components/task-form/task-form.component.spec.ts index 1a3a1d0..61cb2ef 100644 --- a/src/app/components/task-form/task-form.component.spec.ts +++ b/src/app/components/task-form/task-form.component.spec.ts @@ -1,6 +1,9 @@ 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; @@ -8,9 +11,17 @@ describe('TaskFormComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ TaskFormComponent ] + imports: [ + HttpClientModule, + NgbModule, + ], + declarations: [TaskFormComponent], + providers: [ + BackendService, + NgbActiveModal, + ] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -19,7 +30,7 @@ describe('TaskFormComponent', () => { fixture.detectChanges(); }); - it('should create', () => { + it('should create the component', () => { expect(component).toBeTruthy(); }); }); diff --git a/src/app/components/task-table/task-table.component.spec.ts b/src/app/components/task-table/task-table.component.spec.ts new file mode 100644 index 0000000..f8f7757 --- /dev/null +++ b/src/app/components/task-table/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/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/components/userstory-table/userstory-table.component.spec.ts b/src/app/components/userstory-table/userstory-table.component.spec.ts new file mode 100644 index 0000000..ec37668 --- /dev/null +++ b/src/app/components/userstory-table/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/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), + ]); + }); + +}); From ce02728399f64a16b2ee672b44fe0eda750a3ff8 Mon Sep 17 00:00:00 2001 From: Jakob Fahr Date: Tue, 14 Jul 2020 11:01:50 +0200 Subject: [PATCH 2/2] Fix date sorting --- src/app/services/sorting.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/services/sorting.service.ts b/src/app/services/sorting.service.ts index 59b90e6..06a9125 100644 --- a/src/app/services/sorting.service.ts +++ b/src/app/services/sorting.service.ts @@ -9,7 +9,7 @@ export function sortByStringAscending(items: T[], key: (T) => string) { } export function sortByDateAscending(items: T[], key: (T) => Date) { - return items.sort((a, b) => key(b) - key(a)); + return items.sort((a, b) => (key(a) as any) - (key(b) as any)); } export function getNumberForPriority(priority: Priority): number {