diff --git a/.travis.yml b/.travis.yml index d3eb170..9d7e00b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ rvm: - - 1.9.3 - - 2.0.0 - - rbx-19mode - - jruby-19mode \ No newline at end of file + - 2.3.0 + - 3.1.2 + - rbx-3 + - jruby-head \ No newline at end of file diff --git a/currencylayer.gemspec b/currencylayer.gemspec index c372663..02630e5 100644 --- a/currencylayer.gemspec +++ b/currencylayer.gemspec @@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) Gem::Specification.new do |spec| spec.name = "currencylayer" - spec.version = '0.0.2' + spec.version = '0.0.3' spec.authors = ["Andrey Skuratovsky"] spec.email = ["skuratowsky@gmail.com"] spec.summary = "Access to the currencylayer.com online exchange rates" @@ -20,6 +20,6 @@ Gem::Specification.new do |spec| spec.add_development_dependency "rspec", ">= 3.0.0" spec.add_development_dependency "timecop" spec.add_development_dependency "webmock" - spec.add_development_dependency "bundler", "~> 1.7" + spec.add_development_dependency "bundler", "~> 2.3" spec.add_development_dependency "rake", "~> 10.0" end diff --git a/lib/money/bank/currencylayer.rb b/lib/money/bank/currencylayer.rb index e55399b..e821e50 100644 --- a/lib/money/bank/currencylayer.rb +++ b/lib/money/bank/currencylayer.rb @@ -23,11 +23,11 @@ def message class Currencylayer < Money::Bank::VariableExchange include OnTimePatch - # Host of service jsonrates - SERVICE_HOST = "apilayer.net" + # new host for currencylayer.com API + SERVICE_HOST = "api.apilayer.com" - # Relative path of jsonrates api - SERVICE_PATH = "/api/live" + # Relative path of Exchange api + SERVICE_PATH = "/currency_data/live" # accessor of access_key of jsonrates.com service attr_accessor :access_key @@ -283,7 +283,7 @@ def add_rate_with_time(from, to, rate) # # @return [Numeric] def set_rate_with_time(from, to, rate) - rate_d = BigDecimal.new(rate.to_s) + rate_d = BigDecimal(rate.to_s) self.store.transaction { self.store.add_rate(from, to, { rate: rate_d, created_at: Time.now }) @@ -320,10 +320,11 @@ def fetch_rate(from, to) # Performs request on uri or raise exception message with RequestError # # @param [String] uri Requested uri + # @param [Hash] apikey Access key # # @return [String] def perform_request(uri) - uri.read + uri.read('apikey' => access_key) rescue Exception => e raise RequestError, e.message end @@ -354,7 +355,7 @@ def extract_rate(data, from, to) request_hash = JSON.parse(data) success = request_hash['success'] raise RequestError, request_hash['error']['info'] unless success - BigDecimal.new(request_hash['quotes']["#{from}#{to}"].to_s) + BigDecimal(request_hash['quotes']["#{from}#{to}"].to_s) end end end diff --git a/spec/currencylayer_spec.rb b/spec/currencylayer_spec.rb index f6985d6..9839831 100644 --- a/spec/currencylayer_spec.rb +++ b/spec/currencylayer_spec.rb @@ -1,4 +1,5 @@ require 'spec_helper' +include StubHelper describe "Currencylayer" do let(:bank) { Money::Bank::Currencylayer.new } @@ -18,14 +19,13 @@ describe '.get_rate' do it 'returns rate' do uri = bank.send(:build_uri, 'USD', 'EUR').to_s - stub_request(:get, uri).to_return( :status => 200, - :body => '{"success":true,"terms":"https:\/\/currencylayer.com\/terms","privacy":"https:\/\/currencylayer.com\/privacy","timestamp":1434443053,"source":"USD","quotes":{"USDEUR":0.887701}}') + stub_request(:get, uri).to_return(get_rate_USDEUR_success) bank.flush_rates rate = bank.get_rate('USD', 'EUR') - expect(rate).to eq(BigDecimal.new("0.887701")) + expect(rate).to eq(BigDecimal("0.947553e0")) end context "in careful mode" do @@ -40,11 +40,11 @@ uri = bank.send(:build_uri, 'USD', 'EUR').to_s - stub_request(:get, uri).to_return(:status => 200, :body => '{"success":false,"error":{"code":202,"info":"You have provided one or more invalid Currency Codes. [Required format: currencies=EUR,USD,GBP,...]"}}') + stub_request(:get, uri).to_return(get_rate_USDEUR_failure) rate = bank.get_rate('USD', 'EUR') - expect(rate).to eq(BigDecimal.new("1.011")) + expect(rate).to eq(BigDecimal("1.011")) Money::Bank::Currencylayer.rates_careful = false end @@ -72,7 +72,7 @@ it 'returns cached value if exception raised' do bank.flush_rates bank.add_rate("USD", "CAD", 32.231) - expect(bank.get_rate("USD", "CAD")).to eq (BigDecimal.new('32.231')) + expect(bank.get_rate("USD", "CAD")).to eq (BigDecimal('32.231')) end end @@ -119,4 +119,23 @@ end end end + + describe '.build_uri' do + it 'includes new host and path' do + uri = bank.send(:build_uri, 'USD', 'EUR') + expect(uri.host).to eq("api.apilayer.com") + expect(uri.path).to eq("/currency_data/live") + end + end + + describe '.perform_request' do + it 'includes auth header' do + uri = bank.send(:build_uri, 'USD', 'EUR') + stub_request(:get, uri.to_s).to_return(get_rate_USDEUR_success) + + bank.flush_rates + expect(uri).to receive(:read).with('apikey' => bank.access_key) + bank.send(:perform_request, uri) + end + end end \ No newline at end of file diff --git a/spec/helpers/stub_helper.rb b/spec/helpers/stub_helper.rb new file mode 100644 index 0000000..cf52f7d --- /dev/null +++ b/spec/helpers/stub_helper.rb @@ -0,0 +1,37 @@ +module StubHelper + def get_rate_USDEUR_success + { + :status => 200, + :body => '{ + "success": true, + "timestamp": 1670518143, + "source": "USD", + "quotes": { + "USDEUR": 0.947553 + } + }' + } + end + + def get_rate_USDEUR_failure + { + :status => 200, + :body => '{ + "success": false, + "error": { + "code": 202, + "info": "You have provided one or more invalid Currency Codes. [Required format: currencies=EUR,USD,GBP,...]" + } + }' + } + end + + def get_rate_unauthorized + { + :status => 401, + :body => '{ + "message": "No API key found in request" + }' + } + end +end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index e51bb11..2ff776f 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,4 +1,5 @@ require 'timecop' require 'money' require 'money/bank/currencylayer' -require 'webmock/rspec' \ No newline at end of file +require 'webmock/rspec' +require 'helpers/stub_helper' \ No newline at end of file