currency-rate 0.4.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -4
  3. data/README.md +41 -53
  4. data/VERSION +1 -1
  5. data/currency-rate.gemspec +92 -78
  6. data/lib/adapter.rb +37 -83
  7. data/lib/adapters/crypto/bitfinex_adapter.rb +17 -0
  8. data/lib/adapters/crypto/bitpay_adapter.rb +14 -0
  9. data/lib/adapters/crypto/bitstamp_adapter.rb +19 -0
  10. data/lib/adapters/crypto/btc_china_adapter.rb +11 -0
  11. data/lib/adapters/crypto/btc_e_adapter.rb +18 -0
  12. data/lib/adapters/crypto/coinbase_adapter.rb +14 -0
  13. data/lib/adapters/crypto/huobi_adapter.rb +17 -0
  14. data/lib/adapters/crypto/kraken_adapter.rb +29 -0
  15. data/lib/adapters/crypto/localbitcoins_adapter.rb +14 -0
  16. data/lib/adapters/crypto/okcoin_adapter.rb +19 -0
  17. data/lib/adapters/fiat/fixer_adapter.rb +16 -0
  18. data/lib/adapters/fiat/forge_adapter.rb +23 -0
  19. data/lib/adapters/fiat/yahoo_adapter.rb +35 -0
  20. data/lib/configuration.rb +21 -0
  21. data/lib/currency_rate.rb +52 -48
  22. data/lib/fetcher.rb +71 -0
  23. data/lib/storage/file_storage.rb +29 -0
  24. data/lib/storage/serializers/yaml_serializer.rb +15 -0
  25. data/lib/synchronizer.rb +31 -0
  26. data/spec/fixtures/adapters/bitfinex_adapter.yml +18 -0
  27. data/spec/fixtures/adapters/bitpay_adapter.yml +486 -0
  28. data/spec/fixtures/adapters/bitstamp_adapter.yml +30 -0
  29. data/spec/fixtures/adapters/btc_china_adapter.yml +11 -0
  30. data/spec/fixtures/adapters/btce_adapter.yml +60 -0
  31. data/spec/fixtures/adapters/coinbase_adapter.yml +680 -0
  32. data/spec/fixtures/adapters/fixer_adapter.yml +34 -0
  33. data/spec/fixtures/adapters/forge_adapter.yml +75 -0
  34. data/spec/fixtures/adapters/huobi_adapter.yml +22 -0
  35. data/spec/fixtures/adapters/kraken_adapter.yml +124 -0
  36. data/spec/fixtures/adapters/localbitcoins_adapter.yml +381 -0
  37. data/spec/fixtures/adapters/normalized/bitfinex_adapter.yml +2 -0
  38. data/spec/fixtures/adapters/normalized/bitpay_adapter.yml +161 -0
  39. data/spec/fixtures/adapters/normalized/bitstamp_adapter.yml +3 -0
  40. data/spec/fixtures/adapters/normalized/btc_china_adapter.yml +1 -0
  41. data/spec/fixtures/adapters/normalized/btce_adapter.yml +5 -0
  42. data/spec/fixtures/adapters/normalized/coinbase_adapter.yml +680 -0
  43. data/spec/fixtures/adapters/normalized/fixer_adapter.yml +32 -0
  44. data/spec/fixtures/adapters/normalized/forge_adapter.yml +16 -0
  45. data/spec/fixtures/adapters/normalized/huobi_adapter.yml +2 -0
  46. data/spec/fixtures/adapters/normalized/kraken_adapter.yml +4 -0
  47. data/spec/fixtures/adapters/normalized/localbitcoins_adapter.yml +57 -0
  48. data/spec/fixtures/adapters/normalized/okcoin_adapter.yml +4 -0
  49. data/spec/fixtures/adapters/normalized/yahoo_adapter.yml +160 -0
  50. data/spec/fixtures/adapters/okcoin_adapter.yml +40 -0
  51. data/spec/fixtures/adapters/yahoo_adapter.yml +1119 -0
  52. data/spec/lib/adapter_spec.rb +54 -0
  53. data/spec/lib/adapters/crypto/bitfinex_adapter_spec.rb +13 -0
  54. data/spec/lib/adapters/crypto/bitpay_adapter_spec.rb +13 -0
  55. data/spec/lib/adapters/crypto/bitstamp_adapter_spec.rb +13 -0
  56. data/spec/lib/adapters/crypto/btc_china_adapter_spec.rb +13 -0
  57. data/spec/lib/adapters/crypto/btc_e_adapter_spec.rb +13 -0
  58. data/spec/lib/adapters/crypto/coinbase_adapter_spec.rb +13 -0
  59. data/spec/lib/adapters/crypto/huobi_adapter_spec.rb +13 -0
  60. data/spec/lib/adapters/crypto/kraken_adapter_spec.rb +13 -0
  61. data/spec/lib/adapters/crypto/localbitcoins_adapter_spec.rb +13 -0
  62. data/spec/lib/adapters/crypto/okcoin_adapter_spec.rb +13 -0
  63. data/spec/lib/adapters/fiat/fixer_adapter_spec.rb +13 -0
  64. data/spec/lib/adapters/fiat/forge_adapter_spec.rb +23 -0
  65. data/spec/lib/adapters/fiat/yahoo_adapter_spec.rb +13 -0
  66. data/spec/lib/currency_rate_spec.rb +9 -0
  67. data/spec/lib/fetcher_spec.rb +156 -0
  68. data/spec/lib/storage/file_storage_spec.rb +38 -0
  69. data/spec/lib/synchronizer_spec.rb +65 -0
  70. data/spec/spec_helper.rb +23 -8
  71. data/spec/support/matchers/eq_any_of.rb +3 -0
  72. metadata +67 -64
  73. data/Gemfile.lock +0 -93
  74. data/lib/core_ext/deep_get.rb +0 -11
  75. data/lib/crypto_adapter.rb +0 -19
  76. data/lib/crypto_adapters/average_rate_adapter.rb +0 -54
  77. data/lib/crypto_adapters/bitfinex_adapter.rb +0 -40
  78. data/lib/crypto_adapters/bitpay_adapter.rb +0 -33
  79. data/lib/crypto_adapters/bitstamp_adapter.rb +0 -44
  80. data/lib/crypto_adapters/btcchina_adapter.rb +0 -19
  81. data/lib/crypto_adapters/btce_adapter.rb +0 -44
  82. data/lib/crypto_adapters/coinbase_adapter.rb +0 -23
  83. data/lib/crypto_adapters/huobi_adapter.rb +0 -40
  84. data/lib/crypto_adapters/kraken_adapter.rb +0 -42
  85. data/lib/crypto_adapters/localbitcoins_adapter.rb +0 -30
  86. data/lib/crypto_adapters/okcoin_adapter.rb +0 -43
  87. data/lib/fiat_adapter.rb +0 -17
  88. data/lib/fiat_adapters/fixer_adapter.rb +0 -38
  89. data/lib/fiat_adapters/yahoo_adapter.rb +0 -51
  90. data/lib/storage.rb +0 -20
  91. data/spec/currency_rate_spec.rb +0 -52
  92. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/average_rate_adapter.yml +0 -567
  93. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitfinex_adapter.yml +0 -121
  94. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitpay_adapter.yml +0 -272
  95. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/btcchina_adapter.yml +0 -55
  96. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/btce_adapter.yml +0 -223
  97. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/coinbase_adapter.yml +0 -96
  98. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/huobi_adapter.yml +0 -83
  99. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/kraken_adapter.yml +0 -179
  100. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/localbitcoins_adapter.yml +0 -133
  101. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/okcoin_adapter.yml +0 -223
  102. data/spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/fixer_adapter.yml +0 -85
  103. data/spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/yahoo_adapter.yml +0 -48
  104. data/spec/lib/crypto_adapter_spec.rb +0 -56
  105. data/spec/lib/crypto_adapters/average_rate_adapter_spec.rb +0 -46
  106. data/spec/lib/crypto_adapters/bitfinex_adapter_spec.rb +0 -38
  107. data/spec/lib/crypto_adapters/bitpay_adapter_spec.rb +0 -40
  108. data/spec/lib/crypto_adapters/bitstamp_adapter_spec.rb +0 -44
  109. data/spec/lib/crypto_adapters/btcchina_adapter_spec.rb +0 -36
  110. data/spec/lib/crypto_adapters/btce_adapter_spec.rb +0 -42
  111. data/spec/lib/crypto_adapters/coinbase_adapter_spec.rb +0 -39
  112. data/spec/lib/crypto_adapters/huobi_adapter_spec.rb +0 -38
  113. data/spec/lib/crypto_adapters/kraken_adapter_spec.rb +0 -38
  114. data/spec/lib/crypto_adapters/localbitcoins_adapter_spec.rb +0 -36
  115. data/spec/lib/crypto_adapters/okcoin_adapter_spec.rb +0 -43
  116. data/spec/lib/fiat_adapters/fixer_adapter_spec.rb +0 -25
  117. data/spec/lib/fiat_adapters/yahoo_adapter_spec.rb +0 -25
  118. data/spec/lib/storage_spec.rb +0 -32
@@ -1,56 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CurrencyRate::CryptoAdapter do
4
-
5
- class CurrencyRate::Adapter
6
- FETCH_URL = ''
7
- DEFAULT_CURRENCIES = { from: "BTC", to: "USD" }
8
- end
9
-
10
- class SomeExchangeAdapter < CurrencyRate::CryptoAdapter
11
- SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
12
-
13
- def rate_for(from,to)
14
- super
15
- rate = rate_to_f(750)
16
- invert_rate(from,to,rate)
17
- end
18
-
19
- def supported_currency_pairs
20
- ["USD/BTC"]
21
- end
22
- end
23
-
24
- before(:each) do
25
- @exchange_adapter = CurrencyRate::CryptoAdapter.instance
26
- end
27
-
28
- it "inverts currency rate when needed" do
29
- allow(SomeExchangeAdapter.instance).to receive(:fetch_rates!)
30
- @exchange_adapter = SomeExchangeAdapter.instance
31
- expect(@exchange_adapter.rate_for('USD', 'BTC')).to eq(0.001333333)
32
- end
33
-
34
-
35
- it "when checking for rates, only calls fetch_rates! if they were checked long time ago or never" do
36
- uri_mock = double('uri mock')
37
- expect(URI).to receive(:parse).and_return(uri_mock).once
38
- expect(uri_mock).to receive(:read).and_return('{ "USD": 534.4343 }').once
39
- allow(@exchange_adapter).to receive(:supported_currency_pairs).and_return(["USD/BTC"])
40
- @exchange_adapter.rate_for('USD', 'BTC')
41
- @exchange_adapter.rate_for('USD', 'BTC') # not calling fetch_rates! because we've just checked
42
- @exchange_adapter.instance_variable_set(:@rates_updated_at, Time.now-1900)
43
- @exchange_adapter.rate_for('USD', 'BTC')
44
- end
45
-
46
- it "raises exception if rate is nil" do
47
- rate = nil
48
- expect( -> { @exchange_adapter.rate_to_f(rate) }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
49
- end
50
-
51
- it "raises exception if target currency is not in supported currencies" do
52
- @exchange_adapter = SomeExchangeAdapter.instance
53
- expect( -> { @exchange_adapter.rate_for("BTC", "CNY") }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
54
- end
55
-
56
- end
@@ -1,46 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CurrencyRate::AverageRateAdapter do
4
-
5
- before :each do
6
- VCR.insert_cassette 'exchange_rate_adapters/btc_adapters/average_rate_adapter'
7
- end
8
-
9
- after :each do
10
- VCR.eject_cassette
11
- end
12
-
13
- before(:each) do
14
- @average_rates_adapter = CurrencyRate::AverageRateAdapter.instance(
15
- CurrencyRate::BitstampAdapter,
16
- CurrencyRate::BitpayAdapter.instance,
17
- )
18
- end
19
-
20
- it "calculates average rate" do
21
- expect(@average_rates_adapter.rate_for('BTC', 'USD')).to eq 1016.38
22
- end
23
-
24
- it "fetches rates for all adapters" do
25
- expect(@average_rates_adapter.fetch_rates!).not_to be_empty
26
- end
27
-
28
- it 'raises error if all adapters failed to fetch rates' do
29
- adapter_mocks = [double('adapter_1'), double('adapter_2')]
30
- adapter_mocks.each do |adapter|
31
- expect(adapter).to receive(:fetch_rates!).and_raise(CurrencyRate::Adapter::FetchingFailed)
32
- end
33
- average_rates_adapter = CurrencyRate::AverageRateAdapter.instance(*adapter_mocks)
34
- expect( -> { average_rates_adapter.fetch_rates! }).to raise_error(CurrencyRate::Adapter::FetchingFailed)
35
- end
36
-
37
- it "raises exception if all adapters fail to get rates" do
38
- expect( -> { @average_rates_adapter.rate_for('BTC', 'FEDcoin') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
39
- end
40
-
41
- it "raises exception if unallowed method is called" do # fetch_rates! is not to be used in AverageRateAdapter itself
42
- expect( -> { @average_rates_adapter.get_rate_value_from_hash(nil, 'nothing') }).to raise_error("This method is not supposed to be used in #{@average_rates_adapter.class}.")
43
- expect( -> { @average_rates_adapter.rate_to_f(nil) }).to raise_error("This method is not supposed to be used in #{@average_rates_adapter.class}.")
44
- end
45
-
46
- end
@@ -1,38 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CurrencyRate::BitfinexAdapter do
4
-
5
- before :each do
6
- VCR.insert_cassette 'exchange_rate_adapters/btc_adapters/bitfinex_adapter'
7
- end
8
-
9
- after :each do
10
- VCR.eject_cassette
11
- end
12
-
13
- before(:each) do
14
- @exchange_adapter = CurrencyRate::BitfinexAdapter.instance
15
- end
16
-
17
- it "finds the rate for currency code" do
18
- expect(@exchange_adapter.rate_for('BTC', 'USD')).to eq(1016.9)
19
- expect(@exchange_adapter.rate_for('USD', 'BTC')).to eq(0.000983381)
20
- expect(@exchange_adapter.rate_for('LTC', 'USD')).to eq(3.9526)
21
- expect(@exchange_adapter.rate_for('USD', 'LTC')).to eq(0.252998027)
22
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'USD') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
23
- end
24
-
25
- it "raises exception if rate is nil" do
26
- json_response_1 = '{}'
27
- json_response_2 = '{"mid":"762.495","bid":"762.49","ask":"762.5","last_price":"762.5","low":"743.1","high":"775.0","volume":"25680.26724445","timestamp":"1466405569.857112499"}'
28
- json_response_3 = '{"mid":"762.495","bid":"762.49","ask":"762.5","last_price":"762.5","low":"743.1","high":"775.0","volume":"25680.26724445","timestamp":"1466405569.857112499"}'
29
- uri_mock = double('uri mock')
30
- allow(uri_mock).to receive(:read).with(read_timeout: 4).and_return(json_response_1, json_response_2, json_response_3)
31
- allow(URI).to receive(:parse).and_return(uri_mock)
32
- 3.times do
33
- @exchange_adapter.fetch_rates!
34
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'BTC') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
35
- end
36
- end
37
-
38
- end
@@ -1,40 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CurrencyRate::BitpayAdapter do
4
-
5
- before :each do
6
- VCR.insert_cassette 'exchange_rate_adapters/btc_adapters/average_rate_adapter' # contains request to Bitpay
7
- end
8
-
9
- after :each do
10
- VCR.eject_cassette
11
- end
12
-
13
- before(:each) do
14
- @exchange_adapter = CurrencyRate::BitpayAdapter.instance
15
- end
16
-
17
- it "finds the rate for currency code" do
18
- expect(@exchange_adapter.rate_for('BTC', 'USD')).to eq(1015.59)
19
- expect(@exchange_adapter.rate_for('BTC', 'BTC')).to eq(1)
20
- expect(@exchange_adapter.rate_for('BTC', 'EUR')).to eq(941.895743)
21
- expect(@exchange_adapter.rate_for('EUR', 'BTC')).to eq(1)
22
- expect( -> { @exchange_adapter.rate_for('USD', 'EUR') }).to raise_exception(CurrencyRate::Adapter::CurrencyNotSupported)
23
- expect( -> { @exchange_adapter.rate_for('EUR', 'USD') }).to raise_exception(CurrencyRate::Adapter::CurrencyNotSupported)
24
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'USD') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
25
- end
26
-
27
- it "raises exception if rate is nil" do
28
- json_response_1 = '[{},{}]'
29
- json_response_2 = '[{"code":"USD","name":"US Dollar","rat":223.59},{"code":"EUR","name":"Eurozone Euro","rate":197.179544}]'
30
- json_response_3 = '[{"code":"USD","name":"US Dollar","rate":null},{"code":"EUR","name":"Eurozone Euro","rate":197.179544}]'
31
- uri_mock = double('uri mock')
32
- allow(uri_mock).to receive(:read).with(read_timeout: 4).and_return(json_response_1, json_response_2, json_response_3)
33
- allow(URI).to receive(:parse).and_return(uri_mock)
34
- 3.times do
35
- @exchange_adapter.fetch_rates!
36
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'USD') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
37
- end
38
- end
39
-
40
- end
@@ -1,44 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CurrencyRate::BitstampAdapter do
4
-
5
- before :each do
6
- VCR.insert_cassette 'exchange_rate_adapters/btc_adapters/average_rate_adapter' # contains request to Bistamp
7
- end
8
-
9
- after :each do
10
- VCR.eject_cassette
11
- end
12
-
13
- before(:each) do
14
- @exchange_adapter = CurrencyRate::BitstampAdapter.instance
15
- end
16
-
17
- it "finds the rate for currency code" do
18
- expect(@exchange_adapter.rate_for('BTC', 'USD')).to eq(1017.17)
19
- expect(@exchange_adapter.rate_for('USD', 'BTC').to_f).to eq(0.00098312)
20
- expect(@exchange_adapter.rate_for('BTC', 'EUR')).to eq(946.0)
21
- expect(@exchange_adapter.rate_for('EUR', 'BTC').to_f).to eq(0.001057082)
22
- expect(@exchange_adapter.rate_for('LTC', 'USD')).to eq(41.01)
23
- expect(@exchange_adapter.rate_for('USD', 'LTC')).to eq(0.024384297)
24
- expect(@exchange_adapter.rate_for('LTC', 'EUR')).to eq(35.62)
25
- expect(@exchange_adapter.rate_for('EUR', 'LTC')).to eq(0.028074116)
26
- expect(@exchange_adapter.rate_for('USD', 'EUR').to_f).to eq(0.933619643)
27
- expect(@exchange_adapter.rate_for('EUR', 'USD')).to eq(1.0711)
28
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'USD') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
29
- end
30
-
31
- it "raises exception if rate is nil" do
32
- json_response_1 = '{}'
33
- json_response_2 = '{"high": "232.89", "list": "224.13", "timestamp": "1423457015", "bid": "224.00", "vwap": "224.57", "volume": "14810.41127494", "low": "217.28", "ask": "224.13"}'
34
- json_response_3 = '{"high": "232.89", "last": null, "timestamp": "1423457015", "bid": "224.00", "vwap": "224.57", "volume": "14810.41127494", "low": "217.28", "ask": "224.13"}'
35
- uri_mock = double('uri mock')
36
- allow(uri_mock).to receive(:read).with(read_timeout: 4).and_return(json_response_1, json_response_2, json_response_3)
37
- allow(URI).to receive(:parse).and_return(uri_mock)
38
- 3.times do
39
- @exchange_adapter.fetch_rates!
40
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'BTC') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
41
- end
42
- end
43
-
44
- end
@@ -1,36 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CurrencyRate::BTCChinaAdapter do
4
-
5
- before :each do
6
- VCR.insert_cassette 'exchange_rate_adapters/btc_adapters/btcchina_adapter'
7
- end
8
-
9
- after :each do
10
- VCR.eject_cassette
11
- end
12
-
13
- before(:each) do
14
- @exchange_adapter = CurrencyRate::BTCChinaAdapter.instance
15
- end
16
-
17
- it "finds the rate for currency code" do
18
- expect(@exchange_adapter.rate_for('BTC', 'CNY')).to eq(7243.99)
19
- expect(@exchange_adapter.rate_for('CNY', 'BTC').to_f).to eq(0.000138045)
20
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'USD') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
21
- end
22
-
23
- it "raises exception if rate is nil" do
24
- json_response_1 = '{}'
25
- json_response_2 = '{"ticker":{"high":"5119.92","low":"4980.00","buy":"5081.50","sell":"5081.97","last":"5081.98","vol":"44572.00110000","date":1466406593,"vwap":"5056.91","prev_close":"5096.97","open":"5096.28"}}'
26
- json_response_3 = '{"ticker":{"high":"5119.92","low":"4980.00","buy":"5081.50","sell":"5081.97","last":"5081.98","vol":"44572.00110000","date":1466406593,"vwap":"5056.91","prev_close":"5096.97","open":"5096.28"}}'
27
- uri_mock = double('uri mock')
28
- allow(uri_mock).to receive(:read).with(read_timeout: 4).and_return(json_response_1, json_response_2, json_response_3)
29
- allow(URI).to receive(:parse).and_return(uri_mock)
30
- 3.times do
31
- @exchange_adapter.fetch_rates!
32
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'BTC') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
33
- end
34
- end
35
-
36
- end
@@ -1,42 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CurrencyRate::BtceAdapter do
4
-
5
- before :each do
6
- VCR.insert_cassette 'exchange_rate_adapters/btc_adapters/btce_adapter'
7
- end
8
-
9
- after :each do
10
- VCR.eject_cassette
11
- end
12
-
13
- before(:each) do
14
- @exchange_adapter = CurrencyRate::BtceAdapter.instance
15
- end
16
-
17
- it "finds the rate for currency code" do
18
- expect(@exchange_adapter.rate_for('BTC', 'USD')).to eq(996.995)
19
- expect(@exchange_adapter.rate_for('USD', 'BTC').to_f).to eq(0.001003014)
20
- expect(@exchange_adapter.rate_for('BTC', 'EUR')).to eq(947.661)
21
- expect(@exchange_adapter.rate_for('EUR', 'BTC').to_f).to eq(0.00105523)
22
- expect(@exchange_adapter.rate_for('USD', 'RUB')).to eq(59.2)
23
- expect(@exchange_adapter.rate_for('RUB', 'USD').to_f).to eq(0.016891892)
24
- expect(@exchange_adapter.rate_for('EUR', 'RUB')).to eq(62.06926)
25
- expect(@exchange_adapter.rate_for('RUB', 'EUR').to_f).to eq(0.016111035)
26
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'USD') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
27
- end
28
-
29
- it "rases exception if rate is nil" do
30
- json_response_1 = '{"ticker":{}}'
31
- json_response_2 = '{"ticker":{"high":235,"low":215.89999,"avg":225.449995,"vol":2848293.72397,"vol_cur":12657.55799,"bambo":221.444,"buy":221.629,"sell":220.98,"updated":1422678812,"server_time":1422678813}}'
32
- json_response_3 = '{"ticker":{"high":235,"low":215.89999,"avg":225.449995,"vol":2848293.72397,"vol_cur":12657.55799,"last":null,"buy":221.629,"sell":220.98,"updated":1422678812,"server_time":1422678813}}'
33
- uri_mock = double('uri mock')
34
- allow(uri_mock).to receive(:read).with(read_timeout: 4).and_return(json_response_1, json_response_2, json_response_3)
35
- allow(URI).to receive(:parse).and_return(uri_mock)
36
- 3.times do
37
- @exchange_adapter.fetch_rates!
38
- expect( -> { @exchange_adapter.rate_for('USD', 'EUR') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
39
- end
40
- end
41
-
42
- end
@@ -1,39 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CurrencyRate::CoinbaseAdapter do
4
-
5
- before :each do
6
- VCR.insert_cassette 'exchange_rate_adapters/btc_adapters/coinbase_adapter'
7
- end
8
-
9
- after :each do
10
- VCR.eject_cassette
11
- end
12
-
13
- before(:each) do
14
- @exchange_adapter = CurrencyRate::CoinbaseAdapter.instance
15
- end
16
-
17
- it "finds the rate for currency code" do
18
- expect(@exchange_adapter.rate_for('BTC', 'USD')).to eq(1019.98)
19
- expect(@exchange_adapter.rate_for('USD', 'BTC')).to eq(0.00098)
20
- expect(@exchange_adapter.rate_for('LTC', 'USD')).to eq(3.95)
21
- expect(@exchange_adapter.rate_for('USD', 'LTC')).to eq(0.253165)
22
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'USD') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
23
- end
24
-
25
- it "raises exception if rate is nil" do
26
- json_response_1 = '{}'
27
- json_response_2 = '{"btc_to_urd":"224.41","usd_to_xpf":"105.461721","bsd_to_btc":"0.004456"}'
28
- json_response_3 = '{"btc_to_usd":null,"usd_to_xpf":"105.461721","bsd_to_btc":"0.004456"}'
29
- uri_mock = double('uri mock')
30
- allow(uri_mock).to receive(:read).with(read_timeout: 4).and_return(json_response_1, json_response_2, json_response_3)
31
- allow(URI).to receive(:parse).and_return(uri_mock)
32
- 3.times do
33
- @exchange_adapter.fetch_rates!
34
- expect( -> { @exchange_adapter.rate_for('FEDCoin', 'BTC') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
35
- end
36
-
37
- end
38
-
39
- end
@@ -1,38 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CurrencyRate::HuobiAdapter do
4
-
5
- before :each do
6
- VCR.insert_cassette 'exchange_rate_adapters/btc_adapters/huobi_adapter'
7
- end
8
-
9
- after :each do
10
- VCR.eject_cassette
11
- end
12
-
13
- before(:each) do
14
- @exchange_adapter = CurrencyRate::HuobiAdapter.instance
15
- end
16
-
17
- it "finds the rate for currency code" do
18
- expect(@exchange_adapter.rate_for('BTC', 'CNY')).to eq(7216.25)
19
- expect(@exchange_adapter.rate_for('CNY', 'BTC').to_f).to eq(0.000138576)
20
- expect(@exchange_adapter.rate_for('LTC', 'CNY')).to eq(27.99)
21
- expect(@exchange_adapter.rate_for('CNY', 'LTC').to_f).to eq(0.035727045)
22
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'USD') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
23
- end
24
-
25
- it "raises exception if rate is nil" do
26
- json_response_1 = '{}'
27
- json_response_2 = '{"time":"1466406045","ticker":{"open":5108.77,"vol":533438.162,"symbol":"btccny","last":5081.29,"buy":5081.13,"sell":5081.29,"high":5138,"low":5010.5} }'
28
- json_response_3 = '{"time":"1466406045","ticker":{"open":5108.77,"vol":533438.162,"symbol":"btccny","last":5081.29,"buy":5081.13,"sell":5081.29,"high":5138,"low":5010.5} }'
29
- uri_mock = double('uri mock')
30
- allow(uri_mock).to receive(:read).with(read_timeout: 4).and_return(json_response_1, json_response_2, json_response_3)
31
- allow(URI).to receive(:parse).and_return(uri_mock)
32
- 3.times do
33
- @exchange_adapter.fetch_rates!
34
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'BTC') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
35
- end
36
- end
37
-
38
- end
@@ -1,38 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CurrencyRate::KrakenAdapter do
4
-
5
- before :each do
6
- VCR.insert_cassette 'exchange_rate_adapters/btc_adapters/kraken_adapter'
7
- end
8
-
9
- after :each do
10
- VCR.eject_cassette
11
- end
12
-
13
- before(:each) do
14
- @exchange_adapter = CurrencyRate::KrakenAdapter.instance
15
- end
16
-
17
- it "finds the rate for currency code" do
18
- expect(@exchange_adapter.rate_for('BTC', 'USD')).to eq(1018.0)
19
- expect(@exchange_adapter.rate_for('USD', 'BTC').to_f).to eq(0.000982318)
20
- expect(@exchange_adapter.rate_for('BTC', 'EUR')).to eq(945.33)
21
- expect(@exchange_adapter.rate_for('EUR', 'BTC').to_f).to eq(0.001057832)
22
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'USD') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
23
- end
24
-
25
- it "raises exception if rate is nil" do
26
- json_response_1 = '{"error":[],"result":{}}'
27
- json_response_2 = '{"error":[],"result":{"XXBTZUSD":{"a":["244.95495","1"],"b":["227.88761","1"],"abc":["228.20494","0.10000000"],"v":["5.18645337","24.04033530"],"p":["234.92296","234.41356"],"t":[45,74],"l":["228.20494","228.20494"],"h":["239.36069","239.36069"],"o":"231.82976"}}}'
28
- json_response_3 = '{"error":[],"result":{"XXBTZUSD":{"a":["244.95495","1"],"b":["227.88761","1"],"c":[null,"0.10000000"],"v":["5.18645337","24.04033530"],"p":["234.92296","234.41356"],"t":[45,74],"l":["228.20494","228.20494"],"h":["239.36069","239.36069"],"o":"231.82976"}}}'
29
- uri_mock = double('uri mock')
30
- allow(uri_mock).to receive(:read).with(read_timeout: 4).and_return(json_response_1, json_response_2, json_response_3)
31
- allow(URI).to receive(:parse).and_return(uri_mock)
32
- 3.times do
33
- @exchange_adapter.fetch_rates!
34
- expect( -> { @exchange_adapter.rate_for('FEDCoin', 'USD') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
35
- end
36
- end
37
-
38
- end
@@ -1,36 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CurrencyRate::LocalbitcoinsAdapter do
4
-
5
- before :each do
6
- VCR.insert_cassette 'exchange_rate_adapters/btc_adapters/localbitcoins_adapter'
7
- end
8
-
9
- after :each do
10
- VCR.eject_cassette
11
- end
12
-
13
- before(:each) do
14
- @exchange_adapter = CurrencyRate::LocalbitcoinsAdapter.instance
15
- end
16
-
17
- it "finds the rate for currency code" do
18
- expect(@exchange_adapter.rate_for('BTC', 'USD')).to eq(1420.45)
19
- expect(@exchange_adapter.rate_for('USD', 'BTC')).to eq(BigDecimal.new('0.000704002'))
20
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'USD') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
21
- end
22
-
23
- it "rases exception if rate is nil" do
24
- json_response_1 = '{"USD": {}}'
25
- json_response_2 = '{"USD": {"volume_btc": "2277.85", "rates": {"bambo": "263.78"}, "avg_1h": 287.6003904801631, "avg_24h": 253.58144543993674, "avg_12h": 252.29202866050034}}'
26
- json_response_3 = '{"USD": {"volume_btc": "2277.85", "rates": {"last": null}, "avg_1h": 287.6003904801631, "avg_24h": 253.58144543993674, "avg_12h": 252.29202866050034}}'
27
- uri_mock = double('uri mock')
28
- allow(uri_mock).to receive(:read).with(read_timeout: 4).and_return(json_response_1, json_response_2, json_response_3)
29
- allow(URI).to receive(:parse).and_return(uri_mock)
30
- 3.times do
31
- @exchange_adapter.fetch_rates!
32
- expect( -> { @exchange_adapter.rate_for('FEDcoin', 'USD') }).to raise_error(CurrencyRate::Adapter::CurrencyNotSupported)
33
- end
34
- end
35
-
36
- end