spec/danconia/exchanges/currency_layer_spec.rb in danconia-0.2.9 vs spec/danconia/exchanges/currency_layer_spec.rb in danconia-0.3.0

- old
+ new

@@ -1,42 +1,50 @@ -require 'spec_helper' +require 'danconia/exchanges/currency_layer' module Danconia module Exchanges describe CurrencyLayer do - subject { CurrencyLayer.new access_key: '[KEY]' } - context 'fetch_rates' do + subject { CurrencyLayer.new access_key: '[KEY]' } + it 'uses the API to retrive the rates' do - stub_request(:get, 'http://www.apilayer.net/api/live?access_key=[KEY]').to_return body: fixture('success.json') + stub_request(:get, 'http://www.apilayer.net/api/live?access_key=[KEY]') + .to_return(body: fixture('success.json')) + expect(subject.fetch_rates).to eq 'USDARS' => 27.110001, 'USDAUD' => 1.346196 end it 'when the API returns an error' do - stub_request(:get, 'http://www.apilayer.net/api/live?access_key=[KEY]').to_return body: fixture('failure.json') + stub_request(:get, 'http://www.apilayer.net/api/live?access_key=[KEY]') + .to_return(body: fixture('failure.json')) + expect { subject.fetch_rates }.to raise_error Errors::APIError end + + def fixture file + File.read("#{__dir__}/fixtures/currency_layer/#{file}") + end end context 'update_rates!' do it 'fetches the rates and stores them' do - expect(subject).to receive(:fetch_rates) { {'USDARS' => 3, 'USDAUD' => 4} } - subject.update_rates! - expect(subject.store.rates.size).to eq 2 - expect(subject.rate('USD', 'ARS')).to eq 3 - expect(subject.rate('USD', 'AUD')).to eq 4 - end + store = double('store') + expect(store).to receive(:save_rates).with([{pair: 'USDARS', rate: 3}, {pair: 'USDAUD', rate: 4}]) - it 'if a rate already exists should update it' do - subject.store.save_rates 'USDARS' => 3 - expect(subject).to receive(:fetch_rates) { {'USDARS' => 3.1} } - subject.update_rates! - expect(subject.rate('USD', 'ARS')).to eq 3.1 + exchange = CurrencyLayer.new(access_key: '...', store: store) + allow(exchange).to receive(:fetch_rates).and_return('USDARS' => 3, 'USDAUD' => 4) + exchange.update_rates! end end - def fixture file - File.read("#{__dir__}/fixtures/currency_layer/#{file}") + context 'rates' do + it 'converts the array from the store back to a map of pair to rates' do + store = double('store') + expect(store).to receive(:rates).and_return([{pair: 'USDARS', rate: 3}, {pair: 'USDAUD', rate: 4}]) + + exchange = CurrencyLayer.new(access_key: '...', store: store) + expect(exchange.rates).to eq 'USDARS' => 3, 'USDAUD' => 4 + end end end end end