mock_server 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,114 +8,116 @@ unless defined? MockServer::Store
8
8
  require 'mock_server/store/global'
9
9
  end
10
10
 
11
- module MockServer
12
- class Playback
13
- include MockServer::Utils
14
- include MockServer::Store
15
-
16
- def initialize(app, opt = {})
17
- @app = app
18
- @options = mock_server_options_merge(opt)
19
- end
20
-
21
- def call(env)
22
- @options = self.mock_server_options_read
23
-
24
- verbose(env) if @options[:verbose]
25
- return @app.call(env) unless @options[:routes] and
26
- lazy_match @options[:routes], env["PATH_INFO"]
11
+ class MockServer::Playback
12
+ include MockServer::Utils
13
+ include MockServer::Store
27
14
 
28
- @request = Rack::Request.new(env)
15
+ def initialize(app, opt = {})
16
+ @app = app
17
+ @options = mock_server_options_merge(opt)
18
+ end
29
19
 
30
- @options[:requests_stack] << @request.path
20
+ def call(env)
21
+ @options = self.mock_server_options_read
31
22
 
32
- @data = load_data
23
+ verbose(env) if @options[:verbose]
24
+ return @app.call(env) unless matchable_request?(env)
33
25
 
34
- record = match_request
26
+ @request = Rack::Request.new(env)
27
+ @options[:requests_stack] << @request.path
28
+ @data = load_data
35
29
 
36
- response = if record
37
- @options[:success_stack] << @request.path
38
- @options[:matcher_exceptions].clear
30
+ response = build_response
31
+ self.mock_server_options_write(@options)
32
+ response
33
+ end
39
34
 
40
- response = record[:response]
41
- [response[:status], response[:headers], [response[:body]]]
42
- else
43
- error = { @request.path => "Couldn't match #{@request.request_method} #{@request.path}" }
44
- @options[:errors_stack] << error
45
- [404, {}, ['RECORD NOT FOUND!']]
46
- end
35
+ private
47
36
 
48
- self.mock_server_options_write(@options)
49
- response
37
+ def build_response
38
+ if record = match_request
39
+ return_record(record)
40
+ else
41
+ return_error
50
42
  end
43
+ end
51
44
 
52
- private
45
+ def return_record(record)
46
+ @options[:success_stack] << @request.path
47
+ @options[:matcher_exceptions].clear
48
+ response = record[:response]
49
+ [response[:status], response[:headers], [response[:body]]]
50
+ end
53
51
 
54
- def match_request
55
- request = Hashie::Mash.new hashified_request
52
+ def return_error
53
+ error = { @request.path => "Couldn't match #{@request.request_method} #{@request.path}" }
54
+ @options[:errors_stack] << error
55
+ [404, {}, ['RECORD NOT FOUND!']]
56
+ end
56
57
 
57
- # Filter out data records by path and method
58
- data = filter_records(request)
58
+ def match_request
59
+ request = Hashie::Mash.new hashified_request
59
60
 
60
- matchers = filter_matchers(request)
61
+ # Filter out data records by path and method
62
+ records = filter_records(request)
61
63
 
62
- data = false
63
- matchers.detect { |matcher|
64
- # Match the request with a record by validating against the matcher if any.
65
- data = @data.detect { |entry|
66
- recorded_request = Hashie::Mash.new entry[:request]
67
- recorded_response = entry[:response].dup
64
+ matchers = filter_matchers(request)
68
65
 
69
- recorded_response[:body] = JSON.parse(recorded_response[:body]) rescue recorded_response[:body]
70
- recorded_response = Hashie::Mash.new recorded_response
66
+ record = false
67
+ matchers.detect { |matcher|
68
+ # Match the request with a record by validating against the matcher if any.
69
+ record = records.detect { |entry|
70
+ recorded_request = Hashie::Mash.new entry[:request]
71
+ recorded_response = entry[:response].dup
71
72
 
72
- test_request_and_matcher(matcher, request, recorded_request, recorded_response)
73
- }
74
- }
75
- data
76
- end
73
+ recorded_response[:body] = JSON.parse(recorded_response[:body]) rescue recorded_response[:body]
74
+ recorded_response = Hashie::Mash.new recorded_response
77
75
 
78
- def filter_matchers(request)
79
- @options[:matchers].select { |match|
80
- request[:method].to_s.upcase == match[:method].to_s.upcase and request[:path] == match[:path]
76
+ test_request_and_matcher(matcher, request, recorded_request, recorded_response)
81
77
  }
82
- end
78
+ }
79
+ record
80
+ end
83
81
 
84
- def filter_records(request)
85
- @data.select { |record|
86
- record[:request][:path] == request[:path] and record[:request][:method] == request[:method]
87
- }
88
- end
82
+ def filter_matchers(request)
83
+ @options[:matchers].select { |match|
84
+ request[:method].to_s.upcase == match[:method].to_s.upcase and request[:path] == match[:path]
85
+ }
86
+ end
89
87
 
90
- def test_request_and_matcher(matcher, request, recorded_request, recorded_response)
91
- return true if matcher[:matcher].nil?
92
- begin
93
- matcher[:matcher].call(request, recorded_request, recorded_response) == true
94
- rescue => matcher_err
95
- store_matcher_exception(matcher_err)
96
- false
97
- end
98
- end
88
+ def filter_records(request)
89
+ @data.select { |record|
90
+ record[:request][:path] == request[:path] and record[:request][:method] == request[:method]
91
+ }
92
+ end
99
93
 
100
- def store_matcher_exception(exception)
101
- @options[:matcher_exceptions] << exception
94
+ def test_request_and_matcher(matcher, request, recorded_request, recorded_response)
95
+ return true if matcher[:matcher].nil?
96
+ begin
97
+ matcher[:matcher].call(request, recorded_request, recorded_response) == true
98
+ rescue => matcher_err
99
+ store_matcher_exception(matcher_err)
100
+ false
102
101
  end
102
+ end
103
103
 
104
- def load_data
105
- FileUtils.mkdir_p(@options[:path]) unless File.exists? @options[:path]
104
+ def store_matcher_exception(exception)
105
+ @options[:matcher_exceptions] << exception
106
+ end
106
107
 
107
- data = []
108
+ def load_data
109
+ FileUtils.mkdir_p(@options[:path]) unless File.exists? @options[:path]
108
110
 
109
- @options[:record_filenames].map do |filename|
110
- file_path = File.join( @options[:path], filename + '.yml' )
111
- content = File.open(file_path).read
112
- compiled = ERB.new(content).result
113
- parsed = YAML.load(compiled)
114
- data += parsed
115
- end
111
+ data = []
116
112
 
117
- data
113
+ @options[:record_filenames].map do |filename|
114
+ file_path = File.join( @options[:path], filename + '.yml' )
115
+ content = File.open(file_path).read
116
+ compiled = ERB.new(content).result
117
+ parsed = YAML.load(compiled)
118
+ data += parsed
118
119
  end
119
120
 
121
+ data
120
122
  end
121
123
  end
@@ -5,63 +5,59 @@ unless defined? MockServer::Store
5
5
  require 'mock_server/store/global'
6
6
  end
7
7
 
8
- module MockServer
9
- class Record
10
- include MockServer::Utils
11
- include MockServer::Store
8
+ class MockServer::Record
9
+ include MockServer::Utils
10
+ include MockServer::Store
12
11
 
13
- def initialize(app, opt = {})
14
- @app = app
15
- @options = mock_server_options_merge(opt)
16
- end
12
+ def initialize(app, opt = {})
13
+ @app = app
14
+ @options = mock_server_options_merge(opt)
15
+ end
17
16
 
18
- def call(env)
19
- @options = self.mock_server_options_read
17
+ def call(env)
18
+ @options = self.mock_server_options_read
20
19
 
21
- verbose(env) if @options[:verbose]
22
- return @app.call(env) unless @options[:routes] and
23
- lazy_match @options[:routes], env["PATH_INFO"]
20
+ verbose(env) if @options[:verbose]
21
+ return @app.call(env) unless matchable_request?(env)
24
22
 
25
- @request = Rack::Request.new(env)
26
- @data = load_data
23
+ @request = Rack::Request.new(env)
24
+ @data = load_data
27
25
 
28
- @app.call(env).tap do |status, header, response|
29
- record_response(status, header, response)
30
- self.mock_server_options_write(@options)
31
- response
32
- end
26
+ @app.call(env).tap do |status, header, response|
27
+ record_response(status, header, response)
28
+ self.mock_server_options_write(@options)
29
+ response
33
30
  end
34
-
35
- private
36
-
37
- def record_response(status, header, response)
38
- request = hashified_request
31
+ end
39
32
 
40
- @data << { :request => request, :response => hashify_response(status, header, response) }
41
- save_data(@data)
42
- end
33
+ private
43
34
 
44
- def records_path
45
- File.join( @options[:path], @options[:filename] + '.yml' )
46
- end
35
+ def record_response(status, header, response)
36
+ request = hashified_request
47
37
 
48
- def save_data(data)
49
- File.open(records_path, 'w') do |f|
50
- YAML.dump(data, f)
51
- end
38
+ @data << { :request => request, :response => hashify_response(status, header, response) }
39
+ save_data(@data)
40
+ end
41
+
42
+ def records_path
43
+ File.join( @options[:path], @options[:filename] + '.yml' )
44
+ end
45
+
46
+ def save_data(data)
47
+ File.open(records_path, 'w') do |f|
48
+ YAML.dump(data, f)
52
49
  end
50
+ end
53
51
 
54
- def load_data
55
- FileUtils.mkdir_p(@options[:path]) unless File.exists? @options[:path]
52
+ def load_data
53
+ FileUtils.mkdir_p(@options[:path]) unless File.exists? @options[:path]
56
54
 
57
- data = YAML.load_file(records_path) rescue []
55
+ data = YAML.load_file(records_path) rescue []
58
56
 
59
- if data.is_a? Array
60
- data
61
- else
62
- []
63
- end
57
+ if data.is_a? Array
58
+ data
59
+ else
60
+ []
64
61
  end
65
-
66
62
  end
67
63
  end
@@ -2,288 +2,300 @@ unless defined? MockServer::Store
2
2
  require 'mock_server/store/global'
3
3
  end
4
4
 
5
- module MockServer
6
- module Spec
7
- module Helpers
8
- include MockServer::Store
5
+ module MockServer::Spec
6
+ module Helpers
7
+ include MockServer::Store
9
8
 
9
+ # Public: Inspect mock server options
10
+ #
11
+ # Returns a String.
12
+ def mock_server_inspect
13
+ self.mock_server_options_read.inspect
14
+ end
10
15
 
11
- # Public: Inspect mock server options
12
- #
13
- # Returns a String.
14
- def mock_server_inspect
15
- mock_server_options.inspect
16
- end
16
+ # Public: Overwrite or initialize the list of fixtures
17
+ #
18
+ # *arguments - Filename...
19
+ #
20
+ # Examples
21
+ #
22
+ # mock_server_use_record(:users, :comments)
23
+ #
24
+ def mock_server_use_record(*arguments)
25
+ mock_server_options_set(:record_filenames, arguments)
26
+ end
17
27
 
18
- # Public: Overwrite or initialize the list of fixtures
19
- #
20
- # *arguments - Filename...
21
- #
22
- # Examples
23
- #
24
- # mock_server_use_record(:users, :comments)
25
- #
26
- def mock_server_use_record(*arguments)
27
- mock_server_options_set(:record_filenames, arguments)
28
- end
28
+ # Public: Add fixtures to the list of fixtures
29
+ #
30
+ # *arguments - Filename...
31
+ #
32
+ # Examples
33
+ #
34
+ # mock_server_add_record(:users, :comments)
35
+ #
36
+ def mock_server_add_record(*arguments)
37
+ config = (mock_server_options_fetch(:record_filenames, []) + arguments)
38
+ mock_server_options_set(:record_filenames, config)
39
+ end
29
40
 
30
- # Public: Add fixtures to the list of fixtures
31
- #
32
- # *arguments - Filename...
33
- #
34
- # Examples
35
- #
36
- # mock_server_add_record(:users, :comments)
37
- #
38
- def mock_server_add_record(*arguments)
39
- config = (mock_server_options_fetch(:record_filenames, []) + arguments)
40
- mock_server_options_set(:record_filenames, config)
41
- end
41
+ # Public: Set the path of fixtures files
42
+ #
43
+ # path - Sting of the fixtures path
44
+ #
45
+ # Examples
46
+ #
47
+ # mock_server_set_fixture_path('fixtures/records/')
48
+ #
49
+ def mock_server_set_fixture_path(path)
50
+ mock_server_options_set(:path, path)
51
+ end
42
52
 
43
- # Public: Set the path of fixtures files
44
- #
45
- # path - Sting of the fixtures path
46
- #
47
- # Examples
48
- #
49
- # mock_server_set_fixture_path('fixtures/records/')
50
- #
51
- def mock_server_set_fixture_path(path)
52
- mock_server_options_set(:path, path)
53
- end
53
+ # Public: Enabled MockServer on a given routes.
54
+ # Accept unix-directory like */** catch all.
55
+ #
56
+ # *arguments - Sting of the fixtures path
57
+ #
58
+ # Examples
59
+ #
60
+ # mock_server_enable_routes('/api/2/**', '/api/verify')
61
+ #
62
+ def mock_server_enable_routes(*paths)
63
+ routes = mock_server_options_fetch(:routes, []) + paths
64
+ mock_server_options_set(:routes, routes)
65
+ end
54
66
 
55
- # Public: Enabled MockServer on a given routes.
56
- # Accept unix-directory like */** catch all.
57
- #
58
- # *arguments - Sting of the fixtures path
59
- #
60
- # Examples
61
- #
62
- # mock_server_enable_routes('/api/2/**', '/api/verify')
63
- #
64
- def mock_server_enable_routes(*paths)
65
- routes = mock_server_options_fetch(:routes, []) + paths
66
- mock_server_options_set(:routes, routes)
67
- end
67
+ # Public: Disable MockServer on a given routes.
68
+ #
69
+ # *paths - Sting of the fixtures path
70
+ #
71
+ # Examples
72
+ #
73
+ # mock_server_disable_path('/api/2/**', '/api/verify')
74
+ #
75
+ def mock_server_disable_path(*paths)
76
+ routes = mock_server_options_fetch(:routes, []) - paths
77
+ mock_server_options_set(:routes, routes.flatten)
78
+ end
68
79
 
69
- # Public: Disable MockServer on a given routes.
70
- #
71
- # *paths - Sting of the fixtures path
72
- #
73
- # Examples
74
- #
75
- # mock_server_disable_path('/api/2/**', '/api/verify')
76
- #
77
- def mock_server_disable_path(*paths)
78
- routes = mock_server_options_fetch(:routes, []) - paths
79
- mock_server_options_set(:routes, routes.flatten)
80
- end
80
+ # Public: Disable all routes being server by MockServer
81
+ #
82
+ #
83
+ # Examples
84
+ #
85
+ # mock_server_disable_all_routes!
86
+ #
87
+ def mock_server_disable_all_routes!
88
+ mock_server_options_set(:routes, [])
89
+ end
81
90
 
82
- # Public: Disable all routes being server by MockServer
83
- #
84
- #
85
- # Examples
86
- #
87
- # mock_server_disable_all_routes!
88
- #
89
- def mock_server_disable_all_routes!
90
- mock_server_options_set(:routes, [])
91
- end
91
+ # Public: Register a matcher on a GET request for a given route.
92
+ #
93
+ # path - Relative HTTP path to match
94
+ # &block - Optional block for complex matching on the request
95
+ #
96
+ # Examples
97
+ #
98
+ # mock_server_get('/api/2/account')
99
+ #
100
+ # mock_server_get('/api/2/account') { |request, recorded_request| request.body == recorded_request.body }
101
+ #
102
+ def mock_server_get(path, &block)
103
+ mock_server_request :get, path, block
104
+ end
92
105
 
93
- # Public: Register a matcher on a GET request for a given route.
94
- #
95
- # path - Relative HTTP path to match
96
- # &block - Optional block for complex matching on the request
97
- #
98
- # Examples
99
- #
100
- # mock_server_get('/api/2/account')
101
- #
102
- # mock_server_get('/api/2/account') { |request, recorded_request| request.body == recorded_request.body }
103
- #
104
- def mock_server_get(path, &block)
105
- mock_server_request :get, path, block
106
- end
106
+ # Public: Register a matcher on a POST request for a given route.
107
+ #
108
+ # path - Relative HTTP path to match
109
+ # &block - Optional block for complex matching on the request
110
+ #
111
+ # Examples
112
+ #
113
+ # mock_server_post('/api/2/account')
114
+ #
115
+ # mock_server_post('/api/2/account') { |request, recorded_request| request.body == recorded_request.body }
116
+ #
117
+ def mock_server_post(path, &block)
118
+ mock_server_request :post, path, block
119
+ end
107
120
 
108
- # Public: Register a matcher on a POST request for a given route.
109
- #
110
- # path - Relative HTTP path to match
111
- # &block - Optional block for complex matching on the request
112
- #
113
- # Examples
114
- #
115
- # mock_server_post('/api/2/account')
116
- #
117
- # mock_server_post('/api/2/account') { |request, recorded_request| request.body == recorded_request.body }
118
- #
119
- def mock_server_post(path, &block)
120
- mock_server_request :post, path, block
121
- end
121
+ # Public: Register a matcher on a PUT request for a given route.
122
+ #
123
+ # path - Relative HTTP path to match
124
+ # &block - Optional block for complex matching on the request
125
+ #
126
+ # Examples
127
+ #
128
+ # mock_server_put('/api/2/account')
129
+ #
130
+ # mock_server_put('/api/2/account') { |request, recorded_request| request.body == recorded_request.body }
131
+ #
132
+ def mock_server_put(path, &block)
133
+ mock_server_request :put, path, block
134
+ end
122
135
 
123
- # Public: Register a matcher on a PUT request for a given route.
124
- #
125
- # path - Relative HTTP path to match
126
- # &block - Optional block for complex matching on the request
127
- #
128
- # Examples
129
- #
130
- # mock_server_put('/api/2/account')
131
- #
132
- # mock_server_put('/api/2/account') { |request, recorded_request| request.body == recorded_request.body }
133
- #
134
- def mock_server_put(path, &block)
135
- mock_server_request :put, path, block
136
- end
136
+ # Public: Register a matcher on a PATCH request for a given route.
137
+ #
138
+ # path - Relative HTTP path to match
139
+ # &block - Optional block for complex matching on the request
140
+ #
141
+ # Examples
142
+ #
143
+ # mock_server_patch('/api/2/account')
144
+ #
145
+ # mock_server_patch('/api/2/account') { |request, recorded_request| request.body == recorded_request.body }
146
+ #
147
+ def mock_server_patch(path, &block)
148
+ mock_server_request :patch, path, block
149
+ end
137
150
 
138
- # Public: Register a matcher on a DELETE request for a given route.
139
- #
140
- # path - Relative HTTP path to match
141
- # &block - Optional block for complex matching on the request
142
- #
143
- # Examples
144
- #
145
- # mock_server_delete('/api/2/account')
146
- #
147
- # mock_server_delete('/api/2/account') { |request, recorded_request| request.body == recorded_request.body }
148
- #
149
- def mock_server_delete(path, &block)
150
- mock_server_request :delete, path, block
151
- end
151
+ # Public: Register a matcher on a DELETE request for a given route.
152
+ #
153
+ # path - Relative HTTP path to match
154
+ # &block - Optional block for complex matching on the request
155
+ #
156
+ # Examples
157
+ #
158
+ # mock_server_delete('/api/2/account')
159
+ #
160
+ # mock_server_delete('/api/2/account') { |request, recorded_request| request.body == recorded_request.body }
161
+ #
162
+ def mock_server_delete(path, &block)
163
+ mock_server_request :delete, path, block
164
+ end
152
165
 
153
- # Public: Clear all the matchers
154
- #
155
- def mock_server_clear_matchers!
156
- mock_server_options_set(:matchers, [])
157
- end
166
+ # Public: Clear all the matchers
167
+ #
168
+ def mock_server_clear_matchers!
169
+ mock_server_options_set(:matchers, [])
170
+ end
158
171
 
159
- # Public: Retrive the MockServer request stack.
160
- #
161
- # Return array of request path.
162
- def mock_server_requests_stack
163
- mock_server_options_fetch(:requests_stack, [])
164
- end
172
+ # Public: Retrive the MockServer request stack.
173
+ #
174
+ # Return array of request path.
175
+ def mock_server_requests_stack
176
+ mock_server_options_fetch(:requests_stack, [])
177
+ end
165
178
 
166
- # Public: Clear the MockServer request stack.
167
- def mock_server_requests_stack_clear!
168
- mock_server_options_set(:requests_stack, [])
169
- end
179
+ # Public: Clear the MockServer request stack.
180
+ def mock_server_requests_stack_clear!
181
+ mock_server_options_set(:requests_stack, [])
182
+ end
170
183
 
171
- # Public: Retrive the MockServer request stack.
172
- #
173
- # Return array of request path.
174
- def mock_server_errors_stack
175
- mock_server_options_fetch(:errors_stack, [])
176
- end
184
+ # Public: Retrive the MockServer request stack.
185
+ #
186
+ # Return array of request path.
187
+ def mock_server_errors_stack
188
+ mock_server_options_fetch(:errors_stack, [])
189
+ end
177
190
 
178
- # Public: Retrive the MockServer errors request stack.
179
- # i.e.: path being register for being serve by MockServer, but
180
- # no suitable matcher was found to serve the request will be
181
- # added to the error stack
182
- #
183
- # Return array of errors.
184
- def mock_server_errors_stack_clear!
185
- mock_server_options_set(:errors_stack, [])
186
- end
191
+ # Public: Retrive the MockServer errors request stack.
192
+ # i.e.: path being register for being serve by MockServer, but
193
+ # no suitable matcher was found to serve the request will be
194
+ # added to the error stack
195
+ #
196
+ # Return array of errors.
197
+ def mock_server_errors_stack_clear!
198
+ mock_server_options_set(:errors_stack, [])
199
+ end
187
200
 
188
- # Public: Retrive the MockServer successful request stack.
189
- #
190
- # Return array of successful response stack.
191
- def mock_server_success_stack
192
- mock_server_options_fetch(:success_stack, [])
193
- end
201
+ # Public: Retrive the MockServer successful request stack.
202
+ #
203
+ # Return array of successful response stack.
204
+ def mock_server_success_stack
205
+ mock_server_options_fetch(:success_stack, [])
206
+ end
194
207
 
195
- # Public: Clear the MockServer successful request stack.
196
- def mock_server_success_stack_clear!
197
- mock_server_options_set(:success_stack, [])
198
- end
208
+ # Public: Clear the MockServer successful request stack.
209
+ def mock_server_success_stack_clear!
210
+ mock_server_options_set(:success_stack, [])
211
+ end
199
212
 
200
- # Public: Clear the MockServer response stack.
201
- #
202
- # alias:
203
- #
204
- # mock_server_requests_stack_clear!
205
- # mock_server_success_stack_clear!
206
- # mock_server_errors_stack_clear!
207
- #
208
- def mock_server_response_stack_clear!
209
- mock_server_requests_stack_clear!
210
- mock_server_success_stack_clear!
211
- mock_server_errors_stack_clear!
212
- end
213
+ # Public: Clear the MockServer response stack.
214
+ #
215
+ # alias:
216
+ #
217
+ # mock_server_requests_stack_clear!
218
+ # mock_server_success_stack_clear!
219
+ # mock_server_errors_stack_clear!
220
+ #
221
+ def mock_server_response_stack_clear!
222
+ mock_server_requests_stack_clear!
223
+ mock_server_success_stack_clear!
224
+ mock_server_errors_stack_clear!
225
+ end
213
226
 
214
- # Public: Clear the MockServer state.
215
- #
216
- # alias:
217
- #
218
- # mock_server_response_stack_clear!
219
- # mock_server_clear_matchers!
220
- # mock_server_disable_all_routes!
221
- #
222
- def mock_server_reset!
223
- mock_server_response_stack_clear!
224
- mock_server_clear_matchers!
225
- mock_server_disable_all_routes!
226
- end
227
+ # Public: Clear the MockServer state.
228
+ #
229
+ # alias:
230
+ #
231
+ # mock_server_response_stack_clear!
232
+ # mock_server_clear_matchers!
233
+ # mock_server_disable_all_routes!
234
+ #
235
+ def mock_server_reset!
236
+ mock_server_response_stack_clear!
237
+ mock_server_clear_matchers!
238
+ mock_server_disable_all_routes!
239
+ end
227
240
 
228
- # Public: Utility helper to reraise errors catch inside the matchers block
229
- #
230
- def mock_server_reraise_matcher_exceptions
231
- mock_server_options_fetch(:matcher_exceptions, []).each do |exception|
232
- raise exception
233
- end
241
+ # Public: Utility helper to reraise errors catch inside the matchers block
242
+ #
243
+ def mock_server_reraise_matcher_exceptions
244
+ mock_server_options_fetch(:matcher_exceptions, []).each do |exception|
245
+ raise exception
234
246
  end
247
+ end
235
248
 
236
- protected
249
+ protected
237
250
 
238
- # Internal: Register a matcher on a given route for playback
239
- #
240
- # method - HTTP verb to register
241
- # path - Relative HTTP path to match
242
- # matcher - Optional proc for complex matching on the request
243
- #
244
- # Examples
245
- #
246
- # mock_server_request(:get, '/api/2/account')
247
- #
248
- # mock_server_request(:get, '/api/2/account', lambda {|request, recorded_request| request.body == recorded_request.body } )
249
- #
250
- def mock_server_request(method, path, matcher)
251
- add_mock_server_matcher({ :method => method, :path => path, :matcher => matcher })
252
- end
253
-
254
- # Internal: Insert a matcher hash into the matchers array of the MockServer storage class.
255
- #
256
- def add_mock_server_matcher(matcher)
257
- options = self.mock_server_options_read
258
- options[:matchers].unshift(matcher)
259
- mock_server_options_write(options)
260
- end
251
+ # Internal: Register a matcher on a given route for playback
252
+ #
253
+ # method - HTTP verb to register
254
+ # path - Relative HTTP path to match
255
+ # matcher - Optional proc for complex matching on the request
256
+ #
257
+ # Examples
258
+ #
259
+ # mock_server_request(:get, '/api/2/account')
260
+ #
261
+ # mock_server_request(:get, '/api/2/account', lambda {|request, recorded_request| request.body == recorded_request.body } )
262
+ #
263
+ def mock_server_request(method, path, matcher)
264
+ add_mock_server_matcher({ :method => method, :path => path, :matcher => matcher })
265
+ end
261
266
 
262
- # Internal: Fetch key from the storage class
263
- #
264
- def mock_server_options_fetch(key, value)
265
- if self.mock_server_options_read[key]
266
- mock_server_options_get(key)
267
- else
268
- mock_server_options_set(key, value)
269
- end
270
- end
267
+ # Internal: Insert a matcher hash into the matchers array of the MockServer storage class.
268
+ #
269
+ def add_mock_server_matcher(matcher)
270
+ options = self.mock_server_options_read
271
+ options[:matchers].unshift(matcher)
272
+ mock_server_options_write(options)
273
+ end
271
274
 
272
- # Internal: Setter for the storage class
273
- #
274
- def mock_server_options_set(key, value)
275
- hash = self.mock_server_options_read
276
- hash[key] = value
277
- self.mock_server_options_write(hash)
275
+ # Internal: Fetch key from the storage class
276
+ #
277
+ def mock_server_options_fetch(key, value)
278
+ if self.mock_server_options_read[key]
279
+ mock_server_options_get(key)
280
+ else
281
+ mock_server_options_set(key, value)
278
282
  end
283
+ end
279
284
 
280
- # Internal: Getter for the storage class
281
- #
282
- def mock_server_options_get(key)
283
- hash = self.mock_server_options_read
284
- hash[key]
285
- end
285
+ # Internal: Setter for the storage class
286
+ #
287
+ def mock_server_options_set(key, value)
288
+ hash = self.mock_server_options_read
289
+ hash[key] = value
290
+ self.mock_server_options_write(hash)
291
+ end
286
292
 
293
+ # Internal: Getter for the storage class
294
+ #
295
+ def mock_server_options_get(key)
296
+ hash = self.mock_server_options_read
297
+ hash[key]
287
298
  end
299
+
288
300
  end
289
301
  end
@@ -1,33 +1,30 @@
1
1
  require 'hashie'
2
2
 
3
- module MockServer
4
- class State < Hashie::Dash
5
- property :path, :default => 'fixtures/records'
6
- property :filename, :default => 'record'
7
- property :routes, :default => []
8
- property :record_filenames, :default => []
9
- property :matchers, :default => []
10
- property :verbose, :default => false
11
- property :requests_stack, :default => []
12
- property :success_stack, :default => []
13
- property :errors_stack, :default => []
14
- property :requests_stack, :default => []
15
- property :matcher_exceptions, :default => []
3
+ class MockServer::State < Hashie::Dash
4
+ property :path, :default => 'fixtures/records'
5
+ property :filename, :default => 'record'
6
+ property :routes, :default => []
7
+ property :record_filenames, :default => []
8
+ property :matchers, :default => []
9
+ property :verbose, :default => false
10
+ property :requests_stack, :default => []
11
+ property :success_stack, :default => []
12
+ property :errors_stack, :default => []
13
+ property :requests_stack, :default => []
14
+ property :matcher_exceptions, :default => []
16
15
 
17
- def merge(hash)
18
- new_hash = self
19
- hash.each do |k,v|
20
- new_hash[k] = v
21
- end
22
- new_hash
16
+ def merge(hash)
17
+ new_hash = self
18
+ hash.each do |k,v|
19
+ new_hash[k] = v
23
20
  end
21
+ new_hash
22
+ end
24
23
 
25
- def merge!(hash)
26
- hash.each do |k,v|
27
- self[k] = v
28
- end
29
- self
24
+ def merge!(hash)
25
+ hash.each do |k,v|
26
+ self[k] = v
30
27
  end
31
-
28
+ self
32
29
  end
33
30
  end
@@ -1,22 +1,18 @@
1
1
  require 'hashie'
2
2
 
3
- module MockServer
4
- module Store
5
-
6
- def mock_server_options_merge(opt = {})
7
- $mock_server_options ||= MockServer::State.new(opt)
8
- $mock_server_options.merge!(opt)
9
- end
10
-
11
- def mock_server_options_read
12
- $mock_server_options ||= MockServer::State.new
13
- $mock_server_options
14
- end
3
+ module MockServer::Store
4
+ def mock_server_options_merge(opt = {})
5
+ $mock_server_options ||= MockServer::State.new(opt)
6
+ $mock_server_options.merge!(opt)
7
+ end
15
8
 
16
- def mock_server_options_write(value)
17
- $mock_server_options ||= MockServer::State.new
18
- $mock_server_options = value
19
- end
9
+ def mock_server_options_read
10
+ $mock_server_options ||= MockServer::State.new
11
+ $mock_server_options
12
+ end
20
13
 
14
+ def mock_server_options_write(value)
15
+ $mock_server_options ||= MockServer::State.new
16
+ $mock_server_options = value
21
17
  end
22
18
  end
@@ -1,59 +1,60 @@
1
1
  require 'yaml'
2
2
  require 'json'
3
3
 
4
- module MockServer
5
- module Utils
6
-
7
- private
8
-
9
- def verbose(env)
10
- interception = lazy_match(@options[:routes], env["PATH_INFO"]) ? "intercepted!" : "NOT intercepted."
11
- puts %([MockServer] #{env["PATH_INFO"]} was #{interception}"\n)
12
- end
13
-
14
- def lazy_match(strings, path)
15
- regexps = strings.map { |str|
16
- escaped = Regexp.escape(str)
17
- escaped.gsub!('\\*\\*', '[\w|.|\-|\/]+')
18
- escaped.gsub!('\\*', '[\w|.|\-]+')
19
- Regexp.new("^#{escaped}$")
20
- }
21
-
22
- regexps.any? { |regex| regex.match(path) }
23
- end
24
-
25
- def hashified_request
26
- #rewind to ensure we read from the start
27
- @request.body.rewind
28
-
29
- #read body
30
- body = @request.body.read
31
-
32
- #rewind in case upstream expects it rewound
33
- @request.body.rewind
34
-
35
- json = JSON.parse(body) rescue body
36
-
37
- {
38
- :method => @request.request_method,
39
- :path => @request.path,
40
- :query => @request.query_string,
41
- :body => json
42
- }
43
- end
44
-
45
- def hashify_response(status, header, response)
46
- {
47
- :method => @request.request_method,
48
- :path => @request.path,
49
- :status => status,
50
- :headers => header,
51
- :body => if response.respond_to? :body
52
- response.body
53
- else
54
- response.join
55
- end
56
- }
57
- end
4
+ module MockServer::Utils
5
+ private
6
+
7
+ def verbose(env)
8
+ interception = lazy_match(@options[:routes], env["PATH_INFO"]) ? "intercepted!" : "NOT intercepted."
9
+ puts %([MockServer] #{env["PATH_INFO"]} was #{interception}"\n)
10
+ end
11
+
12
+ def matchable_request?(env)
13
+ @options[:routes] and lazy_match @options[:routes], env["PATH_INFO"]
14
+ end
15
+
16
+ def lazy_match(strings, path)
17
+ regexps = strings.map { |str|
18
+ escaped = Regexp.escape(str)
19
+ escaped.gsub!('\\*\\*', '[\w|.|\-|\/]+')
20
+ escaped.gsub!('\\*', '[\w|.|\-]+')
21
+ Regexp.new("^#{escaped}$")
22
+ }
23
+
24
+ regexps.any? { |regex| regex.match(path) }
25
+ end
26
+
27
+ def hashified_request
28
+ #rewind to ensure we read from the start
29
+ @request.body.rewind
30
+
31
+ #read body
32
+ body = @request.body.read
33
+
34
+ #rewind in case upstream expects it rewound
35
+ @request.body.rewind
36
+
37
+ json = JSON.parse(body) rescue body
38
+
39
+ {
40
+ :method => @request.request_method,
41
+ :path => @request.path,
42
+ :query => @request.query_string,
43
+ :body => json
44
+ }
45
+ end
46
+
47
+ def hashify_response(status, header, response)
48
+ {
49
+ :method => @request.request_method,
50
+ :path => @request.path,
51
+ :status => status,
52
+ :headers => header,
53
+ :body => if response.respond_to? :body
54
+ response.body
55
+ else
56
+ response.join
57
+ end
58
+ }
58
59
  end
59
60
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mock_server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: