mirage 2.0.9 → 2.0.10
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/HISTORY +1 -1
- data/VERSION +1 -1
- data/mirage.gemspec +2 -2
- data/mirage_server.rb +24 -19
- data/server/mock_response.rb +33 -24
- data/test.rb +1 -21
- metadata +25 -25
data/HISTORY
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.
|
1
|
+
2.0.10
|
data/mirage.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "mirage"
|
8
|
-
s.version = "2.0.
|
8
|
+
s.version = "2.0.10"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Leon Davis"]
|
12
|
-
s.date = "2011-12-
|
12
|
+
s.date = "2011-12-17"
|
13
13
|
s.description = "Mirage aids testing of your applications by hosting mock responses so that your applications do not have to talk to real endpoints. Its accessible via HTTP and has a RESTful interface."
|
14
14
|
s.executables = ["mirage"]
|
15
15
|
s.extra_rdoc_files = [
|
data/mirage_server.rb
CHANGED
@@ -25,6 +25,7 @@ module Mirage
|
|
25
25
|
set :port, options[:port]
|
26
26
|
set :show_exceptions, false
|
27
27
|
set :logging, true
|
28
|
+
set :dump_errors, true
|
28
29
|
set :server, 'webrick'
|
29
30
|
set :views, "#{ROOT_DIR}/views"
|
30
31
|
|
@@ -38,25 +39,28 @@ module Mirage
|
|
38
39
|
|
39
40
|
put '/mirage/templates/*' do |name|
|
40
41
|
response = request.body.read
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
42
|
+
MockResponse.new(name,
|
43
|
+
response,
|
44
|
+
@env['CONTENT_TYPE'],
|
45
|
+
@env['HTTP_X_MIRAGE_METHOD'],
|
46
|
+
@env['HTTP_X_MIRAGE_PATTERN'],
|
47
|
+
@env['HTTP_X_MIRAGE_DELAY'].to_f,
|
48
|
+
@env['HTTP_X_MIRAGE_DEFAULT'],
|
49
|
+
@env['HTTP_X_MIRAGE_FILE']).response_id.to_s
|
49
50
|
end
|
50
51
|
|
51
52
|
['get', 'post', 'delete', 'put'].each do |http_method|
|
52
53
|
send(http_method, '/mirage/responses/*') do |name|
|
53
54
|
body, query_string = Rack::Utils.unescape(request.body.read.to_s), request.query_string
|
54
|
-
record = MockResponse.get_response(name, http_method, body, query_string)
|
55
55
|
|
56
|
-
|
56
|
+
begin
|
57
|
+
record = MockResponse.find(body, query_string, name, http_method)
|
58
|
+
rescue ServerResponseNotFound
|
59
|
+
record = MockResponse.find_default(body, http_method, name, query_string)
|
60
|
+
end
|
61
|
+
|
57
62
|
REQUESTS[record.response_id] = body.empty? ? query_string : body
|
58
63
|
|
59
|
-
sleep record.delay
|
60
64
|
send_response(record, body, request, query_string)
|
61
65
|
end
|
62
66
|
end
|
@@ -77,24 +81,20 @@ module Mirage
|
|
77
81
|
200
|
78
82
|
end
|
79
83
|
|
80
|
-
|
81
84
|
delete '/mirage/templates' do
|
82
|
-
|
83
|
-
MockResponse.
|
85
|
+
REQUESTS.clear
|
86
|
+
MockResponse.delete_all
|
84
87
|
200
|
85
88
|
end
|
86
89
|
|
87
90
|
get '/mirage/templates/:id' do
|
88
|
-
|
89
|
-
return 404 if response.nil? || response.is_a?(Array)
|
90
|
-
send_response(response)
|
91
|
+
send_response(MockResponse.find_by_id(response_id))
|
91
92
|
end
|
92
93
|
|
93
94
|
get '/mirage/requests/:id' do
|
94
95
|
REQUESTS[response_id] || 404
|
95
96
|
end
|
96
97
|
|
97
|
-
|
98
98
|
get '/mirage' do
|
99
99
|
@responses = {}
|
100
100
|
|
@@ -109,7 +109,7 @@ module Mirage
|
|
109
109
|
|
110
110
|
|
111
111
|
put '/mirage/defaults' do
|
112
|
-
MockResponse.
|
112
|
+
MockResponse.delete_all
|
113
113
|
|
114
114
|
Dir["#{settings.defaults_directory}/**/*.rb"].each do |default|
|
115
115
|
begin
|
@@ -132,6 +132,10 @@ module Mirage
|
|
132
132
|
200
|
133
133
|
end
|
134
134
|
|
135
|
+
error ServerResponseNotFound do
|
136
|
+
404
|
137
|
+
end
|
138
|
+
|
135
139
|
error do
|
136
140
|
erb request.env['sinatra.error'].message
|
137
141
|
end
|
@@ -147,6 +151,7 @@ module Mirage
|
|
147
151
|
end
|
148
152
|
|
149
153
|
def send_response(response, body='', request={}, query_string='')
|
154
|
+
sleep response.delay
|
150
155
|
content_type(response.content_type)
|
151
156
|
response.value(body, request, query_string)
|
152
157
|
end
|
data/server/mock_response.rb
CHANGED
@@ -1,31 +1,19 @@
|
|
1
1
|
module Mirage
|
2
|
+
class ServerResponseNotFound < Exception
|
3
|
+
|
4
|
+
end
|
2
5
|
class MockResponse
|
3
6
|
class << self
|
4
7
|
|
5
|
-
def
|
6
|
-
|
7
|
-
stored_response_set = (stored_response_sets[response.pattern] ||= {})
|
8
|
-
|
9
|
-
old_response = stored_response_set.delete(response.http_method)
|
10
|
-
stored_response_set[response.http_method] = response
|
11
|
-
|
12
|
-
response.response_id = old_response ? old_response.response_id : next_id
|
13
|
-
end
|
14
|
-
|
15
|
-
|
16
|
-
def get_response name, http_method, body, query_string
|
17
|
-
find_response(body, query_string, responses[name], http_method) || default_response(body, http_method, name, query_string)
|
18
|
-
end
|
19
|
-
|
20
|
-
def find id
|
21
|
-
response_set_containing(id).values.find { |response| response.response_id == id }
|
8
|
+
def find_by_id id
|
9
|
+
response_set_containing(id).values.find { |response| response.response_id == id } || raise(ServerResponseNotFound)
|
22
10
|
end
|
23
11
|
|
24
12
|
def delete(id)
|
25
13
|
response_set_containing(id).delete_if { |http_method, response| response.response_id == id }
|
26
14
|
end
|
27
15
|
|
28
|
-
def
|
16
|
+
def delete_all
|
29
17
|
responses.clear
|
30
18
|
@next_id = 0
|
31
19
|
end
|
@@ -35,7 +23,7 @@ module Mirage
|
|
35
23
|
end
|
36
24
|
|
37
25
|
def revert
|
38
|
-
|
26
|
+
delete_all and responses.replace(snapshot.deep_clone)
|
39
27
|
end
|
40
28
|
|
41
29
|
def all
|
@@ -46,17 +34,32 @@ module Mirage
|
|
46
34
|
all_responses
|
47
35
|
end
|
48
36
|
|
49
|
-
def
|
37
|
+
def find_default(body, http_method, name, query_string)
|
50
38
|
default_response_sets = find_default_responses(name)
|
51
39
|
|
52
40
|
until default_response_sets.empty?
|
53
|
-
record =
|
41
|
+
record = find_in_response_set(body, query_string, default_response_sets.delete_at(0), http_method)
|
54
42
|
return record if record && record.default?
|
55
43
|
end
|
44
|
+
|
45
|
+
raise ServerResponseNotFound
|
46
|
+
end
|
47
|
+
|
48
|
+
def find(body, query_string, name, http_method)
|
49
|
+
find_in_response_set(body, query_string, responses[name], http_method) || raise(ServerResponseNotFound)
|
50
|
+
end
|
51
|
+
|
52
|
+
def add new_response
|
53
|
+
response_set = target_response_set(new_response)
|
54
|
+
|
55
|
+
old_response = response_set.delete(new_response.http_method)
|
56
|
+
response_set[new_response.http_method] = new_response
|
57
|
+
new_response.response_id = old_response ? old_response.response_id : next_id
|
56
58
|
end
|
57
59
|
|
58
60
|
private
|
59
|
-
|
61
|
+
|
62
|
+
def find_in_response_set(body, query_string, response_set, http_method)
|
60
63
|
return unless response_set
|
61
64
|
response_set = response_set[body] || response_set[query_string] || response_set[:basic]
|
62
65
|
response_set[http_method.upcase] if response_set
|
@@ -78,6 +81,11 @@ module Mirage
|
|
78
81
|
matches.collect { |key| responses[key] }
|
79
82
|
end
|
80
83
|
|
84
|
+
def target_response_set response
|
85
|
+
responses_sets = responses[response.name]||={}
|
86
|
+
responses_sets[response.pattern] ||= {}
|
87
|
+
end
|
88
|
+
|
81
89
|
def responses
|
82
90
|
@responses ||={}
|
83
91
|
end
|
@@ -97,7 +105,8 @@ module Mirage
|
|
97
105
|
attr_accessor :response_id
|
98
106
|
|
99
107
|
def initialize name, value, content_type, http_method, pattern=nil, delay=0, default=false, file=false
|
100
|
-
@name, @value, @content_type, @http_method, @
|
108
|
+
@name, @value, @content_type, @http_method, @delay, @default, @file = name, value, content_type, (http_method||'GET').upcase, delay, default, file
|
109
|
+
@pattern = pattern ? /#{pattern}/ : :basic
|
101
110
|
MockResponse.add self
|
102
111
|
end
|
103
112
|
|
@@ -135,4 +144,4 @@ module Mirage
|
|
135
144
|
string.scan(/#{regex}/).flatten.first
|
136
145
|
end
|
137
146
|
end
|
138
|
-
end
|
147
|
+
end
|
data/test.rb
CHANGED
@@ -1,22 +1,2 @@
|
|
1
|
-
class Hash
|
2
|
-
alias_method :backup, :[]
|
3
1
|
|
4
|
-
|
5
|
-
result = backup(desired_key)
|
6
|
-
return result if result
|
7
|
-
key, value = find{|key, value| key.is_a?(Regexp) && desired_key.is_a?(String) && key.match(desired_key) }
|
8
|
-
value
|
9
|
-
end
|
10
|
-
end
|
11
|
-
hash = {/hello/ => 'hello', :foo => 'bar'}
|
12
|
-
|
13
|
-
#def hash.[] desired_key
|
14
|
-
# key, value = find{|key, value| key.match(desired_key)}
|
15
|
-
# value
|
16
|
-
#end
|
17
|
-
|
18
|
-
|
19
|
-
puts hash['hello']
|
20
|
-
puts hash[:foo]
|
21
|
-
|
22
|
-
Marshal.dump(hash)
|
2
|
+
puts 'hello' || raise(Exception)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mirage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-12-
|
12
|
+
date: 2011-12-17 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
16
|
-
requirement: &
|
16
|
+
requirement: &16574020 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *16574020
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: childprocess
|
27
|
-
requirement: &
|
27
|
+
requirement: &16573200 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0.1'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *16573200
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: waitforit
|
38
|
-
requirement: &
|
38
|
+
requirement: &16572300 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *16572300
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
|
-
requirement: &
|
49
|
+
requirement: &16571360 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *16571360
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: cucumber
|
60
|
-
requirement: &
|
60
|
+
requirement: &16567920 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *16567920
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
|
-
requirement: &
|
71
|
+
requirement: &16567020 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - =
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 2.6.0
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *16567020
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: jeweler
|
82
|
-
requirement: &
|
82
|
+
requirement: &16566280 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 1.5.2
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *16566280
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: sinatra-contrib
|
93
|
-
requirement: &
|
93
|
+
requirement: &16565440 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *16565440
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: mechanize
|
104
|
-
requirement: &
|
104
|
+
requirement: &16564600 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - =
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: 1.0.0
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *16564600
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: gemcutter
|
115
|
-
requirement: &
|
115
|
+
requirement: &16563700 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *16563700
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: nokogiri
|
126
|
-
requirement: &
|
126
|
+
requirement: &16562800 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - =
|
@@ -131,7 +131,7 @@ dependencies:
|
|
131
131
|
version: 1.4.7
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *16562800
|
135
135
|
description: Mirage aids testing of your applications by hosting mock responses so
|
136
136
|
that your applications do not have to talk to real endpoints. Its accessible via
|
137
137
|
HTTP and has a RESTful interface.
|
@@ -200,7 +200,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
200
200
|
version: '0'
|
201
201
|
segments:
|
202
202
|
- 0
|
203
|
-
hash:
|
203
|
+
hash: -4415743956139999538
|
204
204
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
205
|
none: false
|
206
206
|
requirements:
|