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.
@@ -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
@@ -20,7 +20,7 @@ module HTTPSpec
20
20
  ::Webmachine::Request.new(
21
21
  request.method.to_s.upcase,
22
22
  URI.parse(request.path),
23
- request.headers || {},
23
+ request.headers,
24
24
  request.body
25
25
  )
26
26
  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=nil, headers=nil|
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
- request = example.metadata[:request].dup
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!(/:(\w+)/) do |match|
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
@@ -1,9 +1,6 @@
1
- module HTTPSpec
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
- Response = Struct.new(:status, :body, :headers)
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.1.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-20 00:00:00.000000000 Z
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