Skip to content

Commit db3917d

Browse files
committed
Angular Testing Course
1 parent ffd1342 commit db3917d

27 files changed

+192
-44
lines changed

src/app/app-routing.module.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { NgModule } from '@angular/core';
22
import { Routes, RouterModule } from '@angular/router';
3-
import {HomeComponent} from "./home/home.component";
3+
import {HomeComponent} from "./courses/home/home.component";
44
import {AboutComponent} from "./about/about.component";
5-
import {CourseComponent} from "./course/course.component";
6-
import {CourseResolver} from "./services/course.resolver";
5+
import {CourseComponent} from "./courses/course/course.component";
6+
import {CourseResolver} from "./courses/services/course.resolver";
77

88
const routes: Routes = [
99
{

src/app/app.module.ts

+11-35
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import {MatMenuModule} from '@angular/material/menu';
88
import {MatButtonModule} from '@angular/material/button'
99
import {MatIconModule} from '@angular/material/icon';
1010
import {MatCardModule} from '@angular/material/card';
11-
import { HomeComponent } from './home/home.component';
11+
import { HomeComponent } from './courses/home/home.component';
1212
import { AboutComponent } from './about/about.component';
1313
import {MatTabsModule} from '@angular/material/tabs';
14-
import { CoursesCardListComponent } from './courses-card-list/courses-card-list.component';
15-
import {CourseComponent} from "./course/course.component";
14+
import { CoursesCardListComponent } from './courses/courses-card-list/courses-card-list.component';
15+
import {CourseComponent} from "./courses/course/course.component";
1616
import {
1717
MatDatepickerModule,
1818
MatDialogModule,
@@ -21,52 +21,28 @@ import {
2121
MatTableModule,
2222
MatToolbarModule
2323
} from "@angular/material";
24-
import {CoursesService} from "./services/courses.service";
24+
import {CoursesService} from "./courses/services/courses.service";
2525
import {HttpClientModule} from "@angular/common/http";
26-
import {CourseResolver} from "./services/course.resolver";
27-
import { CourseDialogComponent } from './course-dialog/course-dialog.component';
26+
import {CourseResolver} from "./courses/services/course.resolver";
27+
import { CourseDialogComponent } from './courses/course-dialog/course-dialog.component';
2828
import {ReactiveFormsModule} from "@angular/forms";
2929
import {MatMomentDateModule} from "@angular/material-moment-adapter";
30+
import {CoursesModule} from './courses/courses.module';
3031

3132
@NgModule({
3233
declarations: [
33-
AppComponent,
34-
HomeComponent,
35-
AboutComponent,
36-
CourseComponent,
37-
CoursesCardListComponent,
38-
CourseDialogComponent
34+
AppComponent
3935
],
4036
imports: [
4137
BrowserModule,
4238
BrowserAnimationsModule,
4339
HttpClientModule,
44-
MatMenuModule,
45-
MatButtonModule,MatToolbarModule,
46-
MatIconModule,
47-
MatCardModule,
48-
MatTabsModule,
49-
MatSidenavModule,
50-
MatListModule,
51-
MatToolbarModule,
52-
MatInputModule,
53-
MatTableModule,
54-
MatPaginatorModule,
55-
MatSortModule,
56-
MatProgressSpinnerModule,
57-
MatDialogModule,
58-
AppRoutingModule,
59-
MatSelectModule,
60-
MatDatepickerModule,
61-
MatMomentDateModule,
62-
ReactiveFormsModule
40+
CoursesModule
6341
],
6442
providers: [
65-
CoursesService,
66-
CourseResolver
6743
],
68-
bootstrap: [AppComponent],
69-
entryComponents: [CourseDialogComponent]
44+
bootstrap: [AppComponent]
45+
7046
})
7147
export class AppModule {
7248
}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {Course} from '../model/course';
2+
import {COURSES} from '../../../../server/db-data';
3+
import {sortCoursesBySeqNo} from '../home/sort-course-by-seq';
4+
5+
6+
export function setupCourses() : Course[] {
7+
return Object.values(COURSES).sort(sortCoursesBySeqNo) as Course[];
8+
}
9+
10+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
2+
import {CoursesCardListComponent} from './courses-card-list.component';
3+
import {CoursesModule} from '../courses.module';
4+
import {COURSES} from '../../../../server/db-data';
5+
import {DebugElement} from '@angular/core';
6+
import {By} from '@angular/platform-browser';
7+
import {sortCoursesBySeqNo} from '../home/sort-course-by-seq';
8+
import {Course} from '../model/course';
9+
import {setupCourses} from '../common/setup-test-data';
10+
11+
12+
13+
14+
describe('CoursesCardListComponent', async () => {
15+
16+
let fixture: ComponentFixture<CoursesCardListComponent>;
17+
let component:CoursesCardListComponent;
18+
let el: DebugElement;
19+
20+
beforeEach(async(() => {
21+
22+
TestBed.configureTestingModule({
23+
imports: [
24+
CoursesModule
25+
]
26+
}).compileComponents();
27+
28+
fixture = TestBed.createComponent(CoursesCardListComponent);
29+
component = fixture.debugElement.componentInstance;
30+
el = fixture.debugElement;
31+
32+
}));
33+
34+
35+
it("should create the component", async(() => {
36+
37+
expect(component).toBeTruthy();
38+
39+
}));
40+
41+
42+
it("should display the course list", async(() => {
43+
44+
component.courses = setupCourses();
45+
46+
fixture.detectChanges();
47+
48+
const cards = el.queryAll(By.css('.course-card'));
49+
50+
expect(cards).toBeTruthy("Could not finds cards");
51+
expect(cards.length).toBe(12, "Unexpected number of courses");
52+
53+
}));
54+
55+
56+
it("should display the first course", async(() => {
57+
58+
component.courses = setupCourses();
59+
60+
const course = component.courses[0];
61+
62+
fixture.detectChanges();
63+
64+
const card = el.query(By.css('.course-card:first-child')),
65+
title = card.query(By.css("mat-card-title")),
66+
image = card.query(By.css("img"));
67+
68+
expect(card).toBeTruthy("Could not finds course card");
69+
expect(title.nativeElement.textContent).toBe(course.titles.description, "Wrong course title found");
70+
expect(image.nativeElement.src).toBe(course.iconUrl, "Wrong image found");
71+
72+
73+
}));
74+
75+
76+
});
77+
78+

src/app/courses/courses.module.ts

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { NgModule } from '@angular/core';
2+
import { CommonModule } from '@angular/common';
3+
import {AppComponent} from '../app.component';
4+
import {HomeComponent} from './home/home.component';
5+
import {AboutComponent} from '../about/about.component';
6+
import {CourseComponent} from './course/course.component';
7+
import {CoursesCardListComponent} from './courses-card-list/courses-card-list.component';
8+
import {CourseDialogComponent} from './course-dialog/course-dialog.component';
9+
import {BrowserModule} from '@angular/platform-browser';
10+
import {
11+
MatButtonModule,
12+
MatCardModule,
13+
MatDatepickerModule,
14+
MatDialogModule, MatIconModule,
15+
MatInputModule,
16+
MatListModule, MatMenuModule,
17+
MatPaginatorModule, MatProgressSpinnerModule, MatSelectModule,
18+
MatSidenavModule,
19+
MatSortModule,
20+
MatTableModule, MatTabsModule,
21+
MatToolbarModule
22+
} from '@angular/material';
23+
import {AppRoutingModule} from '../app-routing.module';
24+
import {MatMomentDateModule} from '@angular/material-moment-adapter';
25+
import {ReactiveFormsModule} from '@angular/forms';
26+
import {CoursesService} from './services/courses.service';
27+
import {CourseResolver} from './services/course.resolver';
28+
29+
@NgModule({
30+
declarations: [
31+
HomeComponent,
32+
AboutComponent,
33+
CourseComponent,
34+
CoursesCardListComponent,
35+
CourseDialogComponent
36+
],
37+
imports: [
38+
CommonModule,
39+
MatMenuModule,
40+
MatButtonModule,
41+
MatToolbarModule,
42+
MatIconModule,
43+
MatCardModule,
44+
MatTabsModule,
45+
MatSidenavModule,
46+
MatListModule,
47+
MatToolbarModule,
48+
MatInputModule,
49+
MatTableModule,
50+
MatPaginatorModule,
51+
MatSortModule,
52+
MatProgressSpinnerModule,
53+
MatDialogModule,
54+
AppRoutingModule,
55+
MatSelectModule,
56+
MatDatepickerModule,
57+
MatMomentDateModule,
58+
ReactiveFormsModule
59+
],
60+
exports: [
61+
HomeComponent,
62+
AboutComponent,
63+
CourseComponent,
64+
CoursesCardListComponent,
65+
CourseDialogComponent
66+
],
67+
providers: [
68+
CoursesService,
69+
CourseResolver
70+
],
71+
entryComponents: [CourseDialogComponent]
72+
73+
})export class CoursesModule {
74+
75+
76+
77+
}
78+
79+
80+

src/app/home/home.component.ts renamed to src/app/courses/home/home.component.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {Course} from "../model/course";
33
import {Observable} from "rxjs/Observable";
44
import {CoursesService} from "../services/courses.service";
55
import {map} from "rxjs/operators";
6+
import {sortCoursesBySeqNo} from './sort-course-by-seq';
67

78
@Component({
89
selector: 'home',
@@ -38,14 +39,10 @@ export class HomeComponent implements OnInit {
3839

3940
filterByCategory(courses$: Observable<Course[]>, category:string) {
4041
return courses$.pipe(
41-
map(courses => courses.filter(course => course.category === category).sort(sortBySeqNo) )
42+
map(courses => courses.filter(course => course.category === category).sort(sortCoursesBySeqNo) )
4243
);
4344
}
4445

4546
}
4647

4748

48-
function sortBySeqNo(c1:Course, c2: Course) {
49-
return c1.seqNo - c2.seqNo;
50-
51-
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import {Course} from '../model/course';
2+
3+
4+
export function sortCoursesBySeqNo(c1:Course, c2: Course) {
5+
return c1.seqNo - c2.seqNo;
6+
7+
}
File renamed without changes.
File renamed without changes.

src/app/services/courses.service.spec.ts renamed to src/app/courses/services/courses.service.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {TestBed} from '@angular/core/testing';
22
import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
33
import {CoursesService} from './courses.service';
44
import {HttpClient, HttpErrorResponse} from '@angular/common/http';
5-
import {COURSES} from '../../../server/db-data';
5+
import {COURSES} from '../../../../server/db-data';
66

77

88
describe('CoursesService', () => {

0 commit comments

Comments
 (0)