currency-rate 1.4.1 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +22 -0
- data/Gemfile +3 -8
- data/Rakefile +6 -25
- data/api_keys.yml.sample +1 -0
- data/currency-rate.gemspec +33 -133
- data/lib/adapters/crypto/binance_adapter.rb +3 -3
- data/lib/adapters/crypto/bitfinex_adapter.rb +2 -2
- data/lib/adapters/crypto/bitpay_adapter.rb +1 -1
- data/lib/adapters/crypto/bitstamp_adapter.rb +11 -5
- data/lib/adapters/crypto/btc_china_adapter.rb +1 -1
- data/lib/adapters/crypto/btc_e_adapter.rb +1 -1
- data/lib/adapters/crypto/coin_market_cap_adapter.rb +31 -0
- data/lib/adapters/crypto/coinbase_adapter.rb +1 -1
- data/lib/adapters/crypto/exmo_adapter.rb +2 -2
- data/lib/adapters/crypto/huobi_adapter.rb +1 -1
- data/lib/adapters/crypto/kraken_adapter.rb +21 -15
- data/lib/adapters/crypto/localbitcoins_adapter.rb +1 -1
- data/lib/adapters/crypto/okcoin_adapter.rb +1 -1
- data/lib/adapters/fiat/bonbast_adapter.rb +25 -0
- data/lib/adapters/fiat/currency_layer_adapter.rb +1 -1
- data/lib/adapters/fiat/fixer_adapter.rb +1 -1
- data/lib/adapters/fiat/forge_adapter.rb +1 -1
- data/lib/adapters/fiat/free_forex_adapter.rb +1 -1
- data/lib/adapters/fiat/yahoo_adapter.rb +1 -1
- data/lib/configuration.rb +4 -0
- data/lib/currency_rate.rb +3 -1
- data/lib/currency_rate/version.rb +3 -0
- data/lib/fetcher.rb +26 -6
- data/lib/synchronizer.rb +1 -1
- metadata +23 -95
- data/VERSION +0 -1
- data/spec/fixtures/adapters/binance_rates.yml +0 -993
- data/spec/fixtures/adapters/bitfinex_rates.yml +0 -4050
- data/spec/fixtures/adapters/bitpay_rates.yml +0 -490
- data/spec/fixtures/adapters/bitstamp_rates.yml +0 -61
- data/spec/fixtures/adapters/btc_china_rates.yml +0 -11
- data/spec/fixtures/adapters/btce_rates.yml +0 -60
- data/spec/fixtures/adapters/coinbase_rates.yml +0 -181
- data/spec/fixtures/adapters/currency_layer_rates.yml +0 -174
- data/spec/fixtures/adapters/exmo_rates.yml +0 -1251
- data/spec/fixtures/adapters/fixer_rates.yml +0 -174
- data/spec/fixtures/adapters/forge_rates.yml +0 -75
- data/spec/fixtures/adapters/free_forex_rates.yml +0 -59
- data/spec/fixtures/adapters/huobi_rates.yml +0 -22
- data/spec/fixtures/adapters/kraken_rates.yml +0 -507
- data/spec/fixtures/adapters/localbitcoins_rates.yml +0 -493
- data/spec/fixtures/adapters/normalized/binance_rates.yml +0 -134
- data/spec/fixtures/adapters/normalized/bitfinex_rates.yml +0 -95
- data/spec/fixtures/adapters/normalized/bitpay_rates.yml +0 -164
- data/spec/fixtures/adapters/normalized/bitstamp_rates.yml +0 -9
- data/spec/fixtures/adapters/normalized/btc_china_rates.yml +0 -1
- data/spec/fixtures/adapters/normalized/btce_rates.yml +0 -5
- data/spec/fixtures/adapters/normalized/coinbase_rates.yml +0 -179
- data/spec/fixtures/adapters/normalized/currency_layer_rates.yml +0 -169
- data/spec/fixtures/adapters/normalized/exmo_rates.yml +0 -42
- data/spec/fixtures/adapters/normalized/fixer_rates.yml +0 -170
- data/spec/fixtures/adapters/normalized/forge_rates.yml +0 -16
- data/spec/fixtures/adapters/normalized/free_forex_rates.yml +0 -16
- data/spec/fixtures/adapters/normalized/huobi_rates.yml +0 -2
- data/spec/fixtures/adapters/normalized/kraken_rates.yml +0 -21
- data/spec/fixtures/adapters/normalized/localbitcoins_rates.yml +0 -73
- data/spec/fixtures/adapters/normalized/okcoin_rates.yml +0 -4
- data/spec/fixtures/adapters/normalized/yahoo_rates.yml +0 -160
- data/spec/fixtures/adapters/okcoin_rates.yml +0 -40
- data/spec/fixtures/adapters/yahoo_rates.yml +0 -1119
- data/spec/lib/adapter_spec.rb +0 -54
- data/spec/lib/adapters/crypto/binance_adapter_spec.rb +0 -13
- data/spec/lib/adapters/crypto/bitfinex_adapter_spec.rb +0 -13
- data/spec/lib/adapters/crypto/bitpay_adapter_spec.rb +0 -13
- data/spec/lib/adapters/crypto/bitstamp_adapter_spec.rb +0 -13
- data/spec/lib/adapters/crypto/btc_china_adapter_spec.rb +0 -13
- data/spec/lib/adapters/crypto/btc_e_adapter_spec.rb +0 -13
- data/spec/lib/adapters/crypto/coinbase_adapter_spec.rb +0 -13
- data/spec/lib/adapters/crypto/exmo_adapter_spec.rb +0 -13
- data/spec/lib/adapters/crypto/huobi_adapter_spec.rb +0 -13
- data/spec/lib/adapters/crypto/kraken_adapter_spec.rb +0 -13
- data/spec/lib/adapters/crypto/localbitcoins_adapter_spec.rb +0 -13
- data/spec/lib/adapters/crypto/okcoin_adapter_spec.rb +0 -13
- data/spec/lib/adapters/fiat/currency_layer_adapter_spec.rb +0 -23
- data/spec/lib/adapters/fiat/fixer_adapter_spec.rb +0 -13
- data/spec/lib/adapters/fiat/forge_adapter_spec.rb +0 -23
- data/spec/lib/adapters/fiat/free_forex_adapter_spec.rb +0 -13
- data/spec/lib/adapters/fiat/yahoo_adapter_spec.rb +0 -13
- data/spec/lib/currency_rate_spec.rb +0 -9
- data/spec/lib/fetcher_spec.rb +0 -124
- data/spec/lib/storage/file_storage_spec.rb +0 -38
- data/spec/lib/synchronizer_spec.rb +0 -99
- data/spec/spec_helper.rb +0 -28
- data/spec/support/matchers/eq_any_of.rb +0 -3
data/spec/lib/adapter_spec.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
EXCHANGE_STUB_DOMAIN = "http://exchange.stub.com"
|
4
|
-
|
5
|
-
RESPONSE = {
|
6
|
-
"btc_usd" => 5000,
|
7
|
-
"ltc_usd" => 50,
|
8
|
-
}
|
9
|
-
|
10
|
-
class HashUrlAdapter < CurrencyRate::Adapter
|
11
|
-
FETCH_URL = {
|
12
|
-
"btc_usd" => "#{EXCHANGE_STUB_DOMAIN}/btc_usd",
|
13
|
-
"ltc_usd" => "#{EXCHANGE_STUB_DOMAIN}/ltc_usd",
|
14
|
-
}
|
15
|
-
end
|
16
|
-
|
17
|
-
class StringUrlAdapter < CurrencyRate::Adapter
|
18
|
-
FETCH_URL = EXCHANGE_STUB_DOMAIN
|
19
|
-
end
|
20
|
-
|
21
|
-
RSpec.describe CurrencyRate::Adapter do
|
22
|
-
describe "#exchange_data" do
|
23
|
-
context "when FETCH_URL is not defined" do
|
24
|
-
before { @adapter = CurrencyRate::Adapter.instance }
|
25
|
-
|
26
|
-
it "raises an error" do
|
27
|
-
expect { @adapter.exchange_data }.to raise_error("FETCH_URL is not defined!")
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context "when FETCH_URL is Hash" do
|
32
|
-
before do
|
33
|
-
@adapter = HashUrlAdapter.instance
|
34
|
-
@response_map = Hash[RESPONSE.map { |k, v| [k, { "price" => v } ] }]
|
35
|
-
RESPONSE.each { |k, v| stub_request(:get, "#{EXCHANGE_STUB_DOMAIN}/#{k}").to_return(body: { "price" => v }.to_json) }
|
36
|
-
end
|
37
|
-
|
38
|
-
it "fetches data for each defined pair" do
|
39
|
-
expect(@adapter.exchange_data).to eq(@response_map)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
context "when FETCH_URL is String" do
|
44
|
-
before do
|
45
|
-
@adapter = StringUrlAdapter.instance
|
46
|
-
stub_request(:get, EXCHANGE_STUB_DOMAIN).to_return(body: RESPONSE.to_json)
|
47
|
-
end
|
48
|
-
|
49
|
-
it "fetches all data from exchange and retruns parsed Hash" do
|
50
|
-
expect(@adapter.exchange_data).to eq(RESPONSE)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::BinanceAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :binance }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::BinanceAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::BitfinexAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :bitfinex }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::BitfinexAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::BitpayAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :bitpay }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::BitpayAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to cannonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::BitstampAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :bitstamp }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::BitstampAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to cannonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::BtcChinaAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :btc_china }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::BtcChinaAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::BtcEAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :btce }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::BtcEAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::CoinbaseAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :coinbase }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::CoinbaseAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::ExmoAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :exmo }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::ExmoAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::HuobiAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :huobi }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::HuobiAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::KrakenAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :kraken }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::KrakenAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::LocalbitcoinsAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :localbitcoins }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::LocalbitcoinsAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::OkcoinAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :okcoin }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::OkcoinAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::CurrencyLayerAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :currency_layer }
|
5
|
-
|
6
|
-
before { stub_request(:get, /apilayer/).to_return(body: @data.to_json) }
|
7
|
-
|
8
|
-
before { @adapter = CurrencyRate::CurrencyLayerAdapter.instance }
|
9
|
-
|
10
|
-
describe "#normalize" do
|
11
|
-
it "brings data to canonical form" do
|
12
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe "#exchange_data" do
|
17
|
-
context "when api_key not defined" do
|
18
|
-
it "returns nil" do
|
19
|
-
expect(@adapter.exchange_data).to be_nil
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::FixerAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :fixer }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::FixerAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::ForgeAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :forge }
|
5
|
-
|
6
|
-
before { stub_request(:get, /1forge/).to_return(body: @data) }
|
7
|
-
|
8
|
-
before { @adapter = CurrencyRate::ForgeAdapter.instance }
|
9
|
-
|
10
|
-
describe "#normalize" do
|
11
|
-
it "brings data to canonical form" do
|
12
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe "#exchange_data" do
|
17
|
-
context "when api_key not defined" do
|
18
|
-
it "returns nil" do
|
19
|
-
expect(@adapter.exchange_data).to be_nil
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::FreeForexAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :free_forex }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::FreeForexAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::YahooAdapter do
|
4
|
-
before(:all) { @data, @normalized = data_for :yahoo }
|
5
|
-
|
6
|
-
before { @adapter = CurrencyRate::YahooAdapter.instance }
|
7
|
-
|
8
|
-
describe "#normalize" do
|
9
|
-
it "brings data to canonical form" do
|
10
|
-
expect(@adapter.normalize(@data)).to eq(@normalized)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,9 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate do
|
4
|
-
it { is_expected.to respond_to(:configure) }
|
5
|
-
it { is_expected.to respond_to(:sync!) }
|
6
|
-
it { is_expected.to respond_to(:fetch_crypto) }
|
7
|
-
it { is_expected.to respond_to(:fetch_fiat) }
|
8
|
-
it { is_expected.to respond_to(:logger) }
|
9
|
-
end
|
data/spec/lib/fetcher_spec.rb
DELETED
@@ -1,124 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe CurrencyRate::Fetcher do
|
4
|
-
before do
|
5
|
-
@usd_try = BigDecimal.new("22")
|
6
|
-
@usd_eur = BigDecimal.new("0.8457")
|
7
|
-
@eur_try = @usd_try / @usd_eur
|
8
|
-
@storage_double = double("storage")
|
9
|
-
@fetcher = CurrencyRate::Fetcher.new(storage: @storage_double)
|
10
|
-
end
|
11
|
-
|
12
|
-
it "uses FileStorage by default" do
|
13
|
-
fetcher = CurrencyRate::Fetcher.new
|
14
|
-
expect(fetcher.storage).to be_a(CurrencyRate::FileStorage)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "overwrites the default list of fiat exchanges" do
|
18
|
-
fetcher = CurrencyRate::Fetcher.new(fiat_exchanges: ["CurrencyLayer", "Forge", "Fixer"])
|
19
|
-
expect(fetcher.fiat_exchanges).to eq(["CurrencyLayer", "Forge", "Fixer"])
|
20
|
-
end
|
21
|
-
|
22
|
-
describe "#fetch_crypto" do
|
23
|
-
before do
|
24
|
-
@from = "BTC"
|
25
|
-
@to = "ETH"
|
26
|
-
@btc_eth = BigDecimal.new("3832.5432")
|
27
|
-
@exchange = "Bitstamp"
|
28
|
-
end
|
29
|
-
|
30
|
-
subject { @fetcher.fetch_crypto(@exchange, @from, @to) }
|
31
|
-
|
32
|
-
context "when rates for selected exchange are not available" do
|
33
|
-
before { allow(@storage_double).to receive(:read).with(@exchange).and_return(nil) }
|
34
|
-
|
35
|
-
it { is_expected.to be_nil }
|
36
|
-
end
|
37
|
-
|
38
|
-
context "when pair is supported by selected exchange" do
|
39
|
-
before do
|
40
|
-
allow(@storage_double).to receive(:read).with(@exchange).and_return({ "anchor" => "BTC", "ETH" => @btc_eth })
|
41
|
-
end
|
42
|
-
|
43
|
-
it { is_expected.to eq(@btc_eth) }
|
44
|
-
|
45
|
-
it { is_expected.to be_a(BigDecimal) }
|
46
|
-
end
|
47
|
-
|
48
|
-
context "when pair is not supported by selected exchange" do
|
49
|
-
before do
|
50
|
-
allow(@storage_double).to receive(:read).with(@exchange).and_return({ "anchor" => "BTC", "XOS" => @btc_eth })
|
51
|
-
allow(@storage_double).to receive(:read).with("Yahoo").and_return(nil)
|
52
|
-
allow(@storage_double).to receive(:read).with("Fixer").and_return(nil)
|
53
|
-
allow(@storage_double).to receive(:read).with("Forge").and_return(nil)
|
54
|
-
end
|
55
|
-
|
56
|
-
it { is_expected.to be_nil }
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe "#fetch_fiat" do
|
61
|
-
before do
|
62
|
-
@from = "EUR"
|
63
|
-
@to = "TRY"
|
64
|
-
@fiat_exchanges = ["Yahoo", "Fixer", "Forge"]
|
65
|
-
end
|
66
|
-
|
67
|
-
subject { @fetcher.fetch_fiat(@from, @to) }
|
68
|
-
|
69
|
-
it "uses Yahoo -> Fixer -> Forge priority order" do
|
70
|
-
expect(@storage_double).to receive(:read).with("Yahoo").and_return(nil).ordered
|
71
|
-
expect(@storage_double).to receive(:read).with("Fixer").and_return(nil).ordered
|
72
|
-
expect(@storage_double).to receive(:read).with("Forge").and_return(nil).ordered
|
73
|
-
@fetcher.fetch_fiat("EUR", "TRY")
|
74
|
-
end
|
75
|
-
|
76
|
-
it "uses next exchange if rates for current do not exist" do
|
77
|
-
allow(@storage_double).to receive(:read).with(@fiat_exchanges.first).and_return(nil)
|
78
|
-
expect(@storage_double).to receive(:read).with(@fiat_exchanges[1]).and_return(nil)
|
79
|
-
expect(@storage_double).to receive(:read).with(@fiat_exchanges[2]).and_return(nil)
|
80
|
-
@fetcher.fetch_fiat("EUR", "TRY")
|
81
|
-
end
|
82
|
-
|
83
|
-
context 'when first exchange has "from" currency as an anchor' do
|
84
|
-
before do
|
85
|
-
allow(@storage_double).to receive(:read).with(@fiat_exchanges.first).and_return({ "anchor" => "EUR", "TRY" => @eur_try })
|
86
|
-
end
|
87
|
-
it { is_expected.to eq(@eur_try) }
|
88
|
-
end
|
89
|
-
|
90
|
-
context 'when first exchange has "to" currency as an anchor' do
|
91
|
-
before do
|
92
|
-
allow(@storage_double).to receive(:read).with(@fiat_exchanges.first).and_return({ "anchor" => "TRY", "EUR" => (BigDecimal.new(1) / @eur_try).round(16) })
|
93
|
-
end
|
94
|
-
|
95
|
-
it "returns reversed to anchor rate" do
|
96
|
-
expect(subject.round(16)).to eq(@eur_try.round(16))
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
context "when first exchange has different from requested anchor currency" do
|
101
|
-
context "when first exchange has rates for both requested currencies" do
|
102
|
-
before do
|
103
|
-
allow(@storage_double).to receive(:read).with(@fiat_exchanges.first).and_return({
|
104
|
-
"anchor" => "USD",
|
105
|
-
"EUR" => @usd_eur,
|
106
|
-
"TRY" => @usd_try,
|
107
|
-
})
|
108
|
-
end
|
109
|
-
|
110
|
-
it { is_expected.to eq(@eur_try) }
|
111
|
-
end
|
112
|
-
|
113
|
-
context "when first exchange doen't have rates for requested currencies" do
|
114
|
-
before do
|
115
|
-
allow(@storage_double).to receive(:read).with(@fiat_exchanges.first).and_return(nil)
|
116
|
-
expect(@storage_double).to receive(:read).with(@fiat_exchanges[1]).and_return({ "anchor" => "EUR", "TRY" => @eur_try })
|
117
|
-
end
|
118
|
-
|
119
|
-
it { is_expected.to eq(@eur_try) }
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
end
|
124
|
-
end
|