UNPKG

copay-crown

Version:

A Secure Crown Wallet

216 lines (183 loc) 7.19 kB
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(); }); });