mirage 2.0.0.alpha3 → 2.0.0.alpha4

Sign up to get free protection for your applications and to get access to all the features.
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