mirror of https://github.com/BTCPrivate/copay.git
give rate provider 100% unit test coverage
This commit is contained in:
parent
36d3601a89
commit
e05ae60b44
|
@ -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();
|
||||||
|
});
|
||||||
|
});
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue