mirage 2.0.16 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -11,7 +11,6 @@ group :development do
11
11
  gem "jeweler"
12
12
  gem 'sinatra-contrib'
13
13
  gem 'mechanize'
14
- gem 'gemcutter'
15
14
  gem "nokogiri"
16
15
 
17
16
  platform :jruby do
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
@@ -1,3 +1,5 @@
1
+ V2.1.2 - rename status_code to status
2
+ V2.1.1 - Set response code and tidy ups
1
3
  V2.0.16 - minor typo fix for window command window title in windows
2
4
  V2.0.15 - fix uploading files from client and fix starting mirage on windows
3
5
  V2.0.12/13/14 - updating gem versions
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.16
1
+ 2.1.2
@@ -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 |
@@ -14,7 +14,7 @@ Then /^'([^']*)' should be returned$/ do |expected_response|
14
14
  end
15
15
  end
16
16
 
17
- Then /^a (200|404|500) should be returned$/ do |error_code|
17
+ Then /^a (\d+) should be returned$/ do |error_code|
18
18
  @response.code.to_i.should == error_code.to_i
19
19
  end
20
20
 
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 :method, :pattern, :content_type, :default
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 optionally with a given pattern and delay
43
- # Client.set(endpoint, response, params) => unique id that can be used to call back to the server
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
- # Examples:
46
- # Client.set('greeting', 'hello':)
47
- # Client.set('greeting', 'hello', :pattern => /regexp/)
48
- # Client.set('greeting', 'hello', :pattern => 'text')
49
- # Client.set('greeting', 'hello', :delay => 5) # number of seconds
50
- def put endpoint, response_value, params={}
51
- response = Response.new
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}",response_value, headers))
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
- # Client.peek(response_id) => response held on the server as a String
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.0.16"
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-01-11"
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.10"
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['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
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
@@ -101,24 +101,26 @@ module Mirage
101
101
 
102
102
  end
103
103
 
104
- attr_reader :response_id, :delay, :name, :pattern, :http_method, :content_type
104
+ attr_reader :name
105
105
  attr_accessor :response_id
106
106
 
107
- def initialize name, value, content_type, http_method, pattern=nil, delay=0, default=false, file=false
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
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 default?
114
- 'true' == @default
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 file?
118
- 'true' == @file
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
- puts File.open('rakefile', 'r').kind_of?(IO)
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.0.16
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-01-11 00:00:00.000000000Z
12
+ date: 2012-04-29 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
16
- requirement: &27575680 !ruby/object:Gem::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: *27575680
24
+ version_requirements: *16709080
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: childprocess
27
- requirement: &27575080 !ruby/object:Gem::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: *27575080
35
+ version_requirements: *16708560
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: waitforit
38
- requirement: &27574440 !ruby/object:Gem::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: *27574440
46
+ version_requirements: *16708060
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
- requirement: &27573820 !ruby/object:Gem::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: *27573820
57
+ version_requirements: *16673860
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: cucumber
60
- requirement: &27562100 !ruby/object:Gem::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: *27562100
68
+ version_requirements: *16673060
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
- requirement: &27561500 !ruby/object:Gem::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: *27561500
79
+ version_requirements: *16672340
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: jeweler
82
- requirement: &27560900 !ruby/object:Gem::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: *27560900
90
+ version_requirements: *16671580
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: sinatra-contrib
93
- requirement: &27560300 !ruby/object:Gem::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: *27560300
101
+ version_requirements: *16670800
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: mechanize
104
- requirement: &27559620 !ruby/object:Gem::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: *27559620
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: &27558420 !ruby/object:Gem::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: *27558420
123
+ version_requirements: *16669340
135
124
  - !ruby/object:Gem::Dependency
136
125
  name: jruby-openssl
137
- requirement: &27557920 !ruby/object:Gem::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: *27557920
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: 4466543541330693367
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.10
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