initial codebase
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { Routes, RouterModule } from '@angular/router';
|
||||
|
||||
import { Route, extract } from '@app/core';
|
||||
import { HomeComponent } from './home.component';
|
||||
|
||||
const routes: Routes = [
|
||||
Route.withShell([
|
||||
{ path: '', redirectTo: '/home', pathMatch: 'full' },
|
||||
{ path: 'home', component: HomeComponent, data: { title: extract('Home') } }
|
||||
])
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
imports: [RouterModule.forChild(routes)],
|
||||
exports: [RouterModule],
|
||||
providers: []
|
||||
})
|
||||
export class HomeRoutingModule { }
|
||||
@@ -0,0 +1,7 @@
|
||||
<div class="container-fluid">
|
||||
<div class="text-center">
|
||||
<img class="logo" src="assets/images/mifos_lg-logo.jpg"/>
|
||||
<!-- <app-loader [isLoading]="isLoading"></app-loader>
|
||||
<q [hidden]="isLoading">{{quote}}</q> -->
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,9 @@
|
||||
.logo {
|
||||
width: 500px;
|
||||
}
|
||||
|
||||
q {
|
||||
font-style: italic;
|
||||
font-size: 1.2rem;
|
||||
quotes: "« " " »";
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { HttpClientTestingModule } from '@angular/common/http/testing';
|
||||
|
||||
import { CoreModule } from '@app/core';
|
||||
import { SharedModule } from '@app/shared';
|
||||
import { HomeComponent } from './home.component';
|
||||
import { QuoteService } from './quote.service';
|
||||
|
||||
describe('HomeComponent', () => {
|
||||
let component: HomeComponent;
|
||||
let fixture: ComponentFixture<HomeComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [
|
||||
CoreModule,
|
||||
SharedModule,
|
||||
HttpClientTestingModule
|
||||
],
|
||||
declarations: [HomeComponent],
|
||||
providers: [QuoteService]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(HomeComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,25 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { finalize } from 'rxjs/operators';
|
||||
|
||||
import { QuoteService } from './quote.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-home',
|
||||
templateUrl: './home.component.html',
|
||||
styleUrls: ['./home.component.scss']
|
||||
})
|
||||
export class HomeComponent implements OnInit {
|
||||
|
||||
quote: string;
|
||||
isLoading: boolean;
|
||||
|
||||
constructor(private quoteService: QuoteService) { }
|
||||
|
||||
ngOnInit() {
|
||||
this.isLoading = true;
|
||||
this.quoteService.getRandomQuote({ category: 'dev' })
|
||||
.pipe(finalize(() => { this.isLoading = false; }))
|
||||
.subscribe((quote: string) => { this.quote = quote; });
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
import { CoreModule } from '@app/core';
|
||||
import { SharedModule } from '@app/shared';
|
||||
import { HomeRoutingModule } from './home-routing.module';
|
||||
import { HomeComponent } from './home.component';
|
||||
import { QuoteService } from './quote.service';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
TranslateModule,
|
||||
CoreModule,
|
||||
SharedModule,
|
||||
HomeRoutingModule
|
||||
],
|
||||
declarations: [
|
||||
HomeComponent
|
||||
],
|
||||
providers: [
|
||||
QuoteService
|
||||
]
|
||||
})
|
||||
export class HomeModule { }
|
||||
@@ -0,0 +1,72 @@
|
||||
import { TestBed, inject, async } from '@angular/core/testing';
|
||||
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
|
||||
|
||||
import { CoreModule, HttpCacheService } from '@app/core';
|
||||
import { QuoteService } from './quote.service';
|
||||
|
||||
describe('QuoteService', () => {
|
||||
let quoteService: QuoteService;
|
||||
let httpMock: HttpTestingController;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [
|
||||
CoreModule,
|
||||
HttpClientTestingModule
|
||||
],
|
||||
providers: [
|
||||
HttpCacheService,
|
||||
QuoteService
|
||||
]
|
||||
});
|
||||
}));
|
||||
|
||||
beforeEach(inject([
|
||||
HttpCacheService,
|
||||
QuoteService,
|
||||
HttpTestingController
|
||||
], (htttpCacheService: HttpCacheService,
|
||||
_quoteService: QuoteService,
|
||||
_httpMock: HttpTestingController) => {
|
||||
|
||||
quoteService = _quoteService;
|
||||
httpMock = _httpMock;
|
||||
|
||||
htttpCacheService.cleanCache();
|
||||
}));
|
||||
|
||||
afterEach(() => {
|
||||
httpMock.verify();
|
||||
});
|
||||
|
||||
describe('getRandomQuote', () => {
|
||||
it('should return a random Chuck Norris quote', () => {
|
||||
// Arrange
|
||||
const mockQuote = { value: 'a random quote' };
|
||||
|
||||
// Act
|
||||
const randomQuoteSubscription = quoteService.getRandomQuote({ category: 'toto' });
|
||||
|
||||
// Assert
|
||||
randomQuoteSubscription.subscribe((quote: string) => {
|
||||
expect(quote).toEqual(mockQuote.value);
|
||||
});
|
||||
httpMock.expectOne({}).flush(mockQuote);
|
||||
});
|
||||
|
||||
it('should return a string in case of error', () => {
|
||||
// Act
|
||||
const randomQuoteSubscription = quoteService.getRandomQuote({ category: 'toto' });
|
||||
|
||||
// Assert
|
||||
randomQuoteSubscription.subscribe((quote: string) => {
|
||||
expect(typeof quote).toEqual('string');
|
||||
expect(quote).toContain('Error');
|
||||
});
|
||||
httpMock.expectOne({}).flush(null, {
|
||||
status: 500,
|
||||
statusText: 'error'
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,30 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Observable, of } from 'rxjs';
|
||||
import { map, catchError } from 'rxjs/operators';
|
||||
|
||||
const routes = {
|
||||
quote: (c: RandomQuoteContext) => `/jokes/random?category=${c.category}`
|
||||
};
|
||||
|
||||
export interface RandomQuoteContext {
|
||||
// The quote's category: 'dev', 'explicit'...
|
||||
category: string;
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
export class QuoteService {
|
||||
|
||||
constructor(private httpClient: HttpClient) { }
|
||||
|
||||
getRandomQuote(context: RandomQuoteContext): Observable<string> {
|
||||
return this.httpClient
|
||||
.cache()
|
||||
.get(routes.quote(context))
|
||||
.pipe(
|
||||
map((body: any) => body.value),
|
||||
catchError(() => of('Error, could not load joke :-('))
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user