stacker_bee 2.1.1.pre252 → 2.1.1.pre263
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/.rubocop.yml +0 -3
- data/Rakefile +1 -1
- data/bin/stacker_bee +10 -10
- data/lib/stacker_bee/api.rb +4 -4
- data/lib/stacker_bee/client.rb +24 -24
- data/lib/stacker_bee/configuration.rb +13 -7
- data/lib/stacker_bee/connection.rb +5 -5
- data/lib/stacker_bee/http_middleware/detokenizer.rb +2 -2
- data/lib/stacker_bee/http_middleware/signed_query.rb +3 -3
- data/lib/stacker_bee/middleware/adapter.rb +1 -1
- data/lib/stacker_bee/middleware/base.rb +1 -1
- data/lib/stacker_bee/middleware/clean_response.rb +2 -2
- data/lib/stacker_bee/middleware/cloud_stack_api.rb +2 -2
- data/lib/stacker_bee/middleware/dictionary_flattener.rb +3 -3
- data/lib/stacker_bee/middleware/endpoint_normalizer.rb +2 -2
- data/lib/stacker_bee/middleware/error_message.rb +3 -3
- data/lib/stacker_bee/middleware/log_response.rb +1 -1
- data/lib/stacker_bee/middleware/raise_on_http_error.rb +1 -1
- data/lib/stacker_bee/middleware/remove_nils.rb +1 -1
- data/lib/stacker_bee/rash.rb +3 -3
- data/lib/stacker_bee/version.rb +1 -1
- data/lib/stacker_bee.rb +2 -2
- data/spec/integration/configure_middleware_spec.rb +12 -12
- data/spec/integration/console_spec.rb +4 -4
- data/spec/integration/request_spec.rb +46 -46
- data/spec/spec_helper.rb +4 -4
- data/spec/support/vcr.rb +4 -4
- data/spec/units/stacker_bee/api_spec.rb +11 -11
- data/spec/units/stacker_bee/client_spec.rb +19 -19
- data/spec/units/stacker_bee/configuration_spec.rb +28 -28
- data/spec/units/stacker_bee/connection_spec.rb +18 -18
- data/spec/units/stacker_bee/middleware/adapter_spec.rb +7 -7
- data/spec/units/stacker_bee/middleware/base_spec.rb +17 -17
- data/spec/units/stacker_bee/middleware/cloudstack_api_spec.rb +9 -9
- data/spec/units/stacker_bee/middleware/console_access_spec.rb +10 -10
- data/spec/units/stacker_bee/middleware/dictionary_flattener_spec.rb +22 -22
- data/spec/units/stacker_bee/middleware/endpoint_normalizer_spec.rb +4 -4
- data/spec/units/stacker_bee/middleware/error_message_spec.rb +6 -6
- data/spec/units/stacker_bee/middleware/format_keys_spec.rb +2 -2
- data/spec/units/stacker_bee/middleware/format_values_spec.rb +2 -2
- data/spec/units/stacker_bee/middleware/http_status_spec.rb +2 -2
- data/spec/units/stacker_bee/middleware/log_response_spec.rb +15 -15
- data/spec/units/stacker_bee/middleware/remove_empty_strings_spec.rb +4 -4
- data/spec/units/stacker_bee/middleware/remove_nils_spec.rb +1 -1
- data/spec/units/stacker_bee/rash_spec.rb +41 -41
- data/spec/units/stacker_bee/request_error_spec.rb +7 -7
- data/spec/units/stacker_bee/utilities_spec.rb +30 -30
- data/spec/units/stacker_bee_spec.rb +2 -2
- data/stacker_bee.gemspec +24 -22
- metadata +4 -4
| @@ -1,15 +1,15 @@ | |
| 1 | 
            -
            require  | 
| 2 | 
            -
            require  | 
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'logger'
         | 
| 3 3 |  | 
| 4 | 
            -
            describe  | 
| 4 | 
            +
            describe 'A response to a request sent to the CloudStack API', :vcr do
         | 
| 5 5 | 
             
              subject { client.list_accounts }
         | 
| 6 6 |  | 
| 7 | 
            -
              let(:url) { CONFIG[ | 
| 7 | 
            +
              let(:url) { CONFIG['url'] }
         | 
| 8 8 | 
             
              let(:config_hash) do
         | 
| 9 9 | 
             
                {
         | 
| 10 10 | 
             
                  url:         url,
         | 
| 11 | 
            -
                  api_key:     CONFIG[ | 
| 12 | 
            -
                  secret_key:  CONFIG[ | 
| 11 | 
            +
                  api_key:     CONFIG['api_key'],
         | 
| 12 | 
            +
                  secret_key:  CONFIG['secret_key'],
         | 
| 13 13 | 
             
                  middlewares: middlewares
         | 
| 14 14 | 
             
                }
         | 
| 15 15 | 
             
              end
         | 
| @@ -21,77 +21,77 @@ describe "A response to a request sent to the CloudStack API", :vcr do | |
| 21 21 |  | 
| 22 22 | 
             
              it { should_not be_empty }
         | 
| 23 23 |  | 
| 24 | 
            -
              context  | 
| 24 | 
            +
              context 'first item' do
         | 
| 25 25 | 
             
                subject { client.list_accounts.first }
         | 
| 26 | 
            -
                it { should include  | 
| 27 | 
            -
                its([ | 
| 28 | 
            -
                its([ | 
| 26 | 
            +
                it { should include 'id' }
         | 
| 27 | 
            +
                its(['accounttype'])  { should be_a Numeric }
         | 
| 28 | 
            +
                its(['account_type']) { should be_a Numeric }
         | 
| 29 29 | 
             
              end
         | 
| 30 30 |  | 
| 31 | 
            -
              context  | 
| 32 | 
            -
                let(:url) {  | 
| 33 | 
            -
                it  | 
| 31 | 
            +
              context 'failing to connect' do
         | 
| 32 | 
            +
                let(:url) { 'http://127.0.0.1:666/client/api' }
         | 
| 33 | 
            +
                it 'raises a helpful exception' do
         | 
| 34 34 | 
             
                  klass = StackerBee::ConnectionError
         | 
| 35 35 | 
             
                  expect { subject }.to raise_error klass, /#{url}/
         | 
| 36 36 | 
             
                end
         | 
| 37 37 | 
             
              end
         | 
| 38 38 |  | 
| 39 | 
            -
              context  | 
| 40 | 
            -
                let(:url) { CONFIG[ | 
| 41 | 
            -
                it  | 
| 39 | 
            +
              context 'trailing slash in URL', :regression do
         | 
| 40 | 
            +
                let(:url) { CONFIG['url'].gsub(/\/$/, '') + '/' }
         | 
| 41 | 
            +
                it 'makes request with trailing slash' do
         | 
| 42 42 | 
             
                  stub = stub_request(:get, /#{url}/).to_return(body: '{"foo": {}}')
         | 
| 43 43 | 
             
                  subject
         | 
| 44 44 | 
             
                  stub.should have_been_requested
         | 
| 45 45 | 
             
                end
         | 
| 46 46 | 
             
              end
         | 
| 47 47 |  | 
| 48 | 
            -
              context  | 
| 48 | 
            +
              context 'space character in a request parameter', :regression do
         | 
| 49 49 | 
             
                subject { client.list_accounts(params) }
         | 
| 50 | 
            -
                let(:params) { { name:  | 
| 50 | 
            +
                let(:params) { { name: 'stacker bee' } }
         | 
| 51 51 |  | 
| 52 | 
            -
                it  | 
| 52 | 
            +
                it 'properly signs the request' do
         | 
| 53 53 | 
             
                  expect { subject }.not_to raise_error
         | 
| 54 54 | 
             
                end
         | 
| 55 55 | 
             
              end
         | 
| 56 56 |  | 
| 57 | 
            -
              context  | 
| 57 | 
            +
              context 'a nil request parameter' do
         | 
| 58 58 | 
             
                subject { client.list_accounts(params) }
         | 
| 59 59 | 
             
                let(:params) { { name: nil } }
         | 
| 60 60 |  | 
| 61 | 
            -
                it  | 
| 61 | 
            +
                it 'properly executes the request' do
         | 
| 62 62 | 
             
                  expect { subject }.not_to raise_error
         | 
| 63 63 | 
             
                end
         | 
| 64 64 | 
             
              end
         | 
| 65 65 |  | 
| 66 | 
            -
              context  | 
| 66 | 
            +
              context 'a request parameter with and empty string', :regression do
         | 
| 67 67 | 
             
                subject { client.list_accounts(params) }
         | 
| 68 68 | 
             
                let(:params) { { name: '' } }
         | 
| 69 69 |  | 
| 70 | 
            -
                it  | 
| 70 | 
            +
                it 'properly executes the request' do
         | 
| 71 71 | 
             
                  expect { subject }.not_to raise_error
         | 
| 72 72 | 
             
                end
         | 
| 73 73 | 
             
              end
         | 
| 74 74 |  | 
| 75 | 
            -
              context  | 
| 75 | 
            +
              context 'a request that triggers an error' do
         | 
| 76 76 | 
             
                subject { client.list_accounts(domain_id: 666) }
         | 
| 77 77 |  | 
| 78 78 | 
             
                let(:message) { "Domain id=666 doesn't exist" }
         | 
| 79 | 
            -
                it  | 
| 79 | 
            +
                it 'properly signs the request' do
         | 
| 80 80 | 
             
                  expect { subject }.to raise_error StackerBee::ClientError, message
         | 
| 81 81 | 
             
                end
         | 
| 82 82 | 
             
              end
         | 
| 83 83 |  | 
| 84 | 
            -
              context  | 
| 84 | 
            +
              context 'a request parameter with an Array', :regression do
         | 
| 85 85 | 
             
                subject { client.list_hosts(params).first.keys }
         | 
| 86 86 | 
             
                let(:params) { { page: 1, pagesize: 1, details: [:events, :stats] } }
         | 
| 87 | 
            -
                it { should include  | 
| 88 | 
            -
                it { should include  | 
| 89 | 
            -
                it { should_not include  | 
| 87 | 
            +
                it { should include 'cpuused' }
         | 
| 88 | 
            +
                it { should include 'events' }
         | 
| 89 | 
            +
                it { should_not include 'cpuallocated' }
         | 
| 90 90 | 
             
              end
         | 
| 91 91 |  | 
| 92 | 
            -
              context  | 
| 93 | 
            -
                let(:zone_id) { client.list_zones.first[ | 
| 94 | 
            -
                let(:service_offering_id) { service_offerings.first[ | 
| 92 | 
            +
              context 'a request parameter with a map' do
         | 
| 93 | 
            +
                let(:zone_id) { client.list_zones.first['id'] }
         | 
| 94 | 
            +
                let(:service_offering_id) { service_offerings.first['id'] }
         | 
| 95 95 |  | 
| 96 96 | 
             
                let(:service_offerings) do
         | 
| 97 97 | 
             
                  client.list_network_offerings(
         | 
| @@ -103,42 +103,42 @@ describe "A response to a request sent to the CloudStack API", :vcr do | |
| 103 103 | 
             
                let(:network) do
         | 
| 104 104 | 
             
                  client.create_network(zone_id: zone_id,
         | 
| 105 105 | 
             
                                        network_offering_id: service_offering_id,
         | 
| 106 | 
            -
                                        name:  | 
| 106 | 
            +
                                        name: 'John', displaytext: 'John')
         | 
| 107 107 | 
             
                end
         | 
| 108 108 |  | 
| 109 109 | 
             
                let(:tag) do
         | 
| 110 | 
            -
                  client.create_tags(resource_type:  | 
| 111 | 
            -
                                     resource_ids: network[ | 
| 112 | 
            -
                                     tags: {  | 
| 110 | 
            +
                  client.create_tags(resource_type: 'Network',
         | 
| 111 | 
            +
                                     resource_ids: network['id'],
         | 
| 112 | 
            +
                                     tags: { 'speed [lab]' => 'real fast!' })
         | 
| 113 113 | 
             
                end
         | 
| 114 114 |  | 
| 115 | 
            -
                it  | 
| 115 | 
            +
                it 'can create an object' do
         | 
| 116 116 | 
             
                  tag.should_not be_nil
         | 
| 117 117 | 
             
                end
         | 
| 118 118 | 
             
              end
         | 
| 119 119 |  | 
| 120 | 
            -
              describe  | 
| 120 | 
            +
              describe 'middleware' do
         | 
| 121 121 | 
             
                let(:middlewares) do
         | 
| 122 122 | 
             
                  lambda do |builder|
         | 
| 123 123 | 
             
                    builder.use middleware_class
         | 
| 124 124 | 
             
                  end
         | 
| 125 125 | 
             
                end
         | 
| 126 126 |  | 
| 127 | 
            -
                context  | 
| 127 | 
            +
                context 'a middleware that matches the content type' do
         | 
| 128 128 | 
             
                  let(:middleware_class) do
         | 
| 129 129 | 
             
                    Class.new(StackerBee::Middleware::Base) do
         | 
| 130 130 | 
             
                      def content_types
         | 
| 131 131 | 
             
                        /javascript/
         | 
| 132 132 | 
             
                      end
         | 
| 133 133 |  | 
| 134 | 
            -
                      def after( | 
| 135 | 
            -
                        fail  | 
| 134 | 
            +
                      def after(_env)
         | 
| 135 | 
            +
                        fail 'Middleware Used'
         | 
| 136 136 | 
             
                      end
         | 
| 137 137 | 
             
                    end
         | 
| 138 138 | 
             
                  end
         | 
| 139 139 |  | 
| 140 | 
            -
                  it  | 
| 141 | 
            -
                    expect { client.list_accounts }.to raise_error  | 
| 140 | 
            +
                  it 'uses the middleware' do
         | 
| 141 | 
            +
                    expect { client.list_accounts }.to raise_error 'Middleware Used'
         | 
| 142 142 | 
             
                  end
         | 
| 143 143 | 
             
                end
         | 
| 144 144 |  | 
| @@ -149,13 +149,13 @@ describe "A response to a request sent to the CloudStack API", :vcr do | |
| 149 149 | 
             
                        /html/
         | 
| 150 150 | 
             
                      end
         | 
| 151 151 |  | 
| 152 | 
            -
                      def after( | 
| 153 | 
            -
                        fail  | 
| 152 | 
            +
                      def after(_env)
         | 
| 153 | 
            +
                        fail 'Middleware Used'
         | 
| 154 154 | 
             
                      end
         | 
| 155 155 | 
             
                    end
         | 
| 156 156 | 
             
                  end
         | 
| 157 157 |  | 
| 158 | 
            -
                  it  | 
| 158 | 
            +
                  it 'uses the middleware' do
         | 
| 159 159 | 
             
                    expect { client.list_accounts }.not_to raise_error
         | 
| 160 160 | 
             
                  end
         | 
| 161 161 | 
             
                end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -5,12 +5,12 @@ | |
| 5 5 | 
             
            #
         | 
| 6 6 | 
             
            # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
         | 
| 7 7 |  | 
| 8 | 
            -
            require File.expand_path( | 
| 8 | 
            +
            require File.expand_path('../../lib/stacker_bee', __FILE__)
         | 
| 9 9 |  | 
| 10 10 | 
             
            require 'yaml'
         | 
| 11 11 |  | 
| 12 | 
            -
            default_config_file = File.expand_path( | 
| 13 | 
            -
            config_file         = File.expand_path( | 
| 12 | 
            +
            default_config_file = File.expand_path('../../config.default.yml', __FILE__)
         | 
| 13 | 
            +
            config_file         = File.expand_path('../../config.yml', __FILE__)
         | 
| 14 14 |  | 
| 15 15 | 
             
            CONFIG = YAML.load(File.read(default_config_file))
         | 
| 16 16 | 
             
            CONFIG.merge!(YAML.load(File.read(config_file))) if File.exist?(config_file)
         | 
| @@ -18,7 +18,7 @@ CONFIG.merge!(YAML.load(File.read(config_file))) if File.exist?(config_file) | |
| 18 18 | 
             
            require 'webmock/rspec'
         | 
| 19 19 |  | 
| 20 20 | 
             
            support_files = Dir[File.join(
         | 
| 21 | 
            -
              File.expand_path( | 
| 21 | 
            +
              File.expand_path('../../spec/support/**/*.rb', __FILE__)
         | 
| 22 22 | 
             
            )]
         | 
| 23 23 | 
             
            support_files.each { |f| require f }
         | 
| 24 24 |  | 
    
        data/spec/support/vcr.rb
    CHANGED
    
    | @@ -5,20 +5,20 @@ VCR.configure do |c| | |
| 5 5 | 
             
              c.cassette_library_dir = 'spec/cassettes'
         | 
| 6 6 |  | 
| 7 7 | 
             
              c.filter_sensitive_data('<CLOUD_STACK_URL>') do
         | 
| 8 | 
            -
                CONFIG[ | 
| 8 | 
            +
                CONFIG['url']
         | 
| 9 9 | 
             
              end
         | 
| 10 10 |  | 
| 11 11 | 
             
              c.filter_sensitive_data('<CLOUD_STACK_HOST>') do
         | 
| 12 | 
            -
                uri = URI.parse(CONFIG[ | 
| 12 | 
            +
                uri = URI.parse(CONFIG['url'])
         | 
| 13 13 | 
             
                "#{uri.scheme}://#{uri.host}:#{uri.port}"
         | 
| 14 14 | 
             
              end
         | 
| 15 15 |  | 
| 16 16 | 
             
              c.filter_sensitive_data('<CLOUD_STACK_API_KEY>') do
         | 
| 17 | 
            -
                CONFIG[ | 
| 17 | 
            +
                CONFIG['api_key']
         | 
| 18 18 | 
             
              end
         | 
| 19 19 |  | 
| 20 20 | 
             
              c.filter_sensitive_data('<CLOUD_STACK_SECRET_KEY>') do
         | 
| 21 | 
            -
                CONFIG[ | 
| 21 | 
            +
                CONFIG['secret_key']
         | 
| 22 22 | 
             
              end
         | 
| 23 23 |  | 
| 24 24 | 
             
              c.default_cassette_options = {
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            describe StackerBee::API do
         | 
| 4 4 | 
             
              subject { api }
         | 
| @@ -10,15 +10,15 @@ describe StackerBee::API do | |
| 10 10 |  | 
| 11 11 | 
             
              its(:api_path) { should eq api_path }
         | 
| 12 12 |  | 
| 13 | 
            -
              its([ | 
| 14 | 
            -
              its([ | 
| 15 | 
            -
              its([ | 
| 16 | 
            -
              its([ | 
| 17 | 
            -
              its([ | 
| 18 | 
            -
              its([ | 
| 13 | 
            +
              its(['list_virtual_machines']) { should be_a Hash }
         | 
| 14 | 
            +
              its(['get_vm_password'])       { should be_a Hash }
         | 
| 15 | 
            +
              its(['getvmpassword'])         { should be_a Hash }
         | 
| 16 | 
            +
              its(['getVMPassword'])         { should be_a Hash }
         | 
| 17 | 
            +
              its(['getVmPassword'])         { should be_a Hash }
         | 
| 18 | 
            +
              its(['getWRONG'])              { should be_nil }
         | 
| 19 19 |  | 
| 20 | 
            -
              it { should be_key  | 
| 21 | 
            -
              it { should be_key  | 
| 22 | 
            -
              it { should be_key  | 
| 23 | 
            -
              it { should be_key  | 
| 20 | 
            +
              it { should be_key 'get_vm_password' }
         | 
| 21 | 
            +
              it { should be_key 'getvmpassword' }
         | 
| 22 | 
            +
              it { should be_key 'getVMPassword' }
         | 
| 23 | 
            +
              it { should be_key 'getVmPassword' }
         | 
| 24 24 | 
             
            end
         | 
| @@ -1,7 +1,7 @@ | |
| 1 | 
            -
            require  | 
| 2 | 
            -
            require  | 
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'ostruct'
         | 
| 3 3 |  | 
| 4 | 
            -
            describe StackerBee::Client,  | 
| 4 | 
            +
            describe StackerBee::Client, '.api' do
         | 
| 5 5 | 
             
              subject { described_class }
         | 
| 6 6 | 
             
              let(:api) { double }
         | 
| 7 7 | 
             
              before do
         | 
| @@ -12,10 +12,10 @@ describe StackerBee::Client, ".api" do | |
| 12 12 | 
             
              its(:api) { should eq api }
         | 
| 13 13 | 
             
            end
         | 
| 14 14 |  | 
| 15 | 
            -
            describe StackerBee::Client,  | 
| 15 | 
            +
            describe StackerBee::Client, 'calling endpoint' do
         | 
| 16 16 | 
             
              let(:client) do
         | 
| 17 17 | 
             
                described_class.new(
         | 
| 18 | 
            -
                  url:  | 
| 18 | 
            +
                  url: 'http://example.com',
         | 
| 19 19 | 
             
                  middlewares: lambda do |builder|
         | 
| 20 20 | 
             
                    builder.before middleware_class,
         | 
| 21 21 | 
             
                                   expected_endpoint_name: endpoint_name,
         | 
| @@ -44,28 +44,28 @@ describe StackerBee::Client, "calling endpoint" do | |
| 44 44 | 
             
              let(:params)        { double(:params) }
         | 
| 45 45 | 
             
              let(:response_body) { double(:response_body) }
         | 
| 46 46 |  | 
| 47 | 
            -
              describe  | 
| 47 | 
            +
              describe 'responding to methods' do
         | 
| 48 48 | 
             
                subject { client }
         | 
| 49 49 | 
             
                it { should respond_to endpoint_name }
         | 
| 50 50 | 
             
              end
         | 
| 51 51 |  | 
| 52 | 
            -
              describe  | 
| 52 | 
            +
              describe 'via a method call' do
         | 
| 53 53 | 
             
                subject { client.list_virtual_machines(params) }
         | 
| 54 54 | 
             
                it { should eq response_body }
         | 
| 55 55 | 
             
              end
         | 
| 56 56 |  | 
| 57 | 
            -
              describe  | 
| 57 | 
            +
              describe 'via #request' do
         | 
| 58 58 | 
             
                subject { client.request(endpoint_name, params) }
         | 
| 59 59 | 
             
                it { should eq response_body }
         | 
| 60 60 | 
             
              end
         | 
| 61 61 | 
             
            end
         | 
| 62 62 |  | 
| 63 | 
            -
            describe StackerBee::Client,  | 
| 63 | 
            +
            describe StackerBee::Client, 'configuration' do
         | 
| 64 64 | 
             
              before { described_class.configuration = default_config_hash }
         | 
| 65 65 |  | 
| 66 | 
            -
              let(:default_url)         {  | 
| 67 | 
            -
              let(:default_api_key)     {  | 
| 68 | 
            -
              let(:default_secret_key)  {  | 
| 66 | 
            +
              let(:default_url)         { 'default_cloud-stack.com' }
         | 
| 67 | 
            +
              let(:default_api_key)     { 'default-cloud-stack-api-key' }
         | 
| 68 | 
            +
              let(:default_secret_key)  { 'default-cloud-stack-secret-key' }
         | 
| 69 69 | 
             
              let(:default_config_hash) do
         | 
| 70 70 | 
             
                {
         | 
| 71 71 | 
             
                  url:                 default_url,
         | 
| @@ -76,9 +76,9 @@ describe StackerBee::Client, "configuration" do | |
| 76 76 | 
             
                }
         | 
| 77 77 | 
             
              end
         | 
| 78 78 |  | 
| 79 | 
            -
              let(:instance_url)        {  | 
| 80 | 
            -
              let(:instance_api_key)    {  | 
| 81 | 
            -
              let(:instance_secret_key) {  | 
| 79 | 
            +
              let(:instance_url)        { 'instance-cloud-stack.com' }
         | 
| 80 | 
            +
              let(:instance_api_key)    { 'instance-cloud-stack-api-key' }
         | 
| 81 | 
            +
              let(:instance_secret_key) { 'instance-cloud-stack-secret-key' }
         | 
| 82 82 | 
             
              let(:instance_config_hash) do
         | 
| 83 83 | 
             
                {
         | 
| 84 84 | 
             
                  url:                 instance_url,
         | 
| @@ -89,10 +89,10 @@ describe StackerBee::Client, "configuration" do | |
| 89 89 | 
             
                }
         | 
| 90 90 | 
             
              end
         | 
| 91 91 |  | 
| 92 | 
            -
              describe  | 
| 92 | 
            +
              describe '.new' do
         | 
| 93 93 | 
             
                subject { client.configuration }
         | 
| 94 94 |  | 
| 95 | 
            -
                context  | 
| 95 | 
            +
                context 'with default, class configuration' do
         | 
| 96 96 | 
             
                  let(:client) { described_class.new }
         | 
| 97 97 |  | 
| 98 98 | 
             
                  its(:url)        { should eq default_url }
         | 
| @@ -100,7 +100,7 @@ describe StackerBee::Client, "configuration" do | |
| 100 100 | 
             
                  its(:secret_key) { should eq default_secret_key }
         | 
| 101 101 | 
             
                end
         | 
| 102 102 |  | 
| 103 | 
            -
                context  | 
| 103 | 
            +
                context 'with instance-specific configuration' do
         | 
| 104 104 | 
             
                  let(:client) { described_class.new(instance_config_hash) }
         | 
| 105 105 |  | 
| 106 106 | 
             
                  its(:url)        { should eq instance_url }
         | 
| @@ -117,7 +117,7 @@ describe StackerBee::Client, "configuration" do | |
| 117 117 | 
             
                  its(:secret_key) { should eq instance_secret_key }
         | 
| 118 118 | 
             
                end
         | 
| 119 119 |  | 
| 120 | 
            -
                context  | 
| 120 | 
            +
                context 'with partial instance-specific configuration' do
         | 
| 121 121 | 
             
                  let(:client) { described_class.new(partial_config_hash) }
         | 
| 122 122 | 
             
                  let(:partial_config_hash) do
         | 
| 123 123 | 
             
                    { url: instance_config_hash[:url] }
         | 
| @@ -1,110 +1,110 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            describe StackerBee::Configuration do
         | 
| 4 4 | 
             
              describe "setting an attribute that doesn't exist" do
         | 
| 5 5 | 
             
                [:ssl_verify?, :url?, :other_attr].each do |attr|
         | 
| 6 | 
            -
                  it  | 
| 6 | 
            +
                  it 'raises an error' do
         | 
| 7 7 | 
             
                    expect { described_class.new(attr => true) }
         | 
| 8 8 | 
             
                      .to raise_error described_class::NoAttributeError, /#{attr}/
         | 
| 9 9 | 
             
                  end
         | 
| 10 10 | 
             
                end
         | 
| 11 11 | 
             
              end
         | 
| 12 12 |  | 
| 13 | 
            -
              describe  | 
| 13 | 
            +
              describe '#ssl_verify?' do
         | 
| 14 14 | 
             
                subject { configuration.ssl_verify? }
         | 
| 15 15 |  | 
| 16 | 
            -
                context  | 
| 16 | 
            +
                context 'when not set' do
         | 
| 17 17 | 
             
                  let(:configuration) { described_class.new }
         | 
| 18 18 | 
             
                  it { should eq true }
         | 
| 19 19 | 
             
                end
         | 
| 20 20 |  | 
| 21 | 
            -
                context  | 
| 21 | 
            +
                context 'when set to false' do
         | 
| 22 22 | 
             
                  let(:configuration) { described_class.new(ssl_verify: false) }
         | 
| 23 23 | 
             
                  it { should eq false }
         | 
| 24 24 | 
             
                end
         | 
| 25 25 |  | 
| 26 | 
            -
                context  | 
| 26 | 
            +
                context 'when set to true' do
         | 
| 27 27 | 
             
                  let(:configuration) { described_class.new(ssl_verify: true) }
         | 
| 28 28 | 
             
                  it { should eq true }
         | 
| 29 29 | 
             
                end
         | 
| 30 30 | 
             
              end
         | 
| 31 31 |  | 
| 32 | 
            -
              describe  | 
| 32 | 
            +
              describe '#url' do
         | 
| 33 33 | 
             
                subject { configuration.url }
         | 
| 34 34 |  | 
| 35 | 
            -
                context  | 
| 35 | 
            +
                context 'when not set' do
         | 
| 36 36 | 
             
                  let(:configuration) { described_class.new }
         | 
| 37 37 | 
             
                  it { should eq nil }
         | 
| 38 38 | 
             
                end
         | 
| 39 39 |  | 
| 40 | 
            -
                context  | 
| 40 | 
            +
                context 'when set' do
         | 
| 41 41 | 
             
                  let(:configuration) { described_class.new(url: setting) }
         | 
| 42 | 
            -
                  let(:setting) {  | 
| 42 | 
            +
                  let(:setting) { 'http://example.com' }
         | 
| 43 43 | 
             
                  it { should eq setting }
         | 
| 44 44 | 
             
                end
         | 
| 45 45 | 
             
              end
         | 
| 46 46 |  | 
| 47 | 
            -
              describe  | 
| 47 | 
            +
              describe '#secret_key' do
         | 
| 48 48 | 
             
                subject { configuration.secret_key }
         | 
| 49 49 |  | 
| 50 | 
            -
                context  | 
| 50 | 
            +
                context 'when not set' do
         | 
| 51 51 | 
             
                  let(:configuration) { described_class.new }
         | 
| 52 52 | 
             
                  it { should eq nil }
         | 
| 53 53 | 
             
                end
         | 
| 54 54 |  | 
| 55 | 
            -
                context  | 
| 55 | 
            +
                context 'when set' do
         | 
| 56 56 | 
             
                  let(:configuration) { described_class.new(secret_key: setting) }
         | 
| 57 | 
            -
                  let(:setting) {  | 
| 57 | 
            +
                  let(:setting) { 'qwertyuiop' }
         | 
| 58 58 | 
             
                  it { should eq setting }
         | 
| 59 59 | 
             
                end
         | 
| 60 60 | 
             
              end
         | 
| 61 61 |  | 
| 62 | 
            -
              describe  | 
| 62 | 
            +
              describe '#api_key' do
         | 
| 63 63 | 
             
                subject { configuration.api_key }
         | 
| 64 64 |  | 
| 65 | 
            -
                context  | 
| 65 | 
            +
                context 'when not set' do
         | 
| 66 66 | 
             
                  let(:configuration) { described_class.new }
         | 
| 67 67 | 
             
                  it { should eq nil }
         | 
| 68 68 | 
             
                end
         | 
| 69 69 |  | 
| 70 | 
            -
                context  | 
| 70 | 
            +
                context 'when set' do
         | 
| 71 71 | 
             
                  let(:configuration) { described_class.new(api_key: setting) }
         | 
| 72 | 
            -
                  let(:setting) {  | 
| 72 | 
            +
                  let(:setting) { 'qwertyuiop' }
         | 
| 73 73 | 
             
                  it { should eq setting }
         | 
| 74 74 | 
             
                end
         | 
| 75 75 | 
             
              end
         | 
| 76 76 |  | 
| 77 | 
            -
              describe  | 
| 77 | 
            +
              describe '#middlewares' do
         | 
| 78 78 | 
             
                subject { configuration.middlewares }
         | 
| 79 79 |  | 
| 80 | 
            -
                context  | 
| 80 | 
            +
                context 'when not set' do
         | 
| 81 81 | 
             
                  let(:configuration) { described_class.new }
         | 
| 82 82 | 
             
                  it { should be_a Proc }
         | 
| 83 83 | 
             
                end
         | 
| 84 84 |  | 
| 85 | 
            -
                context  | 
| 85 | 
            +
                context 'when set' do
         | 
| 86 86 | 
             
                  let(:configuration) { described_class.new(middlewares: setting) }
         | 
| 87 87 | 
             
                  let(:setting) { proc { something } }
         | 
| 88 88 | 
             
                  it { should eq setting }
         | 
| 89 89 | 
             
                end
         | 
| 90 90 | 
             
              end
         | 
| 91 91 |  | 
| 92 | 
            -
              describe  | 
| 92 | 
            +
              describe '#faraday_middlewares' do
         | 
| 93 93 | 
             
                subject { configuration.faraday_middlewares }
         | 
| 94 94 |  | 
| 95 | 
            -
                context  | 
| 95 | 
            +
                context 'when not set' do
         | 
| 96 96 | 
             
                  let(:configuration) { described_class.new }
         | 
| 97 97 | 
             
                  it { should be_a Proc }
         | 
| 98 98 | 
             
                end
         | 
| 99 99 |  | 
| 100 | 
            -
                context  | 
| 100 | 
            +
                context 'when set' do
         | 
| 101 101 | 
             
                  let(:configuration) { described_class.new(faraday_middlewares: setting) }
         | 
| 102 102 | 
             
                  let(:setting) { proc { something } }
         | 
| 103 103 | 
             
                  it { should eq setting }
         | 
| 104 104 | 
             
                end
         | 
| 105 105 | 
             
              end
         | 
| 106 106 |  | 
| 107 | 
            -
              describe  | 
| 107 | 
            +
              describe '#merge' do
         | 
| 108 108 | 
             
                subject { parent.merge(child) }
         | 
| 109 109 |  | 
| 110 110 | 
             
                let(:parent) do
         | 
| @@ -131,7 +131,7 @@ describe StackerBee::Configuration do | |
| 131 131 |  | 
| 132 132 | 
             
                context "when the child doesn't have an attribute set" do
         | 
| 133 133 | 
             
                  let(:child) { described_class.new }
         | 
| 134 | 
            -
                  it  | 
| 134 | 
            +
                  it 'uses the attribute of the parent' do
         | 
| 135 135 | 
             
                    subject.url.should eq :parent_url
         | 
| 136 136 | 
             
                    subject.api_key.should eq :parent_api_key
         | 
| 137 137 | 
             
                    subject.secret_key.should eq :parent_secret_key
         | 
| @@ -143,7 +143,7 @@ describe StackerBee::Configuration do | |
| 143 143 |  | 
| 144 144 | 
             
                context "when the parent doesn't have an attribute set" do
         | 
| 145 145 | 
             
                  let(:parent) { described_class.new }
         | 
| 146 | 
            -
                  it  | 
| 146 | 
            +
                  it 'uses the attribute of the child' do
         | 
| 147 147 | 
             
                    subject.url.should eq :child_url
         | 
| 148 148 | 
             
                    subject.api_key.should eq :child_api_key
         | 
| 149 149 | 
             
                    subject.secret_key.should eq :child_secret_key
         | 
| @@ -156,7 +156,7 @@ describe StackerBee::Configuration do | |
| 156 156 | 
             
                context "when the parent and child don't have an attribut set" do
         | 
| 157 157 | 
             
                  let(:child) { described_class.new }
         | 
| 158 158 | 
             
                  let(:parent) { described_class.new }
         | 
| 159 | 
            -
                  it  | 
| 159 | 
            +
                  it 'uses the defaults of the attributes of the child' do
         | 
| 160 160 | 
             
                    subject.url.should eq nil
         | 
| 161 161 | 
             
                    subject.api_key.should eq nil
         | 
| 162 162 | 
             
                    subject.secret_key.should eq nil
         | 
| @@ -1,12 +1,12 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            describe StackerBee::Connection do
         | 
| 4 4 | 
             
              subject(:get) { connection.get(path, query_params) }
         | 
| 5 5 | 
             
              before { Faraday.stub new: faraday }
         | 
| 6 6 |  | 
| 7 | 
            -
              let(:url)          {  | 
| 8 | 
            -
              let(:path)         {  | 
| 9 | 
            -
              let(:secret_key)   {  | 
| 7 | 
            +
              let(:url)          { 'http://test.com:1234/foo/bar/' }
         | 
| 8 | 
            +
              let(:path)         { '/foo/bar' }
         | 
| 9 | 
            +
              let(:secret_key)   { 'shhh' }
         | 
| 10 10 | 
             
              let(:query_params) { [[:foo, :bar]] }
         | 
| 11 11 | 
             
              let(:response)     { double(:response) }
         | 
| 12 12 | 
             
              let(:faraday)      { double(:faraday, get: response) }
         | 
| @@ -20,47 +20,47 @@ describe StackerBee::Connection do | |
| 20 20 | 
             
                )
         | 
| 21 21 | 
             
              end
         | 
| 22 22 |  | 
| 23 | 
            -
              context  | 
| 23 | 
            +
              context 'successfully connecting' do
         | 
| 24 24 | 
             
                before do
         | 
| 25 25 | 
             
                  faraday.should_receive(:get).with('/foo/bar', query_params) { response }
         | 
| 26 26 | 
             
                end
         | 
| 27 27 | 
             
                it { should be response }
         | 
| 28 | 
            -
                it  | 
| 28 | 
            +
                it 'specifies url without path when creating connection' do
         | 
| 29 29 | 
             
                  get
         | 
| 30 | 
            -
                  Faraday.should have_received(:new).with(url:  | 
| 30 | 
            +
                  Faraday.should have_received(:new).with(url: 'http://test.com:1234',
         | 
| 31 31 | 
             
                                                          ssl: { verify: true })
         | 
| 32 32 | 
             
                end
         | 
| 33 33 | 
             
              end
         | 
| 34 34 |  | 
| 35 | 
            -
              context  | 
| 35 | 
            +
              context 'failing to connect' do
         | 
| 36 36 | 
             
                before do
         | 
| 37 | 
            -
                  faraday.stub(:get) { fail Faraday::Error::ConnectionFailed,  | 
| 37 | 
            +
                  faraday.stub(:get) { fail Faraday::Error::ConnectionFailed, 'boom' }
         | 
| 38 38 | 
             
                end
         | 
| 39 | 
            -
                it  | 
| 39 | 
            +
                it 'raises a helpful exception' do
         | 
| 40 40 | 
             
                  expect { get }.to raise_error StackerBee::ConnectionError, /#{url}/
         | 
| 41 41 | 
             
                end
         | 
| 42 42 | 
             
              end
         | 
| 43 43 |  | 
| 44 | 
            -
              context  | 
| 45 | 
            -
                let(:url) {  | 
| 46 | 
            -
                it  | 
| 44 | 
            +
              context 'no protocol specified in URL' do
         | 
| 45 | 
            +
                let(:url) { 'wrong.com' }
         | 
| 46 | 
            +
                it 'raises a helpful exception' do
         | 
| 47 47 | 
             
                  expect { get }.to raise_error StackerBee::ConnectionError, /no protocol/
         | 
| 48 48 | 
             
                end
         | 
| 49 49 | 
             
              end
         | 
| 50 50 |  | 
| 51 | 
            -
              context  | 
| 51 | 
            +
              context 'when given a path' do
         | 
| 52 52 | 
             
                let(:path) { '/baz' }
         | 
| 53 | 
            -
                it  | 
| 53 | 
            +
                it 'makes a request to the correct path' do
         | 
| 54 54 | 
             
                  expect(faraday).to receive(:get).with(query_params, path)
         | 
| 55 55 | 
             
                  connection.get query_params, path
         | 
| 56 56 | 
             
                end
         | 
| 57 57 | 
             
              end
         | 
| 58 58 |  | 
| 59 | 
            -
              context  | 
| 59 | 
            +
              context 'when verifying an ssl connection' do
         | 
| 60 60 | 
             
                let(:ssl_verify) { false }
         | 
| 61 | 
            -
                it  | 
| 61 | 
            +
                it 'specifies the ssl verify option when creating a connection' do
         | 
| 62 62 | 
             
                  get
         | 
| 63 | 
            -
                  Faraday.should have_received(:new).with(url:  | 
| 63 | 
            +
                  Faraday.should have_received(:new).with(url: 'http://test.com:1234',
         | 
| 64 64 | 
             
                                                          ssl: { verify: false })
         | 
| 65 65 | 
             
                end
         | 
| 66 66 | 
             
              end
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            describe StackerBee::Middleware::Adapter do
         | 
| 4 4 | 
             
              let(:env) do
         | 
| @@ -19,14 +19,14 @@ describe StackerBee::Middleware::Adapter do | |
| 19 19 | 
             
              let(:raw_response) do
         | 
| 20 20 | 
             
                double(env: { response_headers: response_headers }, body: response_body)
         | 
| 21 21 | 
             
              end
         | 
| 22 | 
            -
              let(:response_headers) { {  | 
| 23 | 
            -
              let(:content_type) {  | 
| 22 | 
            +
              let(:response_headers) { { 'content-type' => content_type } }
         | 
| 23 | 
            +
              let(:content_type) { 'text/javascript; charset=UTF-8'  }
         | 
| 24 24 | 
             
              let(:response_body) { double }
         | 
| 25 25 |  | 
| 26 | 
            -
              describe  | 
| 26 | 
            +
              describe '#call' do
         | 
| 27 27 | 
             
                before { middleware.call(env) }
         | 
| 28 28 |  | 
| 29 | 
            -
                it  | 
| 29 | 
            +
                it 'makes a call via the connection' do
         | 
| 30 30 | 
             
                  connection.should have_received(:get)
         | 
| 31 31 | 
             
                end
         | 
| 32 32 |  | 
| @@ -42,12 +42,12 @@ describe StackerBee::Middleware::Adapter do | |
| 42 42 | 
             
                  env.response.body.should == response_body
         | 
| 43 43 | 
             
                end
         | 
| 44 44 |  | 
| 45 | 
            -
                it  | 
| 45 | 
            +
                it 'sorts the paramers' do
         | 
| 46 46 | 
             
                  connection.should have_received(:get).with(path, [%w(a a), %w(z z)])
         | 
| 47 47 | 
             
                end
         | 
| 48 48 | 
             
              end
         | 
| 49 49 |  | 
| 50 | 
            -
              describe  | 
| 50 | 
            +
              describe '#endpoint_name_for' do
         | 
| 51 51 | 
             
                subject { middleware.endpoint_name_for('listVirtualMachines') }
         | 
| 52 52 | 
             
                it { should be_nil }
         | 
| 53 53 | 
             
              end
         |