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.
@@ -6,9 +6,9 @@ module Billy
6
6
  def_delegators :stub_handler, :stub
7
7
 
8
8
  def handlers
9
- @handlers ||= { :stubs => StubHandler.new,
10
- :cache => CacheHandler.new,
11
- :proxy => ProxyHandler.new }
9
+ @handlers ||= { stubs: StubHandler.new,
10
+ cache: CacheHandler.new,
11
+ proxy: ProxyHandler.new }
12
12
  end
13
13
 
14
14
  def handle_request(method, url, headers, body)
@@ -20,7 +20,7 @@ module Billy
20
20
  end
21
21
 
22
22
  body_msg = method == 'post' ? " with body '#{body}'" : ''
23
- { :error => "Connection to #{url}#{body_msg} not cached and new http connections are disabled" }
23
+ { error: "Connection to #{url}#{body_msg} not cached and new http connections are disabled" }
24
24
  end
25
25
 
26
26
  def handles_request?(method, url, headers, body)
@@ -32,9 +32,7 @@ module Billy
32
32
  end
33
33
 
34
34
  def reset
35
- handlers.each_value do |handler|
36
- handler.reset
37
- end
35
+ handlers.each_value(&:reset)
38
36
  end
39
37
 
40
38
  def reset_stubs
@@ -46,7 +44,7 @@ module Billy
46
44
  end
47
45
 
48
46
  def restore_cache
49
- warn "[DEPRECATION] `restore_cache` is deprecated as cache files are dynamically checked. Use `reset_cache` if you just want to clear the cache."
47
+ warn '[DEPRECATION] `restore_cache` is deprecated as cache files are dynamically checked. Use `reset_cache` if you just want to clear the cache.'
50
48
  reset_cache
51
49
  end
52
50
 
@@ -8,7 +8,7 @@ module Billy
8
8
  def handle_request(method, url, headers, body)
9
9
  if handles_request?(method, url, headers, body)
10
10
  if (stub = find_stub(method, url))
11
- query_string = Addressable::URI.parse(url).query || ""
11
+ query_string = Addressable::URI.parse(url).query || ''
12
12
  params = CGI.parse(query_string)
13
13
  stub.call(params, headers, body).tap do |response|
14
14
  Billy.log(:info, "puffing-billy: STUB #{method} for '#{url}'")
@@ -20,7 +20,7 @@ module Billy
20
20
  nil
21
21
  end
22
22
 
23
- def handles_request?(method, url, headers, body)
23
+ def handles_request?(method, url, _headers, _body)
24
24
  !find_stub(method, url).nil?
25
25
  end
26
26
 
@@ -2,7 +2,6 @@ require 'json'
2
2
 
3
3
  module Billy
4
4
  module JSONUtils
5
-
6
5
  def self.json?(value)
7
6
  !!JSON.parse(value)
8
7
  rescue JSON::ParserError, TypeError
@@ -33,7 +32,7 @@ module Billy
33
32
  # Processing JSON in this way enables a consistent SHA to be derived from
34
33
  # JSON payloads which have the same name/value pairs, but different orders.
35
34
  def self.sort_json(json_str)
36
- JSONUtils::sort_hash_keys(JSON.parse(json_str, symbolize_names: true)).to_json
35
+ JSONUtils.sort_hash_keys(JSON.parse(json_str, symbolize_names: true)).to_json
37
36
  end
38
37
  end
39
38
  end
@@ -37,7 +37,7 @@ module Billy
37
37
  else
38
38
  if @ssl
39
39
  uri = Addressable::URI.parse(@parser.request_url)
40
- @url = "https://#{@ssl}#{[uri.path,uri.query].compact.join('?')}"
40
+ @url = "https://#{@ssl}#{[uri.path, uri.query].compact.join('?')}"
41
41
  else
42
42
  @url = @parser.request_url
43
43
  end
@@ -52,17 +52,17 @@ module Billy
52
52
  @parser = Http::Parser.new(self)
53
53
  send_data("HTTP/1.0 200 Connection established\r\nProxy-agent: Puffing-Billy/0.0.0\r\n\r\n")
54
54
  start_tls(
55
- :private_key_file => File.expand_path('../mitm.key', __FILE__),
56
- :cert_chain_file => File.expand_path('../mitm.crt', __FILE__)
55
+ private_key_file: File.expand_path('../mitm.key', __FILE__),
56
+ cert_chain_file: File.expand_path('../mitm.crt', __FILE__)
57
57
  )
58
58
  end
59
59
 
60
60
  def handle_request
61
61
  EM.synchrony do
62
62
  handler.handle_request(@parser.http_method, @url, @headers, @body).tap do |response|
63
- if response.has_key?(:error)
63
+ if response.key?(:error)
64
64
  close_connection
65
- raise "puffing-billy: #{response[:error]}"
65
+ fail "puffing-billy: #{response[:error]}"
66
66
  else
67
67
  send_response(response)
68
68
  end
@@ -3,10 +3,10 @@ require 'multi_json'
3
3
  module Billy
4
4
  class ProxyRequestStub
5
5
  def initialize(url, options = {})
6
- @options = {:method => :get}.merge(options)
6
+ @options = { method: :get }.merge(options)
7
7
  @method = @options[:method].to_s.upcase
8
8
  @url = url
9
- @response = {code: 204, headers: {}, text: ""}
9
+ @response = { code: 204, headers: {}, text: '' }
10
10
  end
11
11
 
12
12
  def and_return(response)
@@ -27,10 +27,10 @@ module Billy
27
27
  headers['Content-Type'] = res[:content_type] if res[:content_type]
28
28
 
29
29
  if res[:json]
30
- headers = {'Content-Type' => 'application/json'}.merge(headers)
30
+ headers = { 'Content-Type' => 'application/json' }.merge(headers)
31
31
  body = MultiJson.dump(res[:json])
32
32
  elsif res[:jsonp]
33
- headers = {'Content-Type' => 'application/javascript'}.merge(headers)
33
+ headers = { 'Content-Type' => 'application/javascript' }.merge(headers)
34
34
  if res[:callback]
35
35
  callback = res[:callback]
36
36
  elsif res[:callback_param]
@@ -40,11 +40,11 @@ module Billy
40
40
  end
41
41
  body = "#{callback}(#{MultiJson.dump(res[:jsonp])})"
42
42
  elsif res[:text]
43
- headers = {'Content-Type' => 'text/plain'}.merge(headers)
43
+ headers = { 'Content-Type' => 'text/plain' }.merge(headers)
44
44
  body = res[:text]
45
45
  elsif res[:redirect_to]
46
46
  code = 302
47
- headers = {'Location' => res[:redirect_to]}
47
+ headers = { 'Location' => res[:redirect_to] }
48
48
  else
49
49
  body = res[:body]
50
50
  end
@@ -57,7 +57,7 @@ module Billy
57
57
  if @url.is_a?(Regexp)
58
58
  url.match(@url)
59
59
  else
60
- url.split('?')[0] == @url
60
+ Billy.config.strip_query_params ? (url.split('?')[0] == @url) : (url == @url)
61
61
  end
62
62
  end
63
63
  end
@@ -1,3 +1,3 @@
1
1
  module Billy
2
- VERSION = "0.4.1"
2
+ VERSION = '0.5.0'
3
3
  end
@@ -1,7 +1,6 @@
1
1
  require 'addressable/uri'
2
2
 
3
3
  namespace :cache do
4
-
5
4
  desc 'Print out all cache file information'
6
5
  task :print_all do
7
6
  cache_array = load_cache
@@ -12,9 +11,9 @@ namespace :cache do
12
11
  end
13
12
 
14
13
  desc 'Print out specific cache file information'
15
- task :print_details, :sha do |t, args|
16
- raise "Missing sha; usage: rake cache:print_details['<sha>']" unless args[:sha]
17
- cache_array = load_cache(Billy.config.cache_path, '*'+args[:sha]+'*.yml')
14
+ task :print_details, :sha do |_t, args|
15
+ fail "Missing sha; usage: rake cache:print_details['<sha>']" unless args[:sha]
16
+ cache_array = load_cache(Billy.config.cache_path, '*' + args[:sha] + '*.yml')
18
17
 
19
18
  sort_cache(cache_array).each do |cache|
20
19
  print_cache_details(cache)
@@ -22,10 +21,10 @@ namespace :cache do
22
21
  end
23
22
 
24
23
  desc 'Find specific cache files by URL'
25
- task :find_by_url, :api_path do |t, args|
26
- raise "Missing api path; usage: rake cache:find_by_url['<api_path>']" unless args[:api_path]
24
+ task :find_by_url, :api_path do |_t, args|
25
+ fail "Missing api path; usage: rake cache:find_by_url['<api_path>']" unless args[:api_path]
27
26
  cache_array = load_cache
28
- filtered_cache_array = cache_array.select {|f| f[:url_path].include?(args[:api_path]) }
27
+ filtered_cache_array = cache_array.select { |f| f[:url_path].include?(args[:api_path]) }
29
28
 
30
29
  sort_cache(filtered_cache_array).each do |cache|
31
30
  print_cache_details(cache)
@@ -33,10 +32,10 @@ namespace :cache do
33
32
  end
34
33
 
35
34
  desc 'Find specific cache files by scope'
36
- task :find_by_scope, :scope do |t, args|
37
- raise "Missing scope; usage: rake cache:find_by_scope['<scope>']" unless args[:scope]
35
+ task :find_by_scope, :scope do |_t, args|
36
+ fail "Missing scope; usage: rake cache:find_by_scope['<scope>']" unless args[:scope]
38
37
  cache_array = load_cache
39
- filtered_cache_array = cache_array.select {|f| f[:scope] && f[:scope].include?(args[:scope]) }
38
+ filtered_cache_array = cache_array.select { |f| f[:scope] && f[:scope].include?(args[:scope]) }
40
39
 
41
40
  sort_cache(filtered_cache_array).each do |cache|
42
41
  print_cache_details(cache)
@@ -46,7 +45,7 @@ namespace :cache do
46
45
  desc 'Find cache files with non-successful status codes'
47
46
  task :find_non_successful do
48
47
  cache_array = load_cache
49
- filtered_cache_array = cache_array.select {|f| !(200..299).include?(f[:status]) }
48
+ filtered_cache_array = cache_array.select { |f| !(200..299).include?(f[:status]) }
50
49
 
51
50
  sort_cache(filtered_cache_array).each do |cache|
52
51
  print_cache_details(cache)
@@ -57,11 +56,11 @@ namespace :cache do
57
56
  cache_path = Rails.root.join(cache_directory)
58
57
  cache_array = []
59
58
 
60
- Dir.glob(cache_path+file_pattern) do |filename|
59
+ Dir.glob(cache_path + file_pattern) do |filename|
61
60
  data = load_cache_file(filename)
62
61
  url = Addressable::URI.parse(data[:url])
63
- data[:url_path] = "#{url.path}#{url.query ? '?'+url.query : ''}#{url.fragment ? '#'+url.fragment : ''}"
64
- data[:filename] = filename.gsub(Rails.root.to_s+'/','')
62
+ data[:url_path] = "#{url.path}#{url.query ? '?' + url.query : ''}#{url.fragment ? '#' + url.fragment : ''}"
63
+ data[:filename] = filename.gsub(Rails.root.to_s + '/', '')
65
64
  cache_array << data
66
65
  end
67
66
  cache_array
@@ -85,5 +84,4 @@ namespace :cache do
85
84
  def sort_cache(cache, key = :url_path)
86
85
  cache.sort_by { |hsh| hsh[key] }
87
86
  end
88
-
89
87
  end
@@ -2,36 +2,36 @@
2
2
  require File.expand_path('../lib/billy/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
- gem.authors = ["Olly Smith"]
6
- gem.email = ["olly.smith@gmail.com"]
7
- gem.description = %q{A stubbing proxy server for ruby. Connect it to your browser in integration tests to fake interactions with remote HTTP(S) servers.}
8
- gem.summary = %q{Easy request stubs for browser tests.}
9
- gem.homepage = "https://github.com/oesmith/puffing-billy"
5
+ gem.authors = ['Olly Smith']
6
+ gem.email = ['olly.smith@gmail.com']
7
+ gem.description = 'A stubbing proxy server for ruby. Connect it to your browser in integration tests to fake interactions with remote HTTP(S) servers.'
8
+ gem.summary = 'Easy request stubs for browser tests.'
9
+ gem.homepage = 'https://github.com/oesmith/puffing-billy'
10
10
 
11
- gem.files = `git ls-files`.split($\)
12
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
11
+ gem.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
13
13
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
- gem.name = "puffing-billy"
15
- gem.require_paths = ["lib"]
14
+ gem.name = 'puffing-billy'
15
+ gem.require_paths = ['lib']
16
16
  gem.version = Billy::VERSION
17
17
 
18
- gem.add_development_dependency "rspec"
19
- gem.add_development_dependency "thin"
20
- gem.add_development_dependency "faraday"
21
- gem.add_development_dependency "poltergeist"
22
- gem.add_development_dependency "selenium-webdriver"
23
- gem.add_development_dependency "capybara"
24
- gem.add_development_dependency "capybara-webkit", "~> 1.0"
25
- gem.add_development_dependency "rack"
26
- gem.add_development_dependency "guard"
27
- gem.add_development_dependency "rb-inotify"
28
- gem.add_development_dependency "pry"
29
- gem.add_development_dependency "cucumber"
30
- gem.add_runtime_dependency "addressable"
31
- gem.add_runtime_dependency "eventmachine"
32
- gem.add_runtime_dependency "em-synchrony"
33
- gem.add_runtime_dependency "em-http-request"
34
- gem.add_runtime_dependency "eventmachine_httpserver"
35
- gem.add_runtime_dependency "http_parser.rb", "~> 0.6.0"
36
- gem.add_runtime_dependency "multi_json"
18
+ gem.add_development_dependency 'rspec'
19
+ gem.add_development_dependency 'thin'
20
+ gem.add_development_dependency 'faraday'
21
+ gem.add_development_dependency 'poltergeist'
22
+ gem.add_development_dependency 'selenium-webdriver'
23
+ gem.add_development_dependency 'capybara'
24
+ gem.add_development_dependency 'capybara-webkit', '~> 1.0'
25
+ gem.add_development_dependency 'rack'
26
+ gem.add_development_dependency 'guard'
27
+ gem.add_development_dependency 'rb-inotify'
28
+ gem.add_development_dependency 'pry'
29
+ gem.add_development_dependency 'cucumber'
30
+ gem.add_runtime_dependency 'addressable'
31
+ gem.add_runtime_dependency 'eventmachine'
32
+ gem.add_runtime_dependency 'em-synchrony'
33
+ gem.add_runtime_dependency 'em-http-request', '~> 1.1.0'
34
+ gem.add_runtime_dependency 'eventmachine_httpserver'
35
+ gem.add_runtime_dependency 'http_parser.rb', '~> 0.6.0'
36
+ gem.add_runtime_dependency 'multi_json'
37
37
  end
@@ -1,22 +1,22 @@
1
1
  require 'spec_helper'
2
2
  require 'base64'
3
3
 
4
- describe 'Facebook API example', :type => :feature, :js => true do
4
+ describe 'Facebook API example', type: :feature, js: true do
5
5
  before do
6
- proxy.stub('https://www.facebook.com:443/dialog/oauth').and_return(Proc.new { |params,_,_|
6
+ proxy.stub('https://www.facebook.com:443/dialog/oauth').and_return(proc do |params, _, _|
7
7
  # mock a signed request from facebook. the JS api never verifies the
8
8
  # signature, so all it needs is the base64-encoded payload
9
9
  signed_request = "xxxxxxxxxx.#{Base64.encode64('{"user_id":"1234567"}')}"
10
10
  # redirect to the 'redirect_uri', with some extra crap in the query string
11
- {:redirect_to => "#{params['redirect_uri'][0]}&access_token=foobar&expires_in=600&base_domain=localhost&https=1&signed_request=#{signed_request}"}
12
- })
11
+ { redirect_to: "#{params['redirect_uri'][0]}&access_token=foobar&expires_in=600&base_domain=localhost&https=1&signed_request=#{signed_request}" }
12
+ end)
13
13
 
14
- proxy.stub('https://graph.facebook.com:443/me').and_return(:jsonp => {:name => 'Tester 1'})
14
+ proxy.stub('https://graph.facebook.com:443/me').and_return(jsonp: { name: 'Tester 1' })
15
15
  end
16
16
 
17
17
  it 'should show me as logged-in' do
18
18
  visit '/facebook_api.html'
19
- click_on "Login"
20
- expect(page).to have_content "Hi, Tester 1"
19
+ click_on 'Login'
20
+ expect(page).to have_content 'Hi, Tester 1'
21
21
  end
22
22
  end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Tumblr API example', :type => :feature, :js => true do
3
+ describe 'Tumblr API example', type: :feature, js: true do
4
4
  before do
5
5
  proxy.stub('http://blog.howmanyleft.co.uk/api/read/json').and_return(
6
- :jsonp => {
7
- :posts => [
6
+ jsonp: {
7
+ posts: [
8
8
  {
9
9
  'regular-title' => 'News Item 1',
10
10
  'url-with-slug' => 'http://example.com/news/1',
@@ -16,14 +16,14 @@ describe 'Tumblr API example', :type => :feature, :js => true do
16
16
  'regular-body' => 'News item 2 content here'
17
17
  }
18
18
  ]
19
- })
19
+ })
20
20
  end
21
21
 
22
22
  it 'should show news stories' do
23
23
  visit '/tumblr_api.html'
24
- expect(page).to have_link('News Item 1', :href => 'http://example.com/news/1')
24
+ expect(page).to have_link('News Item 1', href: 'http://example.com/news/1')
25
25
  expect(page).to have_content('News item 1 content here')
26
- expect(page).to have_link('News Item 2', :href => 'http://example.com/news/2')
26
+ expect(page).to have_link('News Item 2', href: 'http://example.com/news/2')
27
27
  expect(page).to have_content('News item 2 content here')
28
28
  end
29
29
  end
@@ -27,13 +27,13 @@ describe Billy::Cache do
27
27
  expect { cache.format_url(pipe_url) }.not_to raise_error
28
28
  end
29
29
 
30
- context "when dynamic_jsonp is true" do
30
+ context 'when dynamic_jsonp is true' do
31
31
  it 'omits the callback param by default' do
32
32
  expect(cache.format_url(params_url_with_callback, false, true)).to eq params_url
33
33
  end
34
34
 
35
35
  it 'omits the params listed in Billy.config.dynamic_jsonp_keys' do
36
- allow(Billy.config).to receive(:dynamic_jsonp_keys) { ["foo"] }
36
+ allow(Billy.config).to receive(:dynamic_jsonp_keys) { ['foo'] }
37
37
 
38
38
  expect(cache.format_url(params_url_with_callback, false, true)).to eq "#{base_url}?callback=quux"
39
39
  end
@@ -56,11 +56,10 @@ describe Billy::Cache do
56
56
  end
57
57
  end
58
58
 
59
- context "with merge_cached_responses_whitelist set" do
60
-
61
- let(:analytics_url1) { "http://www.example-analytics.com/user/SDF879932/" }
62
- let(:analytics_url2) { "http://www.example-analytics.com/user/OIWEMLW39/" }
63
- let(:regular_url) { "http://www.example-analytics.com/user.js" }
59
+ context 'with merge_cached_responses_whitelist set' do
60
+ let(:analytics_url1) { 'http://www.example-analytics.com/user/SDF879932/' }
61
+ let(:analytics_url2) { 'http://www.example-analytics.com/user/OIWEMLW39/' }
62
+ let(:regular_url) { 'http://www.example-analytics.com/user.js' }
64
63
 
65
64
  let(:regex_to_match_analytics_urls_only) do
66
65
  # Note that it matches the forward slash at the end of the URL, which doesn't match regular_url:
@@ -74,19 +73,18 @@ describe Billy::Cache do
74
73
  end
75
74
 
76
75
  it "has one cache key for the two analytics urls that match, and a separate one for the other that doesn't" do
77
- expect(cache.key("post", analytics_url1, "body")).to eq cache.key("post", analytics_url2, "body")
78
- expect(cache.key("post", analytics_url1, "body")).not_to eq cache.key("post", regular_url, "body")
76
+ expect(cache.key('post', analytics_url1, 'body')).to eq cache.key('post', analytics_url2, 'body')
77
+ expect(cache.key('post', analytics_url1, 'body')).not_to eq cache.key('post', regular_url, 'body')
79
78
  end
80
79
 
81
- it "More specifically, the cache keys should be identical for the 2 analytics urls" do
82
- identical_cache_key = "post_5fcb7a450e4cd54dcffcb526212757ee0ca9dc17"
83
- distinct_cache_key = "post_www.example-analytics.com_81f097654a523bd7ddb10fd4aee781723e076a1a_02083f4579e08a612425c0c1a17ee47add783b94"
80
+ it 'More specifically, the cache keys should be identical for the 2 analytics urls' do
81
+ identical_cache_key = 'post_5fcb7a450e4cd54dcffcb526212757ee0ca9dc17'
82
+ distinct_cache_key = 'post_www.example-analytics.com_81f097654a523bd7ddb10fd4aee781723e076a1a_02083f4579e08a612425c0c1a17ee47add783b94'
84
83
 
85
- expect(cache.key("post", analytics_url1, "body")).to eq identical_cache_key
86
- expect(cache.key("post", regular_url, "body")).to eq distinct_cache_key
87
- expect(cache.key("post", analytics_url2, "body")).to eq identical_cache_key
84
+ expect(cache.key('post', analytics_url1, 'body')).to eq identical_cache_key
85
+ expect(cache.key('post', regular_url, 'body')).to eq distinct_cache_key
86
+ expect(cache.key('post', analytics_url2, 'body')).to eq identical_cache_key
88
87
  end
89
-
90
88
  end
91
89
  end
92
90
  end
@@ -2,13 +2,15 @@ require 'spec_helper'
2
2
 
3
3
  describe Billy::CacheHandler do
4
4
  let(:handler) { Billy::CacheHandler.new }
5
- let(:request) { {
5
+ let(:request) do
6
+ {
6
7
  method: 'post',
7
8
  url: 'http://example.test:8080/index?some=param&callback=dynamicCallback5678',
8
- headers: {'Accept-Encoding' => 'gzip',
9
- 'Cache-Control' => 'no-cache' },
9
+ headers: { 'Accept-Encoding' => 'gzip',
10
+ 'Cache-Control' => 'no-cache' },
10
11
  body: 'Some body'
11
- } }
12
+ }
13
+ end
12
14
 
13
15
  it 'delegates #reset to the cache' do
14
16
  expect(Billy::Cache.instance).to receive(:reset).at_least(:once)
@@ -23,12 +25,12 @@ describe Billy::CacheHandler do
23
25
  describe '#handles_request?' do
24
26
  it 'handles the request if it is cached' do
25
27
  expect(Billy::Cache.instance).to receive(:cached?).and_return(true)
26
- expect(handler.handles_request?(nil,nil,nil,nil)).to be true
28
+ expect(handler.handles_request?(nil, nil, nil, nil)).to be true
27
29
  end
28
30
 
29
31
  it 'does not handle the request if it is not cached' do
30
32
  expect(Billy::Cache.instance).to receive(:cached?).and_return(false)
31
- expect(handler.handles_request?(nil,nil,nil,nil)).to be false
33
+ expect(handler.handles_request?(nil, nil, nil, nil)).to be false
32
34
  end
33
35
  end
34
36
 
@@ -43,11 +45,11 @@ describe Billy::CacheHandler do
43
45
 
44
46
  it 'returns a cached response if the request can be handled' do
45
47
  expect(Billy::Cache.instance).to receive(:cached?).and_return(true)
46
- expect(Billy::Cache.instance).to receive(:fetch).and_return({:status=>200, :headers=>{"Connection"=>"close"}, :content=>"The response body"})
48
+ expect(Billy::Cache.instance).to receive(:fetch).and_return(status: 200, headers: { 'Connection' => 'close' }, content: 'The response body')
47
49
  expect(handler.handle_request(request[:method],
48
50
  request[:url],
49
51
  request[:headers],
50
- request[:body])).to eql({:status=>200, :headers=>{"Connection"=>"close"}, :content=>"The response body"})
52
+ request[:body])).to eql(status: 200, headers: { 'Connection' => 'close' }, content: 'The response body')
51
53
  end
52
54
 
53
55
  context 'updating jsonp callback names enabled' do
@@ -57,20 +59,20 @@ describe Billy::CacheHandler do
57
59
 
58
60
  it 'updates the cached response if the callback is dynamic' do
59
61
  expect(Billy::Cache.instance).to receive(:cached?).and_return(true)
60
- expect(Billy::Cache.instance).to receive(:fetch).and_return({:status=>200, :headers=>{"Connection"=>"close"}, :content=> 'dynamicCallback1234({"yolo":"kitten"})'})
62
+ expect(Billy::Cache.instance).to receive(:fetch).and_return(status: 200, headers: { 'Connection' => 'close' }, content: 'dynamicCallback1234({"yolo":"kitten"})')
61
63
  expect(handler.handle_request(request[:method],
62
64
  request[:url],
63
65
  request[:headers],
64
- request[:body])).to eql({:status=>200, :headers=>{"Connection"=>"close"}, :content=>'dynamicCallback5678({"yolo":"kitten"})'})
66
+ request[:body])).to eql(status: 200, headers: { 'Connection' => 'close' }, content: 'dynamicCallback5678({"yolo":"kitten"})')
65
67
  end
66
68
 
67
69
  it 'is flexible about the format of the response body' do
68
70
  expect(Billy::Cache.instance).to receive(:cached?).and_return(true)
69
- expect(Billy::Cache.instance).to receive(:fetch).and_return({:status=>200, :headers=>{"Connection"=>"close"}, :content=> "/**/ dynamicCallback1234(\n{\"yolo\":\"kitten\"})"})
71
+ expect(Billy::Cache.instance).to receive(:fetch).and_return(status: 200, headers: { 'Connection' => 'close' }, content: "/**/ dynamicCallback1234(\n{\"yolo\":\"kitten\"})")
70
72
  expect(handler.handle_request(request[:method],
71
73
  request[:url],
72
74
  request[:headers],
73
- request[:body])).to eql({:status=>200, :headers=>{"Connection"=>"close"}, :content=>"/**/ dynamicCallback5678(\n{\"yolo\":\"kitten\"})"})
75
+ request[:body])).to eql(status: 200, headers: { 'Connection' => 'close' }, content: "/**/ dynamicCallback5678(\n{\"yolo\":\"kitten\"})")
74
76
  end
75
77
 
76
78
  it 'does not interfere with non-jsonp requests' do
@@ -78,22 +80,22 @@ describe Billy::CacheHandler do
78
80
  other_request = {
79
81
  method: 'get',
80
82
  url: 'http://example.test:8080/index?hanukkah=latkes',
81
- headers: {'Accept-Encoding'=>'gzip', 'Cache-Control'=>'no-cache' },
83
+ headers: { 'Accept-Encoding' => 'gzip', 'Cache-Control' => 'no-cache' },
82
84
  body: 'no jsonp'
83
85
  }
84
86
 
85
87
  allow(Billy::Cache.instance).to receive(:cached?).and_return(true)
86
- allow(Billy::Cache.instance).to receive(:fetch).with(jsonp_request[:method], jsonp_request[:url], jsonp_request[:body]).and_return({:status=>200,
87
- :headers=>{"Connection"=>"close"},
88
- :content=> 'dynamicCallback1234({"yolo":"kitten"})'})
89
- allow(Billy::Cache.instance).to receive(:fetch).with(other_request[:method], other_request[:url], other_request[:body]).and_return({:status=>200,
90
- :headers=>{"Connection"=>"close"},
91
- :content=> 'no jsonp but has parentheses()'})
88
+ allow(Billy::Cache.instance).to receive(:fetch).with(jsonp_request[:method], jsonp_request[:url], jsonp_request[:body]).and_return(status: 200,
89
+ headers: { 'Connection' => 'close' },
90
+ content: 'dynamicCallback1234({"yolo":"kitten"})')
91
+ allow(Billy::Cache.instance).to receive(:fetch).with(other_request[:method], other_request[:url], other_request[:body]).and_return(status: 200,
92
+ headers: { 'Connection' => 'close' },
93
+ content: 'no jsonp but has parentheses()')
92
94
 
93
95
  expect(handler.handle_request(other_request[:method],
94
- other_request[:url],
95
- other_request[:headers],
96
- other_request[:body])).to eql({:status=>200, :headers=>{"Connection"=>"close"}, :content=>'no jsonp but has parentheses()'})
96
+ other_request[:url],
97
+ other_request[:headers],
98
+ other_request[:body])).to eql(status: 200, headers: { 'Connection' => 'close' }, content: 'no jsonp but has parentheses()')
97
99
  end
98
100
  end
99
101
 
@@ -104,11 +106,11 @@ describe Billy::CacheHandler do
104
106
 
105
107
  it 'does not change the response' do
106
108
  expect(Billy::Cache.instance).to receive(:cached?).and_return(true)
107
- expect(Billy::Cache.instance).to receive(:fetch).and_return({:status=>200, :headers=>{"Connection"=>"close"}, :content=> 'dynamicCallback1234({"yolo":"kitten"})'})
109
+ expect(Billy::Cache.instance).to receive(:fetch).and_return(status: 200, headers: { 'Connection' => 'close' }, content: 'dynamicCallback1234({"yolo":"kitten"})')
108
110
  expect(handler.handle_request(request[:method],
109
111
  request[:url],
110
112
  request[:headers],
111
- request[:body])).to eql({:status=>200, :headers=>{"Connection"=>"close"}, :content=>'dynamicCallback1234({"yolo":"kitten"})'})
113
+ request[:body])).to eql(status: 200, headers: { 'Connection' => 'close' }, content: 'dynamicCallback1234({"yolo":"kitten"})')
112
114
  end
113
115
  end
114
116