Feature: the Mirage client provides methods for setting responses and loading default responses.
There is no need to escape any parameters before using the client api as this is done for you.
Patterns can be either a string or regex object.
Background:
Given the following gems are required to run the Mirage client test code:
"""
require 'rubygems'
require 'rspec'
require 'mirage/client'
"""
Scenario: Setting a basic response
Given I run
"""
Mirage::Client.new.put('greeting','hello')
"""
When I send GET to 'http://localhost:7001/mirage/responses/greeting'
Then 'hello' should be returned
Scenario: Setting the method that a response should be returned on
Given I run
"""
Mirage::Client.new.put('greeting', 'Hello Leon') do |response|
response.method = 'POST'
end
"""
When I send GET to 'http://localhost:7001/mirage/responses/greeting'
Then a 404 should be returned
When I send POST to 'http://localhost:7001/mirage/responses/greeting'
Then 'Hello Leon' should be returned
Scenario: Setting a response with required body content
Given I run
"""
Mirage::Client.new.put('greeting', 'Hello Leon') do |response|
response.method = 'POST'
response.add_body_content_requirement /leon/
end
"""
When I send POST to 'http://localhost:7001/mirage/responses/greeting'
Then a 404 should be returned
When I send POST to 'http://localhost:7001/mirage/responses/greeting' with request entity
"""
leon
"""
Then 'Hello Leon' should be returned
Scenario: Setting a response with a request parameter requirement
Given I run
"""
Mirage::Client.new.put('greeting', 'Hello Leon') do |response|
response.method = 'POST'
response.add_request_parameter_requirement :name, /leon/
end
"""
When I send POST to 'http://localhost:7001/mirage/responses/greeting'
Then a 404 should be returned
When I send POST to 'http://localhost:7001/mirage/responses/greeting' with parameters:
| name | leon |
Then 'Hello Leon' should be returned
Scenario: setting a response as default
Given I run
"""
Mirage::Client.new.put('greeting', 'default greeting') do |response|
response.default = true
end
"""
When I send GET to 'http://localhost:7001/mirage/responses/greeting/for/joel'
Then 'default greeting' should be returned
Scenario: Setting the content type
Given I run
"""
Mirage::Client.new.put('greeting', '') do |response|
response.content_type = 'text/xml'
end
"""
When I send GET to 'http://localhost:7001/mirage/responses/greeting'
And the response 'content-type' should be 'text/xml'
Scenario: Priming Mirage
Given Mirage is not running
And I run 'mirage start'
When the file 'responses/default_greetings.rb' contains:
"""
prime do |mirage|
mirage.put('greeting', 'hello')
mirage.put('leaving', 'goodbye')
end
"""
And I run
"""
Mirage::Client.new.prime
"""
And I send GET to 'http://localhost:7001/mirage/responses/greeting'
Then 'hello' should be returned
When I send GET to 'http://localhost:7001/mirage/responses/leaving'
Then 'goodbye' should be returned
Scenario: Priming Mirage when one of the response file has something bad in it
Given the file 'responses/default_greetings.rb' contains:
"""
Something bad...
"""
When I run
"""
begin
Mirage::Client.new.prime
fail("Error should have been thrown")
rescue Exception => e
e.is_a?(Mirage::InternalServerException).should == true
end
"""
Scenario: Setting a file as a response
Given the file 'test_file.txt' contains:
"""
test content
"""
And I run
"""
Mirage::Client.new.put('download', File.open('test_file.txt'))
"""
When I send GET to 'http://localhost:7001/mirage/responses/download'
Then the response should be the same as the content of 'test_file.txt'
Scenario: Setting a response status code
Given I run
"""
Mirage::Client.new.put('greeting', 'hello'){|response| response.status = 203}
"""
When I send GET to 'http://localhost:7001/mirage/responses/greeting'
Then a 203 should be returned
Scenario: Setting a response with a delay
Given I run
"""
Mirage::Client.new.put('greeting', 'hello'){|response| response.delay = 2}
"""
When I send GET to 'http://localhost:7001/mirage/responses/greeting'
Then it should take at least '2' seconds