From e05ae60b44eb7c8ae28d6f1094814860b071844e Mon Sep 17 00:00:00 2001 From: Darren Nelsen Date: Tue, 20 Feb 2018 12:21:00 -0500 Subject: [PATCH] give rate provider 100% unit test coverage --- src/providers/rate/rate.spec.ts | 215 ++++++++++++++++++++++++++++++++ src/providers/rate/rate.ts | 13 +- 2 files changed, 221 insertions(+), 7 deletions(-) create mode 100644 src/providers/rate/rate.spec.ts diff --git a/src/providers/rate/rate.spec.ts b/src/providers/rate/rate.spec.ts new file mode 100644 index 000000000..ad257df54 --- /dev/null +++ b/src/providers/rate/rate.spec.ts @@ -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 => { + 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 => { + 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(); + }); +}); diff --git a/src/providers/rate/rate.ts b/src/providers/rate/rate.ts index 38793f242..765a5c247 100644 --- a/src/providers/rate/rate.ts +++ b/src/providers/rate/rate.ts @@ -32,10 +32,9 @@ export class RateProvider { this.updateRatesBch(); } - private updateRatesBtc(): Promise { + public updateRatesBtc(): Promise { return new Promise((resolve, reject) => { this.getBTC().then((dataBTC: any) => { - _.each(dataBTC, (currency: any) => { this.rates[currency.code] = currency.rate; this.alternatives.push({ @@ -53,7 +52,7 @@ export class RateProvider { }); } - private updateRatesBch(): Promise { + public updateRatesBch(): Promise { return new Promise((resolve, reject) => { this.getBCH().then((dataBCH: any) => { _.each(dataBCH, (currency: any) => { @@ -67,7 +66,7 @@ export class RateProvider { }); } - private getBTC(): Promise { + public getBTC(): Promise { return new Promise((resolve, reject) => { this.http.get(this.rateServiceUrl).subscribe((data: any) => { resolve(data); @@ -75,7 +74,7 @@ export class RateProvider { }); } - private getBCH(): Promise { + public getBCH(): Promise { return new Promise((resolve, reject) => { this.http.get(this.bchRateServiceUrl).subscribe((data: any) => { 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') return this.ratesBCH[code]; else @@ -94,7 +93,7 @@ export class RateProvider { return this.alternatives; } - public isAvailable() { + public isAvailable(): boolean { return this.ratesAvailable; }