http_spec 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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