rspec-performance 0.0.3 → 0.1.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.
- data/Rakefile +6 -0
- data/lib/rspec-performance.rb +2 -1
- data/lib/spec/client/http/driver/curl_driver.rb +71 -0
- data/lib/spec/client/http/matcher/transaction_matchers.rb +74 -0
- data/lib/spec/client/http/request.rb +28 -0
- data/lib/spec/client/http/response.rb +32 -0
- data/lib/spec/client/http/session.rb +41 -0
- data/lib/spec/client/http/transaction.rb +29 -0
- data/lib/spec/client/http_client.rb +32 -0
- data/lib/spec/performance/configuration.rb +1 -1
- data/lib/spec/performance/example/performance_example_group_methods.rb +0 -1
- data/lib/spec/performance/example/performance_execution_builder.rb +1 -0
- data/lib/spec/performance/version.rb +2 -2
- data/spec/helpers/integration_server.rb +50 -30
- data/spec/helpers/integration_server_spec.rb +0 -16
- data/spec/lib/spec/client/http/driver/curl_driver_spec.rb +46 -0
- data/spec/lib/spec/client/http/matcher/transaction_matchers_spec.rb +130 -0
- data/spec/lib/spec/client/http/request_spec.rb +26 -0
- data/spec/lib/spec/client/http/response_spec.rb +25 -0
- data/spec/lib/spec/client/http/session_spec.rb +64 -0
- data/spec/lib/spec/client/http/transaction_spec.rb +76 -0
- data/spec/lib/spec/client/http_client_spec.rb +21 -0
- data/spec/lib/spec/performance/example/performance_example_group_methods_spec.rb +1 -1
- data/spec/lib/spec/performance/example/performance_example_group_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -1
- metadata +48 -11
- data/lib/spec/performance/client.rb +0 -1
- data/lib/spec/performance/client/http_client.rb +0 -94
- data/lib/spec/performance/client/response.rb +0 -25
- data/spec/lib/spec/performance/client/http_client_spec.rb +0 -112
data/Rakefile
CHANGED
@@ -24,4 +24,10 @@ task :publish do
|
|
24
24
|
system "gem push rspec-performance-#{Spec::Performance::VERSION::STRING}.gem"
|
25
25
|
end
|
26
26
|
|
27
|
+
desc "Runs the integration test server"
|
28
|
+
task "integration:run" do
|
29
|
+
require "spec/helpers/integration_server"
|
30
|
+
IntegrationServer.new(8888).run
|
31
|
+
end
|
32
|
+
|
27
33
|
# Gem packaging tasks
|
data/lib/rspec-performance.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "spec/performance/version"
|
2
|
-
require "spec/
|
2
|
+
require "spec/client/http_client"
|
3
|
+
require "spec/client/http/matcher/transaction_matchers"
|
3
4
|
require "spec/performance/configuration"
|
4
5
|
require "spec/performance/example/performance_example_group"
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'curb'
|
3
|
+
require 'uri'
|
4
|
+
require 'cgi'
|
5
|
+
|
6
|
+
# TODO: make an abstract parent driver class, and a spec for it
|
7
|
+
|
8
|
+
module Spec
|
9
|
+
module Client
|
10
|
+
module Http
|
11
|
+
module Driver
|
12
|
+
class CurlDriver
|
13
|
+
def url_encode_params(params)
|
14
|
+
return nil if params.empty?
|
15
|
+
|
16
|
+
params.inject([]) do |query, (name, value)|
|
17
|
+
# TODO: come up with a better way to deal with true and false parameters
|
18
|
+
query << [name,value].collect {|s| s.nil? ? "" : s==false ? "0" : s==true ? "1" : CGI.escape(s.to_s)}.join('=')
|
19
|
+
end.join("&")
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize()
|
23
|
+
end
|
24
|
+
|
25
|
+
def execute(url, method, headers, params)
|
26
|
+
# Workaround for potential bug in curl
|
27
|
+
request_url = url
|
28
|
+
encoded_params = url_encode_params(params)
|
29
|
+
|
30
|
+
if method == "GET"
|
31
|
+
request_url += "?#{encoded_params}"
|
32
|
+
end
|
33
|
+
|
34
|
+
response_headers = {}
|
35
|
+
response_body = ""
|
36
|
+
|
37
|
+
curl = Curl::Easy.new(request_url)
|
38
|
+
curl.headers = headers
|
39
|
+
|
40
|
+
curl.on_header do |header|
|
41
|
+
size = header.size; header.chomp!
|
42
|
+
name, value = header.split(/\: /)
|
43
|
+
response_headers[name] ||= []
|
44
|
+
response_headers[name] << value
|
45
|
+
size
|
46
|
+
end
|
47
|
+
|
48
|
+
body_content = ""
|
49
|
+
curl.on_body do |body|
|
50
|
+
body_content += body
|
51
|
+
body.size
|
52
|
+
end
|
53
|
+
|
54
|
+
case method.upcase
|
55
|
+
when "GET"
|
56
|
+
curl.http_get
|
57
|
+
when "POST"
|
58
|
+
curl.http_post(encoded_params)
|
59
|
+
end
|
60
|
+
|
61
|
+
response = Response.new(url)
|
62
|
+
response.code = curl.response_code
|
63
|
+
response.headers = response_headers
|
64
|
+
response.body = body_content
|
65
|
+
response
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Spec
|
2
|
+
module Client
|
3
|
+
module Http
|
4
|
+
module Matcher
|
5
|
+
module TransactionMatchers
|
6
|
+
class VerboseHttpMatcher
|
7
|
+
attr_accessor :transaction
|
8
|
+
|
9
|
+
def matches?(transaction)
|
10
|
+
@transaction = transaction
|
11
|
+
return transaction.is_a?(Spec::Client::Http::Transaction)
|
12
|
+
end
|
13
|
+
|
14
|
+
def transaction_info
|
15
|
+
"Request: #{transaction.request.url} using #{transaction.request.request_method}" + "\n" +
|
16
|
+
" sent headers: #{transaction.request.headers}" + "\n" +
|
17
|
+
" sent params: #{transaction.request.url_encoded_params}" + "\n" +
|
18
|
+
"Response code: #{transaction.response.code}" + "\n" +
|
19
|
+
" with cookies: #{transaction.response.cookies}" + "\n" +
|
20
|
+
" with html body: #{transaction.response.body}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def failure_message
|
24
|
+
transaction_info
|
25
|
+
end
|
26
|
+
|
27
|
+
def negative_failure_message
|
28
|
+
transaction_info
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class BeRedirect < VerboseHttpMatcher
|
33
|
+
def matches?(transaction)
|
34
|
+
super(transaction) && transaction.redirect?
|
35
|
+
#(300..399).include? transaction.response.code
|
36
|
+
end
|
37
|
+
|
38
|
+
def failure_message
|
39
|
+
"expected redirect? to return true, got false" + "\n" + super
|
40
|
+
end
|
41
|
+
|
42
|
+
def negative_failure_message
|
43
|
+
"expected redirect? to return false, got true" + "\n" + super
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def be_redirect
|
48
|
+
BeRedirect.new()
|
49
|
+
end
|
50
|
+
|
51
|
+
class BeSuccess < VerboseHttpMatcher
|
52
|
+
def matches?(transaction)
|
53
|
+
super(transaction) && transaction.success?
|
54
|
+
#(200..299).include? transaction.response.code
|
55
|
+
end
|
56
|
+
|
57
|
+
def failure_message
|
58
|
+
"expected success? to return true, got false" + "\n" + super
|
59
|
+
end
|
60
|
+
|
61
|
+
def negative_failure_message
|
62
|
+
"expected success? to return false, got true" + "\n" + super
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def be_success
|
67
|
+
BeSuccess.new()
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "spec/client/http/request"
|
2
|
+
require "spec/client/http/driver/curl_driver"
|
3
|
+
|
4
|
+
module Spec
|
5
|
+
module Client
|
6
|
+
module Http
|
7
|
+
class Request
|
8
|
+
attr_accessor :url, :request_method, :params, :headers
|
9
|
+
|
10
|
+
def initialize(url, request_method, params, headers, driver=Driver::CurlDriver.new)
|
11
|
+
@url, @request_method, @params, @headers, @driver = url, request_method, params, headers, driver
|
12
|
+
end
|
13
|
+
|
14
|
+
def url_encoded_params
|
15
|
+
@driver.url_encode_params(params)
|
16
|
+
end
|
17
|
+
|
18
|
+
def execute
|
19
|
+
driver_execute(url,request_method,headers,params)
|
20
|
+
end
|
21
|
+
|
22
|
+
def driver_execute(url,request_method,headers,params)
|
23
|
+
@driver.execute(url,request_method,headers,params)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "spec/client/http/request"
|
2
|
+
require "mechanize"
|
3
|
+
require "uri"
|
4
|
+
|
5
|
+
module Spec
|
6
|
+
module Client
|
7
|
+
module Http
|
8
|
+
class Response
|
9
|
+
attr_accessor :code, :headers, :body
|
10
|
+
|
11
|
+
def initialize(url)
|
12
|
+
@code = 0
|
13
|
+
@headers = {}
|
14
|
+
@body = ""
|
15
|
+
@url = url
|
16
|
+
end
|
17
|
+
|
18
|
+
def cookies
|
19
|
+
# TODO: can probably use ruby tricks to bind these together rather than using a temporary array...
|
20
|
+
tmp_cookies = []
|
21
|
+
(headers["Set-Cookie"]||[]).map do |raw_cookie|
|
22
|
+
uri = URI::parse(@url)
|
23
|
+
Mechanize::Cookie::parse(uri,raw_cookie) do |c|
|
24
|
+
tmp_cookies.push(c)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
tmp_cookies
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require "spec/client/http/request"
|
2
|
+
require "spec/client/http/response"
|
3
|
+
require "spec/client/http/transaction"
|
4
|
+
require "mechanize"
|
5
|
+
require "uri"
|
6
|
+
|
7
|
+
module Spec
|
8
|
+
module Client
|
9
|
+
module Http
|
10
|
+
class Session
|
11
|
+
attr_reader :client, :cookie_jar
|
12
|
+
|
13
|
+
def initialize(client, options = {})
|
14
|
+
@client = client
|
15
|
+
@cookie_jar = Mechanize::CookieJar.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def get(url, params = {})
|
19
|
+
execute(Request.new(url, "GET", params, request_headers(url)))
|
20
|
+
end
|
21
|
+
|
22
|
+
def post(url, params = {})
|
23
|
+
execute(Request.new(url, "POST", params, request_headers(url)))
|
24
|
+
end
|
25
|
+
|
26
|
+
def request_headers(url)
|
27
|
+
{ "Cookie" => @cookie_jar.cookies(URI::parse(url)) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def execute(request)
|
31
|
+
transaction = Transaction.new(request)
|
32
|
+
transaction.execute
|
33
|
+
transaction.response.cookies.each do |cookie|
|
34
|
+
cookie_jar.add(URI::parse(transaction.request.url),cookie)
|
35
|
+
end
|
36
|
+
transaction
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "spec/client/http/matcher/transaction_matchers"
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Client
|
5
|
+
module Http
|
6
|
+
class Transaction
|
7
|
+
attr_reader :request, :response
|
8
|
+
|
9
|
+
def initialize(request)
|
10
|
+
@request = request
|
11
|
+
@response = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute
|
15
|
+
@response = request.execute
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def success?
|
20
|
+
(200..299).include? @response.code
|
21
|
+
end
|
22
|
+
|
23
|
+
def redirect?
|
24
|
+
(300..399).include? @response.code
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "uri"
|
2
|
+
require "spec/client/http/session"
|
3
|
+
|
4
|
+
module Spec
|
5
|
+
module Client
|
6
|
+
class HttpClient
|
7
|
+
attr_reader :session, :base_uri
|
8
|
+
|
9
|
+
def initialize(base_uri)
|
10
|
+
@base_uri = base_uri
|
11
|
+
@session = Http::Session.new(self)
|
12
|
+
end
|
13
|
+
|
14
|
+
def new_session()
|
15
|
+
@session = Http::Session.new(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
def get(path, params = {})
|
19
|
+
session.get(full_url(path), params)
|
20
|
+
end
|
21
|
+
|
22
|
+
def post(path, params = {})
|
23
|
+
session.post(full_url(path), params)
|
24
|
+
end
|
25
|
+
|
26
|
+
def full_url(path)
|
27
|
+
URI.join(base_uri, path).to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -50,7 +50,7 @@ module Spec
|
|
50
50
|
:iterations => 20,
|
51
51
|
:iterations_per_second => nil,
|
52
52
|
:maximum_iteration_time => nil,
|
53
|
-
:performance_driver_class => Spec::
|
53
|
+
:performance_driver_class => Spec::Client::HttpClient,
|
54
54
|
:performance_driver_base_uri => "http://localhost/"
|
55
55
|
}
|
56
56
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "rubygems"
|
2
2
|
require "thin"
|
3
|
+
require "cgi"
|
3
4
|
|
4
5
|
Thread.abort_on_exception = true
|
5
6
|
|
@@ -10,26 +11,44 @@ class IntegrationServer
|
|
10
11
|
@running = false
|
11
12
|
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
class << self
|
15
|
+
def base_url
|
16
|
+
"http://127.0.0.1:#{@@port}/"
|
17
|
+
end
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
19
|
+
def instance
|
20
|
+
@@instance ||= new(@@port)
|
21
|
+
end
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
23
|
+
def start
|
24
|
+
instance.start
|
25
|
+
end
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
27
|
+
def kill
|
28
|
+
@@instance.kill
|
29
|
+
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
+
def port=(value)
|
32
|
+
@@port = value
|
33
|
+
end
|
31
34
|
end
|
32
35
|
|
36
|
+
def run
|
37
|
+
Thin::Server.start('0.0.0.0', @port) do
|
38
|
+
map "/hello" do
|
39
|
+
run HelloAdapter.new
|
40
|
+
end
|
41
|
+
|
42
|
+
map "/cookie_echo" do
|
43
|
+
run CookieEchoAdapter.new
|
44
|
+
end
|
45
|
+
|
46
|
+
map "/host_echo" do
|
47
|
+
run HostEchoAdapter.new
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
33
52
|
def running?
|
34
53
|
@running
|
35
54
|
end
|
@@ -39,19 +58,7 @@ class IntegrationServer
|
|
39
58
|
|
40
59
|
Thin::Logging.silent = true
|
41
60
|
@server_thread = Thread.new do
|
42
|
-
@server =
|
43
|
-
map "/hello" do
|
44
|
-
run HelloAdapter.new
|
45
|
-
end
|
46
|
-
|
47
|
-
map "/cookie_echo" do
|
48
|
-
run CookieEchoAdapter.new
|
49
|
-
end
|
50
|
-
|
51
|
-
map "/host_echo" do
|
52
|
-
run HostEchoAdapter.new
|
53
|
-
end
|
54
|
-
end
|
61
|
+
@server = run
|
55
62
|
end
|
56
63
|
sleep 0.010 unless @server && @server.running?
|
57
64
|
@running = true
|
@@ -73,13 +80,26 @@ class IntegrationServer
|
|
73
80
|
|
74
81
|
class CookieEchoAdapter
|
75
82
|
def call(env)
|
76
|
-
|
77
|
-
|
83
|
+
params = {}
|
84
|
+
params.merge!(parse_raw_params(env["rack.input"].read))
|
85
|
+
params.merge!(parse_raw_params(env["QUERY_STRING"]))
|
86
|
+
|
87
|
+
cookies = params.inject([]) do |acc, (name, value)|
|
78
88
|
acc << CGI::Cookie.new(name, value).to_s
|
79
89
|
acc
|
80
90
|
end
|
81
91
|
cookie_string = cookies.join("\n")
|
82
|
-
[200, { "Set-Cookie" => cookie_string }, ["echo"]]
|
92
|
+
[200, { "Set-Cookie" => cookie_string }, ["echo: " + cookie_string]]
|
93
|
+
end
|
94
|
+
|
95
|
+
def parse_raw_params(input)
|
96
|
+
return {} if input.empty?
|
97
|
+
|
98
|
+
input.split(/&/).inject({}) do |parsed, pair|
|
99
|
+
name, value = pair.split(/\=/).map {|p| CGI::unescape(p) }
|
100
|
+
parsed[name] = value
|
101
|
+
parsed
|
102
|
+
end
|
83
103
|
end
|
84
104
|
end
|
85
105
|
|
@@ -1,20 +1,4 @@
|
|
1
1
|
require "#{File.dirname(__FILE__)}/../spec_helper"
|
2
2
|
|
3
3
|
describe IntegrationServer do
|
4
|
-
describe "HostEchoAdapter" do
|
5
|
-
describe "when HTTP_HOST is set by the client" do
|
6
|
-
it "echos the client specified value back" do
|
7
|
-
uri = URI.parse("http://localhost:8888/host_echo")
|
8
|
-
http = Net::HTTP.start(uri.host, uri.port)
|
9
|
-
response = http.get(uri.request_uri, { "Host" => "x.y.z.com" })
|
10
|
-
http.finish
|
11
|
-
|
12
|
-
response.body.should include("x.y.z.com")
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe "when HTTP_HOST is not set" do
|
17
|
-
it "defaults to the machine name"
|
18
|
-
end
|
19
|
-
end
|
20
4
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../../../../../spec_helper"
|
2
|
+
|
3
|
+
describe Spec::Client::Http::Driver::CurlDriver do
|
4
|
+
attr_reader :url, :params, :headers, :driver
|
5
|
+
before do
|
6
|
+
@url = "http://www.example.com"
|
7
|
+
@params = { "some[param]" => "encode me", "ok" => "done" }
|
8
|
+
@headers = { "Cookie", "hey=now" }
|
9
|
+
@driver = Spec::Client::Http::Driver::CurlDriver.new()
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#url_encode_params" do
|
13
|
+
describe "when there are params" do
|
14
|
+
it "creates a url encoded query string" do
|
15
|
+
@driver.url_encode_params(params).should include("some%5Bparam%5D=encode+me")
|
16
|
+
@driver.url_encode_params(params).should include("ok=done")
|
17
|
+
@driver.url_encode_params(params).should include("&")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "when there are no params" do
|
22
|
+
it "returns nil" do
|
23
|
+
@driver.url_encode_params({}).should be_nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#execute" do
|
29
|
+
describe "when the request is a GET" do
|
30
|
+
it "makes a get request" do
|
31
|
+
curler = mock(Curl::Easy.new(@url))
|
32
|
+
stub(Curl::Easy).new {curler}
|
33
|
+
curler.http_get
|
34
|
+
driver.execute(url, "GET", headers, params)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
describe "when the request is a POST" do
|
38
|
+
it "makes a post request" do
|
39
|
+
curler = mock(Curl::Easy.new(@url))
|
40
|
+
stub(Curl::Easy).new {curler}
|
41
|
+
curler.http_post(anything)
|
42
|
+
driver.execute(url, "POST", headers, params)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../../../../../spec_helper"
|
2
|
+
|
3
|
+
describe Spec::Client::Http::Matcher::TransactionMatchers do
|
4
|
+
attr_reader :transaction, :matcher
|
5
|
+
|
6
|
+
describe "DerivedVerboseHttpMatcher" do
|
7
|
+
before do
|
8
|
+
class DerivedVerboseHttpMatcher < Spec::Client::Http::Matcher::TransactionMatchers::VerboseHttpMatcher
|
9
|
+
def matches?(transaction)
|
10
|
+
super(transaction) && true
|
11
|
+
end
|
12
|
+
end
|
13
|
+
# make a transaction for testing
|
14
|
+
url = "http://www.example.com"
|
15
|
+
params = { "some[param]" => "encode me", "ok" => "done" }
|
16
|
+
headers = { "Cookie", "hey=now" }
|
17
|
+
driver = Spec::Client::Http::Driver::CurlDriver.new()
|
18
|
+
request = Spec::Client::Http::Request.new(url, "GET", params, {})
|
19
|
+
@transaction = Spec::Client::Http::Transaction.new(request)
|
20
|
+
transaction.execute
|
21
|
+
@matcher = DerivedVerboseHttpMatcher.new
|
22
|
+
matcher.matches?(transaction)
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#transaction_info" do
|
26
|
+
it "returns a string with information about the http transaction" do
|
27
|
+
matcher.transaction_info.include?("Request: #{transaction.request.url} using #{transaction.request.request_method}").should be_true
|
28
|
+
matcher.transaction_info.include?(" sent headers: #{transaction.request.headers}").should be_true
|
29
|
+
matcher.transaction_info.include?("Response code: #{transaction.response.code}").should be_true
|
30
|
+
matcher.transaction_info.include?(" with cookies: #{transaction.response.cookies}").should be_true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#failure_message" do
|
35
|
+
it "contains the transaction info" do
|
36
|
+
matcher.failure_message.include?(matcher.transaction_info).should be_true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#negative_failure_message" do
|
41
|
+
it "contains the transaction info" do
|
42
|
+
matcher.negative_failure_message.include?(matcher.transaction_info).should be_true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "BeRedirect" do
|
48
|
+
before do
|
49
|
+
# make a transaction for testing
|
50
|
+
url = "http://www.example.com"
|
51
|
+
params = { "some[param]" => "encode me", "ok" => "done" }
|
52
|
+
headers = { "Cookie", "hey=now" }
|
53
|
+
driver = Spec::Client::Http::Driver::CurlDriver.new()
|
54
|
+
request = Spec::Client::Http::Request.new(url, "GET", params, {})
|
55
|
+
@transaction = Spec::Client::Http::Transaction.new(request)
|
56
|
+
transaction.execute
|
57
|
+
@matcher = Spec::Client::Http::Matcher::TransactionMatchers::BeRedirect.new
|
58
|
+
matcher.matches?(transaction)
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#matches?" do
|
62
|
+
describe "transaction is a redirect" do
|
63
|
+
it "returns true" do
|
64
|
+
stub(transaction).redirect? {true}
|
65
|
+
matcher.matches?(transaction).should be_true
|
66
|
+
end
|
67
|
+
end
|
68
|
+
describe "transaction is not a redirect" do
|
69
|
+
it "returns false" do
|
70
|
+
stub(transaction).redirect? {false}
|
71
|
+
matcher.matches?(transaction).should be_false
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#failure_message" do
|
77
|
+
it "contains the transaction info" do
|
78
|
+
matcher.failure_message.include?(matcher.transaction_info).should be_true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "#negative_failure_message" do
|
83
|
+
it "contains the transaction info" do
|
84
|
+
matcher.negative_failure_message.include?(matcher.transaction_info).should be_true
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "BeSuccess" do
|
90
|
+
before do
|
91
|
+
# make a transaction for testing
|
92
|
+
url = "http://www.example.com"
|
93
|
+
params = { "some[param]" => "encode me", "ok" => "done" }
|
94
|
+
headers = { "Cookie", "hey=now" }
|
95
|
+
driver = Spec::Client::Http::Driver::CurlDriver.new()
|
96
|
+
request = Spec::Client::Http::Request.new(url, "GET", params, {})
|
97
|
+
@transaction = Spec::Client::Http::Transaction.new(request)
|
98
|
+
transaction.execute
|
99
|
+
@matcher = Spec::Client::Http::Matcher::TransactionMatchers::BeSuccess.new
|
100
|
+
matcher.matches?(transaction)
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "#matches?" do
|
104
|
+
describe "transaction is successful" do
|
105
|
+
it "returns true" do
|
106
|
+
stub(transaction).success? {true}
|
107
|
+
matcher.matches?(transaction).should be_true
|
108
|
+
end
|
109
|
+
end
|
110
|
+
describe "transaction is not successful" do
|
111
|
+
it "returns false" do
|
112
|
+
stub(transaction).success? {false}
|
113
|
+
matcher.matches?(transaction).should be_false
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "#failure_message" do
|
119
|
+
it "contains the transaction info" do
|
120
|
+
matcher.failure_message.include?(matcher.transaction_info).should be_true
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe "#negative_failure_message" do
|
125
|
+
it "contains the transaction info" do
|
126
|
+
matcher.negative_failure_message.include?(matcher.transaction_info).should be_true
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../../../../spec_helper"
|
2
|
+
|
3
|
+
describe Spec::Client::Http::Request do
|
4
|
+
attr_reader :url, :params, :headers, :request
|
5
|
+
before do
|
6
|
+
@url = "http://www.example.com"
|
7
|
+
@params = { "some[param]" => "encode me", "ok" => "done" }
|
8
|
+
@headers = { "Cookie", "hey=now" }
|
9
|
+
@request = Spec::Client::Http::Request.new(url, "GET", params, headers)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#initialize" do
|
13
|
+
it "populates the readers" do
|
14
|
+
request.url == url
|
15
|
+
request.params == params
|
16
|
+
request.headers == headers
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#execute" do
|
21
|
+
it "makes an http request via the driver" do
|
22
|
+
mock(request).driver_execute(url, "GET", headers, params)
|
23
|
+
response = request.execute
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../../../../spec_helper"
|
2
|
+
|
3
|
+
describe Spec::Client::Http::Response do
|
4
|
+
describe "#cookies" do
|
5
|
+
attr_reader :response
|
6
|
+
before do
|
7
|
+
@response = Spec::Client::Http::Response.new("http://www.example.com")
|
8
|
+
response.headers = { "Set-Cookie" => ["foo=bar", "baz=bang; domain=.example.com"] }
|
9
|
+
end
|
10
|
+
|
11
|
+
def assert_cookies_equal(actual, expected)
|
12
|
+
actual.name.should == expected.name
|
13
|
+
actual.value.should == expected.value
|
14
|
+
actual.domain.should == expected.domain
|
15
|
+
actual.path.should == expected.path
|
16
|
+
actual.expires.should == expected.expires
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns an array of cookies" do
|
20
|
+
response.cookies.size.should == 2
|
21
|
+
assert_cookies_equal(response.cookies.first, Mechanize::Cookie::parse(URI::parse("http://www.example.com"), "foo=bar") {|c| c}.first)
|
22
|
+
assert_cookies_equal(response.cookies.last, Mechanize::Cookie::parse(URI::parse("http://www.example.com"), "baz=bang; domain=.example.com"){|c| c}.first)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../../../../spec_helper"
|
2
|
+
|
3
|
+
describe Spec::Client::Http::Session do
|
4
|
+
class TestClient
|
5
|
+
def intialize
|
6
|
+
end
|
7
|
+
|
8
|
+
def get(url, params = {})
|
9
|
+
end
|
10
|
+
|
11
|
+
def post(url, params = {})
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class TestRequest < Spec::Client::Http::Request
|
16
|
+
def driver_execute(url,method,headers,params)
|
17
|
+
Spec::Client::Http::Response.new(url)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :client
|
22
|
+
before do
|
23
|
+
@client = TestClient.new
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#intialize" do
|
27
|
+
it "creates a new cookie jar" do
|
28
|
+
session = Spec::Client::Http::Session.new(client)
|
29
|
+
session.client.should == client
|
30
|
+
session.cookie_jar.should be_a(Mechanize::CookieJar)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#get" do
|
35
|
+
it "calls execute with a new get request" do
|
36
|
+
session = Spec::Client::Http::Session.new(client)
|
37
|
+
mock(session).execute(anything) do |request|
|
38
|
+
request.should be_a(Spec::Client::Http::Request)
|
39
|
+
request.request_method.should == "GET"
|
40
|
+
end
|
41
|
+
|
42
|
+
session.get("http://127.0.0.1", {})
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#post" do
|
47
|
+
it "calls execute with a new post request" do
|
48
|
+
session = Spec::Client::Http::Session.new(client)
|
49
|
+
mock(session).execute(anything) do |request|
|
50
|
+
request.should be_a(Spec::Client::Http::Request)
|
51
|
+
request.request_method.should == "POST"
|
52
|
+
end
|
53
|
+
session.post("http://127.0.0.1", {})
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#execute" do
|
58
|
+
it "makes a request and returns the Transaction" do
|
59
|
+
# mock.instance_of(Spec::Client::Http::Transaction).execute
|
60
|
+
session = Spec::Client::Http::Session.new(client)
|
61
|
+
transaction = session.execute(TestRequest.new("http://127.0.0.1/", "GET", {}, {}))
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../../../../spec_helper"
|
2
|
+
|
3
|
+
describe Spec::Client::Http::Transaction do
|
4
|
+
attr_reader :request, :response
|
5
|
+
before do
|
6
|
+
@request = Spec::Client::Http::Request.new("http://example.com", "GET", {}, {})
|
7
|
+
@response = Spec::Client::Http::Response.new(@request.url)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#execute" do
|
11
|
+
it "executes the request and sets the response" do
|
12
|
+
mock(request).execute { "foo" }
|
13
|
+
|
14
|
+
transaction = Spec::Client::Http::Transaction.new(request)
|
15
|
+
transaction.execute.should == transaction
|
16
|
+
transaction.response.should == "foo"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#success?" do
|
21
|
+
describe "when the response code is an http success code" do
|
22
|
+
before do
|
23
|
+
response.code = 201
|
24
|
+
mock(request).execute { response }
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns true" do
|
28
|
+
transaction = Spec::Client::Http::Transaction.new(request)
|
29
|
+
transaction.execute
|
30
|
+
transaction.should be_success
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "when the response code is NOT an http success code" do
|
35
|
+
before do
|
36
|
+
response.code = 300
|
37
|
+
mock(request).execute { response }
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns false" do
|
41
|
+
transaction = Spec::Client::Http::Transaction.new(request)
|
42
|
+
transaction.execute
|
43
|
+
transaction.should_not be_success
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#redirect?" do
|
49
|
+
describe "when the response code is an http redirect code" do
|
50
|
+
before do
|
51
|
+
response.code = 302
|
52
|
+
mock(request).execute { response }
|
53
|
+
end
|
54
|
+
|
55
|
+
it "returns true" do
|
56
|
+
transaction = Spec::Client::Http::Transaction.new(request)
|
57
|
+
transaction.execute
|
58
|
+
transaction.should be_redirect
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "when the response code is NOT an http redirect code" do
|
63
|
+
before do
|
64
|
+
response.code = 400
|
65
|
+
mock(request).execute { response }
|
66
|
+
end
|
67
|
+
|
68
|
+
it "returns false" do
|
69
|
+
transaction = Spec::Client::Http::Transaction.new(request)
|
70
|
+
transaction.execute
|
71
|
+
transaction.should_not be_redirect
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../../../spec_helper"
|
2
|
+
|
3
|
+
describe Spec::Client::HttpClient do
|
4
|
+
|
5
|
+
describe "#full_url" do
|
6
|
+
it "creates a full url from base_uri and a path" do
|
7
|
+
full_url = Spec::Client::HttpClient.new("http://example.com").full_url("foo")
|
8
|
+
full_url.should == "http://example.com/foo"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#new_session" do
|
13
|
+
it "empties cookies" do
|
14
|
+
client = Spec::Client::HttpClient.new("http://example.com")
|
15
|
+
client.session.cookie_jar.add(URI::parse("http://example.com"),Mechanize::Cookie::parse(URI::parse("http://example.com"), "foo=bar") {|c| c}.first)
|
16
|
+
client.session.cookie_jar.cookies(URI::parse("http://example.com")).should_not be_empty
|
17
|
+
client.new_session()
|
18
|
+
client.session.cookie_jar.cookies(URI::parse("http://example.com")).should be_empty
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -84,7 +84,7 @@ describe Spec::Performance::Example::PerformanceExampleGroupMethods do
|
|
84
84
|
it "reports the success" do
|
85
85
|
example_group.perform("reports the success", spec_options) { 1.should == 1 }
|
86
86
|
example_group.run(fake_run_options)
|
87
|
-
|
87
|
+
|
88
88
|
fake_run_options.reporter.example_failures.should be_empty
|
89
89
|
example = fake_run_options.reporter.example_successes.first
|
90
90
|
example.description.should == "reports the success"
|
@@ -33,10 +33,10 @@ describe Spec::Performance::Example::PerformanceExampleGroup do
|
|
33
33
|
example_group.run(fake_run_options)
|
34
34
|
fake_run_options.reporter.example_failures.should be_empty
|
35
35
|
|
36
|
-
driver_instance_in_first_perform_block.should be_a(Spec::
|
36
|
+
driver_instance_in_first_perform_block.should be_a(Spec::Client::HttpClient)
|
37
37
|
driver_instance_in_before_block.base_uri.should == "http://localhost/"
|
38
38
|
|
39
|
-
driver_instance_in_second_perform_block.should be_a(Spec::
|
39
|
+
driver_instance_in_second_perform_block.should be_a(Spec::Client::HttpClient)
|
40
40
|
driver_instance_in_second_perform_block.base_uri.should == "http://localhost/"
|
41
41
|
|
42
42
|
driver_instance_in_first_perform_block.eql?(driver_instance_in_second_perform_block).should be_false
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-performance
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Bob Remeika
|
@@ -9,10 +15,25 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date: 2010-
|
18
|
+
date: 2010-05-21 00:00:00 -07:00
|
13
19
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: mechanize
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 23
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
version: 1.0.0
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
16
37
|
description: rspec-performance adds a couple of utility methods for unit testing performance
|
17
38
|
email: bob@grockit.com
|
18
39
|
executables: []
|
@@ -23,9 +44,13 @@ extra_rdoc_files: []
|
|
23
44
|
|
24
45
|
files:
|
25
46
|
- lib/rspec-performance.rb
|
26
|
-
- lib/spec/
|
27
|
-
- lib/spec/
|
28
|
-
- lib/spec/
|
47
|
+
- lib/spec/client/http/driver/curl_driver.rb
|
48
|
+
- lib/spec/client/http/matcher/transaction_matchers.rb
|
49
|
+
- lib/spec/client/http/request.rb
|
50
|
+
- lib/spec/client/http/response.rb
|
51
|
+
- lib/spec/client/http/session.rb
|
52
|
+
- lib/spec/client/http/transaction.rb
|
53
|
+
- lib/spec/client/http_client.rb
|
29
54
|
- lib/spec/performance/configuration.rb
|
30
55
|
- lib/spec/performance/example/performance_example_group.rb
|
31
56
|
- lib/spec/performance/example/performance_example_group_methods.rb
|
@@ -33,7 +58,13 @@ files:
|
|
33
58
|
- lib/spec/performance/version.rb
|
34
59
|
- spec/helpers/integration_server.rb
|
35
60
|
- spec/helpers/integration_server_spec.rb
|
36
|
-
- spec/lib/spec/
|
61
|
+
- spec/lib/spec/client/http/driver/curl_driver_spec.rb
|
62
|
+
- spec/lib/spec/client/http/matcher/transaction_matchers_spec.rb
|
63
|
+
- spec/lib/spec/client/http/request_spec.rb
|
64
|
+
- spec/lib/spec/client/http/response_spec.rb
|
65
|
+
- spec/lib/spec/client/http/session_spec.rb
|
66
|
+
- spec/lib/spec/client/http/transaction_spec.rb
|
67
|
+
- spec/lib/spec/client/http_client_spec.rb
|
37
68
|
- spec/lib/spec/performance/configuration_spec.rb
|
38
69
|
- spec/lib/spec/performance/example/performance_example_group_methods_spec.rb
|
39
70
|
- spec/lib/spec/performance/example/performance_example_group_spec.rb
|
@@ -51,21 +82,27 @@ rdoc_options: []
|
|
51
82
|
require_paths:
|
52
83
|
- lib
|
53
84
|
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
54
86
|
requirements:
|
55
87
|
- - ">="
|
56
88
|
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
57
92
|
version: "0"
|
58
|
-
version:
|
59
93
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
60
95
|
requirements:
|
61
96
|
- - ">="
|
62
97
|
- !ruby/object:Gem::Version
|
98
|
+
hash: 3
|
99
|
+
segments:
|
100
|
+
- 0
|
63
101
|
version: "0"
|
64
|
-
version:
|
65
102
|
requirements:
|
66
103
|
- rspec-1.2.6
|
67
104
|
rubyforge_project: rspec-performance
|
68
|
-
rubygems_version: 1.3.
|
105
|
+
rubygems_version: 1.3.7
|
69
106
|
signing_key:
|
70
107
|
specification_version: 3
|
71
108
|
summary: Ruby based make-like utility.
|
@@ -1 +0,0 @@
|
|
1
|
-
require "spec/performance/client/http_client"
|
@@ -1,94 +0,0 @@
|
|
1
|
-
require "net/http"
|
2
|
-
require "cgi"
|
3
|
-
require "spec/performance/client/response"
|
4
|
-
|
5
|
-
module Spec
|
6
|
-
module Performance
|
7
|
-
module Client
|
8
|
-
class HttpClient
|
9
|
-
attr_writer :recording, :cookies
|
10
|
-
attr_reader :base_uri, :cookies
|
11
|
-
|
12
|
-
def initialize(base_uri)
|
13
|
-
@base_uri = base_uri
|
14
|
-
@headers = {}
|
15
|
-
@cookies = {}
|
16
|
-
@recording = true
|
17
|
-
end
|
18
|
-
|
19
|
-
def post(uri, params = {})
|
20
|
-
request = Net::HTTP::Post.new(uri.path, headers)
|
21
|
-
request.form_data = params
|
22
|
-
request.basic_auth uri.user, uri.password if uri.user
|
23
|
-
response = Net::HTTP.new(uri.host, uri.port).start do |http|
|
24
|
-
http.request(request)
|
25
|
-
end
|
26
|
-
capture(response) if recording?
|
27
|
-
create_http_client_response(response)
|
28
|
-
end
|
29
|
-
|
30
|
-
def get(uri, params = {})
|
31
|
-
if params && params.size > 0
|
32
|
-
query = params2query(params)
|
33
|
-
uri = URI.parse("#{uri}?#{query}")
|
34
|
-
end
|
35
|
-
|
36
|
-
http = Net::HTTP.start(uri.host, uri.port)
|
37
|
-
response = http.get(uri.request_uri, headers)
|
38
|
-
http.finish
|
39
|
-
|
40
|
-
create_http_client_response(response)
|
41
|
-
end
|
42
|
-
|
43
|
-
def add_header(key, value)
|
44
|
-
@headers[key] = value
|
45
|
-
end
|
46
|
-
|
47
|
-
def remove_header(key)
|
48
|
-
@headers.delete(key)
|
49
|
-
end
|
50
|
-
|
51
|
-
def recording?
|
52
|
-
@recording
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
def params2query(hash)
|
58
|
-
q = hash.inject([]) do |acc, (k, v)|
|
59
|
-
acc << CGI::escape(k.to_s) + "=" + CGI::escape(v.to_s)
|
60
|
-
end.join("&")
|
61
|
-
end
|
62
|
-
|
63
|
-
def capture(response)
|
64
|
-
if raw_cookies = response.get_fields("Set-Cookie")
|
65
|
-
cookie_jar = raw_cookies.inject({}) do |parsed_cookies, raw_cookie_string|
|
66
|
-
CGI::Cookie.parse(raw_cookie_string).each do |name, cookie|
|
67
|
-
parsed_cookies[name.to_sym] = cookie
|
68
|
-
end
|
69
|
-
parsed_cookies
|
70
|
-
end
|
71
|
-
@cookies.merge!(cookie_jar)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def headers
|
76
|
-
@headers.merge("Cookie" => browser_cookies)
|
77
|
-
end
|
78
|
-
|
79
|
-
def browser_cookies
|
80
|
-
cookies_to_send = @cookies.values.reject {|cookie| cookie.name == "path" || cookie.name == "domain" }
|
81
|
-
cookies_to_send.map do |cookie|
|
82
|
-
CGI::escape(cookie.name) + "=" + CGI::escape(cookie.value.first)
|
83
|
-
end.join("; ")
|
84
|
-
end
|
85
|
-
|
86
|
-
def create_http_client_response(net_http_response)
|
87
|
-
attributes = { :code => net_http_response.code,
|
88
|
-
:body => net_http_response.body }
|
89
|
-
Response.new(attributes)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
|
2
|
-
module Spec
|
3
|
-
module Performance
|
4
|
-
module Client
|
5
|
-
|
6
|
-
class Response
|
7
|
-
attr_reader :code, :body, :cookies
|
8
|
-
|
9
|
-
def initialize(attributes = {})
|
10
|
-
@code = attributes[:code].to_i
|
11
|
-
@body = attributes[:body]
|
12
|
-
end
|
13
|
-
|
14
|
-
def success?
|
15
|
-
@code == 200
|
16
|
-
end
|
17
|
-
|
18
|
-
def redirect?
|
19
|
-
@code == 301 || @code == 302
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,112 +0,0 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/../../../../spec_helper"
|
2
|
-
|
3
|
-
describe Spec::Performance::Client::HttpClient do
|
4
|
-
attr_reader :client
|
5
|
-
|
6
|
-
before do
|
7
|
-
@client = Spec::Performance::Client::HttpClient.new("http://localhost")
|
8
|
-
end
|
9
|
-
|
10
|
-
describe "#initialize" do
|
11
|
-
it "initializes the cookie jar" do
|
12
|
-
client.cookies.should be_a(Hash)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe "#post" do
|
17
|
-
attr_reader :uri, :params
|
18
|
-
before do
|
19
|
-
@uri = URI.join(IntegrationServer.base_url, "hello")
|
20
|
-
@params = { :foo => "bar", :baz => "quux" }
|
21
|
-
end
|
22
|
-
|
23
|
-
it "makes an HTTP post" do
|
24
|
-
mock.instance_of(Net::HTTP).request(anything) do |request|
|
25
|
-
request.should be_a(Net::HTTP::Post)
|
26
|
-
stub(Net::HTTPResponse.new(1.1, 200, nil)).body { "stubbed response body" }
|
27
|
-
end
|
28
|
-
client.post(uri, params).should be_success
|
29
|
-
end
|
30
|
-
|
31
|
-
it "returns a response object" do
|
32
|
-
client.post(uri, params).should be_a(Spec::Performance::Client::Response)
|
33
|
-
end
|
34
|
-
|
35
|
-
describe "when the client is recording" do
|
36
|
-
before do
|
37
|
-
@uri = URI.join(IntegrationServer.base_url, "cookie_echo")
|
38
|
-
client.should be_recording
|
39
|
-
end
|
40
|
-
|
41
|
-
it "captures the cookie from the response" do
|
42
|
-
client.post(uri, params).should be_success
|
43
|
-
client.cookies[:foo].value.first.should == "bar"
|
44
|
-
client.cookies[:baz].value.first.should == "quux"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe "when the client is not recording" do
|
49
|
-
before do
|
50
|
-
@uri = URI.join(IntegrationServer.base_url, "cookie_echo")
|
51
|
-
client.recording = false
|
52
|
-
client.should_not be_recording
|
53
|
-
end
|
54
|
-
|
55
|
-
it "does not capture cookies" do
|
56
|
-
client.post(uri, params).should be_success
|
57
|
-
client.cookies.should_not have_key(:foo)
|
58
|
-
client.cookies.should_not have_key(:baz)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
describe "#get" do
|
64
|
-
attr_reader :uri, :params
|
65
|
-
before do
|
66
|
-
@params = { :monster_truck => "Truckasaurus", :us_president => "Grover Cleveland" }
|
67
|
-
@uri = URI.join(IntegrationServer.base_url, "hello")
|
68
|
-
end
|
69
|
-
|
70
|
-
it "sends an HTTP get request, sending the current cookies" do
|
71
|
-
expected_cookie = CGI::Cookie.new("cookie-name", "cookie-value")
|
72
|
-
expected_headers = { "Cookie" => "cookie-name=cookie-value" }
|
73
|
-
client.cookies = { "cookie-name".to_sym => expected_cookie }
|
74
|
-
|
75
|
-
mock_http = Object.new
|
76
|
-
mock(Net::HTTP).start("localhost", 8888) { mock_http }
|
77
|
-
mock(mock_http).get(anything, expected_headers) do |request_uri, headers|
|
78
|
-
request_uri.index("/hello?").should == 0
|
79
|
-
request_uri.should include("monster_truck=Truckasaurus")
|
80
|
-
request_uri.should include("us_president=Grover+Cleveland")
|
81
|
-
request_uri.should include("&")
|
82
|
-
|
83
|
-
stub(Net::HTTPResponse.new(1.1, 200, nil)).body { "stubbed response body" }
|
84
|
-
end
|
85
|
-
mock(mock_http).finish
|
86
|
-
|
87
|
-
response = client.get(uri, params)
|
88
|
-
end
|
89
|
-
|
90
|
-
it "returns a response object" do
|
91
|
-
response = client.get(uri, params)
|
92
|
-
response.should be_a(Spec::Performance::Client::Response)
|
93
|
-
response.should be_success
|
94
|
-
end
|
95
|
-
|
96
|
-
describe "when the client is recording" do
|
97
|
-
it "captures the cookie from the response" do
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe "when the client is not recording" do
|
102
|
-
it "does not capture" do
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
describe "#restore" do
|
108
|
-
it "resets after each run" do
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
end
|