http_monkey 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/Rakefile +19 -0
- data/Readme.md +173 -0
- data/http_monkey.gemspec +27 -0
- data/lib/http_monkey/client/environment.rb +30 -0
- data/lib/http_monkey/client/environment_builder.rb +70 -0
- data/lib/http_monkey/client/http_request.rb +20 -0
- data/lib/http_monkey/client.rb +43 -0
- data/lib/http_monkey/configuration/behaviours.rb +49 -0
- data/lib/http_monkey/configuration/middlewares.rb +29 -0
- data/lib/http_monkey/configuration.rb +36 -0
- data/lib/http_monkey/entry_point.rb +88 -0
- data/lib/http_monkey/middlewares/default_headers.rb +26 -0
- data/lib/http_monkey/middlewares.rb +5 -0
- data/lib/http_monkey/version.rb +3 -0
- data/lib/http_monkey.rb +64 -0
- data/test/http_monkey/client/environment_test.rb +28 -0
- data/test/http_monkey/client_test.rb +28 -0
- data/test/http_monkey/configuration/behaviours_test.rb +34 -0
- data/test/http_monkey/configuration/middlewares_test.rb +73 -0
- data/test/http_monkey/configuration_test.rb +64 -0
- data/test/http_monkey/entry_point_test.rb +135 -0
- data/test/http_monkey/http_monkey_test.rb +26 -0
- data/test/http_monkey/middlewares/default_headers_test.rb +32 -0
- data/test/integration/server.rb +73 -0
- data/test/integration/verbs_test.rb +58 -0
- data/test/test_helper.rb +9 -0
- metadata +191 -0
data/lib/http_monkey.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require "net/http"
|
2
|
+
require "rack"
|
3
|
+
require "httpi"
|
4
|
+
|
5
|
+
require "http_monkey/version"
|
6
|
+
require "http_monkey/entry_point"
|
7
|
+
require "http_monkey/configuration"
|
8
|
+
require "http_monkey/configuration/behaviours"
|
9
|
+
require "http_monkey/configuration/middlewares"
|
10
|
+
require "http_monkey/client"
|
11
|
+
require "http_monkey/client/http_request"
|
12
|
+
require "http_monkey/client/environment"
|
13
|
+
require "http_monkey/client/environment_builder"
|
14
|
+
require "http_monkey/middlewares"
|
15
|
+
|
16
|
+
module HttpMonkey
|
17
|
+
|
18
|
+
def self.at(url)
|
19
|
+
default_client.at(url)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.configure(&block)
|
23
|
+
default_client.configure(&block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.build(&block)
|
27
|
+
HttpMonkey::Client.new.configure(&block)
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
def self.default_client
|
33
|
+
@@default_client ||= build do
|
34
|
+
net_adapter :net_http
|
35
|
+
behaviours do
|
36
|
+
# Follow redirects
|
37
|
+
on([301, 302, 303, 307]) do |client, request, response|
|
38
|
+
if (location = response.headers["location"])
|
39
|
+
request.url = location
|
40
|
+
client.http_request(:get, request)
|
41
|
+
else
|
42
|
+
raise "HTTP status #{response.code} not supported (or location not found)"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
# By default, always return response
|
46
|
+
on_unknown do |client, request, response|
|
47
|
+
response
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
HTTPI.log = false
|
56
|
+
|
57
|
+
# This monkey patch is to avoid a bug from httpi (1.1.1) on ruby 1.8.7
|
58
|
+
# that raises "undefined method `use_ssl=' for Net::HTTP"
|
59
|
+
if RUBY_VERSION =~ /1\.8/
|
60
|
+
class Net::HTTPSession
|
61
|
+
def use_ssl=(flag)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe HttpMonkey::Client::Environment do
|
4
|
+
|
5
|
+
subject { HttpMonkey::Client::Environment }
|
6
|
+
|
7
|
+
describe "#accessor" do
|
8
|
+
it "gets like Hash" do
|
9
|
+
env = subject.new(:test => "value")
|
10
|
+
env[:test].must_equal("value")
|
11
|
+
end
|
12
|
+
it "sets like Hash" do
|
13
|
+
env = subject.new(:test => "value")
|
14
|
+
env[:test] = "owned"
|
15
|
+
env[:test].must_equal("owned")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "#http_headers" do
|
20
|
+
env = subject.new("HTTP_CONTENT_TYPE" => "text/html",
|
21
|
+
"HTTP_X_CUSTOM" => "custom")
|
22
|
+
|
23
|
+
env.http_headers.must_be_instance_of(Hash)
|
24
|
+
env.http_headers["Content-Type"].must_equal("text/html")
|
25
|
+
env.http_headers["X-Custom"].must_equal("custom")
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe HttpMonkey::Client do
|
4
|
+
|
5
|
+
subject do
|
6
|
+
HttpMonkey::Client.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "#at" do
|
10
|
+
subject.at("http://server.com").must_be_instance_of(HttpMonkey::EntryPoint)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "default values" do
|
14
|
+
it "#net_adapter" do
|
15
|
+
subject.net_adapter.must_equal(:net_http)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#configure" do
|
20
|
+
it "#net_adapter" do
|
21
|
+
subject.configure do
|
22
|
+
net_adapter(:curb)
|
23
|
+
end
|
24
|
+
subject.net_adapter.must_equal(:curb)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe HttpMonkey::Configuration::Behaviours do
|
4
|
+
|
5
|
+
subject { HttpMonkey::Configuration::Behaviours.new }
|
6
|
+
|
7
|
+
describe "#on" do
|
8
|
+
it "support Integer code" do
|
9
|
+
subject.on(1) { "test int" }
|
10
|
+
|
11
|
+
subject.find(1).call.must_equal("test int")
|
12
|
+
subject.find(2).must_be_nil
|
13
|
+
end
|
14
|
+
it "support Range code" do
|
15
|
+
subject.on(90...100) { "test range" }
|
16
|
+
|
17
|
+
subject.find(90).call.must_equal("test range")
|
18
|
+
subject.find(99).call.must_equal("test range")
|
19
|
+
subject.find(100).must_be_nil
|
20
|
+
end
|
21
|
+
it "support Array code (or anything that respond_to include?)" do
|
22
|
+
subject.on([2,3]) { "test array" }
|
23
|
+
|
24
|
+
subject.find(2).call.must_equal("test array")
|
25
|
+
subject.find(3).call.must_equal("test array")
|
26
|
+
subject.find(1).must_be_nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "#on_unknown" do
|
31
|
+
subject.on_unknown { "ok" }
|
32
|
+
subject.unknown_behaviour.call.must_equal("ok")
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe HttpMonkey::Configuration::Middlewares do
|
4
|
+
|
5
|
+
subject { HttpMonkey::Configuration::Middlewares.new }
|
6
|
+
|
7
|
+
class MiddleBase
|
8
|
+
def initialize(app, args = {}, &block)
|
9
|
+
@app = app
|
10
|
+
@args = args
|
11
|
+
@block = block
|
12
|
+
end
|
13
|
+
def call(env)
|
14
|
+
env[:args] = @args
|
15
|
+
env[:block] = @block
|
16
|
+
env[:app] ||= []
|
17
|
+
env[:app] << "before #{self.class.to_s}"
|
18
|
+
result = @app.call(env)
|
19
|
+
env[:app] << "after #{self.class.to_s}"
|
20
|
+
result
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Middle1 < MiddleBase; end
|
25
|
+
class Middle2 < MiddleBase; end
|
26
|
+
|
27
|
+
let(:app) do
|
28
|
+
Proc.new do |env|
|
29
|
+
env[:app] << "app"
|
30
|
+
"OK"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
let(:env) do
|
35
|
+
{:app => []}
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#use" do
|
39
|
+
it "delegate args" do
|
40
|
+
subject.use Middle1, :arg1 =>'arg1', :arg2 => "arg2"
|
41
|
+
subject.execute(app, env)
|
42
|
+
env[:args].must_equal({:arg1 =>'arg1', :arg2 => "arg2"})
|
43
|
+
end
|
44
|
+
it "delegate block" do
|
45
|
+
subject.use Middle1 do
|
46
|
+
"Middle1 block"
|
47
|
+
end
|
48
|
+
subject.execute(app, env)
|
49
|
+
env[:block].call.must_equal("Middle1 block")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#execute" do
|
54
|
+
it "without chain" do
|
55
|
+
result = subject.execute(app, env)
|
56
|
+
result.must_equal("OK")
|
57
|
+
end
|
58
|
+
it "chain of one" do
|
59
|
+
subject.use Middle1
|
60
|
+
subject.execute(app, env)
|
61
|
+
|
62
|
+
env[:app].must_equal(["before Middle1", "app", "after Middle1"])
|
63
|
+
end
|
64
|
+
it "chain of many (maintain order)" do
|
65
|
+
subject.use Middle1
|
66
|
+
subject.use Middle2
|
67
|
+
subject.execute(app, env)
|
68
|
+
|
69
|
+
env[:app].must_equal(["before Middle1", "before Middle2", "app", "after Middle2", "after Middle1"])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe HttpMonkey::Configuration do
|
4
|
+
|
5
|
+
subject do
|
6
|
+
HttpMonkey::Configuration.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#clone" do
|
10
|
+
it "#behaviours" do
|
11
|
+
clone = subject.clone
|
12
|
+
subject.behaviours.wont_be_same_as(clone.behaviours)
|
13
|
+
end
|
14
|
+
it "#middlewares" do
|
15
|
+
clone = subject.clone
|
16
|
+
subject.middlewares.wont_be_same_as(clone.middlewares)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#net_adapter" do
|
21
|
+
it "returns value" do
|
22
|
+
subject.net_adapter.must_equal(:net_http)
|
23
|
+
end
|
24
|
+
it "sets value" do
|
25
|
+
subject.net_adapter(:curb)
|
26
|
+
subject.net_adapter.must_equal(:curb)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#behaviours" do
|
31
|
+
it "respond_to" do
|
32
|
+
subject.must_respond_to(:behaviours)
|
33
|
+
end
|
34
|
+
it "returns value" do
|
35
|
+
subject.behaviours.must_be_instance_of(HttpMonkey::Configuration::Behaviours)
|
36
|
+
end
|
37
|
+
it "sets value using block" do
|
38
|
+
flag = "out block"
|
39
|
+
subject.behaviours do
|
40
|
+
self.must_be_instance_of(HttpMonkey::Configuration::Behaviours)
|
41
|
+
flag = "inside block"
|
42
|
+
end
|
43
|
+
flag.must_equal("inside block")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#middlewares" do
|
48
|
+
it "respond_to" do
|
49
|
+
subject.must_respond_to(:middlewares)
|
50
|
+
end
|
51
|
+
it "returns value" do
|
52
|
+
subject.middlewares.must_be_instance_of(HttpMonkey::Configuration::Middlewares)
|
53
|
+
end
|
54
|
+
it "sets value using block" do
|
55
|
+
flag = "out block"
|
56
|
+
subject.middlewares do
|
57
|
+
self.must_be_instance_of(HttpMonkey::Configuration::Middlewares)
|
58
|
+
flag = "inside block"
|
59
|
+
end
|
60
|
+
flag.must_equal("inside block")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe HttpMonkey::EntryPoint do
|
4
|
+
|
5
|
+
TEST_URL = "https://www.google.com.br"
|
6
|
+
|
7
|
+
before do
|
8
|
+
@mock_client = stub("client")
|
9
|
+
end
|
10
|
+
|
11
|
+
subject do
|
12
|
+
HttpMonkey::EntryPoint.new(@mock_client, TEST_URL)
|
13
|
+
end
|
14
|
+
|
15
|
+
def expects_request_on(client, method, body, &block)
|
16
|
+
client.expects(:http_request).with do |method, request|
|
17
|
+
if block.respond_to?(:call)
|
18
|
+
block_assertion = block.call(method, request)
|
19
|
+
else
|
20
|
+
block_assertion = true
|
21
|
+
end
|
22
|
+
|
23
|
+
request_url = request.url.select(:scheme, :host).join("://")
|
24
|
+
|
25
|
+
body_assertion = false
|
26
|
+
if body.nil?
|
27
|
+
body_assertion = request.body.must_be_nil
|
28
|
+
elsif body.is_a?(String)
|
29
|
+
body_assertion = request.body.must_equal(body)
|
30
|
+
elsif body.is_a?(Regexp)
|
31
|
+
body_assertion = request.body.must_match(body)
|
32
|
+
end
|
33
|
+
|
34
|
+
block_assertion && \
|
35
|
+
method.must_equal(method) && \
|
36
|
+
request_url.must_equal(TEST_URL) && \
|
37
|
+
request.must_be_instance_of(HTTPI::Request) && \
|
38
|
+
body_assertion
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it "#get" do
|
43
|
+
expects_request_on(@mock_client, :get, nil)
|
44
|
+
subject.get
|
45
|
+
end
|
46
|
+
|
47
|
+
it "#get with parameters" do
|
48
|
+
expects_request_on(@mock_client, :get, nil) do |method, request|
|
49
|
+
request.url.query.must_match(/(p1=param1&p2=param2)|(p2=param2&p1=param1)/)
|
50
|
+
end
|
51
|
+
|
52
|
+
subject.get(:p1 => "param1", :p2 => "param2")
|
53
|
+
end
|
54
|
+
|
55
|
+
it "#post with parameters" do
|
56
|
+
expects_request_on(@mock_client, :post, /(b1=param1&b2=param2)|(b2=param2&b1=param1)/)
|
57
|
+
subject.post(:b1 => "param1", :b2 => "param2")
|
58
|
+
end
|
59
|
+
|
60
|
+
it "#put with parameters" do
|
61
|
+
expects_request_on(@mock_client, :put, /(p1=param1&p2=param2)|(p2=param2&p1=param1)/)
|
62
|
+
subject.put(:p1 => "param1", :p2 => "param2")
|
63
|
+
end
|
64
|
+
|
65
|
+
it "#delete" do
|
66
|
+
expects_request_on(@mock_client, :delete, nil)
|
67
|
+
subject.delete
|
68
|
+
end
|
69
|
+
|
70
|
+
it "HTTP requests should accept configuration block" do
|
71
|
+
block = lambda { raise "Not to be raised" }
|
72
|
+
@mock_client.expects(:clone).returns(@mock_client)
|
73
|
+
@mock_client.expects(:configure).returns(@mock_client)
|
74
|
+
expects_request_on(@mock_client, :get, nil)
|
75
|
+
|
76
|
+
subject.get(&block)
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "FluentInterface -_-" do
|
80
|
+
|
81
|
+
it "#with_header" do
|
82
|
+
expects_request_on(@mock_client, :get, nil) do |method, request|
|
83
|
+
request.headers.must_equal({"Content-Type" => "text/html", "X-Custom" => "sample"})
|
84
|
+
end
|
85
|
+
subject.with_header("Content-Type" => "text/html").
|
86
|
+
with_header("X-Custom" => "sample").
|
87
|
+
get
|
88
|
+
end
|
89
|
+
|
90
|
+
it "#with_headers" do
|
91
|
+
expects_request_on(@mock_client, :get, nil) do |method, request|
|
92
|
+
request.headers.must_equal({"Content-Type" => "text/html", "X-Custom" => "sample"})
|
93
|
+
end
|
94
|
+
subject.with_headers("Content-Type" => "text/html",
|
95
|
+
"X-Custom" => "sample").get
|
96
|
+
end
|
97
|
+
|
98
|
+
it "#set_cookie" do
|
99
|
+
expects_request_on(@mock_client, :get, nil) do |method, request|
|
100
|
+
request.headers["Cookie"].must_equal("name=value;name2=value2")
|
101
|
+
end
|
102
|
+
subject.set_cookie("name=value;name2=value2").get
|
103
|
+
end
|
104
|
+
|
105
|
+
it "#basic_auth" do
|
106
|
+
expects_request_on(@mock_client, :get, nil) do |method, request|
|
107
|
+
request.auth.type.must_equal(:basic) && \
|
108
|
+
request.auth.credentials.must_equal(["mad", "max"])
|
109
|
+
end
|
110
|
+
subject.basic_auth("mad", "max").get
|
111
|
+
end
|
112
|
+
|
113
|
+
it "#digest_auth" do
|
114
|
+
expects_request_on(@mock_client, :get, nil) do |method, request|
|
115
|
+
request.auth.type.must_equal(:digest) && \
|
116
|
+
request.auth.credentials.must_equal(["mad", "max"])
|
117
|
+
end
|
118
|
+
subject.digest_auth("mad", "max").get
|
119
|
+
end
|
120
|
+
|
121
|
+
it "#yield_request" do
|
122
|
+
expects_request_on(@mock_client, :get, nil) do |method, request|
|
123
|
+
request.proxy.to_s.must_equal("http://proxy.com") && \
|
124
|
+
request.open_timeout.must_equal(30) && \
|
125
|
+
request.read_timeout.must_equal(15)
|
126
|
+
end
|
127
|
+
subject.yield_request do |req|
|
128
|
+
req.proxy = "http://proxy.com"
|
129
|
+
req.open_timeout = 30
|
130
|
+
req.read_timeout = 15
|
131
|
+
end.get
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe HttpMonkey do
|
4
|
+
|
5
|
+
subject { HttpMonkey }
|
6
|
+
|
7
|
+
it "#at" do
|
8
|
+
subject.at("http://google.com.br").must_be_instance_of(HttpMonkey::EntryPoint)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "#configure" do
|
12
|
+
flag = "out block"
|
13
|
+
subject.configure do
|
14
|
+
self.must_be_instance_of(HttpMonkey::Configuration)
|
15
|
+
flag = "inside block"
|
16
|
+
end
|
17
|
+
flag.must_equal("inside block")
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#build" do
|
21
|
+
it "wont be same client" do
|
22
|
+
subject.build.wont_be_same_as(HttpMonkey.default_client)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe HttpMonkey::Middlewares::DefaultHeaders do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@mock_app = stub("app", :call => "stubbed")
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:fake_env) { Hash.new }
|
10
|
+
subject { HttpMonkey::Middlewares::DefaultHeaders }
|
11
|
+
|
12
|
+
it "always call app" do
|
13
|
+
@mock_app.expects(:call).with(fake_env)
|
14
|
+
subject.new(@mock_app).call(fake_env)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "sets header" do
|
18
|
+
middle = subject.new(@mock_app, {"X-Custom" => "value"})
|
19
|
+
middle.call(fake_env)
|
20
|
+
|
21
|
+
fake_env["HTTP_X_CUSTOM"].must_equal("value")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "not overwrite header" do
|
25
|
+
fake_env["HTTP_X_CUSTOM"] = "request"
|
26
|
+
middle = subject.new(@mock_app, {"X-Custom" => "value"})
|
27
|
+
middle.call(fake_env)
|
28
|
+
|
29
|
+
fake_env["HTTP_X_CUSTOM"].must_equal("request")
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
# Inspiration from https://github.com/djanowski/mock-server
|
4
|
+
class IntegrationServer
|
5
|
+
|
6
|
+
def initialize(app)
|
7
|
+
@app = app
|
8
|
+
end
|
9
|
+
|
10
|
+
def start(host = "localhost", port = 4000)
|
11
|
+
Thread.new do
|
12
|
+
silence_output do # comment this if you want information
|
13
|
+
Rack::Server.start(
|
14
|
+
:app => @app,
|
15
|
+
:server => 'webrick',
|
16
|
+
:environment => :none,
|
17
|
+
:daemonize => false,
|
18
|
+
:Host => host,
|
19
|
+
:Port => port
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
wait_for_service(host, port)
|
24
|
+
true
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
|
29
|
+
# quick and dirty
|
30
|
+
def silence_output
|
31
|
+
$stdout = File.new('/dev/null', 'w')
|
32
|
+
$stderr = File.new('/dev/null', 'w')
|
33
|
+
yield
|
34
|
+
ensure
|
35
|
+
$stdout = STDOUT
|
36
|
+
$stderr = STDERR
|
37
|
+
end
|
38
|
+
|
39
|
+
def listening?(host, port)
|
40
|
+
begin
|
41
|
+
socket = TCPSocket.new(host, port)
|
42
|
+
socket.close unless socket.nil?
|
43
|
+
true
|
44
|
+
rescue Errno::ECONNREFUSED,
|
45
|
+
Errno::EBADF, # Windows
|
46
|
+
Errno::EADDRNOTAVAIL # Windows
|
47
|
+
false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def wait_for_service(host, port, timeout = 5)
|
52
|
+
start_time = Time.now
|
53
|
+
|
54
|
+
until listening?(host, port)
|
55
|
+
if timeout && (Time.now > (start_time + timeout))
|
56
|
+
raise SocketError.new("Socket did not open within #{timeout} seconds")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
true
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
class IntegrationServer::InspectEnv
|
66
|
+
def initialize(app)
|
67
|
+
@app = app
|
68
|
+
end
|
69
|
+
def call(env)
|
70
|
+
puts "-> #{env.inspect}"
|
71
|
+
@app.call(env)
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "integration/server"
|
2
|
+
|
3
|
+
VerbsApp = Rack::Builder.new do
|
4
|
+
#use IntegrationServer::InspectEnv # i can see clear now the rain is gone ...
|
5
|
+
map "/" do
|
6
|
+
run lambda { |env|
|
7
|
+
env['rack.input'] = env['rack.input'].read if env['rack.input'].respond_to?(:read)
|
8
|
+
body = YAML.dump(env)
|
9
|
+
[200, {"Content-Type" => "text/plain", "Content-Length" => body.size.to_s}, [body]]
|
10
|
+
}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
IntegrationServer.new(VerbsApp).start
|
15
|
+
|
16
|
+
describe "Integration Specs - Verbs" do
|
17
|
+
|
18
|
+
describe "#get" do
|
19
|
+
it "no parameter" do
|
20
|
+
response = HttpMonkey.at("http://localhost:4000").get
|
21
|
+
server_env = YAML.load(response.body)
|
22
|
+
|
23
|
+
server_env["REQUEST_METHOD"].must_equal("GET")
|
24
|
+
server_env["QUERY_STRING"].must_be_empty
|
25
|
+
end
|
26
|
+
it "with parameters" do
|
27
|
+
response = HttpMonkey.at("http://localhost:4000").get(:q => "query")
|
28
|
+
server_env = YAML.load(response.body)
|
29
|
+
|
30
|
+
server_env["REQUEST_METHOD"].must_equal("GET")
|
31
|
+
server_env["QUERY_STRING"].must_equal("q=query")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it "#post" do
|
36
|
+
response = HttpMonkey.at("http://localhost:4000").post(:var => "post_var")
|
37
|
+
server_env = YAML.load(response.body)
|
38
|
+
|
39
|
+
server_env["REQUEST_METHOD"].must_equal("POST")
|
40
|
+
server_env["rack.input"].must_equal("var=post_var")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "#put" do
|
44
|
+
response = HttpMonkey.at("http://localhost:4000").put(:var => "put_var")
|
45
|
+
server_env = YAML.load(response.body)
|
46
|
+
|
47
|
+
server_env["REQUEST_METHOD"].must_equal("PUT")
|
48
|
+
server_env["rack.input"].must_equal("var=put_var")
|
49
|
+
end
|
50
|
+
|
51
|
+
it "#delete" do
|
52
|
+
response = HttpMonkey.at("http://localhost:4000").delete
|
53
|
+
server_env = YAML.load(response.body)
|
54
|
+
|
55
|
+
server_env["REQUEST_METHOD"].must_equal("DELETE")
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|