improve coverage for the services (+ minor refactoring)

did committed Feb 04, 2015
commit 637bdd0ef9e1ffcd929988b0a3c24bdaec58bdf6
Showing 5 changed files with 53 additions and 31 deletions
Gemfile.lock +1 -1
@@ @@ -75,7 +75,7 @@ GEM
multi_json (~> 1.0)
rack
erubis (2.7.0)
- execjs (2.2.2)
+ execjs (2.3.0)
ffi (1.9.6)
haml (4.0.6)
tilt
locomotive/steam/core_ext/hash.rb b/lib/locomotive/steam/core_ext/hash.rb +19 -22
@@ @@ -1,27 +1,24 @@
- class Hash
-
- def underscore_keys
- new_hash = {}
-
- self.each_pair do |key, value|
- if value.respond_to?(:collect!) # Array
- value.collect do |item|
- if item.respond_to?(:each_pair) # Hash item within
- item.underscore_keys
- else
- item
- end
+ module HashConverter
+ class << self
+ def to_underscore hash
+ convert hash, :underscore
+ end
+ def to_camel_case hash
+ convert hash, :camelize, :lower
+ end
+ def convert obj, *method
+ case obj
+ when Hash
+ obj.inject({}) do |h,(k,v)|
+ v = convert v, *method
+ h[k.send(*method)] = v
+ h
end
- elsif value.respond_to?(:each_pair) # Hash
- value = value.underscore_keys
+ when Array
+ obj.map {|m| convert m, *method }
+ else
+ obj
end
-
- new_key = key.is_a?(String) ? key.underscore : key # only String keys
-
- new_hash[new_key] = value
end
-
- self.replace(new_hash)
end
-
end
locomotive/steam/services/external_api.rb b/lib/locomotive/steam/services/external_api.rb +1 -5
@@ @@ -44,11 +44,7 @@ module Locomotive
parsed_response = response.parsed_response
if response.code == 200
- if parsed_response.respond_to?(:underscore_keys)
- parsed_response.underscore_keys
- else
- parsed_response.collect(&:underscore_keys)
- end
+ HashConverter.to_underscore parsed_response
else
Locomotive::Common::Logger.error "[WebService] consumed #{path}, #{options.inspect}, response = #{response.inspect}"
nil
spec/unit/services/external_api_spec.rb +25 -3
@@ @@ -6,9 +6,11 @@ describe Locomotive::Steam::Services::ExternalAPI do
describe '#consume' do
- let(:url) { '' }
- let(:options) { {} }
- let(:response) { instance_double('Response', code: 200, parsed_response: OpenStruct.new) }
+ let(:url) { '' }
+ let(:options) { {} }
+ let(:code) { 200 }
+ let(:parsed_response) { Hash.new }
+ let(:response) { instance_double('Response', code: code, parsed_response: parsed_response) }
subject { service.consume(url, options) }
@@ @@ -20,6 +22,26 @@ describe Locomotive::Steam::Services::ExternalAPI do
subject
end
+ describe 'wrong response (<> 200)' do
+
+ let(:code) { 500 }
+ it do
+ expect(service.class).to receive(:get).with('/', { base_uri: 'http://blog.locomotiveapp.org' }).and_return(response)
+ expect(subject).to eq nil
+ end
+
+ end
+
+ describe 'returns a collection instead of a hash' do
+
+ let(:parsed_response) { [{ 'averagePrice' => 1 }] }
+ it do
+ expect(service.class).to receive(:get).with('/', { base_uri: 'http://blog.locomotiveapp.org' }).and_return(response)
+ expect(subject.first['average_price']).to eq 1
+ end
+
+ end
+
end
describe 'sets the base uri from a much more complex url' do
spec/unit/services/image_resizer_spec.rb +7 -0
@@ @@ -56,6 +56,13 @@ describe Locomotive::Steam::Services::ImageResizer do
end
+ describe 'unable to fetch a file' do
+
+ before { allow(service).to receive(:fetch_file).and_return(nil) }
+ it { is_expected.to eq nil }
+
+ end
+
end
end