puffing-billy 0.4.1 → 0.5.0
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 +4 -4
 - data/CHANGELOG.md +7 -0
 - data/Gemfile.lock +2 -2
 - data/Guardfile +5 -5
 - data/README.md +19 -1
 - data/Rakefile +1 -1
 - data/lib/billy.rb +17 -17
 - data/lib/billy/cache.rb +30 -31
 - data/lib/billy/config.rb +4 -2
 - data/lib/billy/handlers/cache_handler.rb +5 -7
 - data/lib/billy/handlers/handler.rb +2 -2
 - data/lib/billy/handlers/proxy_handler.rb +16 -16
 - data/lib/billy/handlers/request_handler.rb +6 -8
 - data/lib/billy/handlers/stub_handler.rb +2 -2
 - data/lib/billy/json_utils.rb +1 -2
 - data/lib/billy/proxy_connection.rb +5 -5
 - data/lib/billy/proxy_request_stub.rb +7 -7
 - data/lib/billy/version.rb +1 -1
 - data/lib/tasks/billy.rake +13 -15
 - data/puffing-billy.gemspec +28 -28
 - data/spec/features/examples/facebook_api_spec.rb +7 -7
 - data/spec/features/examples/tumblr_api_spec.rb +6 -6
 - data/spec/lib/billy/cache_spec.rb +14 -16
 - data/spec/lib/billy/handlers/cache_handler_spec.rb +26 -24
 - data/spec/lib/billy/handlers/handler_spec.rb +3 -3
 - data/spec/lib/billy/handlers/proxy_handler_spec.rb +18 -16
 - data/spec/lib/billy/handlers/request_handler_spec.rb +44 -42
 - data/spec/lib/billy/handlers/stub_handler_spec.rb +14 -12
 - data/spec/lib/billy/proxy_request_stub_spec.rb +55 -42
 - data/spec/lib/billy/resource_utils_spec.rb +17 -17
 - data/spec/lib/proxy_spec.rb +62 -70
 - data/spec/spec_helper.rb +3 -3
 - data/spec/support/test_server.rb +2 -2
 - metadata +6 -6
 
| 
         @@ -1,13 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe Billy::Handler do
         
     | 
| 
       4 
     | 
    
         
            -
              let(:handler) { Class.new{ include Billy::Handler }.new }
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:handler) { Class.new { include Billy::Handler }.new }
         
     | 
| 
       5 
5 
     | 
    
         
             
              it '#handle_request raises an error if not overridden' do
         
     | 
| 
       6 
     | 
    
         
            -
                expect(handler.handle_request(nil,nil,nil,nil)).to eql( 
     | 
| 
      
 6 
     | 
    
         
            +
                expect(handler.handle_request(nil, nil, nil, nil)).to eql(error: 'The handler has not overridden the handle_request method!')
         
     | 
| 
       7 
7 
     | 
    
         
             
              end
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
              it '#handles_request returns false by default' do
         
     | 
| 
       10 
     | 
    
         
            -
                expect(handler.handles_request?(nil,nil,nil,nil)).to be false
         
     | 
| 
      
 10 
     | 
    
         
            +
                expect(handler.handles_request?(nil, nil, nil, nil)).to be false
         
     | 
| 
       11 
11 
     | 
    
         
             
              end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
              it 'responds to #reset' do
         
     | 
| 
         @@ -2,13 +2,15 @@ require 'spec_helper' 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe Billy::ProxyHandler do
         
     | 
| 
       4 
4 
     | 
    
         
             
              subject { Billy::ProxyHandler.new }
         
     | 
| 
       5 
     | 
    
         
            -
              let(:request)  
     | 
| 
      
 5 
     | 
    
         
            +
              let(:request) do
         
     | 
| 
      
 6 
     | 
    
         
            +
                {
         
     | 
| 
       6 
7 
     | 
    
         
             
                  method:   'post',
         
     | 
| 
       7 
8 
     | 
    
         
             
                  url:      'http://example.test:8080/index?some=param',
         
     | 
| 
       8 
     | 
    
         
            -
                  headers:  {'Accept-Encoding'  => 'gzip',
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
      
 9 
     | 
    
         
            +
                  headers:  { 'Accept-Encoding'  => 'gzip',
         
     | 
| 
      
 10 
     | 
    
         
            +
                              'Cache-Control'    => 'no-cache' },
         
     | 
| 
       10 
11 
     | 
    
         
             
                  body:     'Some body'
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
                }
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
       12 
14 
     | 
    
         | 
| 
       13 
15 
     | 
    
         
             
              describe '#handles_request?' do
         
     | 
| 
       14 
16 
     | 
    
         
             
                context 'with non-whitelisted requests enabled' do
         
     | 
| 
         @@ -108,31 +110,31 @@ describe Billy::ProxyHandler do 
     | 
|
| 
       108 
110 
     | 
    
         
             
                    header
         
     | 
| 
       109 
111 
     | 
    
         
             
                  end
         
     | 
| 
       110 
112 
     | 
    
         | 
| 
       111 
     | 
    
         
            -
                  let(:em_response)     { double( 
     | 
| 
       112 
     | 
    
         
            -
                  let(:em_request)       
     | 
| 
       113 
     | 
    
         
            -
                    double( 
     | 
| 
       114 
     | 
    
         
            -
                   
     | 
| 
      
 113 
     | 
    
         
            +
                  let(:em_response)     { double('response') }
         
     | 
| 
      
 114 
     | 
    
         
            +
                  let(:em_request)      do
         
     | 
| 
      
 115 
     | 
    
         
            +
                    double('EM::HttpRequest', error: nil, response: em_response, response_header: response_header)
         
     | 
| 
      
 116 
     | 
    
         
            +
                  end
         
     | 
| 
       115 
117 
     | 
    
         | 
| 
       116 
118 
     | 
    
         
             
                  before do
         
     | 
| 
       117 
119 
     | 
    
         
             
                    allow(subject).to receive(:handles_request?).and_return(true)
         
     | 
| 
       118 
     | 
    
         
            -
                    allow(em_response).to receive(:force_encoding).and_return( 
     | 
| 
      
 120 
     | 
    
         
            +
                    allow(em_response).to receive(:force_encoding).and_return('The response body')
         
     | 
| 
       119 
121 
     | 
    
         
             
                    allow(EventMachine::HttpRequest).to receive(:new).and_return(em_request)
         
     | 
| 
       120 
122 
     | 
    
         
             
                    expect(em_request).to receive(:post).and_return(em_request)
         
     | 
| 
       121 
123 
     | 
    
         
             
                  end
         
     | 
| 
       122 
124 
     | 
    
         | 
| 
       123 
125 
     | 
    
         
             
                  it 'returns any error in the response' do
         
     | 
| 
       124 
     | 
    
         
            -
                    allow(em_request).to receive(:error).and_return( 
     | 
| 
      
 126 
     | 
    
         
            +
                    allow(em_request).to receive(:error).and_return('ERROR!')
         
     | 
| 
       125 
127 
     | 
    
         
             
                    expect(subject.handle_request(request[:method],
         
     | 
| 
       126 
128 
     | 
    
         
             
                                                  request[:url],
         
     | 
| 
       127 
129 
     | 
    
         
             
                                                  request[:headers],
         
     | 
| 
       128 
     | 
    
         
            -
                                                  request[:body])).to eql( 
     | 
| 
      
 130 
     | 
    
         
            +
                                                  request[:body])).to eql(error: "Request to #{request[:url]} failed with error: ERROR!")
         
     | 
| 
       129 
131 
     | 
    
         
             
                  end
         
     | 
| 
       130 
132 
     | 
    
         | 
| 
       131 
133 
     | 
    
         
             
                  it 'returns a hashed response if the request succeeds' do
         
     | 
| 
       132 
134 
     | 
    
         
             
                    expect(subject.handle_request(request[:method],
         
     | 
| 
       133 
135 
     | 
    
         
             
                                                  request[:url],
         
     | 
| 
       134 
136 
     | 
    
         
             
                                                  request[:headers],
         
     | 
| 
       135 
     | 
    
         
            -
                                                  request[:body])).to eql( 
     | 
| 
      
 137 
     | 
    
         
            +
                                                  request[:body])).to eql(status: 200, headers: { 'Connection' => 'close' }, content: 'The response body')
         
     | 
| 
       136 
138 
     | 
    
         
             
                  end
         
     | 
| 
       137 
139 
     | 
    
         | 
| 
       138 
140 
     | 
    
         
             
                  it 'returns nil if both the error and response are for some reason nil' do
         
     | 
| 
         @@ -156,10 +158,10 @@ describe Billy::ProxyHandler do 
     | 
|
| 
       156 
158 
     | 
    
         
             
                    allow(Billy.config).to receive(:proxied_request_inactivity_timeout).and_return(42)
         
     | 
| 
       157 
159 
     | 
    
         
             
                    allow(Billy.config).to receive(:proxied_request_connect_timeout).and_return(24)
         
     | 
| 
       158 
160 
     | 
    
         | 
| 
       159 
     | 
    
         
            -
                    expect(EventMachine::HttpRequest).to receive(:new).with(request[:url], 
     | 
| 
       160 
     | 
    
         
            -
             
     | 
| 
       161 
     | 
    
         
            -
             
     | 
| 
       162 
     | 
    
         
            -
                     
     | 
| 
      
 161 
     | 
    
         
            +
                    expect(EventMachine::HttpRequest).to receive(:new).with(request[:url],
         
     | 
| 
      
 162 
     | 
    
         
            +
                                                                            inactivity_timeout: 42,
         
     | 
| 
      
 163 
     | 
    
         
            +
                                                                            connect_timeout: 24
         
     | 
| 
      
 164 
     | 
    
         
            +
                    )
         
     | 
| 
       163 
165 
     | 
    
         | 
| 
       164 
166 
     | 
    
         
             
                    subject.handle_request(request[:method],
         
     | 
| 
       165 
167 
     | 
    
         
             
                                           request[:url],
         
     | 
| 
         @@ -22,15 +22,17 @@ describe Billy::RequestHandler do 
     | 
|
| 
       22 
22 
     | 
    
         
             
              end
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
24 
     | 
    
         
             
              context 'with stubbed handlers' do
         
     | 
| 
       25 
     | 
    
         
            -
                let(:args) {  
     | 
| 
       26 
     | 
    
         
            -
                let(:stub_handler) { double( 
     | 
| 
       27 
     | 
    
         
            -
                let(:cache_handler) { double( 
     | 
| 
       28 
     | 
    
         
            -
                let(:proxy_handler) { double( 
     | 
| 
       29 
     | 
    
         
            -
                let(:handlers)  
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                    : 
     | 
| 
       32 
     | 
    
         
            -
                    : 
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
      
 25 
     | 
    
         
            +
                let(:args) { %w(get url headers body) }
         
     | 
| 
      
 26 
     | 
    
         
            +
                let(:stub_handler) { double('StubHandler') }
         
     | 
| 
      
 27 
     | 
    
         
            +
                let(:cache_handler) { double('CacheHandler') }
         
     | 
| 
      
 28 
     | 
    
         
            +
                let(:proxy_handler) { double('ProxyHandler') }
         
     | 
| 
      
 29 
     | 
    
         
            +
                let(:handlers) do
         
     | 
| 
      
 30 
     | 
    
         
            +
                  {
         
     | 
| 
      
 31 
     | 
    
         
            +
                    stubs: stub_handler,
         
     | 
| 
      
 32 
     | 
    
         
            +
                    cache: cache_handler,
         
     | 
| 
      
 33 
     | 
    
         
            +
                    proxy: proxy_handler
         
     | 
| 
      
 34 
     | 
    
         
            +
                  }
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
       34 
36 
     | 
    
         | 
| 
       35 
37 
     | 
    
         
             
                before do
         
     | 
| 
       36 
38 
     | 
    
         
             
                  allow(subject).to receive(:handlers).and_return(handlers)
         
     | 
| 
         @@ -38,82 +40,82 @@ describe Billy::RequestHandler do 
     | 
|
| 
       38 
40 
     | 
    
         | 
| 
       39 
41 
     | 
    
         
             
                describe '#handles_request?' do
         
     | 
| 
       40 
42 
     | 
    
         
             
                  it 'returns false if no handlers handle the request' do
         
     | 
| 
       41 
     | 
    
         
            -
                    handlers.each do | 
     | 
| 
      
 43 
     | 
    
         
            +
                    handlers.each do |_key, handler|
         
     | 
| 
       42 
44 
     | 
    
         
             
                      expect(handler).to receive(:handles_request?).with(*args).and_return(false)
         
     | 
| 
       43 
45 
     | 
    
         
             
                    end
         
     | 
| 
       44 
46 
     | 
    
         
             
                    expect(subject.handles_request?(*args)).to be false
         
     | 
| 
       45 
47 
     | 
    
         
             
                  end
         
     | 
| 
       46 
48 
     | 
    
         | 
| 
       47 
49 
     | 
    
         
             
                  it 'returns true immediately if the stub handler handles the request' do
         
     | 
| 
       48 
     | 
    
         
            -
                    expect(stub_handler).to 
     | 
| 
       49 
     | 
    
         
            -
                    expect(cache_handler).to_not 
     | 
| 
       50 
     | 
    
         
            -
                    expect(proxy_handler).to_not 
     | 
| 
      
 50 
     | 
    
         
            +
                    expect(stub_handler).to receive(:handles_request?).with(*args).and_return(true)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    expect(cache_handler).to_not receive(:handles_request?)
         
     | 
| 
      
 52 
     | 
    
         
            +
                    expect(proxy_handler).to_not receive(:handles_request?)
         
     | 
| 
       51 
53 
     | 
    
         
             
                    expect(subject.handles_request?(*args)).to be true
         
     | 
| 
       52 
54 
     | 
    
         
             
                  end
         
     | 
| 
       53 
55 
     | 
    
         | 
| 
       54 
56 
     | 
    
         
             
                  it 'returns true if the cache handler handles the request' do
         
     | 
| 
       55 
     | 
    
         
            -
                    expect(stub_handler).to 
     | 
| 
       56 
     | 
    
         
            -
                    expect(cache_handler).to 
     | 
| 
       57 
     | 
    
         
            -
                    expect(proxy_handler).to_not 
     | 
| 
      
 57 
     | 
    
         
            +
                    expect(stub_handler).to receive(:handles_request?).with(*args).and_return(false)
         
     | 
| 
      
 58 
     | 
    
         
            +
                    expect(cache_handler).to receive(:handles_request?).with(*args).and_return(true)
         
     | 
| 
      
 59 
     | 
    
         
            +
                    expect(proxy_handler).to_not receive(:handles_request?)
         
     | 
| 
       58 
60 
     | 
    
         
             
                    expect(subject.handles_request?(*args)).to be true
         
     | 
| 
       59 
61 
     | 
    
         
             
                  end
         
     | 
| 
       60 
62 
     | 
    
         | 
| 
       61 
63 
     | 
    
         
             
                  it 'returns true if the proxy handler handles the request' do
         
     | 
| 
       62 
     | 
    
         
            -
                    expect(stub_handler).to 
     | 
| 
       63 
     | 
    
         
            -
                    expect(cache_handler).to 
     | 
| 
       64 
     | 
    
         
            -
                    expect(proxy_handler).to 
     | 
| 
      
 64 
     | 
    
         
            +
                    expect(stub_handler).to receive(:handles_request?).with(*args).and_return(false)
         
     | 
| 
      
 65 
     | 
    
         
            +
                    expect(cache_handler).to receive(:handles_request?).with(*args).and_return(false)
         
     | 
| 
      
 66 
     | 
    
         
            +
                    expect(proxy_handler).to receive(:handles_request?).with(*args).and_return(true)
         
     | 
| 
       65 
67 
     | 
    
         
             
                    expect(subject.handles_request?(*args)).to be true
         
     | 
| 
       66 
68 
     | 
    
         
             
                  end
         
     | 
| 
       67 
69 
     | 
    
         
             
                end
         
     | 
| 
       68 
70 
     | 
    
         | 
| 
       69 
71 
     | 
    
         
             
                describe '#handle_request' do
         
     | 
| 
       70 
72 
     | 
    
         
             
                  it 'returns stubbed responses' do
         
     | 
| 
       71 
     | 
    
         
            -
                    expect(stub_handler).to 
     | 
| 
       72 
     | 
    
         
            -
                    expect(cache_handler).to_not 
     | 
| 
       73 
     | 
    
         
            -
                    expect(proxy_handler).to_not 
     | 
| 
       74 
     | 
    
         
            -
                    expect(subject.handle_request(*args)).to eql  
     | 
| 
      
 73 
     | 
    
         
            +
                    expect(stub_handler).to receive(:handle_request).with(*args).and_return('foo')
         
     | 
| 
      
 74 
     | 
    
         
            +
                    expect(cache_handler).to_not receive(:handle_request)
         
     | 
| 
      
 75 
     | 
    
         
            +
                    expect(proxy_handler).to_not receive(:handle_request)
         
     | 
| 
      
 76 
     | 
    
         
            +
                    expect(subject.handle_request(*args)).to eql 'foo'
         
     | 
| 
       75 
77 
     | 
    
         
             
                  end
         
     | 
| 
       76 
78 
     | 
    
         | 
| 
       77 
79 
     | 
    
         
             
                  it 'returns cached responses' do
         
     | 
| 
       78 
     | 
    
         
            -
                    expect(stub_handler).to 
     | 
| 
       79 
     | 
    
         
            -
                    expect(cache_handler).to 
     | 
| 
       80 
     | 
    
         
            -
                    expect(proxy_handler).to_not 
     | 
| 
       81 
     | 
    
         
            -
                    expect(subject.handle_request(*args)).to eql  
     | 
| 
      
 80 
     | 
    
         
            +
                    expect(stub_handler).to receive(:handle_request).with(*args)
         
     | 
| 
      
 81 
     | 
    
         
            +
                    expect(cache_handler).to receive(:handle_request).with(*args).and_return('bar')
         
     | 
| 
      
 82 
     | 
    
         
            +
                    expect(proxy_handler).to_not receive(:handle_request)
         
     | 
| 
      
 83 
     | 
    
         
            +
                    expect(subject.handle_request(*args)).to eql 'bar'
         
     | 
| 
       82 
84 
     | 
    
         
             
                  end
         
     | 
| 
       83 
85 
     | 
    
         | 
| 
       84 
86 
     | 
    
         
             
                  it 'returns proxied responses' do
         
     | 
| 
       85 
     | 
    
         
            -
                    expect(stub_handler).to 
     | 
| 
       86 
     | 
    
         
            -
                    expect(cache_handler).to 
     | 
| 
       87 
     | 
    
         
            -
                    expect(proxy_handler).to 
     | 
| 
       88 
     | 
    
         
            -
                    expect(subject.handle_request(*args)).to eql  
     | 
| 
      
 87 
     | 
    
         
            +
                    expect(stub_handler).to receive(:handle_request).with(*args)
         
     | 
| 
      
 88 
     | 
    
         
            +
                    expect(cache_handler).to receive(:handle_request).with(*args)
         
     | 
| 
      
 89 
     | 
    
         
            +
                    expect(proxy_handler).to receive(:handle_request).with(*args).and_return('baz')
         
     | 
| 
      
 90 
     | 
    
         
            +
                    expect(subject.handle_request(*args)).to eql 'baz'
         
     | 
| 
       89 
91 
     | 
    
         
             
                  end
         
     | 
| 
       90 
92 
     | 
    
         | 
| 
       91 
93 
     | 
    
         
             
                  it 'returns an error hash if request is not handled' do
         
     | 
| 
       92 
     | 
    
         
            -
                    expect(stub_handler).to 
     | 
| 
       93 
     | 
    
         
            -
                    expect(cache_handler).to 
     | 
| 
       94 
     | 
    
         
            -
                    expect(proxy_handler).to 
     | 
| 
       95 
     | 
    
         
            -
                    expect(subject.handle_request(*args)).to eql( 
     | 
| 
      
 94 
     | 
    
         
            +
                    expect(stub_handler).to receive(:handle_request).with(*args)
         
     | 
| 
      
 95 
     | 
    
         
            +
                    expect(cache_handler).to receive(:handle_request).with(*args)
         
     | 
| 
      
 96 
     | 
    
         
            +
                    expect(proxy_handler).to receive(:handle_request).with(*args)
         
     | 
| 
      
 97 
     | 
    
         
            +
                    expect(subject.handle_request(*args)).to eql(error: 'Connection to url not cached and new http connections are disabled')
         
     | 
| 
       96 
98 
     | 
    
         
             
                  end
         
     | 
| 
       97 
99 
     | 
    
         | 
| 
       98 
100 
     | 
    
         
             
                  it 'returns an error hash with body message if POST request is not handled' do
         
     | 
| 
       99 
101 
     | 
    
         
             
                    args[0] = 'post'
         
     | 
| 
       100 
     | 
    
         
            -
                    expect(stub_handler).to 
     | 
| 
       101 
     | 
    
         
            -
                    expect(cache_handler).to 
     | 
| 
       102 
     | 
    
         
            -
                    expect(proxy_handler).to 
     | 
| 
       103 
     | 
    
         
            -
                    expect(subject.handle_request(*args)).to eql( 
     | 
| 
      
 102 
     | 
    
         
            +
                    expect(stub_handler).to receive(:handle_request).with(*args)
         
     | 
| 
      
 103 
     | 
    
         
            +
                    expect(cache_handler).to receive(:handle_request).with(*args)
         
     | 
| 
      
 104 
     | 
    
         
            +
                    expect(proxy_handler).to receive(:handle_request).with(*args)
         
     | 
| 
      
 105 
     | 
    
         
            +
                    expect(subject.handle_request(*args)).to eql(error: "Connection to url with body 'body' not cached and new http connections are disabled")
         
     | 
| 
       104 
106 
     | 
    
         
             
                  end
         
     | 
| 
       105 
107 
     | 
    
         
             
                end
         
     | 
| 
       106 
108 
     | 
    
         | 
| 
       107 
109 
     | 
    
         
             
                describe '#stub' do
         
     | 
| 
       108 
110 
     | 
    
         
             
                  it 'delegates to the stub_handler' do
         
     | 
| 
       109 
     | 
    
         
            -
                    expect(stub_handler).to receive(:stub).with( 
     | 
| 
       110 
     | 
    
         
            -
                    subject.stub( 
     | 
| 
      
 111 
     | 
    
         
            +
                    expect(stub_handler).to receive(:stub).with('some args')
         
     | 
| 
      
 112 
     | 
    
         
            +
                    subject.stub('some args')
         
     | 
| 
       111 
113 
     | 
    
         
             
                  end
         
     | 
| 
       112 
114 
     | 
    
         
             
                end
         
     | 
| 
       113 
115 
     | 
    
         | 
| 
       114 
116 
     | 
    
         
             
                describe '#reset' do
         
     | 
| 
       115 
117 
     | 
    
         
             
                  it 'resets all of the handlers' do
         
     | 
| 
       116 
     | 
    
         
            -
                    handlers.each do | 
     | 
| 
      
 118 
     | 
    
         
            +
                    handlers.each do |_key, handler|
         
     | 
| 
       117 
119 
     | 
    
         
             
                      expect(handler).to receive(:reset)
         
     | 
| 
       118 
120 
     | 
    
         
             
                    end
         
     | 
| 
       119 
121 
     | 
    
         
             
                    subject.reset
         
     | 
| 
         @@ -2,42 +2,44 @@ require 'spec_helper' 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe Billy::StubHandler do
         
     | 
| 
       4 
4 
     | 
    
         
             
              let(:handler) { Billy::StubHandler.new }
         
     | 
| 
       5 
     | 
    
         
            -
              let(:request)  
     | 
| 
      
 5 
     | 
    
         
            +
              let(:request) do
         
     | 
| 
      
 6 
     | 
    
         
            +
                {
         
     | 
| 
       6 
7 
     | 
    
         
             
                  method:   'GET',
         
     | 
| 
       7 
8 
     | 
    
         
             
                  url:      'http://example.test:8080/index?some=param',
         
     | 
| 
       8 
     | 
    
         
            -
                  headers:  {'Accept-Encoding'  => 'gzip',
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
      
 9 
     | 
    
         
            +
                  headers:  { 'Accept-Encoding'  => 'gzip',
         
     | 
| 
      
 10 
     | 
    
         
            +
                              'Cache-Control'    => 'no-cache' },
         
     | 
| 
       10 
11 
     | 
    
         
             
                  body:     'Some body'
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
                }
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
       12 
14 
     | 
    
         | 
| 
       13 
15 
     | 
    
         
             
              describe '#handles_request?' do
         
     | 
| 
       14 
16 
     | 
    
         
             
                it 'handles the request if it is stubbed' do
         
     | 
| 
       15 
     | 
    
         
            -
                  expect(handler).to receive(:find_stub).and_return( 
     | 
| 
       16 
     | 
    
         
            -
                  expect(handler.handles_request?(nil,nil,nil,nil)).to be true
         
     | 
| 
      
 17 
     | 
    
         
            +
                  expect(handler).to receive(:find_stub).and_return('a stub')
         
     | 
| 
      
 18 
     | 
    
         
            +
                  expect(handler.handles_request?(nil, nil, nil, nil)).to be true
         
     | 
| 
       17 
19 
     | 
    
         
             
                end
         
     | 
| 
       18 
20 
     | 
    
         | 
| 
       19 
21 
     | 
    
         
             
                it 'does not handle the request if it is not stubbed' do
         
     | 
| 
       20 
22 
     | 
    
         
             
                  expect(handler).to receive(:find_stub).and_return(nil)
         
     | 
| 
       21 
     | 
    
         
            -
                  expect(handler.handles_request?(nil,nil,nil,nil)).to be false
         
     | 
| 
      
 23 
     | 
    
         
            +
                  expect(handler.handles_request?(nil, nil, nil, nil)).to be false
         
     | 
| 
       22 
24 
     | 
    
         
             
                end
         
     | 
| 
       23 
25 
     | 
    
         
             
              end
         
     | 
| 
       24 
26 
     | 
    
         | 
| 
       25 
27 
     | 
    
         
             
              describe '#handle_request' do
         
     | 
| 
       26 
28 
     | 
    
         
             
                it 'returns nil if the request is not stubbed' do
         
     | 
| 
       27 
29 
     | 
    
         
             
                  expect(handler).to receive(:handles_request?).and_return(false)
         
     | 
| 
       28 
     | 
    
         
            -
                  expect(handler.handle_request(nil,nil,nil,nil)).to be nil
         
     | 
| 
      
 30 
     | 
    
         
            +
                  expect(handler.handle_request(nil, nil, nil, nil)).to be nil
         
     | 
| 
       29 
31 
     | 
    
         
             
                end
         
     | 
| 
       30 
32 
     | 
    
         | 
| 
       31 
33 
     | 
    
         
             
                it 'returns a response hash if the request is stubbed' do
         
     | 
| 
       32 
     | 
    
         
            -
                  stub = double( 
     | 
| 
      
 34 
     | 
    
         
            +
                  stub = double('stub', call: [200, { 'Content-Type' => 'application/json' }, 'Some content'])
         
     | 
| 
       33 
35 
     | 
    
         
             
                  expect(handler).to receive(:handles_request?).and_return(true)
         
     | 
| 
       34 
36 
     | 
    
         
             
                  expect(handler).to receive(:find_stub).and_return(stub)
         
     | 
| 
       35 
37 
     | 
    
         
             
                  expect(handler.handle_request('GET',
         
     | 
| 
       36 
38 
     | 
    
         
             
                                                request[:url],
         
     | 
| 
       37 
39 
     | 
    
         
             
                                                request[:headers],
         
     | 
| 
       38 
     | 
    
         
            -
                                                request[:body])).to eql( 
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
      
 40 
     | 
    
         
            +
                                                request[:body])).to eql(status: 200,
         
     | 
| 
      
 41 
     | 
    
         
            +
                                                                        headers: { 'Content-Type' => 'application/json' },
         
     | 
| 
      
 42 
     | 
    
         
            +
                                                                        content: 'Some content')
         
     | 
| 
       41 
43 
     | 
    
         
             
                end
         
     | 
| 
       42 
44 
     | 
    
         
             
              end
         
     | 
| 
       43 
45 
     | 
    
         | 
| 
         @@ -3,27 +3,27 @@ require 'spec_helper' 
     | 
|
| 
       3 
3 
     | 
    
         
             
            describe Billy::ProxyRequestStub do
         
     | 
| 
       4 
4 
     | 
    
         
             
              context '#matches?' do
         
     | 
| 
       5 
5 
     | 
    
         
             
                it 'should match urls and methods' do
         
     | 
| 
       6 
     | 
    
         
            -
                  expect(Billy::ProxyRequestStub.new('http://example.com') 
     | 
| 
       7 
     | 
    
         
            -
                    matches?('GET', 'http://example.com')).to be
         
     | 
| 
       8 
     | 
    
         
            -
                  expect(Billy::ProxyRequestStub.new('http://example.com') 
     | 
| 
       9 
     | 
    
         
            -
                    matches?('POST', 'http://example.com')).to_not be
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                  expect(Billy::ProxyRequestStub.new('http://example.com', : 
     | 
| 
       12 
     | 
    
         
            -
                    matches?('GET', 'http://example.com')).to be
         
     | 
| 
       13 
     | 
    
         
            -
                  expect(Billy::ProxyRequestStub.new('http://example.com', : 
     | 
| 
       14 
     | 
    
         
            -
                    matches?('GET', 'http://example.com')).to_not be
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                  expect(Billy::ProxyRequestStub.new('http://example.com', : 
     | 
| 
       17 
     | 
    
         
            -
                    matches?('POST', 'http://example.com')).to be
         
     | 
| 
       18 
     | 
    
         
            -
                  expect(Billy::ProxyRequestStub.new('http://fooxample.com', : 
     | 
| 
       19 
     | 
    
         
            -
                    matches?('POST', 'http://example.com')).to_not be
         
     | 
| 
      
 6 
     | 
    
         
            +
                  expect(Billy::ProxyRequestStub.new('http://example.com')
         
     | 
| 
      
 7 
     | 
    
         
            +
                    .matches?('GET', 'http://example.com')).to be
         
     | 
| 
      
 8 
     | 
    
         
            +
                  expect(Billy::ProxyRequestStub.new('http://example.com')
         
     | 
| 
      
 9 
     | 
    
         
            +
                    .matches?('POST', 'http://example.com')).to_not be
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  expect(Billy::ProxyRequestStub.new('http://example.com', method: :get)
         
     | 
| 
      
 12 
     | 
    
         
            +
                    .matches?('GET', 'http://example.com')).to be
         
     | 
| 
      
 13 
     | 
    
         
            +
                  expect(Billy::ProxyRequestStub.new('http://example.com', method: :post)
         
     | 
| 
      
 14 
     | 
    
         
            +
                    .matches?('GET', 'http://example.com')).to_not be
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                  expect(Billy::ProxyRequestStub.new('http://example.com', method: :post)
         
     | 
| 
      
 17 
     | 
    
         
            +
                    .matches?('POST', 'http://example.com')).to be
         
     | 
| 
      
 18 
     | 
    
         
            +
                  expect(Billy::ProxyRequestStub.new('http://fooxample.com', method: :post)
         
     | 
| 
      
 19 
     | 
    
         
            +
                    .matches?('POST', 'http://example.com')).to_not be
         
     | 
| 
       20 
20 
     | 
    
         
             
                end
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
                it 'should match regexps' do
         
     | 
| 
       23 
     | 
    
         
            -
                  expect(Billy::ProxyRequestStub.new(/http:\/\/.+\.com/, : 
     | 
| 
       24 
     | 
    
         
            -
                    matches?('POST', 'http://example.com')).to be
         
     | 
| 
       25 
     | 
    
         
            -
                  expect(Billy::ProxyRequestStub.new(/http:\/\/.+\.co\.uk/, : 
     | 
| 
       26 
     | 
    
         
            -
                    matches?('GET', 'http://example.com')).to_not be
         
     | 
| 
      
 23 
     | 
    
         
            +
                  expect(Billy::ProxyRequestStub.new(/http:\/\/.+\.com/, method: :post)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    .matches?('POST', 'http://example.com')).to be
         
     | 
| 
      
 25 
     | 
    
         
            +
                  expect(Billy::ProxyRequestStub.new(/http:\/\/.+\.co\.uk/, method: :get)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    .matches?('GET', 'http://example.com')).to_not be
         
     | 
| 
       27 
27 
     | 
    
         
             
                end
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
29 
     | 
    
         
             
                it 'should match up to but not including query strings' do
         
     | 
| 
         @@ -34,11 +34,24 @@ describe Billy::ProxyRequestStub do 
     | 
|
| 
       34 
34 
     | 
    
         
             
                end
         
     | 
| 
       35 
35 
     | 
    
         
             
              end
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
              context "# 
     | 
| 
      
 37 
     | 
    
         
            +
              context "#matches? (with strip_query_params false in config)" do
         
     | 
| 
      
 38 
     | 
    
         
            +
                before do
         
     | 
| 
      
 39 
     | 
    
         
            +
                  Billy.config.strip_query_params = false
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                it 'should not match up to request with query strings' do
         
     | 
| 
      
 43 
     | 
    
         
            +
                  stub = Billy::ProxyRequestStub.new('http://example.com/foo/bar/')
         
     | 
| 
      
 44 
     | 
    
         
            +
                  expect(stub.matches?('GET', 'http://example.com/foo/')).to_not be
         
     | 
| 
      
 45 
     | 
    
         
            +
                  expect(stub.matches?('GET', 'http://example.com/foo/bar/')).to be
         
     | 
| 
      
 46 
     | 
    
         
            +
                  expect(stub.matches?('GET', 'http://example.com/foo/bar/?baz=bap')).to_not be
         
     | 
| 
      
 47 
     | 
    
         
            +
                end
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
              context '#call (without #and_return)' do
         
     | 
| 
       38 
51 
     | 
    
         
             
                let(:subject) { Billy::ProxyRequestStub.new('url') }
         
     | 
| 
       39 
52 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
                it  
     | 
| 
       41 
     | 
    
         
            -
                  expect(subject.call({}, {}, nil)).to eql [204, { 
     | 
| 
      
 53 
     | 
    
         
            +
                it 'returns a 204 empty response' do
         
     | 
| 
      
 54 
     | 
    
         
            +
                  expect(subject.call({}, {}, nil)).to eql [204, { 'Content-Type' => 'text/plain' }, '']
         
     | 
| 
       42 
55 
     | 
    
         
             
                end
         
     | 
| 
       43 
56 
     | 
    
         
             
              end
         
     | 
| 
       44 
57 
     | 
    
         | 
| 
         @@ -46,7 +59,7 @@ describe Billy::ProxyRequestStub do 
     | 
|
| 
       46 
59 
     | 
    
         
             
                let(:subject) { Billy::ProxyRequestStub.new('url') }
         
     | 
| 
       47 
60 
     | 
    
         | 
| 
       48 
61 
     | 
    
         
             
                it 'should generate bare responses' do
         
     | 
| 
       49 
     | 
    
         
            -
                  subject.and_return : 
     | 
| 
      
 62 
     | 
    
         
            +
                  subject.and_return body: 'baz foo bar'
         
     | 
| 
       50 
63 
     | 
    
         
             
                  expect(subject.call({}, {}, nil)).to eql [
         
     | 
| 
       51 
64 
     | 
    
         
             
                    200,
         
     | 
| 
       52 
65 
     | 
    
         
             
                    {},
         
     | 
| 
         @@ -55,75 +68,75 @@ describe Billy::ProxyRequestStub do 
     | 
|
| 
       55 
68 
     | 
    
         
             
                end
         
     | 
| 
       56 
69 
     | 
    
         | 
| 
       57 
70 
     | 
    
         
             
                it 'should generate text responses' do
         
     | 
| 
       58 
     | 
    
         
            -
                  subject.and_return : 
     | 
| 
      
 71 
     | 
    
         
            +
                  subject.and_return text: 'foo bar baz'
         
     | 
| 
       59 
72 
     | 
    
         
             
                  expect(subject.call({}, {}, nil)).to eql [
         
     | 
| 
       60 
73 
     | 
    
         
             
                    200,
         
     | 
| 
       61 
     | 
    
         
            -
                    {'Content-Type' => 'text/plain'},
         
     | 
| 
      
 74 
     | 
    
         
            +
                    { 'Content-Type' => 'text/plain' },
         
     | 
| 
       62 
75 
     | 
    
         
             
                    'foo bar baz'
         
     | 
| 
       63 
76 
     | 
    
         
             
                  ]
         
     | 
| 
       64 
77 
     | 
    
         
             
                end
         
     | 
| 
       65 
78 
     | 
    
         | 
| 
       66 
79 
     | 
    
         
             
                it 'should generate JSON responses' do
         
     | 
| 
       67 
     | 
    
         
            -
                  subject.and_return : 
     | 
| 
      
 80 
     | 
    
         
            +
                  subject.and_return json: { foo: 'bar' }
         
     | 
| 
       68 
81 
     | 
    
         
             
                  expect(subject.call({}, {}, nil)).to eql [
         
     | 
| 
       69 
82 
     | 
    
         
             
                    200,
         
     | 
| 
       70 
     | 
    
         
            -
                    {'Content-Type' => 'application/json'},
         
     | 
| 
      
 83 
     | 
    
         
            +
                    { 'Content-Type' => 'application/json' },
         
     | 
| 
       71 
84 
     | 
    
         
             
                    '{"foo":"bar"}'
         
     | 
| 
       72 
85 
     | 
    
         
             
                  ]
         
     | 
| 
       73 
86 
     | 
    
         
             
                end
         
     | 
| 
       74 
87 
     | 
    
         | 
| 
       75 
88 
     | 
    
         
             
                context 'JSONP' do
         
     | 
| 
       76 
89 
     | 
    
         
             
                  it 'should generate JSONP responses' do
         
     | 
| 
       77 
     | 
    
         
            -
                    subject.and_return : 
     | 
| 
      
 90 
     | 
    
         
            +
                    subject.and_return jsonp: { foo: 'bar' }
         
     | 
| 
       78 
91 
     | 
    
         
             
                    expect(subject.call({ 'callback' => ['baz'] }, {}, nil)).to eql [
         
     | 
| 
       79 
92 
     | 
    
         
             
                      200,
         
     | 
| 
       80 
     | 
    
         
            -
                      {'Content-Type' => 'application/javascript'},
         
     | 
| 
      
 93 
     | 
    
         
            +
                      { 'Content-Type' => 'application/javascript' },
         
     | 
| 
       81 
94 
     | 
    
         
             
                      'baz({"foo":"bar"})'
         
     | 
| 
       82 
95 
     | 
    
         
             
                    ]
         
     | 
| 
       83 
96 
     | 
    
         
             
                  end
         
     | 
| 
       84 
97 
     | 
    
         | 
| 
       85 
98 
     | 
    
         
             
                  it 'should generate JSONP responses with custom callback parameter' do
         
     | 
| 
       86 
     | 
    
         
            -
                    subject.and_return : 
     | 
| 
      
 99 
     | 
    
         
            +
                    subject.and_return jsonp: { foo: 'bar' }, callback_param: 'cb'
         
     | 
| 
       87 
100 
     | 
    
         
             
                    expect(subject.call({ 'cb' => ['bap'] }, {}, nil)).to eql [
         
     | 
| 
       88 
101 
     | 
    
         
             
                      200,
         
     | 
| 
       89 
     | 
    
         
            -
                      {'Content-Type' => 'application/javascript'},
         
     | 
| 
      
 102 
     | 
    
         
            +
                      { 'Content-Type' => 'application/javascript' },
         
     | 
| 
       90 
103 
     | 
    
         
             
                      'bap({"foo":"bar"})'
         
     | 
| 
       91 
104 
     | 
    
         
             
                    ]
         
     | 
| 
       92 
105 
     | 
    
         
             
                  end
         
     | 
| 
       93 
106 
     | 
    
         | 
| 
       94 
107 
     | 
    
         
             
                  it 'should generate JSONP responses with custom callback name' do
         
     | 
| 
       95 
     | 
    
         
            -
                    subject.and_return : 
     | 
| 
      
 108 
     | 
    
         
            +
                    subject.and_return jsonp: { foo: 'bar' }, callback: 'cb'
         
     | 
| 
       96 
109 
     | 
    
         
             
                    expect(subject.call({}, {}, nil)).to eql [
         
     | 
| 
       97 
110 
     | 
    
         
             
                      200,
         
     | 
| 
       98 
     | 
    
         
            -
                      {'Content-Type' => 'application/javascript'},
         
     | 
| 
      
 111 
     | 
    
         
            +
                      { 'Content-Type' => 'application/javascript' },
         
     | 
| 
       99 
112 
     | 
    
         
             
                      'cb({"foo":"bar"})'
         
     | 
| 
       100 
113 
     | 
    
         
             
                    ]
         
     | 
| 
       101 
114 
     | 
    
         
             
                  end
         
     | 
| 
       102 
115 
     | 
    
         
             
                end
         
     | 
| 
       103 
116 
     | 
    
         | 
| 
       104 
117 
     | 
    
         
             
                it 'should generate redirection responses' do
         
     | 
| 
       105 
     | 
    
         
            -
                  subject.and_return : 
     | 
| 
      
 118 
     | 
    
         
            +
                  subject.and_return redirect_to: 'http://example.com'
         
     | 
| 
       106 
119 
     | 
    
         
             
                  expect(subject.call({}, {}, nil)).to eql [
         
     | 
| 
       107 
120 
     | 
    
         
             
                    302,
         
     | 
| 
       108 
     | 
    
         
            -
                    {'Location' => 'http://example.com'},
         
     | 
| 
      
 121 
     | 
    
         
            +
                    { 'Location' => 'http://example.com' },
         
     | 
| 
       109 
122 
     | 
    
         
             
                    nil
         
     | 
| 
       110 
123 
     | 
    
         
             
                  ]
         
     | 
| 
       111 
124 
     | 
    
         
             
                end
         
     | 
| 
       112 
125 
     | 
    
         | 
| 
       113 
126 
     | 
    
         
             
                it 'should set headers' do
         
     | 
| 
       114 
     | 
    
         
            -
                  subject.and_return : 
     | 
| 
      
 127 
     | 
    
         
            +
                  subject.and_return text: 'foo', headers: { 'HTTP-X-Foo' => 'bar' }
         
     | 
| 
       115 
128 
     | 
    
         
             
                  expect(subject.call({}, {}, nil)).to eql [
         
     | 
| 
       116 
129 
     | 
    
         
             
                    200,
         
     | 
| 
       117 
     | 
    
         
            -
                    {'Content-Type' => 'text/plain', 'HTTP-X-Foo' => 'bar'},
         
     | 
| 
      
 130 
     | 
    
         
            +
                    { 'Content-Type' => 'text/plain', 'HTTP-X-Foo' => 'bar' },
         
     | 
| 
       118 
131 
     | 
    
         
             
                    'foo'
         
     | 
| 
       119 
132 
     | 
    
         
             
                  ]
         
     | 
| 
       120 
133 
     | 
    
         
             
                end
         
     | 
| 
       121 
134 
     | 
    
         | 
| 
       122 
135 
     | 
    
         
             
                it 'should set status codes' do
         
     | 
| 
       123 
     | 
    
         
            -
                  subject.and_return : 
     | 
| 
      
 136 
     | 
    
         
            +
                  subject.and_return text: 'baz', code: 410
         
     | 
| 
       124 
137 
     | 
    
         
             
                  expect(subject.call({}, {}, nil)).to eql [
         
     | 
| 
       125 
138 
     | 
    
         
             
                    410,
         
     | 
| 
       126 
     | 
    
         
            -
                    {'Content-Type' => 'text/plain'},
         
     | 
| 
      
 139 
     | 
    
         
            +
                    { 'Content-Type' => 'text/plain' },
         
     | 
| 
       127 
140 
     | 
    
         
             
                    'baz'
         
     | 
| 
       128 
141 
     | 
    
         
             
                  ]
         
     | 
| 
       129 
142 
     | 
    
         
             
                end
         
     | 
| 
         @@ -133,15 +146,15 @@ describe Billy::ProxyRequestStub do 
     | 
|
| 
       133 
146 
     | 
    
         
             
                  expected_headers = { 'header1' => 'three', 'header2' => 'four' }
         
     | 
| 
       134 
147 
     | 
    
         
             
                  expected_body = 'body text'
         
     | 
| 
       135 
148 
     | 
    
         | 
| 
       136 
     | 
    
         
            -
                  subject.and_return( 
     | 
| 
      
 149 
     | 
    
         
            +
                  subject.and_return(proc do |params, headers, body|
         
     | 
| 
       137 
150 
     | 
    
         
             
                    expect(params).to eql expected_params
         
     | 
| 
       138 
151 
     | 
    
         
             
                    expect(headers).to eql expected_headers
         
     | 
| 
       139 
152 
     | 
    
         
             
                    expect(body).to eql 'body text'
         
     | 
| 
       140 
     | 
    
         
            -
                    {: 
     | 
| 
       141 
     | 
    
         
            -
                   
     | 
| 
      
 153 
     | 
    
         
            +
                    { code: 418, text: 'success' }
         
     | 
| 
      
 154 
     | 
    
         
            +
                  end)
         
     | 
| 
       142 
155 
     | 
    
         
             
                  expect(subject.call(expected_params, expected_headers, expected_body)).to eql [
         
     | 
| 
       143 
156 
     | 
    
         
             
                    418,
         
     | 
| 
       144 
     | 
    
         
            -
                    {'Content-Type' => 'text/plain'},
         
     | 
| 
      
 157 
     | 
    
         
            +
                    { 'Content-Type' => 'text/plain' },
         
     | 
| 
       145 
158 
     | 
    
         
             
                    'success'
         
     | 
| 
       146 
159 
     | 
    
         
             
                  ]
         
     | 
| 
       147 
160 
     | 
    
         
             
                end
         
     |