mirage 2.0.16 → 2.1.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/Gemfile +0 -1
- data/Gemfile.lock +0 -2
- data/HISTORY +2 -0
- data/VERSION +1 -1
- data/features/client/put.feature +8 -0
- data/features/server/templates/put/put.feature +8 -0
- data/features/server/templates/put/put_with_substitutions.feature +1 -0
- data/features/step_definitions/my_steps.rb +1 -1
- data/lib/mirage/client.rb +36 -29
- data/mirage.gemspec +3 -6
- data/mirage_server.rb +9 -6
- data/server/mock_response.rb +11 -9
- data/test.rb +1 -1
- metadata +26 -37
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -19,7 +19,6 @@ GEM
|
|
19
19
|
eventmachine (0.12.10-java)
|
20
20
|
ffi (1.0.11)
|
21
21
|
ffi (1.0.11-java)
|
22
|
-
gemcutter (0.7.1)
|
23
22
|
gherkin (2.7.2)
|
24
23
|
json (>= 1.4.6)
|
25
24
|
gherkin (2.7.2-java)
|
@@ -86,7 +85,6 @@ PLATFORMS
|
|
86
85
|
DEPENDENCIES
|
87
86
|
childprocess
|
88
87
|
cucumber
|
89
|
-
gemcutter
|
90
88
|
jeweler
|
91
89
|
jruby-openssl
|
92
90
|
mechanize
|
data/HISTORY
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.1.2
|
data/features/client/put.feature
CHANGED
@@ -120,3 +120,11 @@ Feature: the Mirage client provides methods for setting responses and loading de
|
|
120
120
|
"""
|
121
121
|
When I send GET to 'http://localhost:7001/mirage/responses/download'
|
122
122
|
Then the response should be the same as the content of 'README.md'
|
123
|
+
|
124
|
+
Scenario: Setting a response status code
|
125
|
+
Given I run
|
126
|
+
"""
|
127
|
+
Mirage::Client.new.put('greeting', 'hello'){|response| response.status = 203}
|
128
|
+
"""
|
129
|
+
When I send GET to 'http://localhost:7001/mirage/responses/greeting'
|
130
|
+
Then a 203 should be returned
|
@@ -9,6 +9,7 @@ Feature: Mirage can be configured with templates that are returned when addresse
|
|
9
9
|
X-mirage-delay (optional) = the amount of time in seconds that mirage should wait for before responding (defaults to 0)
|
10
10
|
X-mirage-method (optional) = http method that this response applies to. Can be set to GET, POST, PUT or DELETE. Templates are configured to respond to GET requests by default
|
11
11
|
X-mirage-default (optional) = set whether the reponse can act as a default response, see put_as_default.feature (defaults to false)
|
12
|
+
X-mirage-status-code (optional) = set the http status that is returned, defaults to 200
|
12
13
|
content-type (optional) = Set the content type to be returned
|
13
14
|
|
14
15
|
|
@@ -17,6 +18,7 @@ Feature: Mirage can be configured with templates that are returned when addresse
|
|
17
18
|
|
18
19
|
When I send GET to 'http://localhost:7001/mirage/responses/greeting'
|
19
20
|
Then 'Hello' should be returned
|
21
|
+
And a 200 should be returned
|
20
22
|
|
21
23
|
|
22
24
|
Scenario: A template put under a deeper address
|
@@ -41,6 +43,12 @@ Feature: Mirage can be configured with templates that are returned when addresse
|
|
41
43
|
|
42
44
|
Given I send PUT to 'http://localhost:7001/mirage/templates/greeting' with body 'Hi'
|
43
45
|
Then '1' should be returned
|
46
|
+
|
47
|
+
Scenario: Setting the http status code to be returned
|
48
|
+
Given I send PUT to 'http://localhost:7001/mirage/templates/greeting' with body 'Hello' and headers:
|
49
|
+
| X-mirage-status | 202 |
|
50
|
+
When I send GET to 'http://localhost:7001/mirage/responses/greeting'
|
51
|
+
Then a 202 should be returned
|
44
52
|
|
45
53
|
|
46
54
|
|
@@ -6,6 +6,7 @@ Feature: Parts of a response can be substitued for values found in the request b
|
|
6
6
|
matching group which is what is put in to the response.
|
7
7
|
|
8
8
|
|
9
|
+
|
9
10
|
Scenario: A response template populated from matches found in the request body using a regex
|
10
11
|
Given I send PUT to 'http://localhost:7001/mirage/templates/greeting' with body 'Hello ${<firstname>(.*?)</firstname>} ${<surname>(.*?)</surname>}, how are you?' and headers:
|
11
12
|
| X-mirage-method | POST |
|
data/lib/mirage/client.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}"
|
2
2
|
require 'uri'
|
3
|
-
require 'open-uri'
|
4
3
|
require 'client/web'
|
4
|
+
require 'ostruct'
|
5
5
|
|
6
6
|
module Mirage
|
7
7
|
|
@@ -14,10 +14,26 @@ module Mirage
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
class Response
|
18
|
-
|
19
|
-
attr_accessor :
|
20
|
-
|
17
|
+
class Response < OpenStruct
|
18
|
+
|
19
|
+
attr_accessor :content_type
|
20
|
+
attr_reader :value
|
21
|
+
def initialize response
|
22
|
+
@content_type = 'text/plain'
|
23
|
+
@value = response
|
24
|
+
super({})
|
25
|
+
end
|
26
|
+
|
27
|
+
def headers
|
28
|
+
headers = {}
|
29
|
+
|
30
|
+
@table.each{|header, value| headers["X-mirage-#{header.to_s.gsub('_', '-')}"] = value}
|
31
|
+
headers['Content-Type']=@content_type
|
32
|
+
headers['X-mirage-file'] = 'true' if @response.kind_of?(IO)
|
33
|
+
|
34
|
+
headers
|
35
|
+
end
|
36
|
+
|
21
37
|
end
|
22
38
|
|
23
39
|
class InternalServerException < MirageError;
|
@@ -39,37 +55,28 @@ module Mirage
|
|
39
55
|
end
|
40
56
|
|
41
57
|
|
42
|
-
# Set a text or file based response, to be hosted at a given end point
|
43
|
-
# Client.set(endpoint, response,
|
58
|
+
# Set a text or file based response template, to be hosted at a given end point. A block can be specified to configure the template
|
59
|
+
# Client.set(endpoint, response, &block) => unique id that can be used to call back to the server
|
60
|
+
#
|
61
|
+
# Examples:
|
62
|
+
# Client.put('greeting', 'hello')
|
44
63
|
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
|
51
|
-
|
64
|
+
# Client.put('greeting', 'hello') do |response|
|
65
|
+
# response.pattern = 'pattern' #regex or string literal applied against the request querystring and body
|
66
|
+
# response.method = :post #By default templates will respond to get requests
|
67
|
+
# response.content_type = 'text/html' #defaults text/plain
|
68
|
+
# response.default = true # defaults to false. setting to true will allow this template to respond to request made to sub resources should it match.
|
69
|
+
# end
|
70
|
+
def put endpoint, response_value, &block
|
71
|
+
response = Response.new response_value
|
52
72
|
|
53
73
|
yield response if block_given?
|
54
|
-
|
55
|
-
headers = {}
|
56
|
-
headers['X-mirage-method'] = response.method.to_s if response.method
|
57
|
-
|
58
|
-
headers['X-mirage-pattern'] = response.pattern if response.pattern
|
59
|
-
headers['X-mirage-default'] = 'true' if response.default
|
60
|
-
headers['Content-Type'] = response.content_type || 'text/plain'
|
61
|
-
|
62
|
-
if response_value.kind_of?(IO)
|
63
|
-
headers['X-mirage-file'] = 'true'
|
64
|
-
else
|
65
|
-
response_value = response_value.to_s
|
66
|
-
end
|
67
74
|
|
68
|
-
build_response(http_put("#{@url}/templates/#{endpoint}",
|
75
|
+
build_response(http_put("#{@url}/templates/#{endpoint}",response.value, response.headers))
|
69
76
|
end
|
70
77
|
|
71
78
|
# Use to look at what a response contains without actually triggering it.
|
72
|
-
#
|
79
|
+
# client.response(response_id) => response held on the server as a String
|
73
80
|
def response response_id
|
74
81
|
response = build_response(http_get("#{@url}/templates/#{response_id}"))
|
75
82
|
case response
|
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.
|
8
|
+
s.version = "2.1.2"
|
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 = "2012-
|
12
|
+
s.date = "2012-04-29"
|
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 = [
|
@@ -62,7 +62,7 @@ Gem::Specification.new do |s|
|
|
62
62
|
s.licenses = ["MIT"]
|
63
63
|
s.post_install_message = "\n===============================================================================\nThanks you for installing mirage. \n\nRun Mirage with:\n\nmirage start \n\nFor more information go to: https://github.com/lashd/mirage/wiki\n===============================================================================\n"
|
64
64
|
s.require_paths = ["lib"]
|
65
|
-
s.rubygems_version = "1.8.
|
65
|
+
s.rubygems_version = "1.8.17"
|
66
66
|
s.summary = "Mirage is a easy mock server for testing your applications"
|
67
67
|
|
68
68
|
if s.respond_to? :specification_version then
|
@@ -78,7 +78,6 @@ Gem::Specification.new do |s|
|
|
78
78
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
79
79
|
s.add_development_dependency(%q<sinatra-contrib>, [">= 0"])
|
80
80
|
s.add_development_dependency(%q<mechanize>, [">= 0"])
|
81
|
-
s.add_development_dependency(%q<gemcutter>, [">= 0"])
|
82
81
|
s.add_development_dependency(%q<nokogiri>, [">= 0"])
|
83
82
|
s.add_development_dependency(%q<jruby-openssl>, [">= 0"])
|
84
83
|
else
|
@@ -91,7 +90,6 @@ Gem::Specification.new do |s|
|
|
91
90
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
92
91
|
s.add_dependency(%q<sinatra-contrib>, [">= 0"])
|
93
92
|
s.add_dependency(%q<mechanize>, [">= 0"])
|
94
|
-
s.add_dependency(%q<gemcutter>, [">= 0"])
|
95
93
|
s.add_dependency(%q<nokogiri>, [">= 0"])
|
96
94
|
s.add_dependency(%q<jruby-openssl>, [">= 0"])
|
97
95
|
end
|
@@ -105,7 +103,6 @@ Gem::Specification.new do |s|
|
|
105
103
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
106
104
|
s.add_dependency(%q<sinatra-contrib>, [">= 0"])
|
107
105
|
s.add_dependency(%q<mechanize>, [">= 0"])
|
108
|
-
s.add_dependency(%q<gemcutter>, [">= 0"])
|
109
106
|
s.add_dependency(%q<nokogiri>, [">= 0"])
|
110
107
|
s.add_dependency(%q<jruby-openssl>, [">= 0"])
|
111
108
|
end
|
data/mirage_server.rb
CHANGED
@@ -39,14 +39,16 @@ module Mirage
|
|
39
39
|
|
40
40
|
put '/mirage/templates/*' do |name|
|
41
41
|
response = request.body.read
|
42
|
+
|
42
43
|
MockResponse.new(name,
|
43
44
|
response,
|
44
|
-
@env['CONTENT_TYPE'],
|
45
|
-
@env['HTTP_X_MIRAGE_METHOD'],
|
46
|
-
@env['
|
47
|
-
@env['
|
48
|
-
@env['
|
49
|
-
@env['
|
45
|
+
:content_type => @env['CONTENT_TYPE'],
|
46
|
+
:http_method => @env['HTTP_X_MIRAGE_METHOD'],
|
47
|
+
:status => @env['HTTP_X_MIRAGE_STATUS'],
|
48
|
+
:pattern => @env['HTTP_X_MIRAGE_PATTERN'],
|
49
|
+
:delay => @env['HTTP_X_MIRAGE_DELAY'].to_f,
|
50
|
+
:default => @env['HTTP_X_MIRAGE_DEFAULT'],
|
51
|
+
:file => @env['HTTP_X_MIRAGE_FILE']).response_id.to_s
|
50
52
|
end
|
51
53
|
|
52
54
|
['get', 'post', 'delete', 'put'].each do |http_method|
|
@@ -153,6 +155,7 @@ module Mirage
|
|
153
155
|
def send_response(response, body='', request={}, query_string='')
|
154
156
|
sleep response.delay
|
155
157
|
content_type(response.content_type)
|
158
|
+
status response.status
|
156
159
|
response.value(body, request, query_string)
|
157
160
|
end
|
158
161
|
end
|
data/server/mock_response.rb
CHANGED
@@ -101,24 +101,26 @@ module Mirage
|
|
101
101
|
|
102
102
|
end
|
103
103
|
|
104
|
-
attr_reader
|
104
|
+
attr_reader :name
|
105
105
|
attr_accessor :response_id
|
106
106
|
|
107
|
-
def initialize name, value,
|
108
|
-
@name, @value
|
109
|
-
@
|
107
|
+
def initialize name, value,options
|
108
|
+
@name, @value = name, value
|
109
|
+
@options = {:pattern => :basic, :http_method => 'GET', :delay => 0.0, :status => 200}.merge(options){|key, old_value, new_value| new_value || old_value}
|
110
|
+
@options[:http_method].upcase!
|
110
111
|
MockResponse.add self
|
111
112
|
end
|
112
113
|
|
113
|
-
def
|
114
|
-
|
114
|
+
def method_missing *args
|
115
|
+
method_name = args.first
|
116
|
+
key = method_name.to_s.gsub(/\?$/, '').to_sym
|
117
|
+
method_name.to_s.end_with?('?') ? 'true' == @options[key] : @options[key]
|
115
118
|
end
|
116
119
|
|
117
|
-
def
|
118
|
-
|
120
|
+
def pattern
|
121
|
+
@options[:pattern] == :basic ? :basic : /#{@options[:pattern]}/
|
119
122
|
end
|
120
123
|
|
121
|
-
|
122
124
|
def value(body='', request_parameters={}, query_string='')
|
123
125
|
return @value if file?
|
124
126
|
|
data/test.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
a change another
|
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.
|
4
|
+
version: 2.1.2
|
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: 2012-
|
12
|
+
date: 2012-04-29 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
16
|
-
requirement: &
|
16
|
+
requirement: &16709080 !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: *16709080
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: childprocess
|
27
|
-
requirement: &
|
27
|
+
requirement: &16708560 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *16708560
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: waitforit
|
38
|
-
requirement: &
|
38
|
+
requirement: &16708060 !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: *16708060
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
|
-
requirement: &
|
49
|
+
requirement: &16673860 !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: *16673860
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: cucumber
|
60
|
-
requirement: &
|
60
|
+
requirement: &16673060 !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: *16673060
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
|
-
requirement: &
|
71
|
+
requirement: &16672340 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *16672340
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: jeweler
|
82
|
-
requirement: &
|
82
|
+
requirement: &16671580 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *16671580
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: sinatra-contrib
|
93
|
-
requirement: &
|
93
|
+
requirement: &16670800 !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: *16670800
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: mechanize
|
104
|
-
requirement: &
|
104
|
+
requirement: &16670040 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,21 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
113
|
-
- !ruby/object:Gem::Dependency
|
114
|
-
name: gemcutter
|
115
|
-
requirement: &27559000 !ruby/object:Gem::Requirement
|
116
|
-
none: false
|
117
|
-
requirements:
|
118
|
-
- - ! '>='
|
119
|
-
- !ruby/object:Gem::Version
|
120
|
-
version: '0'
|
121
|
-
type: :development
|
122
|
-
prerelease: false
|
123
|
-
version_requirements: *27559000
|
112
|
+
version_requirements: *16670040
|
124
113
|
- !ruby/object:Gem::Dependency
|
125
114
|
name: nokogiri
|
126
|
-
requirement: &
|
115
|
+
requirement: &16669340 !ruby/object:Gem::Requirement
|
127
116
|
none: false
|
128
117
|
requirements:
|
129
118
|
- - ! '>='
|
@@ -131,10 +120,10 @@ dependencies:
|
|
131
120
|
version: '0'
|
132
121
|
type: :development
|
133
122
|
prerelease: false
|
134
|
-
version_requirements: *
|
123
|
+
version_requirements: *16669340
|
135
124
|
- !ruby/object:Gem::Dependency
|
136
125
|
name: jruby-openssl
|
137
|
-
requirement: &
|
126
|
+
requirement: &16668600 !ruby/object:Gem::Requirement
|
138
127
|
none: false
|
139
128
|
requirements:
|
140
129
|
- - ! '>='
|
@@ -142,7 +131,7 @@ dependencies:
|
|
142
131
|
version: '0'
|
143
132
|
type: :development
|
144
133
|
prerelease: false
|
145
|
-
version_requirements: *
|
134
|
+
version_requirements: *16668600
|
146
135
|
description: Mirage aids testing of your applications by hosting mock responses so
|
147
136
|
that your applications do not have to talk to real endpoints. Its accessible via
|
148
137
|
HTTP and has a RESTful interface.
|
@@ -211,7 +200,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
211
200
|
version: '0'
|
212
201
|
segments:
|
213
202
|
- 0
|
214
|
-
hash:
|
203
|
+
hash: -2084322877409170050
|
215
204
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
205
|
none: false
|
217
206
|
requirements:
|
@@ -220,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
220
209
|
version: '0'
|
221
210
|
requirements: []
|
222
211
|
rubyforge_project:
|
223
|
-
rubygems_version: 1.8.
|
212
|
+
rubygems_version: 1.8.17
|
224
213
|
signing_key:
|
225
214
|
specification_version: 3
|
226
215
|
summary: Mirage is a easy mock server for testing your applications
|