mimic 0.4.1 → 0.4.2

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/CHANGES CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.4.2
2
+
3
+ * Remove unnecessary signal traps.
4
+
1
5
  ## 0.4.1
2
6
 
3
7
  * Fixed bug where stubs wouldn't actually be cleared correctly.
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # What is Mimic?
2
2
  Mimic is a testing tool that lets you set create a fake stand-in for an external web service to be used when writing integration/end-to-end tests for applications or libraries that access these services.
3
3
 
4
- Note: this is still very early in its development; don't let the existence of this README fool you into thinking its ready for prime-time!
5
-
6
4
  ## Why not stub?
7
5
  There are already some good tools, like [FakeWeb](http://fakeweb.rubyforge.org/) which let you stub requests at a low-level which is fine for unit and functional tests but when exercising our code through integration or end-to-end tests we want to exercise as much of the stack as possible.
8
6
 
data/Rakefile CHANGED
@@ -27,7 +27,7 @@ spec = Gem::Specification.new do |s|
27
27
 
28
28
  # Change these as appropriate
29
29
  s.name = "mimic"
30
- s.version = "0.4.1"
30
+ s.version = "0.4.2"
31
31
  s.summary = "A Ruby gem for faking external web services for testing"
32
32
  s.authors = "Luke Redpath"
33
33
  s.email = "luke@lukeredpath.co.uk"
@@ -18,7 +18,7 @@ module Mimic
18
18
 
19
19
  host = FakeHost.new(options[:hostname], options[:remote_configuration_path]).tap do |host|
20
20
  host.instance_eval(&block) if block_given?
21
- Server.instance.serve(host, options[:port], options[:fork])
21
+ Server.instance.serve(host, options)
22
22
  end
23
23
  add_host(host)
24
24
  end
@@ -44,30 +44,32 @@ module Mimic
44
44
  @logger ||= Logger.new(StringIO.new)
45
45
  end
46
46
 
47
- def serve(host_app, port, should_fork)
48
- if should_fork
47
+ def serve(app, options)
48
+ if options[:fork]
49
49
  @thread = Thread.fork do
50
- start_service(host_app, port)
50
+ start_service(app, options)
51
51
  end
52
52
 
53
- wait_for_service(host_app.hostname, port)
54
-
53
+ wait_for_service(app.hostname, options[:port])
54
+
55
55
  else
56
- start_service(host_app, port)
56
+ start_service(app, options)
57
57
  end
58
58
  end
59
59
 
60
- def start_service(host_app, port)
61
- Rack::Handler::WEBrick.run(host_app.url_map, {
62
- :Port => port,
60
+ def start_service(app, options)
61
+ Rack::Handler::WEBrick.run(app.url_map, {
62
+ :Port => options[:port],
63
63
  :Logger => logger,
64
64
  :AccessLog => logger,
65
65
 
66
66
  }) do |server|
67
67
  @server = server
68
68
 
69
- trap("TERM") { @server.shutdown }
70
- trap("INT") { @server.shutdown }
69
+ old = trap('EXIT') do
70
+ old.call if old
71
+ @server.shutdown
72
+ end
71
73
  end
72
74
  end
73
75
 
@@ -31,6 +31,14 @@ module Mimic
31
31
  [200, {}, "Cleared stubs: #{response_body}"]
32
32
  end
33
33
 
34
+ get "/ping" do
35
+ [200, {}, "OK"]
36
+ end
37
+
38
+ get "/debug" do
39
+ [200, {}, self.host.inspect]
40
+ end
41
+
34
42
  private
35
43
 
36
44
  class APIRequest
@@ -68,7 +76,13 @@ module Mimic
68
76
  end
69
77
 
70
78
  def on(host)
71
- host.send(@method.downcase.to_sym, path).returning(body, code, headers)
79
+ stub = host.send(@method.downcase.to_sym, path).returning(body, code, headers)
80
+ stub.with_query_parameters(params)
81
+ stub.echo_request!(echo_format)
82
+ end
83
+
84
+ def echo_format
85
+ @data['echo'].to_sym rescue nil
72
86
  end
73
87
 
74
88
  def path
@@ -86,6 +100,10 @@ module Mimic
86
100
  def headers
87
101
  @data['headers'] || {}
88
102
  end
103
+
104
+ def params
105
+ @data['params'] || {}
106
+ end
89
107
  end
90
108
  end
91
109
  end
@@ -8,6 +8,7 @@ module Mimic
8
8
  def initialize(hostname, remote_configuration_path = nil)
9
9
  @hostname = hostname
10
10
  @remote_configuration_path = remote_configuration_path
11
+ @imports = []
11
12
  clear
12
13
  build_url_map!
13
14
  end
@@ -34,7 +35,10 @@ module Mimic
34
35
 
35
36
  def import(path)
36
37
  if File.exists?(path)
38
+ @imports << path unless @imports.include?(path)
37
39
  instance_eval(File.read(path))
40
+ else
41
+ raise "Could not locate file for stub import: #{path}"
38
42
  end
39
43
  end
40
44
 
@@ -49,6 +53,10 @@ module Mimic
49
53
  @app.not_found do
50
54
  [404, {}, ""]
51
55
  end
56
+ @app.helpers do
57
+ include Helpers
58
+ end
59
+ @imports.each { |file| import(file) }
52
60
  end
53
61
 
54
62
  def inspect
@@ -81,11 +89,59 @@ module Mimic
81
89
  @url_map = Rack::URLMap.new(routes)
82
90
  end
83
91
 
92
+ module Helpers
93
+ def echo_request!(format)
94
+ RequestEcho.new(request).response_as(format)
95
+ end
96
+ end
97
+
98
+ class RequestEcho
99
+ def initialize(request)
100
+ @request = request
101
+ end
102
+
103
+ def response_as(format)
104
+ content_type = case format
105
+ when :json, :plist
106
+ "application/#{format.to_s.downcase}"
107
+ else
108
+ "text/plain"
109
+ end
110
+ [200, {"Content-Type" => content_type}, to_s(format)]
111
+ end
112
+
113
+ def to_s(format)
114
+ case format
115
+ when :json
116
+ to_hash.to_json
117
+ when :plist
118
+ to_hash.to_plist
119
+ when :text
120
+ to_hash.inspect
121
+ end
122
+ end
123
+
124
+ def to_hash
125
+ {"echo" => {
126
+ "params" => @request.params,
127
+ "env" => env_without_rack_env,
128
+ "body" => @request.body.read
129
+ }}
130
+ end
131
+
132
+ private
133
+
134
+ def env_without_rack_env
135
+ Hash[*@request.env.select { |key, value| key !~ /^rack/i }.flatten]
136
+ end
137
+ end
138
+
84
139
  class StubbedRequest
85
140
  def initialize(app, method, path)
86
141
  @method, @path = method, path
87
142
  @code = 200
88
143
  @headers = {}
144
+ @params = {}
89
145
  @body = ""
90
146
  @app = app
91
147
  end
@@ -98,9 +154,43 @@ module Mimic
98
154
  end
99
155
  end
100
156
 
157
+ def with_query_parameters(params)
158
+ tap do
159
+ @params = params
160
+ end
161
+ end
162
+
163
+ def echo_request!(format = :json)
164
+ @echo_request_format = format
165
+ end
166
+
167
+ def matches?(request)
168
+ if @params.any?
169
+ request.params == @params
170
+ else
171
+ true
172
+ end
173
+ end
174
+
175
+ def matched_response
176
+ [@code, @headers, @body]
177
+ end
178
+
179
+ def unmatched_response
180
+ [404, "", {}]
181
+ end
182
+
183
+ def response_for_request(request)
184
+ if @echo_request_format
185
+ @body = RequestEcho.new(request).to_s(@echo_request_format)
186
+ end
187
+
188
+ matches?(request) ? matched_response : unmatched_response
189
+ end
190
+
101
191
  def build
102
- response = [@code, @headers, @body]
103
- @app.send(@method.downcase, @path) { response }
192
+ stub = self
193
+ @app.send(@method.downcase, @path) { stub.response_for_request(request) }
104
194
  end
105
195
  end
106
196
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mimic
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 11
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 1
10
- version: 0.4.1
9
+ - 2
10
+ version: 0.4.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Luke Redpath
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-13 00:00:00 +00:00
18
+ date: 2011-04-20 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency