give rate provider 100% unit test coverage

This commit is contained in:
Darren Nelsen 2018-02-20 12:21:00 -05:00
parent 36d3601a89
commit e05ae60b44
2 changed files with 221 additions and 7 deletions

View File

@ -0,0 +1,215 @@
import { TestBed, getTestBed, inject, async } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { RateProvider } from './rate';
import { NgLoggerModule, Level } from '@nsalaun/ng-logger';
import { Logger } from '../../providers/logger/logger';
import {
TranslateModule,
TranslateService,
TranslateLoader,
TranslateFakeLoader
} from '@ngx-translate/core';
describe('RateProvider', () => {
let injector: TestBed;
let service: RateProvider;
let httpMock: HttpTestingController;
const btcResponse = [{"code":"BTC","name":"Bitcoin","rate":1},{"code":"USD","name":"US Dollar","rate":11535.74},{"code":"BCH","name":"Bitcoin Cash","rate":7.65734}];
const bchResponse = [{"code":"BTC","name":"Bitcoin","rate":0.130377},{"code":"USD","name":"US Dollar","rate":1503.3},{"code":"BCH","name":"Bitcoin Cash","rate":1}];
let btcUrl: string = 'https://bitpay.com/api/rates';
let bchUrl: string = 'https://bitpay.com/api/rates/bch';
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule,
NgLoggerModule.forRoot(Level.LOG),
TranslateModule.forRoot({
loader: { provide: TranslateLoader, useClass: TranslateFakeLoader }
})
],
providers: [
RateProvider,
Logger
]
});
injector = getTestBed();
service = injector.get(RateProvider);
httpMock = injector.get(HttpTestingController);
});
it('should see if rates are available', () => {
service.updateRatesBtc().then(response => {
expect(service.isAvailable()).toBe(true);
});
httpMock.match(btcUrl)[1].flush(btcResponse);
httpMock.match(bchUrl)[0].flush(bchResponse);
httpMock.verify();
});
it('should get BTC rates', () => {
service.updateRatesBtc().then(response => {
expect(service.isAvailable()).toBe(true);
expect(service.getRate('BTC')).toEqual(1);
expect(service.getRate('USD')).toEqual(11535.74);
expect(service.getRate('BCH')).toEqual(7.65734);
});
httpMock.match(btcUrl)[1].flush(btcResponse);
httpMock.match(bchUrl)[0].flush(bchResponse);
httpMock.verify();
});
it('should get BCH rates', () => {
service.updateRatesBch().then(response => {
expect(service.isAvailable()).toBe(true);
expect(service.getRate('BTC', 'bch')).toEqual(0.130377);
expect(service.getRate('USD', 'bch')).toEqual(1503.3);
expect(service.getRate('BCH', 'bch')).toEqual(1);
});
httpMock.match(btcUrl)[0].flush(btcResponse);
httpMock.match(bchUrl)[1].flush(bchResponse);
httpMock.verify();
});
it('should catch an error on when call to update btc rates fails', () => {
service.getBCH = (): Promise<any> => {
let prom = new Promise((resolve, reject) => {
reject('test rejection');
});
return prom;
};
service.updateRatesBch()
.catch((err: any) => {
expect(err).not.toBeNull();
});
});
it('should catch an error on when call to update bch rates fails', () => {
service.getBTC = (): Promise<any> => {
let prom = new Promise((resolve, reject) => {
reject('test rejection');
});
return prom;
};
service.updateRatesBtc()
.catch((err: any) => {
expect(err).not.toBeNull();
});
});
it('should covert BCH satoshis to fiat', () => {
// before we have rates
expect(service.toFiat(0.25*1e+8, 'USD', 'bch')).toBeNull();
// after we have rates
service.updateRatesBch().then(response => {
expect(service.isAvailable()).toBe(true);
expect(service.toFiat(1*1e+8, 'USD', 'bch')).toEqual(1503.3);
expect(service.toFiat(0.5*1e+8, 'USD', 'bch')).toEqual(751.65);
expect(service.toFiat(0.25*1e+8, 'USD', 'bch')).toEqual(375.825);
});
httpMock.match(btcUrl)[0].flush(btcResponse);
httpMock.match(bchUrl)[1].flush(bchResponse);
httpMock.verify();
});
it('should covert fiat to BCH satoshis', () => {
// before we have rates
expect(service.fromFiat(0.25*1e+8, 'USD', 'bch')).toBeNull();
// after we have rates
service.updateRatesBch().then(response => {
expect(service.isAvailable()).toBe(true);
expect(service.fromFiat(1503.3, 'USD', 'bch')).toEqual(1*1e+8);
expect(service.fromFiat(751.65, 'USD', 'bch')).toEqual(0.5*1e+8);
expect(service.fromFiat(375.825, 'USD', 'bch')).toEqual(0.25*1e+8);
});
httpMock.match(btcUrl)[0].flush(btcResponse);
httpMock.match(bchUrl)[1].flush(bchResponse);
httpMock.verify();
});
it('should covert BTC satoshis to fiat', () => {
// before we have rates
expect(service.toFiat(0.25*1e+8, 'USD', 'btc')).toBeNull();
// after we have rates
service.updateRatesBtc().then(response => {
expect(service.isAvailable()).toBe(true);
expect(service.toFiat(1*1e+8, 'USD', 'btc')).toEqual(11535.74);
expect(service.toFiat(0.5*1e+8, 'USD', 'btc')).toEqual(5767.87);
expect(service.toFiat(0.25*1e+8, 'USD', 'btc')).toEqual(2883.935);
});
httpMock.match(btcUrl)[1].flush(btcResponse);
httpMock.match(bchUrl)[0].flush(bchResponse);
httpMock.verify();
});
it('should covert fiat to BTC satoshis', () => {
// before we have rates
expect(service.fromFiat(0.25*1e+8, 'USD', 'btc')).toBeNull();
// after we have rates
service.updateRatesBtc().then(response => {
expect(service.isAvailable()).toBe(true);
expect(service.fromFiat(11535.74, 'USD', 'btc')).toEqual(1*1e+8);
expect(service.fromFiat(5767.87, 'USD', 'btc')).toEqual(0.5*1e+8);
expect(service.fromFiat(2883.935, 'USD', 'btc')).toEqual(0.25*1e+8);
});
httpMock.match(btcUrl)[1].flush(btcResponse);
httpMock.match(bchUrl)[0].flush(bchResponse);
httpMock.verify();
});
it('should list alternatives', () => {
// before we have rates
expect(service.listAlternatives(false)).toEqual([]);
expect(service.listAlternatives(true)).toEqual([]);
// after we have rates
service.updateRatesBtc().then(response => {
expect(service.isAvailable()).toBe(true);
expect(service.listAlternatives(false)).toEqual([
{name: 'Bitcoin', isoCode: 'BTC'},
{name: 'US Dollar', isoCode: 'USD'},
{name: 'Bitcoin Cash', isoCode: 'BCH'}
]);
expect(service.listAlternatives(true)).toEqual([
{name: 'Bitcoin', isoCode: 'BTC'},
{name: 'Bitcoin Cash', isoCode: 'BCH'},
{name: 'US Dollar', isoCode: 'USD'}
]);
});
httpMock.match(btcUrl)[1].flush(btcResponse);
httpMock.match(bchUrl)[0].flush(bchResponse);
httpMock.verify();
});
it('should resolve when rates are available', () => {
// before we have rates
expect(service.isAvailable()).toBe(false);
service.whenRatesAvailable().then(response => {
// after we have rates
expect(service.isAvailable()).toBe(true);
// hit the if in whenRatesAvailable
service.whenRatesAvailable();
});
httpMock.match(btcUrl)[1].flush(btcResponse);
httpMock.match(bchUrl)[0].flush(bchResponse);
httpMock.verify();
});
});

View File

@ -32,10 +32,9 @@ export class RateProvider {
this.updateRatesBch(); this.updateRatesBch();
} }
private updateRatesBtc(): Promise<any> { public updateRatesBtc(): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.getBTC().then((dataBTC: any) => { this.getBTC().then((dataBTC: any) => {
_.each(dataBTC, (currency: any) => { _.each(dataBTC, (currency: any) => {
this.rates[currency.code] = currency.rate; this.rates[currency.code] = currency.rate;
this.alternatives.push({ this.alternatives.push({
@ -53,7 +52,7 @@ export class RateProvider {
}); });
} }
private updateRatesBch(): Promise<any> { public updateRatesBch(): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.getBCH().then((dataBCH: any) => { this.getBCH().then((dataBCH: any) => {
_.each(dataBCH, (currency: any) => { _.each(dataBCH, (currency: any) => {
@ -67,7 +66,7 @@ export class RateProvider {
}); });
} }
private getBTC(): Promise<any> { public getBTC(): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.http.get(this.rateServiceUrl).subscribe((data: any) => { this.http.get(this.rateServiceUrl).subscribe((data: any) => {
resolve(data); resolve(data);
@ -75,7 +74,7 @@ export class RateProvider {
}); });
} }
private getBCH(): Promise<any> { public getBCH(): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.http.get(this.bchRateServiceUrl).subscribe((data: any) => { this.http.get(this.bchRateServiceUrl).subscribe((data: any) => {
resolve(data); resolve(data);
@ -83,7 +82,7 @@ export class RateProvider {
}); });
} }
private getRate(code: string, chain?: string): number { public getRate(code: string, chain?: string): number {
if (chain == 'bch') if (chain == 'bch')
return this.ratesBCH[code]; return this.ratesBCH[code];
else else
@ -94,7 +93,7 @@ export class RateProvider {
return this.alternatives; return this.alternatives;
} }
public isAvailable() { public isAvailable(): boolean {
return this.ratesAvailable; return this.ratesAvailable;
} }