mirage 2.0.0.alpha3 → 2.0.0.alpha4

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 (31) hide show
  1. data/Gemfile +1 -2
  2. data/VERSION +1 -1
  3. data/bin/mirage +1 -1
  4. data/features/client/clear.feature +1 -1
  5. data/features/client/mirage_client.feature +1 -1
  6. data/features/client/{set.feature → put.feature} +20 -11
  7. data/features/client/{track.feature → request.feature} +2 -2
  8. data/features/client/{peek.feature → response.feature} +12 -12
  9. data/features/client/save_and_revert.feature +1 -1
  10. data/features/server/prime.feature +5 -5
  11. data/features/server/requests/delete.feature +46 -0
  12. data/features/server/requests/get.feature +32 -0
  13. data/features/server/templates/delete.feature +47 -0
  14. data/features/server/{peek.feature → templates/get.feature} +0 -0
  15. data/features/server/{set.feature → templates/put/put.feature} +29 -19
  16. data/features/server/{set_default_response.feature → templates/put/put_as_default.feature} +1 -1
  17. data/features/server/{set_with_a_delay.feature → templates/put/put_with_delay.feature} +0 -0
  18. data/features/server/{set_with_a_pattern.feature → templates/put/put_with_pattern.feature} +14 -1
  19. data/features/server/{response_templates.feature → templates/put/put_with_substitutions.feature} +0 -0
  20. data/features/step_definitions/my_steps.rb +15 -15
  21. data/features/support/env.rb +1 -1
  22. data/lib/mirage/client.rb +21 -17
  23. data/lib/mirage/core.rb +12 -3
  24. data/lib/mirage/server.rb +17 -0
  25. data/lib/mirage/web.rb +4 -4
  26. data/lib/start_mirage.rb +12 -17
  27. data/mirage.gemspec +32 -25
  28. metadata +41 -51
  29. data/features/server/clear.feature +0 -93
  30. data/features/server/track_requests.feature +0 -71
  31. data/lib/mirage.rb +0 -18
@@ -1,4 +1,4 @@
1
- Feature: Mirage can respond with a 'default' response when a when the response requested at a sub url is not found.
1
+ Feature: A template can be configure as the default response for when there is no response found for a sub url.
2
2
  I.e.
3
3
  if a response is held for 'level1' and request comes in for 'level1/level2' the response for 'level1'
4
4
  can be returned if nothing is held for 'level1/level2'
@@ -3,6 +3,9 @@ Feature: Mirage can be configured to return particular responses conditionally b
3
3
 
4
4
  Patterns can be either plain text or a regular expression
5
5
 
6
+ A response with a pattern is not considered the same a response at the same address that has either no pattern or a diffferent one.
7
+ This allows you to specify different behaviour depending on the request.
8
+
6
9
  Background: There is already a default response for 'greeting'
7
10
  Given I send PUT to 'http://localhost:7001/mirage/templates/greeting' with body 'Hello Stranger' and headers:
8
11
  | X-mirage-method | POST |
@@ -64,4 +67,14 @@ Feature: Mirage can be configured to return particular responses conditionally b
64
67
  </greetingRequest>
65
68
  """
66
69
 
67
- Then 'Hello Stranger' should be returned
70
+ Then 'Hello Stranger' should be returned
71
+
72
+ Scenario: Templates with different patterns on the same address
73
+ When I send PUT to 'http://localhost:7001/mirage/templates/greeting' with body 'Hello Leon, how are you?' and headers:
74
+ | X-mirage-pattern | 2 |
75
+
76
+ When I send PUT to 'http://localhost:7001/mirage/templates/greeting' with body 'Hello Leon, how are you?' and headers:
77
+ | X-mirage-pattern | 3 |
78
+ Then '3' should be returned
79
+
80
+
@@ -24,7 +24,7 @@ end
24
24
 
25
25
 
26
26
  Then /^mirage should be running on '(.*)'$/ do |url|
27
- get(url).code.to_i.should == 200
27
+ http_get(url).code.to_i.should == 200
28
28
  end
29
29
 
30
30
  Given /^I run '(.*)'$/ do |command|
@@ -42,7 +42,7 @@ end
42
42
 
43
43
  Then /^Connection should be refused to '(.*)'$/ do |url|
44
44
  begin
45
- get(url)
45
+ http_get(url)
46
46
  fail "Mirage is still running"
47
47
  rescue Errno::ECONNREFUSED
48
48
  end
@@ -80,10 +80,10 @@ When /^I send (POST|PUT) to '(http:\/\/localhost:7001\/mirage\/(.*?))' with requ
80
80
  @response = case method
81
81
  when 'POST'
82
82
  then
83
- post(url, entity)
83
+ http_post(url, entity)
84
84
  when 'PUT'
85
85
  then
86
- put(url, entity)
86
+ http_put(url, entity)
87
87
  end
88
88
  end
89
89
 
@@ -91,17 +91,17 @@ When /^I send (GET|PUT|POST|OPTIONS|HEAD|DELETE) to '(http:\/\/localhost:7001\/m
91
91
  start_time = Time.now
92
92
  @response = case method
93
93
  when 'GET' then
94
- get(url)
94
+ http_get(url)
95
95
  when 'PUT' then
96
- put(url, '')
96
+ http_put(url, '')
97
97
  when 'POST' then
98
- post(url, '')
98
+ http_post(url, '')
99
99
  when 'HEAD' then
100
- head(url)
100
+ http_head(url)
101
101
  when 'OPTIONS' then
102
- options(url)
102
+ http_options(url)
103
103
  when 'DELETE' then
104
- delete(url)
104
+ http_delete(url)
105
105
  end
106
106
  @response_time = Time.now - start_time
107
107
  end
@@ -109,7 +109,7 @@ end
109
109
 
110
110
  When /^I send PUT to '(http:\/\/localhost:7001\/mirage\/([^']*))' with body '([^']*)'$/ do |url, endpoint, body|
111
111
  start_time = Time.now
112
- @response = put(url, body)
112
+ @response = http_put(url, body)
113
113
  @response_time = Time.now - start_time
114
114
  end
115
115
 
@@ -119,7 +119,7 @@ When /^I send PUT to '(http:\/\/localhost:7001\/mirage\/([^']*))' with body '([^
119
119
  parameter, value = row[0], row[1]
120
120
  headers[parameter]=value
121
121
  end
122
- @response = put(url, body, headers)
122
+ @response = http_put(url, body, headers)
123
123
  end
124
124
 
125
125
  Then /^I should see '(.*?)' on the command line$/ do |content|
@@ -158,9 +158,9 @@ When /^I send (GET|POST) to '(http:\/\/localhost:7001\/mirage\/(.*?))' with para
158
158
 
159
159
  @response = case http_method
160
160
  when 'POST' then
161
- post(url, parameters)
161
+ http_post(url, parameters)
162
162
  when 'GET' then
163
- get(url, parameters)
163
+ http_get(url, parameters)
164
164
  end
165
165
  end
166
166
 
@@ -174,7 +174,7 @@ Given /^I send PUT to '(http:\/\/localhost:7001\/mirage\/(.*?))' with file: ([^'
174
174
  parameter, value = row[0], row[1]
175
175
  headers[parameter]=value
176
176
  end
177
- put(url, File.new(path), headers)
177
+ http_put(url, File.new(path), headers)
178
178
  end
179
179
 
180
180
  When /^the response '([^']*)' should be '([^']*)'$/ do |header, value|
@@ -1,6 +1,6 @@
1
1
  $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
2
2
  require 'rubygems'
3
- require 'mirage'
3
+ require 'mirage/client'
4
4
  require 'cucumber'
5
5
  require 'rspec'
6
6
  require 'mechanize'
@@ -1,6 +1,8 @@
1
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}"
1
2
  require 'uri'
2
3
  require 'open-uri'
3
- require 'mirage/web'
4
+ require 'util'
5
+ require 'web'
4
6
 
5
7
  module Mirage
6
8
 
@@ -15,7 +17,7 @@ module Mirage
15
17
 
16
18
  class Response
17
19
 
18
- attr_accessor :method, :pattern, :content_type
20
+ attr_accessor :method, :pattern, :content_type, :default
19
21
 
20
22
  end
21
23
 
@@ -46,7 +48,7 @@ module Mirage
46
48
  # Client.set('greeting', 'hello', :pattern => /regexp/)
47
49
  # Client.set('greeting', 'hello', :pattern => 'text')
48
50
  # Client.set('greeting', 'hello', :delay => 5) # number of seconds
49
- def set endpoint, response_value, params={}
51
+ def put endpoint, response_value, params={}
50
52
  response = Response.new
51
53
 
52
54
  yield response if block_given?
@@ -55,15 +57,16 @@ module Mirage
55
57
  headers['X-mirage-method'] = response.method.to_s if response.method
56
58
 
57
59
  headers['X-mirage-pattern'] = response.pattern if response.pattern
60
+ headers['X-mirage-default'] = 'true' if response.default
58
61
  headers['Content-Type'] = response.content_type || 'text/plain'
59
62
 
60
- response(put("#{@url}/templates/#{endpoint}",response_value, headers))
63
+ build_response(http_put("#{@url}/templates/#{endpoint}",response_value, headers))
61
64
  end
62
65
 
63
66
  # Use to look at what a response contains without actually triggering it.
64
67
  # Client.peek(response_id) => response held on the server as a String
65
- def peek response_id
66
- response = response(get("#{@url}/templates/#{response_id}"))
68
+ def response response_id
69
+ response = build_response(http_get("#{@url}/templates/#{response_id}"))
67
70
  case response
68
71
  when String then
69
72
  return response
@@ -86,14 +89,14 @@ module Mirage
86
89
 
87
90
  case thing
88
91
  when :requests
89
- delete("#{@url}/requests")
92
+ http_delete("#{@url}/requests")
90
93
  when Numeric then
91
- delete("#{@url}/templates/#{thing}")
94
+ http_delete("#{@url}/templates/#{thing}")
92
95
  when Hash then
93
96
  puts "deleteing request #{thing[:request]}"
94
- delete("#{@url}/requests/#{thing[:request]}") if thing[:request]
97
+ http_delete("#{@url}/requests/#{thing[:request]}") if thing[:request]
95
98
  else NilClass
96
- delete("#{@url}/templates")
99
+ http_delete("#{@url}/templates")
97
100
  end
98
101
 
99
102
  end
@@ -104,27 +107,27 @@ module Mirage
104
107
  #
105
108
  # Example:
106
109
  # Client.new.track(response_id) => Tracked request as a String
107
- def track response_id
108
- response(get("#{@url}/requests/#{response_id}"))
110
+ def request response_id
111
+ build_response(http_get("#{@url}/requests/#{response_id}"))
109
112
  end
110
113
 
111
114
  # Save the state of the Mirage server so that it can be reverted back to that exact state at a later time.
112
115
  def save
113
- put("#{@url}/backup",'').code == 200
116
+ http_put("#{@url}/backup",'').code == 200
114
117
  end
115
118
 
116
119
 
117
120
  # Revert the state of Mirage back to the state that was last saved
118
121
  # If there is no snapshot to rollback to, nothing happens
119
122
  def revert
120
- put("#{@url}",'').code == 200
123
+ http_put("#{@url}",'').code == 200
121
124
  end
122
125
 
123
126
 
124
127
  # Check to see if Mirage is up and running
125
128
  def running?
126
129
  begin
127
- get(@url) and return true
130
+ http_get(@url) and return true
128
131
  rescue Errno::ECONNREFUSED
129
132
  return false
130
133
  end
@@ -132,11 +135,12 @@ module Mirage
132
135
 
133
136
  # Clear down the Mirage Server and load any defaults that are in Mirages default responses directory.
134
137
  def prime
135
- response(put("#{@url}/defaults",''))
138
+ puts "#{@url}/defaults"
139
+ build_response(http_put("#{@url}/defaults",''))
136
140
  end
137
141
 
138
142
  private
139
- def response response
143
+ def build_response response
140
144
  case response.code.to_i
141
145
  when 500 then
142
146
  raise ::Mirage::InternalServerException.new(response.body, response.code.to_i)
@@ -4,7 +4,16 @@ require 'sinatra/reloader'
4
4
 
5
5
  module Mirage
6
6
 
7
- class MirageServer < Sinatra::Base
7
+ class Server < Sinatra::Base
8
+
9
+
10
+ class << self
11
+ attr_reader :defaults_directory
12
+
13
+ def configure options
14
+ @defaults_directory = options[:defaults_directory]
15
+ end
16
+ end
8
17
 
9
18
  REQUESTS= {}
10
19
 
@@ -76,7 +85,7 @@ module Mirage
76
85
  @responses["#{response.name}#{'/*' if response.default?}: #{pattern} #{delay}"] = response
77
86
  end
78
87
  erb :index
79
- end
88
+ end
80
89
 
81
90
  error do
82
91
  erb request.env['sinatra.error'].message
@@ -85,7 +94,7 @@ module Mirage
85
94
  put '/mirage/defaults' do
86
95
  MOCK_RESPONSES.clear
87
96
 
88
- Dir["#{DEFAULT_RESPONSES_DIR}/**/*.rb"].each do |default|
97
+ Dir["#{Server.defaults_directory}/**/*.rb"].each do |default|
89
98
  begin
90
99
  load default
91
100
  rescue Exception
@@ -0,0 +1,17 @@
1
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}"
2
+ require 'object'
3
+ require 'mock_response'
4
+ require 'mock_responses_collection'
5
+ require 'core'
6
+
7
+ module Mirage
8
+ class << self
9
+ def prime
10
+ yield @client
11
+ end
12
+
13
+ def client= client
14
+ @client = client
15
+ end
16
+ end
17
+ end
@@ -13,7 +13,7 @@ module Mirage
13
13
  end
14
14
  end
15
15
 
16
- def put url, entity, headers={}
16
+ def http_put url, entity, headers={}
17
17
  uri = URI.parse(url)
18
18
  request = Net::HTTP::Put.new(uri.request_uri)
19
19
 
@@ -28,7 +28,7 @@ module Mirage
28
28
  Net::HTTP.new(uri.host, uri.port).request(request)
29
29
  end
30
30
 
31
- def get url, params={}, headers={}
31
+ def http_get url, params={}, headers={}
32
32
  uri = URI.parse(url)
33
33
  request = Net::HTTP::Get.new(uri.request_uri)
34
34
  request.set_form_data params
@@ -36,7 +36,7 @@ module Mirage
36
36
  Net::HTTP.new(uri.host, uri.port).request(request)
37
37
  end
38
38
 
39
- def post url, params={}, headers={}
39
+ def http_post url, params={}, headers={}
40
40
  uri = URI.parse(url)
41
41
  request = Net::HTTP::Post.new(uri.request_uri)
42
42
 
@@ -46,7 +46,7 @@ module Mirage
46
46
  Net::HTTP.new(uri.host, uri.port).request(request)
47
47
  end
48
48
 
49
- def delete url, params={}, headers={}
49
+ def http_delete url, params={}, headers={}
50
50
  uri = URI.parse(url)
51
51
  request = Net::HTTP::Delete.new(uri.request_uri)
52
52
  params.is_a?(Hash) ? request.set_form_data(params) : request.body = params
@@ -1,24 +1,20 @@
1
1
  require 'rubygems'
2
-
3
2
  $0='Mirage Server'
4
3
  $LOAD_PATH.unshift(File.dirname(__FILE__))
5
4
 
6
- require 'sinatra'
7
5
  require 'sinatra/base'
8
6
 
9
- require 'mirage/util'
10
- include Mirage::Util
11
- options = parse_options(ARGV)
12
-
13
7
  module Mirage
14
- class MirageServer < Sinatra::Base
15
- configure do
8
+ class Server < Sinatra::Base
9
+ configure do |config|
16
10
  require 'logger'
17
11
  enable :logging
18
12
  log_file = File.open('mirage.log', 'a')
19
13
  log_file.sync=true
20
14
  use Rack::CommonLogger, log_file
21
- set :views, File.dirname(__FILE__) + '/views'
15
+ config.set :views, File.dirname(__FILE__) + '/views'
16
+ config.set(:show_exception, false)
17
+ config.set(:raise_errors, false)
22
18
  end
23
19
 
24
20
  configure(:development) do |config|
@@ -30,14 +26,13 @@ module Mirage
30
26
  end
31
27
 
32
28
 
33
- require 'mirage'
29
+ require 'mirage/server'
34
30
 
35
-
36
- DEFAULT_RESPONSES_DIR = "#{options[:defaults_directory]}"
37
- Mirage.client = Mirage::Client.new
38
- set(:show_exception, false)
39
- set(:raise_errors, true)
40
-
41
- Mirage::MirageServer.run! :port => options[:port], :show_exceptions => false, :logging => true, :server => 'webrick'
31
+ require 'mirage/client'
32
+ include Mirage::Util
33
+ options = parse_options(ARGV)
34
+ Mirage::Server.configure options
35
+ Mirage.client = Mirage::Client.new "http://localhost:#{options[:port]}/mirage"
36
+ Mirage::Server.run! :port => options[:port], :show_exceptions => false, :logging => true, :server => 'webrick'
42
37
 
43
38
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mirage}
8
- s.version = "1.3.6"
8
+ s.version = "2.0.0.alpha4"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Leon Davis"]
12
- s.date = %q{2011-04-25}
12
+ s.date = %q{2011-08-11}
13
13
  s.default_executable = %q{mirage}
14
14
  s.description = %q{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.}
15
15
  s.executables = ["mirage"]
@@ -23,33 +23,34 @@ Gem::Specification.new do |s|
23
23
  "VERSION",
24
24
  "bin/mirage",
25
25
  "features/client/clear.feature",
26
- "features/client/get.feature",
27
26
  "features/client/mirage_client.feature",
28
- "features/client/peek.feature",
27
+ "features/client/put.feature",
28
+ "features/client/request.feature",
29
+ "features/client/response.feature",
29
30
  "features/client/save_and_revert.feature",
30
- "features/client/set.feature",
31
- "features/client/track_requests.feature",
32
- "features/server/clear.feature",
33
31
  "features/server/command_line_iterface.feature",
34
- "features/server/file_responses.feature",
35
32
  "features/server/logging.feature",
36
- "features/server/peek.feature",
37
33
  "features/server/prime.feature",
38
- "features/server/response_templates.feature",
34
+ "features/server/requests/delete.feature",
35
+ "features/server/requests/get.feature",
39
36
  "features/server/save_and_revert.feature",
40
- "features/server/set.feature",
41
- "features/server/set_default_response.feature",
42
- "features/server/set_with_a_delay.feature",
43
- "features/server/set_with_a_pattern.feature",
44
- "features/server/track_requests.feature",
37
+ "features/server/templates/delete.feature",
38
+ "features/server/templates/get.feature",
39
+ "features/server/templates/put/put.feature",
40
+ "features/server/templates/put/put_as_default.feature",
41
+ "features/server/templates/put/put_with_delay.feature",
42
+ "features/server/templates/put/put_with_pattern.feature",
43
+ "features/server/templates/put/put_with_substitutions.feature",
45
44
  "features/server/web_user_interface.feature",
46
45
  "features/step_definitions/my_steps.rb",
47
46
  "features/support/env.rb",
48
47
  "full_build.sh",
49
- "lib/config.ru",
50
- "lib/mirage.rb",
51
48
  "lib/mirage/client.rb",
52
49
  "lib/mirage/core.rb",
50
+ "lib/mirage/mock_response.rb",
51
+ "lib/mirage/mock_responses_collection.rb",
52
+ "lib/mirage/object.rb",
53
+ "lib/mirage/server.rb",
53
54
  "lib/mirage/util.rb",
54
55
  "lib/mirage/web.rb",
55
56
  "lib/start_mirage.rb",
@@ -71,43 +72,49 @@ For more information go to: https://github.com/lashd/mirage/wiki
71
72
  ===============================================================================
72
73
  }
73
74
  s.require_paths = ["lib"]
74
- s.rubygems_version = %q{1.6.1}
75
+ s.rubygems_version = %q{1.6.2}
75
76
  s.summary = %q{Mirage is a easy mock server for testing your applications}
76
77
 
77
78
  if s.respond_to? :specification_version then
78
79
  s.specification_version = 3
79
80
 
80
81
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
81
- s.add_runtime_dependency(%q<rack>, ["~> 1.1.0"])
82
82
  s.add_runtime_dependency(%q<sinatra>, [">= 0"])
83
- s.add_runtime_dependency(%q<mechanize>, [">= 1.0.0"])
84
83
  s.add_runtime_dependency(%q<childprocess>, ["~> 0.1"])
85
84
  s.add_development_dependency(%q<rake>, [">= 0"])
86
85
  s.add_development_dependency(%q<cucumber>, [">= 0"])
86
+ s.add_development_dependency(%q<gherkin>, ["= 2.3.9"])
87
87
  s.add_development_dependency(%q<rspec>, [">= 0"])
88
88
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
89
89
  s.add_development_dependency(%q<bundler>, [">= 0"])
90
+ s.add_development_dependency(%q<sinatra-reloader>, [">= 0"])
91
+ s.add_development_dependency(%q<mechanize>, [">= 1.0.0"])
92
+ s.add_development_dependency(%q<gemcutter>, [">= 0"])
90
93
  else
91
- s.add_dependency(%q<rack>, ["~> 1.1.0"])
92
94
  s.add_dependency(%q<sinatra>, [">= 0"])
93
- s.add_dependency(%q<mechanize>, [">= 1.0.0"])
94
95
  s.add_dependency(%q<childprocess>, ["~> 0.1"])
95
96
  s.add_dependency(%q<rake>, [">= 0"])
96
97
  s.add_dependency(%q<cucumber>, [">= 0"])
98
+ s.add_dependency(%q<gherkin>, ["= 2.3.9"])
97
99
  s.add_dependency(%q<rspec>, [">= 0"])
98
100
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
99
101
  s.add_dependency(%q<bundler>, [">= 0"])
102
+ s.add_dependency(%q<sinatra-reloader>, [">= 0"])
103
+ s.add_dependency(%q<mechanize>, [">= 1.0.0"])
104
+ s.add_dependency(%q<gemcutter>, [">= 0"])
100
105
  end
101
106
  else
102
- s.add_dependency(%q<rack>, ["~> 1.1.0"])
103
107
  s.add_dependency(%q<sinatra>, [">= 0"])
104
- s.add_dependency(%q<mechanize>, [">= 1.0.0"])
105
108
  s.add_dependency(%q<childprocess>, ["~> 0.1"])
106
109
  s.add_dependency(%q<rake>, [">= 0"])
107
110
  s.add_dependency(%q<cucumber>, [">= 0"])
111
+ s.add_dependency(%q<gherkin>, ["= 2.3.9"])
108
112
  s.add_dependency(%q<rspec>, [">= 0"])
109
113
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
110
114
  s.add_dependency(%q<bundler>, [">= 0"])
115
+ s.add_dependency(%q<sinatra-reloader>, [">= 0"])
116
+ s.add_dependency(%q<mechanize>, [">= 1.0.0"])
117
+ s.add_dependency(%q<gemcutter>, [">= 0"])
111
118
  end
112
119
  end
113
120