puffing-billy 0.2.0 → 0.2.1
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.
- data/.gitignore +1 -0
- data/Gemfile.lock +11 -4
- data/README.md +48 -2
- data/lib/billy.rb +50 -0
- data/lib/billy/cucumber.rb +19 -0
- data/lib/billy/proxy_request_stub.rb +3 -3
- data/lib/billy/rspec.rb +1 -45
- data/lib/billy/version.rb +1 -1
- data/puffing-billy.gemspec +3 -2
- metadata +26 -9
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
puffing-billy (0.1
|
4
|
+
puffing-billy (0.2.1)
|
5
5
|
capybara
|
6
6
|
em-http-request
|
7
7
|
eventmachine
|
8
8
|
eventmachine_httpserver
|
9
9
|
http_parser.rb
|
10
|
-
|
11
|
-
yajl-ruby
|
10
|
+
multi_json
|
12
11
|
|
13
12
|
GEM
|
14
13
|
remote: https://rubygems.org/
|
15
14
|
specs:
|
16
15
|
addressable (2.3.3)
|
16
|
+
builder (3.2.0)
|
17
17
|
capybara (2.0.2)
|
18
18
|
mime-types (>= 1.16)
|
19
19
|
nokogiri (>= 1.3.3)
|
@@ -28,6 +28,11 @@ GEM
|
|
28
28
|
ffi (~> 1.0, >= 1.0.11)
|
29
29
|
coderay (1.0.9)
|
30
30
|
cookiejar (0.3.0)
|
31
|
+
cucumber (1.2.5)
|
32
|
+
builder (>= 2.1.2)
|
33
|
+
diff-lcs (>= 1.1.3)
|
34
|
+
gherkin (~> 2.11.7)
|
35
|
+
multi_json (~> 1.3)
|
31
36
|
daemons (1.1.9)
|
32
37
|
diff-lcs (1.2.1)
|
33
38
|
em-http-request (1.0.3)
|
@@ -45,6 +50,8 @@ GEM
|
|
45
50
|
faye-websocket (0.4.7)
|
46
51
|
eventmachine (>= 0.12.0)
|
47
52
|
ffi (1.4.0)
|
53
|
+
gherkin (2.11.8)
|
54
|
+
multi_json (~> 1.3)
|
48
55
|
guard (1.6.2)
|
49
56
|
listen (>= 0.6.0)
|
50
57
|
lumberjack (>= 1.0.2)
|
@@ -97,13 +104,13 @@ GEM
|
|
97
104
|
websocket (1.0.7)
|
98
105
|
xpath (1.0.0)
|
99
106
|
nokogiri (~> 1.3)
|
100
|
-
yajl-ruby (1.1.0)
|
101
107
|
|
102
108
|
PLATFORMS
|
103
109
|
ruby
|
104
110
|
|
105
111
|
DEPENDENCIES
|
106
112
|
capybara-webkit
|
113
|
+
cucumber
|
107
114
|
faraday
|
108
115
|
guard
|
109
116
|
poltergeist
|
data/README.md
CHANGED
@@ -34,7 +34,7 @@ You can also record HTTP interactions and replay them later. See
|
|
34
34
|
|
35
35
|
Add this line to your application's Gemfile:
|
36
36
|
|
37
|
-
gem 'puffing-billy'
|
37
|
+
gem 'puffing-billy'
|
38
38
|
|
39
39
|
And then execute:
|
40
40
|
|
@@ -44,7 +44,7 @@ Or install it yourself as:
|
|
44
44
|
|
45
45
|
$ gem install puffing-billy
|
46
46
|
|
47
|
-
## Usage
|
47
|
+
## RSpec Usage
|
48
48
|
|
49
49
|
In your `spec_helper.rb`:
|
50
50
|
|
@@ -64,6 +64,10 @@ In your tests:
|
|
64
64
|
proxy.stub('http://example.com/text/').and_return(:text => 'Foobar')
|
65
65
|
proxy.stub('http://example.com/json/').and_return(:json => { :foo => 'bar' })
|
66
66
|
proxy.stub('http://example.com/jsonp/').and_return(:jsonp => { :foo => 'bar' })
|
67
|
+
proxy.stub('http://example.com/headers/').and_return({
|
68
|
+
:headers => { 'Access-Control-Allow-Origin' => '*' },
|
69
|
+
:json => { :foo => 'bar' }
|
70
|
+
})
|
67
71
|
proxy.stub('http://example.com/wtf/').and_return(:body => 'WTF!?', :content_type => 'text/wtf')
|
68
72
|
|
69
73
|
# Stub redirections and other return codes
|
@@ -88,6 +92,48 @@ proxy.stub('https://example.com/proc/').and_return(Proc.new { |params, headers,
|
|
88
92
|
Stubs are reset between tests. Any requests that are not stubbed will be
|
89
93
|
proxied to the remote server.
|
90
94
|
|
95
|
+
## Cucumber Usage
|
96
|
+
|
97
|
+
In your `features/support/env.rb`:
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
require 'billy/cucumber'
|
101
|
+
|
102
|
+
After do
|
103
|
+
Capybara.use_default_driver
|
104
|
+
end
|
105
|
+
```
|
106
|
+
|
107
|
+
An example feature:
|
108
|
+
|
109
|
+
```
|
110
|
+
Feature: Stubbing via billy
|
111
|
+
|
112
|
+
@javascript @billy
|
113
|
+
Scenario: Test billy
|
114
|
+
And a stub for google
|
115
|
+
```
|
116
|
+
|
117
|
+
And in steps:
|
118
|
+
|
119
|
+
```
|
120
|
+
Before('@billy') do
|
121
|
+
Capybara.current_driver = :poltergeist_billy
|
122
|
+
Capybara.javascript_driver = :poltergeist_billy
|
123
|
+
end
|
124
|
+
|
125
|
+
And /^a stub for google$/ do
|
126
|
+
proxy.stub('http://www.google.com/').and_return(:text => "I'm not Google!")
|
127
|
+
visit 'http://www.google.com/'
|
128
|
+
page.should have_content("I'm not Google!")
|
129
|
+
end
|
130
|
+
```
|
131
|
+
|
132
|
+
It's good practice to reset the driver after each scenario, so having an
|
133
|
+
`@billy` tag switches the drivers on for a given scenario. Also note that
|
134
|
+
stubs are reset after each step, so any usage of a stub should be in the
|
135
|
+
same step that it was created in.
|
136
|
+
|
91
137
|
## Caching
|
92
138
|
|
93
139
|
Requests routed through the external proxy are cached.
|
data/lib/billy.rb
CHANGED
@@ -4,3 +4,53 @@ require "billy/proxy_request_stub"
|
|
4
4
|
require "billy/cache"
|
5
5
|
require "billy/proxy"
|
6
6
|
require "billy/proxy_connection"
|
7
|
+
|
8
|
+
$billy_proxy = Billy::Proxy.new
|
9
|
+
$billy_proxy.start
|
10
|
+
|
11
|
+
module Billy
|
12
|
+
def self.proxy
|
13
|
+
$billy_proxy
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.register_drivers
|
17
|
+
['capybara/poltergeist', 'capybara/webkit', 'selenium/webdriver'].each do |d|
|
18
|
+
begin
|
19
|
+
require d
|
20
|
+
rescue LoadError
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
if defined?(Capybara::Poltergeist)
|
25
|
+
Capybara.register_driver :poltergeist_billy do |app|
|
26
|
+
options = {
|
27
|
+
phantomjs_options: [
|
28
|
+
'--ignore-ssl-errors=yes',
|
29
|
+
"--proxy=#{Billy.proxy.host}:#{Billy.proxy.port}"
|
30
|
+
]
|
31
|
+
}
|
32
|
+
Capybara::Poltergeist::Driver.new(app, options)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
if defined?(Capybara::Webkit::Driver)
|
37
|
+
Capybara.register_driver :webkit_billy do |app|
|
38
|
+
driver = Capybara::Webkit::Driver.new(app)
|
39
|
+
driver.browser.set_proxy(:host => Billy.proxy.host,
|
40
|
+
:port => Billy.proxy.port)
|
41
|
+
driver.browser.ignore_ssl_errors
|
42
|
+
driver
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
if defined?(Selenium::WebDriver)
|
47
|
+
Capybara.register_driver :selenium_billy do |app|
|
48
|
+
profile = Selenium::WebDriver::Firefox::Profile.new
|
49
|
+
profile.proxy = Selenium::WebDriver::Proxy.new(
|
50
|
+
:http => "#{Billy.proxy.host}:#{Billy.proxy.port}",
|
51
|
+
:ssl => "#{Billy.proxy.host}:#{Billy.proxy.port}")
|
52
|
+
Capybara::Selenium::Driver.new(app, :profile => profile)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'cucumber'
|
2
|
+
require 'capybara/cucumber'
|
3
|
+
require 'billy'
|
4
|
+
|
5
|
+
Billy.register_drivers
|
6
|
+
|
7
|
+
module Billy
|
8
|
+
module CucumberHelper
|
9
|
+
def proxy
|
10
|
+
Billy.proxy
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
World(Billy::CucumberHelper)
|
16
|
+
|
17
|
+
After('@billy') do
|
18
|
+
proxy.reset
|
19
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'multi_json'
|
2
2
|
|
3
3
|
module Billy
|
4
4
|
class ProxyRequestStub
|
@@ -28,7 +28,7 @@ module Billy
|
|
28
28
|
|
29
29
|
if res[:json]
|
30
30
|
headers = {'Content-Type' => 'application/json'}.merge(headers)
|
31
|
-
body =
|
31
|
+
body = MultiJson.dump(res[:json])
|
32
32
|
elsif res[:jsonp]
|
33
33
|
headers = {'Content-Type' => 'application/javascript'}.merge(headers)
|
34
34
|
if res[:callback]
|
@@ -38,7 +38,7 @@ module Billy
|
|
38
38
|
else
|
39
39
|
callback = params['callback'][0]
|
40
40
|
end
|
41
|
-
body = "#{callback}(#{
|
41
|
+
body = "#{callback}(#{MultiJson.dump(res[:jsonp])})"
|
42
42
|
elsif res[:text]
|
43
43
|
headers = {'Content-Type' => 'text/plain'}.merge(headers)
|
44
44
|
body = res[:text]
|
data/lib/billy/rspec.rb
CHANGED
@@ -2,14 +2,9 @@ require 'rspec'
|
|
2
2
|
require 'capybara/rspec'
|
3
3
|
require 'billy'
|
4
4
|
|
5
|
-
|
6
|
-
$billy_proxy.start
|
5
|
+
Billy.register_drivers
|
7
6
|
|
8
7
|
module Billy
|
9
|
-
def self.proxy
|
10
|
-
$billy_proxy
|
11
|
-
end
|
12
|
-
|
13
8
|
module RspecHelper
|
14
9
|
def proxy
|
15
10
|
Billy.proxy
|
@@ -24,42 +19,3 @@ RSpec.configure do |config|
|
|
24
19
|
proxy.reset
|
25
20
|
end
|
26
21
|
end
|
27
|
-
|
28
|
-
['capybara/poltergeist', 'capybara/webkit', 'selenium/webdriver'].each do |d|
|
29
|
-
begin
|
30
|
-
require d
|
31
|
-
rescue LoadError
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
if defined?(Capybara::Poltergeist)
|
36
|
-
Capybara.register_driver :poltergeist_billy do |app|
|
37
|
-
options = {
|
38
|
-
phantomjs_options: [
|
39
|
-
'--ignore-ssl-errors=yes',
|
40
|
-
"--proxy=#{Billy.proxy.host}:#{Billy.proxy.port}"
|
41
|
-
]
|
42
|
-
}
|
43
|
-
Capybara::Poltergeist::Driver.new(app, options)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
if defined?(Capybara::Webkit::Driver)
|
48
|
-
Capybara.register_driver :webkit_billy do |app|
|
49
|
-
driver = Capybara::Webkit::Driver.new(app)
|
50
|
-
driver.browser.set_proxy(:host => Billy.proxy.host,
|
51
|
-
:port => Billy.proxy.port)
|
52
|
-
driver.browser.ignore_ssl_errors
|
53
|
-
driver
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
if defined?(Selenium::WebDriver)
|
58
|
-
Capybara.register_driver :selenium_billy do |app|
|
59
|
-
profile = Selenium::WebDriver::Firefox::Profile.new
|
60
|
-
profile.proxy = Selenium::WebDriver::Proxy.new(
|
61
|
-
:http => "#{Billy.proxy.host}:#{Billy.proxy.port}",
|
62
|
-
:ssl => "#{Billy.proxy.host}:#{Billy.proxy.port}")
|
63
|
-
Capybara::Selenium::Driver.new(app, :profile => profile)
|
64
|
-
end
|
65
|
-
end
|
data/lib/billy/version.rb
CHANGED
data/puffing-billy.gemspec
CHANGED
@@ -24,11 +24,12 @@ Gem::Specification.new do |gem|
|
|
24
24
|
gem.add_development_dependency "rack"
|
25
25
|
gem.add_development_dependency "guard"
|
26
26
|
gem.add_development_dependency "rb-inotify"
|
27
|
+
gem.add_development_dependency "rspec"
|
28
|
+
gem.add_development_dependency "cucumber"
|
27
29
|
gem.add_runtime_dependency "eventmachine"
|
28
30
|
gem.add_runtime_dependency "em-http-request"
|
29
31
|
gem.add_runtime_dependency "eventmachine_httpserver"
|
30
32
|
gem.add_runtime_dependency "http_parser.rb"
|
31
|
-
gem.add_runtime_dependency "
|
32
|
-
gem.add_runtime_dependency "rspec"
|
33
|
+
gem.add_runtime_dependency "multi_json"
|
33
34
|
gem.add_runtime_dependency "capybara"
|
34
35
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puffing-billy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -156,14 +156,14 @@ dependencies:
|
|
156
156
|
- !ruby/object:Gem::Version
|
157
157
|
version: '0'
|
158
158
|
- !ruby/object:Gem::Dependency
|
159
|
-
name:
|
159
|
+
name: rspec
|
160
160
|
requirement: !ruby/object:Gem::Requirement
|
161
161
|
none: false
|
162
162
|
requirements:
|
163
163
|
- - ! '>='
|
164
164
|
- !ruby/object:Gem::Version
|
165
165
|
version: '0'
|
166
|
-
type: :
|
166
|
+
type: :development
|
167
167
|
prerelease: false
|
168
168
|
version_requirements: !ruby/object:Gem::Requirement
|
169
169
|
none: false
|
@@ -172,7 +172,23 @@ dependencies:
|
|
172
172
|
- !ruby/object:Gem::Version
|
173
173
|
version: '0'
|
174
174
|
- !ruby/object:Gem::Dependency
|
175
|
-
name:
|
175
|
+
name: cucumber
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
178
|
+
requirements:
|
179
|
+
- - ! '>='
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0'
|
182
|
+
type: :development
|
183
|
+
prerelease: false
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ! '>='
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0'
|
190
|
+
- !ruby/object:Gem::Dependency
|
191
|
+
name: eventmachine
|
176
192
|
requirement: !ruby/object:Gem::Requirement
|
177
193
|
none: false
|
178
194
|
requirements:
|
@@ -188,7 +204,7 @@ dependencies:
|
|
188
204
|
- !ruby/object:Gem::Version
|
189
205
|
version: '0'
|
190
206
|
- !ruby/object:Gem::Dependency
|
191
|
-
name:
|
207
|
+
name: em-http-request
|
192
208
|
requirement: !ruby/object:Gem::Requirement
|
193
209
|
none: false
|
194
210
|
requirements:
|
@@ -204,7 +220,7 @@ dependencies:
|
|
204
220
|
- !ruby/object:Gem::Version
|
205
221
|
version: '0'
|
206
222
|
- !ruby/object:Gem::Dependency
|
207
|
-
name:
|
223
|
+
name: eventmachine_httpserver
|
208
224
|
requirement: !ruby/object:Gem::Requirement
|
209
225
|
none: false
|
210
226
|
requirements:
|
@@ -220,7 +236,7 @@ dependencies:
|
|
220
236
|
- !ruby/object:Gem::Version
|
221
237
|
version: '0'
|
222
238
|
- !ruby/object:Gem::Dependency
|
223
|
-
name:
|
239
|
+
name: http_parser.rb
|
224
240
|
requirement: !ruby/object:Gem::Requirement
|
225
241
|
none: false
|
226
242
|
requirements:
|
@@ -236,7 +252,7 @@ dependencies:
|
|
236
252
|
- !ruby/object:Gem::Version
|
237
253
|
version: '0'
|
238
254
|
- !ruby/object:Gem::Dependency
|
239
|
-
name:
|
255
|
+
name: multi_json
|
240
256
|
requirement: !ruby/object:Gem::Requirement
|
241
257
|
none: false
|
242
258
|
requirements:
|
@@ -291,6 +307,7 @@ files:
|
|
291
307
|
- lib/billy.rb
|
292
308
|
- lib/billy/cache.rb
|
293
309
|
- lib/billy/config.rb
|
310
|
+
- lib/billy/cucumber.rb
|
294
311
|
- lib/billy/mitm.crt
|
295
312
|
- lib/billy/mitm.key
|
296
313
|
- lib/billy/proxy.rb
|