http_spec 0.1.0 → 0.2.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/lib/http_spec/clients/faraday.rb +9 -2
- data/lib/http_spec/clients/rack.rb +5 -2
- data/lib/http_spec/clients/raddocs_proxy.rb +2 -1
- data/lib/http_spec/clients/vcr_proxy.rb +61 -0
- data/lib/http_spec/clients/webmachine.rb +1 -1
- data/lib/http_spec/dsl/methods.rb +1 -1
- data/lib/http_spec/dsl/resource.rb +12 -14
- data/lib/http_spec/types.rb +4 -7
- metadata +36 -3
@@ -9,10 +9,17 @@ module HTTPSpec
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def dispatch(request)
|
12
|
-
@conn.send(request.method, request.path) do |req|
|
13
|
-
req.headers = request.headers
|
12
|
+
response = @conn.send(request.method, request.path) do |req|
|
13
|
+
req.headers = request.headers
|
14
14
|
req.body = request.body
|
15
15
|
end
|
16
|
+
from_faraday response
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def from_faraday(response)
|
22
|
+
HTTPSpec::Response.new(response.status, response.body, response.headers)
|
16
23
|
end
|
17
24
|
end
|
18
25
|
end
|
@@ -11,13 +11,16 @@ module HTTPSpec
|
|
11
11
|
def dispatch(request)
|
12
12
|
opts = headers_to_env(request.headers)
|
13
13
|
opts[:input] = request.body
|
14
|
-
@session.request(request.method, request.path, opts)
|
14
|
+
from_rack @session.request(request.method, request.path, opts)
|
15
15
|
end
|
16
16
|
|
17
17
|
private
|
18
18
|
|
19
|
+
def from_rack(response)
|
20
|
+
HTTPSpec::Response.new(response.status, response.body, response.headers)
|
21
|
+
end
|
22
|
+
|
19
23
|
def headers_to_env(headers)
|
20
|
-
return {} unless headers
|
21
24
|
headers.inject({}) do |env, (k, v)|
|
22
25
|
k = k.tr("-", "_").upcase
|
23
26
|
k = "HTTP_#{k}" unless %w{CONTENT_TYPE CONTENT_LENGTH}.include?(k)
|
@@ -122,9 +122,10 @@ module HTTPSpec
|
|
122
122
|
|
123
123
|
def add_request(request, response)
|
124
124
|
requests.push(
|
125
|
-
"request_headers" => request.headers
|
125
|
+
"request_headers" => request.headers,
|
126
126
|
"request_method" => request.method.upcase,
|
127
127
|
"request_path" => request.path,
|
128
|
+
"request_query_parameters" => {},
|
128
129
|
"request_body" => request.body,
|
129
130
|
"response_status" => response.status,
|
130
131
|
"response_headers" => response.headers,
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "http_spec/types"
|
2
|
+
require "digest/sha1"
|
3
|
+
|
4
|
+
module HTTPSpec
|
5
|
+
module Clients
|
6
|
+
class VCRProxy
|
7
|
+
def initialize(inner, cassette, dir = "recordings")
|
8
|
+
@inner = inner
|
9
|
+
@recording = Recording.new(cassette, dir)
|
10
|
+
end
|
11
|
+
|
12
|
+
def dispatch(request)
|
13
|
+
if @recording.new?
|
14
|
+
response = @inner.dispatch(request)
|
15
|
+
@recording.record(request, response)
|
16
|
+
response
|
17
|
+
else
|
18
|
+
@recording.play(request)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Recording
|
23
|
+
def initialize(cassette, dir)
|
24
|
+
filename = Digest::SHA1.hexdigest(cassette)
|
25
|
+
@filepath = File.join(dir, filename)
|
26
|
+
end
|
27
|
+
|
28
|
+
def new?
|
29
|
+
@new ||= !File.exists?(@filepath)
|
30
|
+
end
|
31
|
+
|
32
|
+
def record(request, response)
|
33
|
+
cache << [request, response]
|
34
|
+
File.open(@filepath, "w+") do |file|
|
35
|
+
Marshal.dump(@cache, file)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def play(request)
|
40
|
+
next_request, next_response = cache.shift
|
41
|
+
if next_request == request
|
42
|
+
next_response
|
43
|
+
else
|
44
|
+
raise "Request does not match recording."
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def cache
|
49
|
+
@cache ||=
|
50
|
+
if File.exists?(@filepath)
|
51
|
+
File.open(@filepath, "r+") do |file|
|
52
|
+
Marshal.load(file)
|
53
|
+
end
|
54
|
+
else
|
55
|
+
[]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -6,7 +6,7 @@ module HTTPSpec
|
|
6
6
|
module Methods
|
7
7
|
def self.define_actions(*methods)
|
8
8
|
methods.each do |method|
|
9
|
-
define_method(method) do |path, body=
|
9
|
+
define_method(method) do |path, body="", headers={}|
|
10
10
|
request = Request.new(method, path, body, headers)
|
11
11
|
HTTPSpec.dispatch(request)
|
12
12
|
end
|
@@ -14,7 +14,7 @@ module HTTPSpec
|
|
14
14
|
methods.each do |method|
|
15
15
|
define_method(method) do |route, metadata = {}, &block|
|
16
16
|
description = "#{method.to_s.upcase} #{route}"
|
17
|
-
metadata[:request] = Request.new(method, route)
|
17
|
+
metadata[:request] = Request.new(method, route, "", {})
|
18
18
|
context(description, metadata, &block)
|
19
19
|
end
|
20
20
|
end
|
@@ -36,11 +36,7 @@ module HTTPSpec
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def do_request(options = {})
|
39
|
-
|
40
|
-
request.body = options.delete(:body)
|
41
|
-
request.headers = default_headers(options.delete(:headers))
|
42
|
-
build_path(request, options)
|
43
|
-
@last_response = HTTPSpec.dispatch(request)
|
39
|
+
@last_response = HTTPSpec.dispatch(build_request(options))
|
44
40
|
end
|
45
41
|
|
46
42
|
def status
|
@@ -58,8 +54,17 @@ module HTTPSpec
|
|
58
54
|
|
59
55
|
private
|
60
56
|
|
57
|
+
def build_request(options)
|
58
|
+
request = example.metadata[:request]
|
59
|
+
path = build_path(request, options)
|
60
|
+
body = options.fetch(:body, "")
|
61
|
+
headers = example.metadata[:default_headers]
|
62
|
+
headers.merge!(options.fetch(:headers, {}))
|
63
|
+
Request.new(request.method, path, body, headers)
|
64
|
+
end
|
65
|
+
|
61
66
|
def build_path(request, options)
|
62
|
-
request.path.gsub
|
67
|
+
request.path.gsub(/:(\w+)/) do |match|
|
63
68
|
if options.key?($1.to_sym)
|
64
69
|
options[$1.to_sym]
|
65
70
|
elsif respond_to?($1)
|
@@ -69,13 +74,6 @@ module HTTPSpec
|
|
69
74
|
end
|
70
75
|
end
|
71
76
|
end
|
72
|
-
|
73
|
-
def default_headers(headers)
|
74
|
-
default_headers = example.metadata[:default_headers]
|
75
|
-
return default_headers if headers.nil?
|
76
|
-
return headers if default_headers.nil?
|
77
|
-
default_headers.merge(headers)
|
78
|
-
end
|
79
77
|
end
|
80
78
|
end
|
81
79
|
end
|
data/lib/http_spec/types.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
|
-
|
2
|
-
Request = Struct.new(:method, :path, :body, :headers) do
|
3
|
-
def dup
|
4
|
-
Request.new(method, path.dup, body, headers)
|
5
|
-
end
|
6
|
-
end
|
1
|
+
require "values"
|
7
2
|
|
8
|
-
|
3
|
+
module HTTPSpec
|
4
|
+
Request = Value.new(:method, :path, :body, :headers)
|
5
|
+
Response = Value.new(:status, :body, :headers)
|
9
6
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http_spec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,10 +9,26 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name: rspec
|
15
|
+
name: rspec-core
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: values
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
17
33
|
none: false
|
18
34
|
requirements:
|
@@ -107,6 +123,22 @@ dependencies:
|
|
107
123
|
- - ! '>='
|
108
124
|
- !ruby/object:Gem::Version
|
109
125
|
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: rspec
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
110
142
|
- !ruby/object:Gem::Dependency
|
111
143
|
name: rake
|
112
144
|
requirement: !ruby/object:Gem::Requirement
|
@@ -197,6 +229,7 @@ files:
|
|
197
229
|
- lib/http_spec/clients/fdoc_proxy.rb
|
198
230
|
- lib/http_spec/clients/rack.rb
|
199
231
|
- lib/http_spec/clients/raddocs_proxy.rb
|
232
|
+
- lib/http_spec/clients/vcr_proxy.rb
|
200
233
|
- lib/http_spec/clients/webmachine.rb
|
201
234
|
- lib/http_spec/dsl/methods.rb
|
202
235
|
- lib/http_spec/dsl/parameters.rb
|