mirage 1.3.6 → 2.0.0.alpha1

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.
Files changed (36) hide show
  1. data/Gemfile +7 -4
  2. data/VERSION +1 -1
  3. data/bin/mirage +2 -0
  4. data/features/client/clear.feature +38 -20
  5. data/features/client/peek.feature +11 -11
  6. data/features/client/save_and_revert.feature +14 -8
  7. data/features/client/set.feature +59 -13
  8. data/features/client/track.feature +5 -3
  9. data/features/server/clear.feature +59 -47
  10. data/features/server/logging.feature +2 -3
  11. data/features/server/peek.feature +12 -10
  12. data/features/server/prime.feature +15 -13
  13. data/features/server/response_templates.feature +9 -16
  14. data/features/server/save_and_revert.feature +11 -14
  15. data/features/server/set.feature +44 -17
  16. data/features/server/set_default_response.feature +19 -25
  17. data/features/server/set_with_a_delay.feature +3 -5
  18. data/features/server/set_with_a_pattern.feature +24 -29
  19. data/features/server/track_requests.feature +71 -0
  20. data/features/server/web_user_interface.feature +7 -8
  21. data/features/step_definitions/my_steps.rb +83 -28
  22. data/features/support/env.rb +0 -14
  23. data/lib/mirage.rb +3 -0
  24. data/lib/mirage/client.rb +48 -43
  25. data/lib/mirage/core.rb +65 -152
  26. data/lib/mirage/mock_response.rb +49 -0
  27. data/lib/mirage/mock_responses_collection.rb +109 -0
  28. data/lib/mirage/object.rb +5 -0
  29. data/lib/mirage/web.rb +37 -28
  30. data/lib/start_mirage.rb +27 -5
  31. data/lib/{view/mirage/index.xhtml → views/index.erb} +5 -5
  32. data/mirage.gemspec +7 -7
  33. metadata +57 -23
  34. data/features/client/get.feature +0 -46
  35. data/features/server/file_responses.feature +0 -8
  36. data/features/server/track.feature +0 -74
@@ -2,15 +2,14 @@ Feature: Mirage's home page allows you to see what response are currently being
2
2
  From this page you can:
3
3
  - Peek at a responses content
4
4
  - Track the response to see if a request has been made to it
5
-
6
- #TODO tests needed for displaying pattern and delay values
5
+
6
+ #TODO tests needed for displaying pattern and delay values and http method
7
7
 
8
8
  Background: There are already a couple of responses hosted on he Mirage server
9
- Given I hit 'http://localhost:7001/mirage/set/greeting' with parameters:
10
- | response | hello |
11
- | default | true |
12
- And I hit 'http://localhost:7001/mirage/set/leaving' with parameters:
13
- | response | goodbye |
9
+ Given I send PUT to 'http://localhost:7001/mirage/templates/greeting' with body 'hello' and headers:
10
+ | X-mirage-default | true |
11
+ | X-mirage-method | POST |
12
+ And I send PUT to 'http://localhost:7001/mirage/templates/leaving' with body 'goodbye'
14
13
 
15
14
  Scenario: Using the home page to see what response are being hosted
16
15
  Given I goto 'http://localhost:7001/mirage'
@@ -23,7 +22,7 @@ Feature: Mirage's home page allows you to see what response are currently being
23
22
  Then I should see 'hello'
24
23
 
25
24
  Scenario: Using the home page to track if a request has been made
26
- Given I hit 'http://localhost:7001/mirage/get/greeting' with request body:
25
+ Given I send POST to 'http://localhost:7001/mirage/responses/greeting' with request entity
27
26
  """
28
27
  Yo!
29
28
  """
@@ -6,18 +6,16 @@ After('@command_line') do
6
6
  stop_mirage
7
7
  end
8
8
 
9
- Then /^'(.*?)' should be returned$/ do |expected_response|
9
+ Then /^'([^']*)' should be returned$/ do |expected_response|
10
10
  response_text = @response.body
11
- if ["1.8.6", "1.8.7"].include?(RUBY_VERSION) && response_text != expected_response
12
- expected_response.length.should == response_text.length
11
+ if response_text != expected_response
13
12
  expected_response.split('&').each { |param_value_pair| response_text.should =~ /#{param_value_pair}/ }
14
- else
15
- response_text.should == expected_response
13
+ expected_response.length.should == response_text.length
16
14
  end
17
15
  end
18
16
 
19
- Then /^a (404|500) should be returned$/ do |error_code|
20
- @response.code.should == error_code.to_i
17
+ Then /^a (200|404|500) should be returned$/ do |error_code|
18
+ @response.code.to_i.should == error_code.to_i
21
19
  end
22
20
 
23
21
  Then /^it should take at least '(.*)' seconds$/ do |time|
@@ -25,12 +23,6 @@ Then /^it should take at least '(.*)' seconds$/ do |time|
25
23
  end
26
24
 
27
25
 
28
- Then /^the response should be a file the same as '([^']*)'$/ do |file_path|
29
- download_path = "#{SCRATCH}/temp.download"
30
- @response.save_as(download_path)
31
- FileUtils.cmp(download_path, file_path).should == true
32
- end
33
-
34
26
  Then /^mirage should be running on '(.*)'$/ do |url|
35
27
  get(url).code.to_i.should == 200
36
28
  end
@@ -49,13 +41,11 @@ Given /^Mirage (is|is not) running$/ do |running|
49
41
  end
50
42
 
51
43
  Then /^Connection should be refused to '(.*)'$/ do |url|
52
-
53
44
  begin
54
45
  get(url)
55
46
  fail "Mirage is still running"
56
47
  rescue Errno::ECONNREFUSED
57
48
  end
58
-
59
49
  end
60
50
 
61
51
  Given /^the file '(.*)' contains:$/ do |file_path, content|
@@ -74,7 +64,7 @@ Then /^the usage information should be displayed$/ do
74
64
  end
75
65
  Given /^usage information:$/ do |table|
76
66
  @usage = table.raw.flatten.collect { |line| normalise(line) }
77
- end
67
+ end
78
68
 
79
69
  Then /^I run$/ do |text|
80
70
  text.gsub!("\"", "\\\\\"")
@@ -85,24 +75,51 @@ Given /^the following gems are required to run the Mirage client test code:$/ do
85
75
  @code_snippet = text.gsub("\"", "\\\\\"")
86
76
  end
87
77
 
88
- When /^I hit '(http:\/\/localhost:7001\/mirage\/(.*?))'$/ do |url, response_id|
89
- @response = hit_mirage(url)
78
+ When /^I send (POST|PUT) to '(http:\/\/localhost:7001\/mirage\/(.*?))' with request entity$/ do |method, url, endpoint, entity|
79
+
80
+ @response = case method
81
+ when 'POST'
82
+ then
83
+ post(url, entity)
84
+ when 'PUT'
85
+ then
86
+ put(url, entity)
87
+ end
90
88
  end
91
89
 
92
- When /^I (hit|get|post to) '(http:\/\/localhost:7001\/mirage\/(.*?))' with parameters:$/ do |http_method, url, endpoint, table|
90
+ When /^I send (GET|PUT|POST|OPTIONS|HEAD|DELETE) to '(http:\/\/localhost:7001\/mirage([^']*))'$/ do |method, url, endpoint|
91
+ start_time = Time.now
92
+ @response = case method
93
+ when 'GET' then
94
+ get(url)
95
+ when 'PUT' then
96
+ put(url, '')
97
+ when 'POST' then
98
+ post(url, '')
99
+ when 'HEAD' then
100
+ head(url)
101
+ when 'OPTIONS' then
102
+ options(url)
103
+ when 'DELETE' then
104
+ delete(url)
105
+ end
106
+ @response_time = Time.now - start_time
107
+ end
93
108
 
94
- parameters = {}
95
- table.raw.each do |row|
96
- parameter, value = row[0].to_sym, row[1]
97
- value = File.exists?(value) ? File.open(value, 'rb') : value
98
- parameters[parameter]=value
99
- end
100
109
 
101
- @response = hit_mirage(url, parameters)
110
+ When /^I send PUT to '(http:\/\/localhost:7001\/mirage\/([^']*))' with body '([^']*)'$/ do |url, endpoint, body|
111
+ start_time = Time.now
112
+ @response = put(url, body)
113
+ @response_time = Time.now - start_time
102
114
  end
103
115
 
104
- When /^I hit '(http:\/\/localhost:7001\/mirage\/(.*?))' with request body:$/ do |url, endpoint, request_body|
105
- @response = hit_mirage(url, {:body => request_body})
116
+ When /^I send PUT to '(http:\/\/localhost:7001\/mirage\/([^']*))' with body '([^']*)' and headers:$/ do |url, endpoint, body, table|
117
+ headers = {}
118
+ table.raw.each do |row|
119
+ parameter, value = row[0], row[1]
120
+ headers[parameter]=value
121
+ end
122
+ @response = put(url, body, headers)
106
123
  end
107
124
 
108
125
  Then /^I should see '(.*?)' on the command line$/ do |content|
@@ -128,4 +145,42 @@ end
128
145
 
129
146
  When /^I click '(.*)'$/ do |thing|
130
147
  @page = @page.links.find { |link| link.attributes['id'] == thing }.click
148
+ end
149
+
150
+ When /^I send (GET|POST) to '(http:\/\/localhost:7001\/mirage\/(.*?))' with parameters:$/ do |http_method, url, endpoint, table|
151
+
152
+ parameters = {}
153
+ table.raw.each do |row|
154
+ parameter, value = row[0].to_sym, row[1]
155
+ value = File.exists?(value) ? File.open(value, 'rb') : value
156
+ parameters[parameter]=value
157
+ end
158
+
159
+ @response = case http_method
160
+ when 'POST' then
161
+ post(url, parameters)
162
+ when 'GET' then
163
+ get(url, parameters)
164
+ end
165
+ end
166
+
167
+ Then /^the following should be returned:$/ do |text|
168
+ @response.body.should == text
169
+ end
170
+
171
+ Given /^I send PUT to '(http:\/\/localhost:7001\/mirage\/(.*?))' with file: ([^']*) and headers:$/ do |url, endpoint, path, table|
172
+ headers = {}
173
+ table.raw.each do |row|
174
+ parameter, value = row[0], row[1]
175
+ headers[parameter]=value
176
+ end
177
+ put(url, File.new(path), headers)
178
+ end
179
+
180
+ When /^the response '([^']*)' should be '([^']*)'$/ do |header, value|
181
+ @response.response[header].should include(value)
182
+ end
183
+
184
+ Then /^the response should be the same as the content of '([^']*)'$/ do |path|
185
+ @response.body.should == File.read(path)
131
186
  end
@@ -48,20 +48,6 @@ end
48
48
  module Web
49
49
  include Mirage::Web
50
50
 
51
- def get(url)
52
- browser = Mechanize.new
53
- browser.keep_alive= false
54
- browser.get(url)
55
- end
56
-
57
- def hit_mirage(url, parameters={})
58
- start_time = Time.now
59
- file = parameters.values.find { |value| value.is_a?(File) }
60
- response = (file ? http_post(url, parameters) : http_get(url, parameters))
61
- @response_time = Time.now - start_time
62
- response
63
- end
64
-
65
51
  def normalise text
66
52
  text.gsub(/[\n]/, ' ').gsub(/\s+/, ' ')
67
53
  end
@@ -1,5 +1,8 @@
1
+ require 'mirage/object'
1
2
  require 'mirage/web'
2
3
  require 'mirage/util'
4
+ require 'mirage/mock_response'
5
+ require 'mirage/mock_responses_collection'
3
6
  require 'mirage/core'
4
7
  require 'mirage/client'
5
8
 
@@ -1,5 +1,4 @@
1
1
  require 'uri'
2
- require 'mechanize'
3
2
  require 'open-uri'
4
3
  require 'mirage/web'
5
4
 
@@ -13,6 +12,12 @@ module Mirage
13
12
  @code = message, code
14
13
  end
15
14
  end
15
+
16
+ class Response
17
+
18
+ attr_accessor :method, :pattern, :content_type
19
+
20
+ end
16
21
 
17
22
  class InternalServerException < MirageError;
18
23
  end
@@ -32,24 +37,6 @@ module Mirage
32
37
  @url = url
33
38
  end
34
39
 
35
- # Get a response at the given endpoint
36
- # Mirage::Client.get(endpoint) => response as a string
37
- # If a response is not found a ResponseNotFound exception is thrown
38
- #
39
- # Examples:
40
- # Getting a response without any parameters or body content
41
- # Mirage::Client.get(endpoint)
42
- #
43
- # Getting a response, passing request parameters
44
- # Mirage::Client.new.get('greeting', :param1 => 'value1', param2=>'value2')
45
- #
46
- # Getting a response, passing a content in the body of the request
47
- # Mirage::Client.new.get('greeting', 'content')
48
-
49
- def get endpoint, body_or_params={}
50
- body_or_params = {:body => body_or_params} if body_or_params.is_a?(String)
51
- response(http_get("#{@url}/get/#{endpoint}", body_or_params))
52
- end
53
40
 
54
41
  # Set a text or file based response, to be hosted at a given end point optionally with a given pattern and delay
55
42
  # Client.set(endpoint, response, params) => unique id that can be used to call back to the server
@@ -59,16 +46,31 @@ module Mirage
59
46
  # Client.set('greeting', 'hello', :pattern => /regexp/)
60
47
  # Client.set('greeting', 'hello', :pattern => 'text')
61
48
  # Client.set('greeting', 'hello', :delay => 5) # number of seconds
62
- def set endpoint, response, params={}
63
- params[:response] = response.is_a?(File) ? File.open(response.path, 'rb') : response
64
- params[:pattern] = params[:pattern].source if params[:pattern].is_a?(Regexp)
65
- response(http_post("#{@url}/set/#{endpoint}", params))
49
+ def set endpoint, response_value, params={}
50
+ response = Response.new
51
+
52
+ yield response if block_given?
53
+
54
+ headers = {}
55
+ headers['X-mirage-method'] = response.method.to_s if response.method
56
+
57
+ headers['X-mirage-pattern'] = response.pattern if response.pattern
58
+ headers['Content-Type'] = response.content_type || 'text/plain'
59
+
60
+ response(put("#{@url}/templates/#{endpoint}",response_value, headers))
66
61
  end
67
62
 
68
63
  # Use to look at what a response contains without actually triggering it.
69
64
  # Client.peek(response_id) => response held on the server as a String
70
65
  def peek response_id
71
- response(http_get("#{@url}/peek/#{response_id}"))
66
+ response = response(get("#{@url}/templates/#{response_id}"))
67
+ case response
68
+ when String then
69
+ return response
70
+ when Mirage::Web::FileResponse then
71
+ return response.response.body
72
+ end
73
+
72
74
  end
73
75
 
74
76
  # Clear Content from Mirage
@@ -81,19 +83,19 @@ module Mirage
81
83
  # Client.new.clear(:requests) # Clear all tracked request information
82
84
  # Client.new.clear(:request => response_id) # Clear the tracked request for a given response id
83
85
  def clear thing=nil
86
+
84
87
  case thing
85
- when NilClass then
86
- http_get("#{@url}/clear")
87
- when Fixnum then
88
- http_get("#{@url}/clear/#{thing}")
89
- when :requests then
90
- http_get("#{@url}/clear/requests")
88
+ when :requests
89
+ delete("#{@url}/requests")
90
+ when Numeric then
91
+ delete("#{@url}/templates/#{thing}")
91
92
  when Hash then
92
- case thing.keys.first
93
- when :request then
94
- http_get("#{@url}/clear/request/#{thing.values.first}")
95
- end
93
+ puts "deleteing request #{thing[:request]}"
94
+ delete("#{@url}/requests/#{thing[:request]}") if thing[:request]
95
+ else NilClass
96
+ delete("#{@url}/templates")
96
97
  end
98
+
97
99
  end
98
100
 
99
101
 
@@ -103,40 +105,43 @@ module Mirage
103
105
  # Example:
104
106
  # Client.new.track(response_id) => Tracked request as a String
105
107
  def track response_id
106
- response(http_get("#{@url}/track/#{response_id}"))
108
+ response(get("#{@url}/requests/#{response_id}"))
107
109
  end
108
110
 
109
111
  # Save the state of the Mirage server so that it can be reverted back to that exact state at a later time.
110
112
  def save
111
- http_post("#{@url}/save").code == 200
113
+ put("#{@url}/backup",'').code == 200
112
114
  end
113
115
 
114
116
 
115
117
  # Revert the state of Mirage back to the state that was last saved
116
118
  # If there is no snapshot to rollback to, nothing happens
117
119
  def revert
118
- http_post("#{@url}/revert").code == 200
120
+ put("#{@url}",'').code == 200
119
121
  end
120
122
 
121
123
 
122
124
  # Check to see if Mirage is up and running
123
125
  def running?
124
- !http_get(@url).is_a?(Errno::ECONNREFUSED)
126
+ begin
127
+ get(@url) and return true
128
+ rescue Errno::ECONNREFUSED
129
+ return false
130
+ end
125
131
  end
126
132
 
127
133
  # Clear down the Mirage Server and load any defaults that are in Mirages default responses directory.
128
134
  def prime
129
- response(http_post("#{@url}/prime"))
135
+ response(put("#{@url}/defaults",''))
130
136
  end
131
137
 
132
138
  private
133
139
  def response response
134
- return Mirage::Web::FileResponse.new(response) if response.instance_of?(Mechanize::File)
135
- case response.code
140
+ case response.code.to_i
136
141
  when 500 then
137
- raise ::Mirage::InternalServerException.new(response.page.body, response.code)
142
+ raise ::Mirage::InternalServerException.new(response.body, response.code.to_i)
138
143
  when 404 then
139
- raise ::Mirage::ResponseNotFound.new(response.page.body, response.code)
144
+ raise ::Mirage::ResponseNotFound.new(response.body, response.code.to_i)
140
145
  else
141
146
  response.body
142
147
  end
@@ -1,207 +1,120 @@
1
- require 'ramaze'
2
- require 'ramaze/helper/send_file'
1
+ require 'sinatra/base'
2
+ require 'sinatra/reloader'
3
3
 
4
- class Object
5
- def deep_clone
6
- Marshal.load(Marshal.dump(self))
7
- end
8
- end
9
4
 
10
5
  module Mirage
11
6
 
12
- class MockResponse
13
- @@id_count = 0
14
- attr_reader :response_id, :delay, :name, :pattern
15
- attr_accessor :response_id
7
+ class MirageServer < Sinatra::Base
16
8
 
17
- def initialize name, value, pattern=nil, delay=0, default=false
18
- @name, @value, @pattern, @response_id, @delay, @default = name, value, pattern, @@id_count+=1, delay, default
19
- end
9
+ REQUESTS= {}
20
10
 
21
- def self.reset_count
22
- @@id_count = 0
23
- end
11
+ MOCK_RESPONSES = MockResponsesCollection.new
24
12
 
25
- def default?
26
- @default
27
- end
13
+ put '/mirage/templates/*' do |name|
14
+ response = request.body.read
28
15
 
29
- def file?
30
- !@value.is_a?(String)
31
- end
16
+ headers = request.env
17
+ http_method = headers['HTTP_X_MIRAGE_METHOD'] || 'GET'
32
18
 
19
+ pattern = headers['HTTP_X_MIRAGE_PATTERN'] ? /#{headers['HTTP_X_MIRAGE_PATTERN']}/ : :basic
33
20
 
34
- def value(body='', request_parameters={}, query_string='')
35
- return @value if file?
36
-
37
- value = @value
38
- value.scan(/\$\{([^\}]*)\}/).flatten.each do |pattern|
21
+ MOCK_RESPONSES << MockResponse.new(name, response, headers['CONTENT_TYPE'], http_method, pattern, headers['HTTP_X_MIRAGE_DELAY'].to_f, headers['HTTP_X_MIRAGE_DEFAULT'], headers['HTTP_X_MIRAGE_FILE'])
22
+ end
39
23
 
40
- if (parameter_match = request_parameters[pattern])
41
- value = value.gsub("${#{pattern}}", parameter_match)
42
- end
24
+ ['get', 'post', 'delete', 'put'].each do |http_method|
25
+ send(http_method, '/mirage/responses/*') do |name|
26
+ body, query_string = Rack::Utils.unescape(request.body.read.to_s), request.env['QUERY_STRING']
27
+ record = MOCK_RESPONSES.get_response(name, http_method.upcase, body, query_string)
43
28
 
44
- [body, query_string].each do |string|
45
- if (string_match = find_match(string, pattern))
46
- value = value.gsub("${#{pattern}}", string_match)
47
- end
48
- end
29
+ return 404 unless record
30
+ REQUESTS[record.response_id] = body.empty? ? query_string : body
49
31
 
32
+ sleep record.delay
33
+ send_response(record, body, request, query_string)
50
34
  end
51
- value
52
35
  end
53
36
 
54
- private
55
- def find_match(string, regex)
56
- string.scan(/#{regex}/).flatten.first
37
+ delete '/mirage/templates/:id' do
38
+ response_id = params[:id].to_i
39
+ MOCK_RESPONSES.delete(response_id)
40
+ REQUESTS.delete(response_id)
57
41
  end
58
- end
59
-
60
-
61
- class MirageServer < Ramaze::Controller
62
- include Ramaze::Helper::SendFile
63
- map '/mirage'
64
- RESPONSES, REQUESTS, SNAPSHOT= {}, {}, {}
65
-
66
- def index
67
- @responses = {}
68
42
 
69
- RESPONSES.each do |name, responses|
70
- responses.each do |pattern, response|
71
- pattern = pattern.is_a?(Regexp) ? "pattern = #{pattern.source}" : ''
72
- delay = response.delay > 0 ? "delay = #{response.delay}" : ''
73
- pattern << ' ,' unless pattern.empty? || delay.empty?
74
- @responses["#{name}#{'/*' if response.default?}: #{pattern} #{delay}"] = response
75
- end
76
- end
43
+ delete '/mirage/requests' do
44
+ REQUESTS.clear
77
45
  end
78
46
 
79
- def peek response_id
80
- peeked_response = nil
81
- RESPONSES.values.each do |responses|
82
- peeked_response = responses.values.find { |response| response.response_id == response_id.to_i }
83
- break unless peeked_response.nil?
84
- end
85
- respond("Can not peek reponse, id:#{response_id} does not exist}", 404) unless peeked_response
86
- send_response(peeked_response)
47
+ delete '/mirage/requests/:id' do
48
+ REQUESTS.delete(params[:id].to_i)
87
49
  end
88
50
 
89
- def set *args
90
- delay = (request['delay']||0)
91
- pattern = request['pattern'] ? /#{request['pattern']}/ : :basic
92
- name = args.join('/')
93
- is_default = request['default'] == 'true'
94
-
95
- response = MockResponse.new(name, response_value, pattern, delay.to_f, is_default)
96
51
 
97
- stored_responses = RESPONSES[name]||={}
98
-
99
- old_response = stored_responses.delete(pattern)
100
- stored_responses[pattern] = response
101
-
102
- # Right not an the main id count goes up by one even if the id is not used because the old id is reused from another response
103
- response.response_id = old_response.response_id if old_response
104
- response.response_id
52
+ delete '/mirage/templates' do
53
+ [REQUESTS].each { |map| map.clear }
54
+ MOCK_RESPONSES.clear
55
+ MockResponse.reset_count
105
56
  end
106
57
 
107
- def get *args
108
- body, query_string = Rack::Utils.unescape(request.body.read.to_s), request.env['QUERY_STRING']
109
- name = args.join('/')
110
- stored_responses = RESPONSES[name]
111
-
112
- if stored_responses
113
- record = find_response(body, query_string, stored_responses)
114
- else
115
- default_responses, record = find_default_responses(name), nil
58
+ get '/mirage/templates/:id' do
59
+ response = MOCK_RESPONSES.find(params[:id].to_i)
60
+ return 404 if response.is_a? Array
61
+ send_response(response)
62
+ end
116
63
 
117
- until record || default_responses.empty?
118
- record = find_response(body, query_string, default_responses.delete_at(0))
119
- record = record.default? ? record : nil
120
- end
121
- end
64
+ get '/mirage/requests/:id' do
65
+ REQUESTS[params[:id].to_i] || 404
66
+ end
122
67
 
123
- respond('Response not found', 404) unless record
124
- REQUESTS[record.response_id] = body.empty? ? query_string : body
125
68
 
126
- sleep record.delay
127
- send_response(record, body, request, query_string)
128
- end
69
+ get '/mirage' do
70
+ @responses = {}
129
71
 
130
- def clear datatype=nil, response_id=nil
131
- response_id = response_id.to_i
132
- case datatype
133
- when 'requests' then
134
- REQUESTS.clear
135
- when 'responses' then
136
- RESPONSES.clear and REQUESTS.clear and MockResponse.reset_count
137
- when /\d+/ then
138
- response_id = datatype.to_i
139
- delete_response(response_id)
140
- REQUESTS.delete(response_id)
141
- when 'request'
142
- REQUESTS.delete(response_id)
143
- when nil
144
- [REQUESTS, RESPONSES].each { |map| map.clear }
145
- MockResponse.reset_count
72
+ MOCK_RESPONSES.all.each do |response|
73
+ pattern = response.pattern.is_a?(Regexp) ? "pattern = #{response.pattern.source}" : ''
74
+ delay = response.delay > 0 ? "delay = #{response.delay}" : ''
75
+ pattern << ' ,' unless pattern.empty? || delay.empty?
76
+ @responses["#{response.name}#{'/*' if response.default?}: #{pattern} #{delay}"] = response
146
77
  end
78
+ erb :index
147
79
  end
148
80
 
149
- def track id
150
- REQUESTS[id.to_i] || respond("Nothing stored for: #{id}", 404)
81
+ error do
82
+ erb request.env['sinatra.error'].message
151
83
  end
152
84
 
153
- def save
154
- SNAPSHOT.clear and SNAPSHOT.replace(RESPONSES.deep_clone)
155
- end
156
-
157
- def revert
158
- RESPONSES.clear and RESPONSES.replace(SNAPSHOT.deep_clone)
159
- end
85
+ put '/mirage/defaults' do
86
+ MOCK_RESPONSES.clear
160
87
 
161
- def prime
162
- clear
163
88
  Dir["#{DEFAULT_RESPONSES_DIR}/**/*.rb"].each do |default|
164
89
  begin
165
90
  load default
166
91
  rescue Exception
167
- respond("Unable to load default responses from: #{default}", 500)
92
+ raise "Unable to load default responses from: #{default}"
168
93
  end
169
94
 
170
95
  end
171
96
  end
172
-
173
- private
174
- def find_response(body, query_string, stored_responses)
175
- pattern_match = stored_responses.keys.find_all { |pattern| pattern != :basic }.find { |pattern| body =~ pattern || query_string =~ pattern }
176
- record = pattern_match ? stored_responses[pattern_match] : stored_responses[:basic]
177
- record
97
+ #
98
+ put '/mirage/backup' do
99
+ MOCK_RESPONSES.backup
178
100
  end
179
101
 
180
- def response_value
181
- return request['response'] unless request['response'].nil?
182
- respond('response or file parameter required', 500)
183
- end
184
102
 
185
- def find_default_responses(name)
186
- matches = RESPONSES.keys.find_all { |key| name.index(key) == 0 }.sort { |a, b| b.length <=> a.length }
187
- matches.collect { |key| RESPONSES[key] }
103
+ put '/mirage' do
104
+ MOCK_RESPONSES.revert
188
105
  end
189
106
 
190
- def delete_response(response_id)
191
- RESPONSES.values.each do |response_set|
192
- response_set.each { |key, response| response_set.delete(key) if response.response_id == response_id }
107
+
108
+ helpers do
109
+
110
+ def response_value
111
+ return request['response'] unless request['response'].nil?
193
112
  end
194
- end
195
113
 
196
- def send_response(response, body='', request={}, query_string='')
197
- if response.file?
198
- tempfile, filename, type = response.value.values_at(:tempfile, :filename, :type)
199
- tempfile.binmode
200
- send_file(tempfile.path, type, "Content-Length: #{tempfile.size}; Content-Disposition: attachment; filename=#{filename}")
201
- else
114
+ def send_response(response, body='', request={}, query_string='')
115
+ content_type(response.content_type)
202
116
  response.value(body, request, query_string)
203
117
  end
204
118
  end
205
-
206
119
  end
207
120
  end