mirage 3.0.13 → 3.0.14
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.
- checksums.yaml +8 -8
- metadata +1 -75
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
- data/.simplecov +0 -6
- data/.travis.yml +0 -4
- data/Gemfile +0 -27
- data/Gemfile.lock +0 -142
- data/HISTORY +0 -24
- data/Rakefile +0 -10
- data/VERSION +0 -1
- data/features/.nav +0 -29
- data/features/client/clear.feature +0 -78
- data/features/client/configure.feature +0 -72
- data/features/client/model.feature +0 -95
- data/features/client/preview_responses.feature +0 -33
- data/features/client/prime.feature +0 -32
- data/features/client/put.feature +0 -111
- data/features/client/readme.md +0 -3
- data/features/client/requests.feature +0 -20
- data/features/client/running.feature +0 -51
- data/features/client/save_and_revert.feature +0 -39
- data/features/client/start.feature +0 -46
- data/features/client/stop.feature +0 -53
- data/features/commandline_interface/help.feature +0 -17
- data/features/commandline_interface/readme.md +0 -1
- data/features/commandline_interface/start.feature +0 -18
- data/features/commandline_interface/stop.feature +0 -42
- data/features/logging.feature +0 -6
- data/features/prime.feature +0 -35
- data/features/readme.md +0 -7
- data/features/requests/delete.feature +0 -48
- data/features/requests/get.feature +0 -36
- data/features/save_and_revert.feature +0 -35
- data/features/step_definitions/my_steps.rb +0 -97
- data/features/step_definitions/observation_steps.rb +0 -102
- data/features/support/command_line.rb +0 -37
- data/features/support/env.rb +0 -22
- data/features/support/hooks.rb +0 -26
- data/features/support/mirage.rb +0 -12
- data/features/support/web.rb +0 -19
- data/features/templates/delete.feature +0 -45
- data/features/templates/get.feature +0 -54
- data/features/templates/path_wildcards.feature +0 -10
- data/features/templates/preview.feature +0 -18
- data/features/templates/put.feature +0 -77
- data/features/templates/put_with_substitutions.feature +0 -22
- data/features/templates/readme.md +0 -4
- data/features/templates/required_content.feature +0 -113
- data/features/web_user_interface.feature +0 -44
- data/full_build.sh +0 -100
- data/mirage.gemspec +0 -174
- data/spec/mirage/client/cli_bridge_spec.rb +0 -63
- data/spec/mirage/client/client_spec.rb +0 -179
- data/spec/mirage/client/helpers/method_builder_spec.rb +0 -48
- data/spec/mirage/client/request_spec.rb +0 -44
- data/spec/mirage/client/requests_spec.rb +0 -9
- data/spec/mirage/client/runner_spec.rb +0 -138
- data/spec/mirage/client/template/configuration_spec.rb +0 -32
- data/spec/mirage/client/template/model/common_methods_spec.rb +0 -25
- data/spec/mirage/client/template/model/instance_methods_spec.rb +0 -169
- data/spec/mirage/client/template/model_spec.rb +0 -119
- data/spec/mirage/client/template_spec.rb +0 -146
- data/spec/mirage/client/templates_spec.rb +0 -197
- data/spec/mirage/wait_methods_spec.rb +0 -42
- data/spec/resources/binary.file +0 -0
- data/spec/server/binary_data_checker_spec.rb +0 -21
- data/spec/server/helpers/http_headers_spec.rb +0 -20
- data/spec/server/helpers/template_requirements_spec.rb +0 -34
- data/spec/server/mock_response_set_spec.rb +0 -57
- data/spec/server/mock_response_spec.rb +0 -577
- data/spec/server/server_spec.rb +0 -156
- data/spec/spec_helper.rb +0 -85
- data/tasks/application.rake +0 -7
- data/tasks/packaging.rake +0 -28
- data/tasks/tests.rake +0 -25
@@ -1,197 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'mirage/client'
|
3
|
-
|
4
|
-
describe 'templates' do
|
5
|
-
|
6
|
-
|
7
|
-
describe 'deleting' do
|
8
|
-
it 'should delete all templates and associated request data' do
|
9
|
-
base_url = "base_url"
|
10
|
-
requests = double('requests')
|
11
|
-
Requests.should_receive(:new).with(base_url).and_return(requests)
|
12
|
-
|
13
|
-
Templates.should_receive(:delete).with("#{base_url}/templates")
|
14
|
-
requests.should_receive(:delete_all)
|
15
|
-
|
16
|
-
Templates.new(base_url).delete_all
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe 'setting default config' do
|
21
|
-
|
22
|
-
it 'should preset configuration for templates' do
|
23
|
-
Template.stub(:put).and_return(convert_keys_to_strings({:id => 1}))
|
24
|
-
templates = Templates.new "base_url"
|
25
|
-
|
26
|
-
http_method = :post
|
27
|
-
status = 202
|
28
|
-
default = true
|
29
|
-
delay = 2
|
30
|
-
content_type = "text/xml"
|
31
|
-
|
32
|
-
templates.default_config do
|
33
|
-
http_method http_method
|
34
|
-
status status
|
35
|
-
default default
|
36
|
-
delay delay
|
37
|
-
content_type content_type
|
38
|
-
end
|
39
|
-
|
40
|
-
template = templates.put('greeting', 'hello')
|
41
|
-
|
42
|
-
template.http_method.should == http_method
|
43
|
-
template.status.should == status
|
44
|
-
template.default.should == default
|
45
|
-
template.delay.should == delay
|
46
|
-
template.content_type.should == content_type
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'should fall over to methods on the caller if the method does not exist on the configuration object' do
|
50
|
-
templates_wrapper = Class.new do
|
51
|
-
def initialize
|
52
|
-
@templates = Templates.new "base_url"
|
53
|
-
@outer_method_called = false
|
54
|
-
end
|
55
|
-
|
56
|
-
def outer_method_call
|
57
|
-
@outer_method_called = true
|
58
|
-
end
|
59
|
-
|
60
|
-
|
61
|
-
def outer_method_called?
|
62
|
-
@outer_method_called
|
63
|
-
end
|
64
|
-
|
65
|
-
def test
|
66
|
-
@templates.default_config do
|
67
|
-
outer_method_call
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
|
73
|
-
wrapper = templates_wrapper.new
|
74
|
-
|
75
|
-
wrapper.test
|
76
|
-
wrapper.outer_method_called?.should == true
|
77
|
-
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe 'putting templates' do
|
82
|
-
|
83
|
-
|
84
|
-
endpoint = "greeting"
|
85
|
-
value = "hello"
|
86
|
-
let(:base_url) { "base_url" }
|
87
|
-
let!(:templates) { Templates.new(base_url) }
|
88
|
-
let!(:model_class) do
|
89
|
-
Class.new do
|
90
|
-
extend Template::Model
|
91
|
-
endpoint endpoint
|
92
|
-
|
93
|
-
def create
|
94
|
-
self
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
|
100
|
-
context 'model as parameter' do
|
101
|
-
let!(:endpoint) { 'endpoint' }
|
102
|
-
|
103
|
-
before :each do
|
104
|
-
@base_url = "base_url"
|
105
|
-
@templates = Templates.new(@base_url)
|
106
|
-
end
|
107
|
-
it 'should take a model as a parameter' do
|
108
|
-
template = model_class.new
|
109
|
-
template = @templates.put template
|
110
|
-
template.endpoint.should == "#{@base_url}/templates/#{endpoint}"
|
111
|
-
end
|
112
|
-
|
113
|
-
it 'should prepend base url to the endpoint unless it is set already' do
|
114
|
-
original_template = model_class.new
|
115
|
-
stored_template = @templates.put original_template
|
116
|
-
stored_template.endpoint.should == "#{@base_url}/templates/#{endpoint}"
|
117
|
-
stored_template = @templates.put original_template
|
118
|
-
stored_template.endpoint.should == "#{@base_url}/templates/#{endpoint}"
|
119
|
-
end
|
120
|
-
|
121
|
-
it 'should fall over to methods on the caller if the method does not exist on the template object' do
|
122
|
-
template_wrapper = Class.new do
|
123
|
-
def initialize
|
124
|
-
@templates = Templates.new "base_url"
|
125
|
-
@outer_method_called = false
|
126
|
-
end
|
127
|
-
|
128
|
-
def outer_method_call
|
129
|
-
@outer_method_called = true
|
130
|
-
end
|
131
|
-
|
132
|
-
def outer_method_called?
|
133
|
-
@outer_method_called
|
134
|
-
end
|
135
|
-
|
136
|
-
def test
|
137
|
-
template = Template.new 'endpoint'
|
138
|
-
Template.should_receive(:new).and_return template
|
139
|
-
template.stub(:create).and_return(template)
|
140
|
-
@templates.put('endpoint', 'value') do |response|
|
141
|
-
outer_method_call
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
wrapper = template_wrapper.new
|
147
|
-
|
148
|
-
template = wrapper.test
|
149
|
-
wrapper.outer_method_called?.should == true
|
150
|
-
template.caller_binding.should == nil
|
151
|
-
|
152
|
-
end
|
153
|
-
|
154
|
-
|
155
|
-
end
|
156
|
-
|
157
|
-
context 'endpoint and value as parameters' do
|
158
|
-
before :each do
|
159
|
-
@base_url = "base_url"
|
160
|
-
@templates = Templates.new(@base_url)
|
161
|
-
|
162
|
-
@template_mock = double('template')
|
163
|
-
Template.should_receive(:new).with("#{@base_url}/templates/#{endpoint}", value, @templates.default_config).and_return(@template_mock)
|
164
|
-
@template_mock.should_receive(:create)
|
165
|
-
end
|
166
|
-
|
167
|
-
it 'should create a template' do
|
168
|
-
@templates.put(endpoint, value)
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
context 'endpoint and model as parameters' do
|
173
|
-
it 'should put the given template on the given endpoint' do
|
174
|
-
@base_url = "base_url"
|
175
|
-
@templates = Templates.new(@base_url)
|
176
|
-
|
177
|
-
template = model_class.new
|
178
|
-
template = @templates.put 'greeting', template
|
179
|
-
template.endpoint.should == "#{@base_url}/templates/greeting"
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
describe 'block parameter that can be used for template customisation' do
|
184
|
-
it 'it is called in the context of the template' do
|
185
|
-
template = Template.new('', '')
|
186
|
-
template.stub(:create)
|
187
|
-
Template.should_receive(:new).and_return(template)
|
188
|
-
templates.put(endpoint, value) do
|
189
|
-
status 404
|
190
|
-
end
|
191
|
-
template.status.should == 404
|
192
|
-
end
|
193
|
-
|
194
|
-
end
|
195
|
-
|
196
|
-
end
|
197
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'mirage/wait_methods'
|
2
|
-
module Mirage
|
3
|
-
describe WaitMethods do
|
4
|
-
subject do
|
5
|
-
Object.new.tap do |o|
|
6
|
-
o.extend(described_class)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
let(:default_options) { { timeout_after: 0.1, retry_every: 0.05 } }
|
11
|
-
|
12
|
-
it 'waits until the prescribed thing has happened' do
|
13
|
-
expect { subject.wait_until(default_options) { true } }.to_not raise_exception
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'should keep trying for a specified period' do
|
17
|
-
start_time = Time.now
|
18
|
-
|
19
|
-
expect { subject.wait_until(default_options) { false } }.to raise_exception TimeoutException
|
20
|
-
|
21
|
-
expect(Time.now - default_options[:timeout_after]).to be > start_time
|
22
|
-
end
|
23
|
-
|
24
|
-
context 'timeout_after specified' do
|
25
|
-
it 'throws an exception if when the prescribed action does not happen in time' do
|
26
|
-
expect { subject.wait_until(default_options) { false } }.to raise_error TimeoutException
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'retry time specified' do
|
31
|
-
it 'retries at the given interval' do
|
32
|
-
count = 0
|
33
|
-
expect do
|
34
|
-
subject.wait_until(timeout_after: default_options[:timeout_after] * 2, retry_every: 0.1) do
|
35
|
-
count += 1
|
36
|
-
end
|
37
|
-
end.to raise_exception TimeoutException
|
38
|
-
expect(count).to eq(2)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
data/spec/resources/binary.file
DELETED
Binary file
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'binary_data_checker'
|
3
|
-
|
4
|
-
|
5
|
-
describe Mirage::BinaryDataChecker do
|
6
|
-
include_context :resources
|
7
|
-
it 'should find binary data' do
|
8
|
-
BinaryDataChecker.contains_binary_data?(File.read("#{resources_dir}/binary.file")).should == true
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'should not find binary data' do
|
12
|
-
BinaryDataChecker.contains_binary_data?("string").should == false
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'should clean up the temporary file created when checking string content' do
|
16
|
-
tmpfile = Tempfile.new("file")
|
17
|
-
Tempfile.should_receive(:new).and_return tmpfile
|
18
|
-
FileUtils.should_receive(:rm).with(tmpfile.path)
|
19
|
-
BinaryDataChecker.contains_binary_data?("string")
|
20
|
-
end
|
21
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'helpers/http_headers'
|
3
|
-
describe Mirage::Server::Helpers::HttpHeaders do
|
4
|
-
describe '#extract_http_headers' do
|
5
|
-
it 'returns content-type' do
|
6
|
-
helpers = Object.new
|
7
|
-
helpers.extend(described_class)
|
8
|
-
expected = {'CONTENT_TYPE' => 'application/json'}
|
9
|
-
expect(helpers.extract_http_headers(expected)['Content-Type']).to eq('application/json')
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'returns content-length' do
|
13
|
-
helpers = Object.new
|
14
|
-
helpers.extend(described_class)
|
15
|
-
expected = {'CONTENT_LENGTH' => '10'}
|
16
|
-
expect(helpers.extract_http_headers(expected)['Content-Length']).to eq('10')
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'sinatra'
|
3
|
-
require 'helpers/template_requirements'
|
4
|
-
|
5
|
-
|
6
|
-
describe "helpers" do
|
7
|
-
include_context :resources
|
8
|
-
|
9
|
-
before :each do
|
10
|
-
@helper = Object.new
|
11
|
-
@helper.extend(Mirage::Server::Helpers::TemplateRequirements)
|
12
|
-
end
|
13
|
-
|
14
|
-
describe 'converting raw parameter requirements' do
|
15
|
-
it 'should split on split on the (:) to derive the required parameter and value' do
|
16
|
-
@helper.convert_raw_required_params(%w(name:leon)).should == {'name' => 'leon'}
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'should store regular expression matcher' do
|
20
|
-
@helper.convert_raw_required_params(%w(name:%r{.*eon})).should == {'name' => /.*eon/}
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe 'converting raw body content requirements' do
|
25
|
-
it 'should extract plan text requirements' do
|
26
|
-
@helper.convert_raw_required_body_content_requirements(%w(leon)).should == %w(leon)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should extract plan requirements in the form of a regexp' do
|
30
|
-
@helper.convert_raw_required_body_content_requirements(%w(%r{.*eon})).should == [/.*eon/]
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
@@ -1,57 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'mock_response_set'
|
3
|
-
describe Mirage::MockResponseSet do
|
4
|
-
|
5
|
-
it 'extends Hash' do
|
6
|
-
expect(subject).to be_a(Hash)
|
7
|
-
end
|
8
|
-
describe '#fuzzy_find' do
|
9
|
-
|
10
|
-
let(:expected_greeting){'hello'}
|
11
|
-
let(:greeting_key){'/greeting'}
|
12
|
-
|
13
|
-
subject do
|
14
|
-
described_class.new.tap do |subject|
|
15
|
-
subject[greeting_key] = expected_greeting
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context 'key is not a regex' do
|
20
|
-
context 'input is the same' do
|
21
|
-
it 'returns the stored value' do
|
22
|
-
expect(subject.fuzzy_find(greeting_key)).to eq(expected_greeting)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context 'input is different' do
|
27
|
-
it 'returns nil' do
|
28
|
-
expect(subject.fuzzy_find('/salutation')).to eq(nil)
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
context 'key is a regular expression' do
|
36
|
-
subject do
|
37
|
-
described_class.new.tap do |subject|
|
38
|
-
subject[%r{.*ting}] = expected_greeting
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'input is matches regex' do
|
43
|
-
it 'returns the stored value' do
|
44
|
-
expect(subject.fuzzy_find(greeting_key)).to eq(expected_greeting)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'input does not match regex' do
|
49
|
-
it 'returns nil' do
|
50
|
-
subject[%r{.*ting}] = expected_greeting
|
51
|
-
expect(subject.fuzzy_find('/salutation')).to eq(nil)
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
@@ -1,577 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'extensions/object'
|
3
|
-
require 'extensions/hash'
|
4
|
-
require 'mock_response'
|
5
|
-
|
6
|
-
describe Mirage::MockResponse do
|
7
|
-
|
8
|
-
before :each do
|
9
|
-
MockResponse.delete_all
|
10
|
-
end
|
11
|
-
|
12
|
-
describe 'initialisation' do
|
13
|
-
it 'should find binary data' do
|
14
|
-
string="string"
|
15
|
-
response_spec = convert_keys_to_strings({:response => {:body => string}})
|
16
|
-
BinaryDataChecker.should_receive(:contains_binary_data?).with(string).and_return(true)
|
17
|
-
MockResponse.new("greeting", response_spec).binary?.should == true
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'should not find binary data' do
|
21
|
-
string="string"
|
22
|
-
response_spec = convert_keys_to_strings({:response => {:body => string}})
|
23
|
-
BinaryDataChecker.should_receive(:contains_binary_data?).with(string).and_return(false)
|
24
|
-
MockResponse.new("greeting", response_spec).binary?.should == false
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe 'defaults' do
|
29
|
-
describe 'request' do
|
30
|
-
it 'should default http_method' do
|
31
|
-
MockResponse.new("greeting", {}).request_spec['http_method'].should == "get"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe 'response' do
|
36
|
-
|
37
|
-
it 'should default content_type' do
|
38
|
-
MockResponse.new("greeting", {}).response_spec['content_type'].should == "text/plain"
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'should default status code' do
|
42
|
-
MockResponse.new("greeting", {}).response_spec['status'].should == 200
|
43
|
-
end
|
44
|
-
it 'should default delay' do
|
45
|
-
MockResponse.new("greeting", {}).response_spec['delay'].should == 0
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'should default default' do
|
49
|
-
MockResponse.new("greeting", {}).response_spec['default'].should == false
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
describe 'saving state' do
|
55
|
-
it 'should store the current set of responses' do
|
56
|
-
greeting = MockResponse.new("greeting")
|
57
|
-
farewell = MockResponse.new("farewell")
|
58
|
-
|
59
|
-
MockResponse.backup
|
60
|
-
MockResponse.new("farewell", "cheerio")
|
61
|
-
MockResponse.revert
|
62
|
-
|
63
|
-
MockResponse.all.should == [greeting, farewell]
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
describe "response values" do
|
68
|
-
|
69
|
-
it 'should return any headers set' do
|
70
|
-
headers = {
|
71
|
-
'header' => 'value'
|
72
|
-
}
|
73
|
-
response_spec = convert_keys_to_strings({:response => {:headers => headers}})
|
74
|
-
MockResponse.new("greeting", response_spec).headers.should == headers
|
75
|
-
end
|
76
|
-
|
77
|
-
it 'should return the response value' do
|
78
|
-
response_spec = convert_keys_to_strings({:response => {:body => Base64.encode64("hello")}})
|
79
|
-
MockResponse.new("greeting", response_spec).value.should == "hello"
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'should return if the value contains binary data' do
|
83
|
-
response_spec = convert_keys_to_strings({:response => {:body => Base64.encode64("hello ${name}")}})
|
84
|
-
BinaryDataChecker.should_receive(:contains_binary_data?).and_return(true)
|
85
|
-
response = MockResponse.new("greeting", response_spec)
|
86
|
-
|
87
|
-
response.value("", {"name" => "leon"}).should == "hello ${name}"
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'should replace patterns with values found in request parameters' do
|
91
|
-
response_spec = convert_keys_to_strings({:response => {:body => Base64.encode64("hello ${name}")}})
|
92
|
-
MockResponse.new("greeting", response_spec).value("", {"name" => "leon"}).should == "hello leon"
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'should base64 decode values' do
|
96
|
-
response_spec = convert_keys_to_strings({:response => {:body => "encoded value"}})
|
97
|
-
Base64.should_receive(:decode64).and_return("decoded value")
|
98
|
-
MockResponse.new("greeting", response_spec).value("")
|
99
|
-
end
|
100
|
-
|
101
|
-
it 'should replace patterns with values found in the body' do
|
102
|
-
response_spec = convert_keys_to_strings({:response => {:body => Base64.encode64("hello ${name>(.*?)<}")}})
|
103
|
-
MockResponse.new("greeting", response_spec).value("<name>leon</name>").should == "hello leon"
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
describe "Matching http method" do
|
108
|
-
it 'should find the response with the correct http method' do
|
109
|
-
response_spec = convert_keys_to_strings({:request => {:http_method => "post"}})
|
110
|
-
response = MockResponse.new("greeting", response_spec)
|
111
|
-
|
112
|
-
options = {:body => "", :params => {}, :endpoint => "greeting", :http_method => "post", :headers => {}}
|
113
|
-
MockResponse.find(options).should == response
|
114
|
-
options[:http_method] = "get"
|
115
|
-
expect { MockResponse.find(options) }.to raise_error(ServerResponseNotFound)
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
describe 'Finding by id' do
|
120
|
-
it 'should find a response given its id' do
|
121
|
-
response1 = MockResponse.new("greeting", "hello")
|
122
|
-
MockResponse.new("farewell", "goodbye")
|
123
|
-
MockResponse.find_by_id(response1.response_id).should == response1
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
describe 'deleting' do
|
128
|
-
|
129
|
-
it 'should delete a response given its id' do
|
130
|
-
response1 = MockResponse.new("greeting", "hello")
|
131
|
-
MockResponse.delete(response1.response_id)
|
132
|
-
expect { MockResponse.find_by_id(response1.response_id) }.to raise_error(ServerResponseNotFound)
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'should delete all responses' do
|
136
|
-
MockResponse.new("greeting", "hello")
|
137
|
-
MockResponse.new("farewell", "goodbye")
|
138
|
-
MockResponse.delete_all
|
139
|
-
MockResponse.all.size.should == 0
|
140
|
-
end
|
141
|
-
|
142
|
-
end
|
143
|
-
|
144
|
-
describe 'matching' do
|
145
|
-
it 'should convert requirements in to strings before matching' do
|
146
|
-
requirement = 1234
|
147
|
-
spec = convert_keys_to_strings(
|
148
|
-
{
|
149
|
-
:request => {
|
150
|
-
:parameters => {:number => requirement},
|
151
|
-
:body_content => [requirement],
|
152
|
-
:headers => {:number => requirement}
|
153
|
-
},
|
154
|
-
:response => {
|
155
|
-
:body => 'response'
|
156
|
-
}
|
157
|
-
|
158
|
-
}
|
159
|
-
)
|
160
|
-
|
161
|
-
MockResponse.new("greeting", spec)
|
162
|
-
options = {:headers => {'number' => '1234'},
|
163
|
-
:params => {'number' => "1234"},
|
164
|
-
:endpoint => "greeting",
|
165
|
-
:http_method => "get",
|
166
|
-
:body => "1234", }
|
167
|
-
|
168
|
-
expect { MockResponse.find(options) }.to_not raise_error
|
169
|
-
end
|
170
|
-
|
171
|
-
describe "matching on request parameters" do
|
172
|
-
it 'should find the response if all required parameters are present' do
|
173
|
-
get_spec = convert_keys_to_strings(
|
174
|
-
{
|
175
|
-
:request => {
|
176
|
-
:http_method => "get",
|
177
|
-
:parameters => {
|
178
|
-
:firstname => "leon"
|
179
|
-
}
|
180
|
-
},
|
181
|
-
:response => {
|
182
|
-
:body => Base64.encode64("get response")
|
183
|
-
}
|
184
|
-
}
|
185
|
-
)
|
186
|
-
|
187
|
-
post_spec = convert_keys_to_strings(
|
188
|
-
{
|
189
|
-
:request => {
|
190
|
-
:http_method => "post",
|
191
|
-
:parameters => {
|
192
|
-
:firstname => "leon"
|
193
|
-
}
|
194
|
-
},
|
195
|
-
:response => {
|
196
|
-
:body => Base64.encode64("post response")
|
197
|
-
}
|
198
|
-
}
|
199
|
-
)
|
200
|
-
get_response = MockResponse.new("greeting", get_spec)
|
201
|
-
post_response = MockResponse.new("greeting", post_spec)
|
202
|
-
|
203
|
-
options = {:body => "", :params => {"firstname" => "leon"}, :endpoint => "greeting", :http_method => "post", :headers => {}}
|
204
|
-
|
205
|
-
MockResponse.find(options).should == post_response
|
206
|
-
MockResponse.find(options.merge(:http_method => "get")).should == get_response
|
207
|
-
end
|
208
|
-
|
209
|
-
it 'should match request parameter values using regexps' do
|
210
|
-
response_spec = convert_keys_to_strings(
|
211
|
-
{
|
212
|
-
:request => {
|
213
|
-
:parameters => {:firstname => "%r{leon.*}"}
|
214
|
-
},
|
215
|
-
:response => {
|
216
|
-
:body => 'response'
|
217
|
-
}
|
218
|
-
|
219
|
-
}
|
220
|
-
)
|
221
|
-
response = MockResponse.new("greeting", response_spec)
|
222
|
-
|
223
|
-
options = {:body => "", :params => {"firstname" => "leon"}, :endpoint => "greeting", :http_method => "get", :headers => {}}
|
224
|
-
MockResponse.find(options).should == response
|
225
|
-
MockResponse.find(options.merge(:params => {"firstname" => "leonard"})).should == response
|
226
|
-
expect { MockResponse.find(options.merge(:params => {"firstname" => "leo"})) }.to raise_error(ServerResponseNotFound)
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
describe 'matching request uri' do
|
231
|
-
it 'should match using wild cards' do
|
232
|
-
response_spec = convert_keys_to_strings(
|
233
|
-
{
|
234
|
-
:response => {
|
235
|
-
:body => 'response'
|
236
|
-
}
|
237
|
-
|
238
|
-
}
|
239
|
-
)
|
240
|
-
response = MockResponse.new('greeting/*/ashley/*', response_spec)
|
241
|
-
MockResponse.find(:params => {}, :headers => {}, :http_method => "get", endpoint: 'greeting/leon/ashley/davis').should == response
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
describe 'matching against request http_headers' do
|
246
|
-
it 'should match using literals' do
|
247
|
-
required_headers = {
|
248
|
-
'HEADER-1' => 'value1',
|
249
|
-
'HEADER-2' => 'value2'
|
250
|
-
}
|
251
|
-
spec = convert_keys_to_strings(
|
252
|
-
{
|
253
|
-
:request => {
|
254
|
-
:headers => required_headers
|
255
|
-
},
|
256
|
-
:response => {
|
257
|
-
:body => 'response'
|
258
|
-
}
|
259
|
-
|
260
|
-
}
|
261
|
-
)
|
262
|
-
response = MockResponse.new("greeting", spec)
|
263
|
-
|
264
|
-
options = {:body => "<name>leon</name>", :params => {}, :endpoint => "greeting", :http_method => "get", :headers => required_headers}
|
265
|
-
MockResponse.find(options).should == response
|
266
|
-
expect { MockResponse.find(options.merge(:headers => {})) }.to raise_error(ServerResponseNotFound)
|
267
|
-
|
268
|
-
end
|
269
|
-
|
270
|
-
it 'should match using regex' do
|
271
|
-
required_headers = {
|
272
|
-
'CONTENT-TYPE' => '%r{.*/json}',
|
273
|
-
}
|
274
|
-
spec = convert_keys_to_strings(
|
275
|
-
{
|
276
|
-
:request => {
|
277
|
-
:headers => required_headers
|
278
|
-
},
|
279
|
-
:response => {
|
280
|
-
:body => 'response'
|
281
|
-
}
|
282
|
-
|
283
|
-
}
|
284
|
-
)
|
285
|
-
response = MockResponse.new("greeting", spec)
|
286
|
-
|
287
|
-
options = {:body => "<name>leon</name>", :params => {}, :endpoint => "greeting", :http_method => "get", :headers => {'CONTENT-TYPE' => 'application/json'}}
|
288
|
-
MockResponse.find(options).should == response
|
289
|
-
expect { MockResponse.find(options.merge(:headers => {'CONTENT-TYPE' => 'text/xml'})) }.to raise_error(ServerResponseNotFound)
|
290
|
-
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
describe 'matching against the request body' do
|
295
|
-
it 'should match required fragments in the request body' do
|
296
|
-
|
297
|
-
response_spec = convert_keys_to_strings(
|
298
|
-
{
|
299
|
-
:request => {
|
300
|
-
:body_content => %w(leon)
|
301
|
-
},
|
302
|
-
:response => {
|
303
|
-
:body => 'response'
|
304
|
-
}
|
305
|
-
|
306
|
-
}
|
307
|
-
)
|
308
|
-
|
309
|
-
response = MockResponse.new("greeting", response_spec)
|
310
|
-
|
311
|
-
options = {:body => "<name>leon</name>", :params => {}, :endpoint => "greeting", :http_method => "get", :headers => {}}
|
312
|
-
|
313
|
-
MockResponse.find(options).should == response
|
314
|
-
expect { MockResponse.find(options.merge(:body => "<name>jeff</name>")) }.to raise_error(ServerResponseNotFound)
|
315
|
-
end
|
316
|
-
|
317
|
-
it 'should use regexs to match required fragements in the request body' do
|
318
|
-
response_spec = convert_keys_to_strings(
|
319
|
-
{
|
320
|
-
:request => {
|
321
|
-
:body_content => %w(%r{leon.*})
|
322
|
-
},
|
323
|
-
:response => {
|
324
|
-
:body => 'response'
|
325
|
-
}
|
326
|
-
|
327
|
-
}
|
328
|
-
)
|
329
|
-
|
330
|
-
response = MockResponse.new("greeting", response_spec)
|
331
|
-
|
332
|
-
|
333
|
-
options = {:body => "<name>leon</name>", :params => {}, :endpoint => "greeting", :http_method => "get", :headers => {}}
|
334
|
-
MockResponse.find(options).should == response
|
335
|
-
MockResponse.find(options.merge(:body => "<name>leonard</name>")).should == response
|
336
|
-
expect { MockResponse.find(options.merge(:body => "<name>jeff</name>")) }.to raise_error(ServerResponseNotFound)
|
337
|
-
end
|
338
|
-
end
|
339
|
-
end
|
340
|
-
|
341
|
-
it 'should be equal to another response that is the same not including the response value' do
|
342
|
-
|
343
|
-
spec = convert_keys_to_strings({:response => {:body => "hello1",
|
344
|
-
:content_type => "text/xml",
|
345
|
-
:status => 202,
|
346
|
-
:delay => 1.0,
|
347
|
-
:default => true,
|
348
|
-
:file => false}
|
349
|
-
|
350
|
-
})
|
351
|
-
|
352
|
-
response = MockResponse.new("greeting", spec)
|
353
|
-
response.should_not == MockResponse.new("greeting", {})
|
354
|
-
response.should == MockResponse.new("greeting", spec)
|
355
|
-
end
|
356
|
-
|
357
|
-
describe "scoring to represent the specificity of a response" do
|
358
|
-
|
359
|
-
it 'should score an exact requirement match at 2' do
|
360
|
-
response_spec = convert_keys_to_strings(
|
361
|
-
{
|
362
|
-
:request => {
|
363
|
-
:parameters => {:firstname => "leon"}
|
364
|
-
},
|
365
|
-
:response => {
|
366
|
-
:body => 'response'
|
367
|
-
}
|
368
|
-
|
369
|
-
}
|
370
|
-
)
|
371
|
-
MockResponse.new("greeting", response_spec).score.should == 2
|
372
|
-
|
373
|
-
response_spec = convert_keys_to_strings(
|
374
|
-
{
|
375
|
-
:request => {
|
376
|
-
:body_content => %w(login)
|
377
|
-
},
|
378
|
-
:response => {
|
379
|
-
:body => 'response'
|
380
|
-
}
|
381
|
-
|
382
|
-
}
|
383
|
-
)
|
384
|
-
MockResponse.new("greeting", response_spec).score.should == 2
|
385
|
-
|
386
|
-
response_spec = convert_keys_to_strings(
|
387
|
-
{
|
388
|
-
:request => {
|
389
|
-
:headers => {'header' => 'header'}
|
390
|
-
},
|
391
|
-
:response => {
|
392
|
-
:body => 'response'
|
393
|
-
}
|
394
|
-
|
395
|
-
}
|
396
|
-
)
|
397
|
-
MockResponse.new("greeting", response_spec).score.should == 2
|
398
|
-
end
|
399
|
-
|
400
|
-
it 'should score a match found by regexp at 1' do
|
401
|
-
|
402
|
-
response_spec = convert_keys_to_strings(
|
403
|
-
{
|
404
|
-
:request => {
|
405
|
-
:parameters => {:firstname => "%r{leon.*}"}
|
406
|
-
},
|
407
|
-
:response => {
|
408
|
-
:body => 'response'
|
409
|
-
}
|
410
|
-
|
411
|
-
}
|
412
|
-
)
|
413
|
-
MockResponse.new("greeting", response_spec).score.should == 1
|
414
|
-
|
415
|
-
response_spec = convert_keys_to_strings(
|
416
|
-
{
|
417
|
-
:request => {
|
418
|
-
:body_content => %w(%r{input|output})
|
419
|
-
},
|
420
|
-
:response => {
|
421
|
-
:body => 'response'
|
422
|
-
}
|
423
|
-
|
424
|
-
}
|
425
|
-
)
|
426
|
-
MockResponse.new("greeting", response_spec).score.should == 1
|
427
|
-
|
428
|
-
response_spec = convert_keys_to_strings(
|
429
|
-
{
|
430
|
-
:request => {
|
431
|
-
:headers => {'header' => '%r{.*blah}'}
|
432
|
-
},
|
433
|
-
:response => {
|
434
|
-
:body => 'response'
|
435
|
-
}
|
436
|
-
|
437
|
-
}
|
438
|
-
)
|
439
|
-
MockResponse.new("greeting", response_spec).score.should == 1
|
440
|
-
end
|
441
|
-
|
442
|
-
it 'should find the most specific response' do
|
443
|
-
default_response_spec = convert_keys_to_strings(
|
444
|
-
{
|
445
|
-
:request => {
|
446
|
-
:body_content => %w(login)
|
447
|
-
},
|
448
|
-
:response => {
|
449
|
-
:body => 'default_response'
|
450
|
-
}
|
451
|
-
|
452
|
-
}
|
453
|
-
)
|
454
|
-
|
455
|
-
specific_response_spec = convert_keys_to_strings(
|
456
|
-
{
|
457
|
-
:request => {
|
458
|
-
:body_content => %w(login),
|
459
|
-
:parameters => {
|
460
|
-
:name => "leon"
|
461
|
-
}
|
462
|
-
},
|
463
|
-
:response => {
|
464
|
-
:body => 'specific response'
|
465
|
-
}
|
466
|
-
|
467
|
-
}
|
468
|
-
)
|
469
|
-
|
470
|
-
MockResponse.new("greeting", default_response_spec)
|
471
|
-
expected_response = MockResponse.new("greeting", specific_response_spec)
|
472
|
-
options = {:body => "<action>login</action>", :params => {"name" => "leon"}, :endpoint => "greeting", :http_method => "get", :headers => {}}
|
473
|
-
MockResponse.find(options).should == expected_response
|
474
|
-
end
|
475
|
-
end
|
476
|
-
|
477
|
-
|
478
|
-
it 'should all matching to be based on body content, request parameters and http method' do
|
479
|
-
response_spec = convert_keys_to_strings({
|
480
|
-
:request => {
|
481
|
-
:body_content => %w(login),
|
482
|
-
:parameters => {
|
483
|
-
:name => "leon"
|
484
|
-
},
|
485
|
-
:http_method => "post"
|
486
|
-
},
|
487
|
-
:response => {
|
488
|
-
:body => "response"
|
489
|
-
}
|
490
|
-
})
|
491
|
-
|
492
|
-
|
493
|
-
response = MockResponse.new("greeting", response_spec)
|
494
|
-
options = {:body => "<action>login</action>", :params => {"name" => "leon"}, :endpoint => "greeting", :http_method => "post", :headers => {}}
|
495
|
-
MockResponse.find(options).should == response
|
496
|
-
|
497
|
-
options[:http_method] = 'get'
|
498
|
-
expect { MockResponse.find(options) }.to raise_error(ServerResponseNotFound)
|
499
|
-
end
|
500
|
-
|
501
|
-
it 'should recycle response ids' do
|
502
|
-
response_spec = convert_keys_to_strings({
|
503
|
-
:request => {
|
504
|
-
:body_content => %w(login),
|
505
|
-
:parameters => {
|
506
|
-
:name => "leon"
|
507
|
-
},
|
508
|
-
:http_method => "post"
|
509
|
-
},
|
510
|
-
:response => {
|
511
|
-
:body => "response"
|
512
|
-
}
|
513
|
-
})
|
514
|
-
response1 = MockResponse.new("greeting", response_spec)
|
515
|
-
response_spec['response']['body'] = 'response2'
|
516
|
-
response2 = MockResponse.new("greeting", response_spec)
|
517
|
-
|
518
|
-
response1.response_id.should_not == nil
|
519
|
-
response1.response_id.should == response2.response_id
|
520
|
-
end
|
521
|
-
|
522
|
-
it 'should raise an exception when a response is not found' do
|
523
|
-
expect { MockResponse.find(:body => "<action>login</action>", :params => {:name => "leon"}, :endpoint => "greeting", :http_method => "post", :headers => {}) }.to raise_error(ServerResponseNotFound)
|
524
|
-
end
|
525
|
-
|
526
|
-
it 'should return all responses' do
|
527
|
-
MockResponse.new("greeting", convert_keys_to_strings({:response => {:body => "hello"}}))
|
528
|
-
MockResponse.new("greeting", convert_keys_to_strings({:request => {:body_content => %w(leon)}, :response => {:body => "hello leon"}}))
|
529
|
-
MockResponse.new("greeting", convert_keys_to_strings({:request => {:body_content => %w(leon), :http_method => "post"}, :response => {:body => "hello leon"}}))
|
530
|
-
MockResponse.new("deposit", convert_keys_to_strings({:request => {:body_content => %w(amount), :http_method => "post"}, :response => {:body => "received"}}))
|
531
|
-
MockResponse.all.size.should == 4
|
532
|
-
end
|
533
|
-
|
534
|
-
describe 'finding defaults' do
|
535
|
-
it 'most appropriate response under parent resource and same http method' do
|
536
|
-
level1_response = MockResponse.new("level1", convert_keys_to_strings({:response => {:body => "level1", :default => true}}))
|
537
|
-
MockResponse.new("level1/level2", convert_keys_to_strings({:response => {:body => "level2", :default => true}, :request => {:body_content => %w(body)}}))
|
538
|
-
MockResponse.find_default(:body => "", :http_method => "get", :endpoint => "level1/level2/level3", :params => {}, :headers => {}).should == level1_response
|
539
|
-
end
|
540
|
-
end
|
541
|
-
|
542
|
-
it 'should generate subdomains' do
|
543
|
-
MockResponse.subdomains("1/2/3").should == ["1/2/3", '1/2', '1']
|
544
|
-
end
|
545
|
-
|
546
|
-
it 'should generate a json representation of itself' do
|
547
|
-
endpoint = "greeting"
|
548
|
-
requests_url = "requests_url"
|
549
|
-
response_spec = convert_keys_to_strings({
|
550
|
-
:id => 1,
|
551
|
-
:endpoint => endpoint,
|
552
|
-
:requests_url => requests_url,
|
553
|
-
:request => {
|
554
|
-
:body_content => %w(login),
|
555
|
-
:parameters => {
|
556
|
-
:name => "leon"
|
557
|
-
},
|
558
|
-
:headers => {
|
559
|
-
:header => 'header'
|
560
|
-
},
|
561
|
-
:http_method => "post"
|
562
|
-
},
|
563
|
-
:response => {
|
564
|
-
:body => "response",
|
565
|
-
:delay => 0,
|
566
|
-
:content_type => 'text/plain',
|
567
|
-
:status => 200,
|
568
|
-
:default => false
|
569
|
-
}
|
570
|
-
})
|
571
|
-
|
572
|
-
mock_response = MockResponse.new(endpoint, response_spec)
|
573
|
-
mock_response.requests_url = requests_url
|
574
|
-
JSON.parse(mock_response.raw).should == response_spec
|
575
|
-
end
|
576
|
-
|
577
|
-
end
|