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 | |