poisol 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/poisol/domain.rb +13 -11
- data/lib/poisol/server.rb +45 -37
- data/lib/poisol/stub/request/query_builder.rb +3 -1
- data/lib/poisol/stub/request/request_body_builder.rb +89 -87
- data/lib/poisol/stub/request/url_builder.rb +15 -12
- data/lib/poisol/stub/response/array_response_body.rb +75 -0
- data/lib/poisol/stub/response/response_body_builder.rb +49 -116
- data/lib/poisol/stub/response/status_builder.rb +2 -0
- data/lib/poisol/stub/stub.rb +22 -21
- data/lib/poisol/stub/stub_class_builder.rb +24 -23
- data/lib/poisol/stub/stub_instance.rb +62 -44
- data/lib/poisol/stub/webrick_stub_builder.rb +34 -32
- data/lib/poisol/stub_config/stub_config.rb +10 -8
- data/lib/poisol/stub_config/stub_config_builder.rb +91 -89
- data/lib/poisol/stub_factory.rb +39 -38
- data/lib/poisol/stub_mapper/request_matcher.rb +68 -0
- data/lib/poisol/stub_mapper/response_mapper.rb +33 -0
- data/lib/poisol/stub_mapper/stubs.rb +27 -0
- data/spec/functional/key_value/explicit_inclusion_spec.rb +15 -1
- data/spec/functional/key_value/implicit_inclusion_spec.rb +1 -1
- data/spec/functional/multi_domain_spec.rb +1 -1
- data/spec/functional/post_request_spec.rb +1 -2
- data/spec/functional/query/query_explicit_spec.rb +1 -1
- data/spec/functional/query/query_implicit_spec.rb +1 -1
- data/spec/functional/response/array_spec.rb +14 -7
- data/spec/functional/response/dumb_response_spec.rb +1 -1
- data/spec/functional/response/hash_params_spec.rb +1 -1
- data/spec/functional/response/nested_array_spec.rb +2 -2
- data/spec/functional/url_spec.rb +1 -1
- data/spec/spec_helper.rb +0 -1
- metadata +5 -3
- data/lib/poisol/response_mapper.rb +0 -31
- data/lib/poisol/stubs.rb +0 -74
@@ -0,0 +1,68 @@
|
|
1
|
+
module Poisol
|
2
|
+
module RequestMatcher
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def matches? actual_req,stub_req
|
6
|
+
type_matches?(actual_req,stub_req) &&
|
7
|
+
url_macthes?(actual_req,stub_req) &&
|
8
|
+
query_matches?(actual_req,stub_req) &&
|
9
|
+
body_matches?(actual_req,stub_req)
|
10
|
+
end
|
11
|
+
|
12
|
+
def type_matches? actual_req,stub_req
|
13
|
+
actual_req.type == stub_req.type
|
14
|
+
end
|
15
|
+
|
16
|
+
def url_macthes? actual_req,stub_req
|
17
|
+
actual_req.url == stub_req.url
|
18
|
+
end
|
19
|
+
|
20
|
+
def query_matches? actual_req,stub_req
|
21
|
+
return actual_req.query==stub_req.query
|
22
|
+
end
|
23
|
+
|
24
|
+
def body_matches? actual_req,stub_req
|
25
|
+
return true if actual_req.body == stub_req.body
|
26
|
+
actual_req_body = load_as_json actual_req.body
|
27
|
+
stub_req_body = load_as_json stub_req.body
|
28
|
+
return false unless actual_req_body.class == stub_req_body.class
|
29
|
+
return true if actual_req_body == stub_req_body
|
30
|
+
return matching_hashes? actual_req_body,stub_req_body if actual_req_body.is_a?(Hash)
|
31
|
+
return matching_array? actual_req_body,stub_req_body if actual_req_body.is_a?(Array)
|
32
|
+
end
|
33
|
+
|
34
|
+
def load_as_json input
|
35
|
+
begin
|
36
|
+
return Parse.json_to_hash input
|
37
|
+
rescue
|
38
|
+
return input
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def matching_hashes?(actuals, expected)
|
44
|
+
return false unless actuals.keys.sort == expected.keys.sort
|
45
|
+
actuals.each do |key, actual|
|
46
|
+
expected = expected[key]
|
47
|
+
|
48
|
+
if actual.is_a?(Hash) && expected.is_a?(Hash)
|
49
|
+
return false unless matching_hashes?(actual, expected)
|
50
|
+
else
|
51
|
+
return false unless expected === actual
|
52
|
+
end
|
53
|
+
end
|
54
|
+
true
|
55
|
+
end
|
56
|
+
|
57
|
+
def matching_array actuals,expected
|
58
|
+
return false unless actuals.size == expected.size
|
59
|
+
return actuals.sort == expected.sort unless actual[0].is_a(Hash)
|
60
|
+
expect = expected.clone
|
61
|
+
actuals.each do |actual|
|
62
|
+
match = expect.detect {|expected| matching_hashes? actual,expect}
|
63
|
+
return false if match.blank?
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Poisol
|
2
|
+
module ResponseMapper
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def map webrick_request
|
6
|
+
stub_request = get_stub_request webrick_request
|
7
|
+
PoisolLog.info stub_request.to_s
|
8
|
+
stub_response = get_stub_response stub_request
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_stub_request webrick_request
|
12
|
+
stub_request = Request.new
|
13
|
+
stub_request.type = webrick_request.request_method.downcase
|
14
|
+
uri = webrick_request.request_uri
|
15
|
+
stub_request.url = uri.query.blank? ? uri.to_s : uri.to_s.sub(uri.query,"").sub("?","")
|
16
|
+
stub_request.query = webrick_request.query_string
|
17
|
+
stub_request.body = webrick_request.body
|
18
|
+
stub_request
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def get_stub_response stub_request
|
23
|
+
stub = Stubs.get_match stub_request
|
24
|
+
if stub.blank?
|
25
|
+
PoisolLog.error "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^No match found for above request"
|
26
|
+
PoisolLog.error "Registered requests are: #{Stubs.all.map{|stub| "\n#{stub.request.to_s}"}.join}\n--end--"
|
27
|
+
raise "No match found for request: #{stub_request.to_s} "
|
28
|
+
end
|
29
|
+
return stub.response if stub.present?
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative './request_matcher'
|
2
|
+
module Poisol
|
3
|
+
module Stubs
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def all
|
7
|
+
@stubs
|
8
|
+
end
|
9
|
+
|
10
|
+
def add stub
|
11
|
+
@stubs = [] if @stubs.blank?
|
12
|
+
@stubs << stub
|
13
|
+
end
|
14
|
+
|
15
|
+
def reset
|
16
|
+
@stubs = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_match actual_request
|
20
|
+
return nil if @stubs.blank?
|
21
|
+
matches = @stubs.select{|stub| Poisol::RequestMatcher.matches? actual_request,stub.request}
|
22
|
+
return matches.present? ? matches[0] : nil
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
describe Stub, "#key_value" do
|
1
|
+
describe Poisol::Stub, "#key_value" do
|
2
2
|
|
3
3
|
it "partial dynamic request" do
|
4
4
|
Explicit.new.by_name("ram").build()
|
@@ -6,10 +6,24 @@ describe Stub, "#key_value" do
|
|
6
6
|
expect(response.body).to eq({"hi"=>1}.to_json)
|
7
7
|
end
|
8
8
|
|
9
|
+
it "partial hash param" do
|
10
|
+
Explicit.new.by(:name=>"ram").build()
|
11
|
+
response = RestClient.post "http://localhost:3030/explicit","name=ram"
|
12
|
+
expect(response.body).to eq({"hi"=>1}.to_json)
|
13
|
+
end
|
14
|
+
|
15
|
+
|
9
16
|
it "dynamic request" do
|
10
17
|
Explicit.new.by_name("ram").by_age(11).build()
|
11
18
|
response = RestClient.post "http://localhost:3030/explicit","name=ram&age=11"
|
12
19
|
expect(response.body).to eq({"hi"=>1}.to_json)
|
13
20
|
end
|
14
21
|
|
22
|
+
it "as hash param" do
|
23
|
+
Explicit.new.by(:name=>"ram",:age=>11).build()
|
24
|
+
response = RestClient.post "http://localhost:3030/explicit","name=ram&age=11"
|
25
|
+
expect(response.body).to eq({"hi"=>1}.to_json)
|
26
|
+
end
|
27
|
+
|
28
|
+
|
15
29
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
describe Stub, "#array" do
|
1
|
+
describe Poisol::Stub, "#array" do
|
2
2
|
|
3
|
-
it "
|
3
|
+
it "default column array" do
|
4
4
|
Columns.new.build
|
5
5
|
response = RestClient.get "http://localhost:3030/column"
|
6
|
-
expect(response.body).to eq("[]")
|
6
|
+
expect(response.body).to eq({"title"=>["independance"], "category"=>["10"]}.to_json)
|
7
7
|
end
|
8
8
|
|
9
9
|
it "column array" do
|
@@ -24,16 +24,23 @@ describe Stub, "#array" do
|
|
24
24
|
expect(response.body).to eq({"title"=>["abc", "c"], "category"=>["10","1"]}.to_json)
|
25
25
|
end
|
26
26
|
|
27
|
-
it "
|
27
|
+
it "default row array" do
|
28
28
|
Rows.new.build
|
29
29
|
response = RestClient.get "http://localhost:3030/row"
|
30
|
-
expect(response.body).to eq("[]")
|
30
|
+
expect(response.body).to eq([{"title"=>"independance","items"=> [1,2],"category"=>{"age_group"=>"10"}}].to_json)
|
31
31
|
end
|
32
32
|
|
33
33
|
it "row array" do
|
34
|
-
Rows.new.
|
34
|
+
Rows.new.
|
35
|
+
has_row.with_item(3).with_item(4).
|
36
|
+
has_row.with_item(3).with_item(4).
|
37
|
+
has_row.with_title("abc").with_category("age_group" => "12").with_items([2,3]).build
|
35
38
|
response = RestClient.get "http://localhost:3030/row"
|
36
|
-
expect(response.body).to eq([
|
39
|
+
expect(response.body).to eq([
|
40
|
+
{"title"=>"independance","items"=> [3,4],"category"=>{"age_group"=>"10"}},
|
41
|
+
{"title"=>"independance","items"=> [3,4],"category"=>{"age_group"=>"10"}},
|
42
|
+
{"title"=>"abc","items"=> [2,3],"category"=>{"age_group"=>"12"}}
|
43
|
+
].to_json)
|
37
44
|
end
|
38
45
|
|
39
46
|
it "row array hash_params" do
|
@@ -1,4 +1,4 @@
|
|
1
|
-
describe Stub, "#nested array" do
|
1
|
+
describe Poisol::Stub, "#nested array" do
|
2
2
|
|
3
3
|
it "empty" do
|
4
4
|
NestedArray.new.has_no_role.build()
|
@@ -25,7 +25,7 @@ describe Stub, "#nested array" do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
it "multiple fields with altered values" do
|
28
|
-
NestedArray.new.has_role.
|
28
|
+
NestedArray.new.has_role.has_role(:role_id=>"test").build()
|
29
29
|
response = RestClient.get "http://localhost:3030/nested_array"
|
30
30
|
expect(response.body).to eq({"title"=>"ind", "roles"=>[{"role_id"=>"chumma", "role_name"=>"sol"},{"role_id"=>"test", "role_name"=>"sol"}]}.to_json)
|
31
31
|
end
|
data/spec/functional/url_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: poisol
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Deepak
|
@@ -133,11 +133,11 @@ files:
|
|
133
133
|
- lib/poisol/domain.rb
|
134
134
|
- lib/poisol/extensions/hash.rb
|
135
135
|
- lib/poisol/extensions/webmock_extensions.rb
|
136
|
-
- lib/poisol/response_mapper.rb
|
137
136
|
- lib/poisol/server.rb
|
138
137
|
- lib/poisol/stub/request/query_builder.rb
|
139
138
|
- lib/poisol/stub/request/request_body_builder.rb
|
140
139
|
- lib/poisol/stub/request/url_builder.rb
|
140
|
+
- lib/poisol/stub/response/array_response_body.rb
|
141
141
|
- lib/poisol/stub/response/response_body_builder.rb
|
142
142
|
- lib/poisol/stub/response/status_builder.rb
|
143
143
|
- lib/poisol/stub/stub.rb
|
@@ -147,7 +147,9 @@ files:
|
|
147
147
|
- lib/poisol/stub_config/stub_config.rb
|
148
148
|
- lib/poisol/stub_config/stub_config_builder.rb
|
149
149
|
- lib/poisol/stub_factory.rb
|
150
|
-
- lib/poisol/
|
150
|
+
- lib/poisol/stub_mapper/request_matcher.rb
|
151
|
+
- lib/poisol/stub_mapper/response_mapper.rb
|
152
|
+
- lib/poisol/stub_mapper/stubs.rb
|
151
153
|
- lib/poisol/utils/file_util.rb
|
152
154
|
- lib/poisol/utils/logger.rb
|
153
155
|
- lib/poisol/utils/parse.rb
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module ResponseMapper
|
2
|
-
extend self
|
3
|
-
|
4
|
-
def map webrick_request
|
5
|
-
stub_request = get_stub_request webrick_request
|
6
|
-
PoisolLog.info stub_request.to_s
|
7
|
-
stub_response = get_stub_response stub_request
|
8
|
-
end
|
9
|
-
|
10
|
-
def get_stub_request webrick_request
|
11
|
-
stub_request = Request.new
|
12
|
-
stub_request.type = webrick_request.request_method.downcase
|
13
|
-
uri = webrick_request.request_uri
|
14
|
-
stub_request.url = uri.query.blank? ? uri.to_s : uri.to_s.sub(uri.query,"").sub("?","")
|
15
|
-
stub_request.query = webrick_request.query_string
|
16
|
-
stub_request.body = webrick_request.body
|
17
|
-
stub_request
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
def get_stub_response stub_request
|
22
|
-
stub = Stubs.get_match stub_request
|
23
|
-
if stub.blank?
|
24
|
-
PoisolLog.error "^^^^^^^^^^^^\nNo match found for above request"
|
25
|
-
PoisolLog.error "Registered requests are #{Stubs.all.map{|stub| "#{stub.request.to_s}\n"}.join}"
|
26
|
-
raise "No match found for request: #{stub_request.to_s} "
|
27
|
-
end
|
28
|
-
return stub.response if stub.present?
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
data/lib/poisol/stubs.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
module Stubs
|
2
|
-
extend self
|
3
|
-
|
4
|
-
def all
|
5
|
-
@stubs
|
6
|
-
end
|
7
|
-
|
8
|
-
def add stub
|
9
|
-
@stubs = [] if @stubs.blank?
|
10
|
-
@stubs << stub
|
11
|
-
end
|
12
|
-
|
13
|
-
def reset
|
14
|
-
@stubs = []
|
15
|
-
end
|
16
|
-
|
17
|
-
def get_match request
|
18
|
-
return nil if @stubs.blank?
|
19
|
-
matches = @stubs.select{|stub| stub.request.url == request.url }
|
20
|
-
matches = matches.select{|stub|query_matches?(request.query,stub.request.query)} if request.query.present? && matches.present?
|
21
|
-
matches = matches.select{|stub|body_matches? request.body,stub.request.body} if request.body.present? && matches.present?
|
22
|
-
return matches.present? ? matches[0] : nil
|
23
|
-
end
|
24
|
-
|
25
|
-
def query_matches? (actual,stub)
|
26
|
-
return false if stub.blank?
|
27
|
-
return actual==stub
|
28
|
-
end
|
29
|
-
|
30
|
-
def body_matches? (actual_request_body,stub_request_body)
|
31
|
-
return true if stub_request_body.present? && actual_request_body == stub_request_body
|
32
|
-
return false if stub_request_body.blank?
|
33
|
-
actual_request_body = load_as_json actual_request_body
|
34
|
-
stub_request_body = load_as_json stub_request_body
|
35
|
-
return false unless actual_request_body.class == stub_request_body.class
|
36
|
-
return matching_hashes? actual_request_body,stub_request_body if actual_request_body.is_a?(Hash)
|
37
|
-
return matching_array? actual_request_body,stub_request_body if actual_request_body.is_a?(Array)
|
38
|
-
return false
|
39
|
-
end
|
40
|
-
|
41
|
-
def load_as_json input
|
42
|
-
begin
|
43
|
-
return Parse.json_to_hash input
|
44
|
-
rescue
|
45
|
-
return input
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
|
50
|
-
def matching_hashes?(query_parameters, pattern)
|
51
|
-
return false unless query_parameters.is_a?(Hash)
|
52
|
-
return false unless query_parameters.keys.sort == pattern.keys.sort
|
53
|
-
query_parameters.each do |key, actual|
|
54
|
-
expected = pattern[key]
|
55
|
-
|
56
|
-
if actual.is_a?(Hash) && expected.is_a?(Hash)
|
57
|
-
return false unless matching_hashes?(actual, expected)
|
58
|
-
else
|
59
|
-
return false unless expected === actual
|
60
|
-
end
|
61
|
-
end
|
62
|
-
true
|
63
|
-
end
|
64
|
-
|
65
|
-
def matching_array actuals,expected
|
66
|
-
return false unless actuals.size == expected.size
|
67
|
-
return actuals.sort == expected.sort unless actual[0].is_a(Hash)
|
68
|
-
expect = expected.clone
|
69
|
-
actuals.each do |actual|
|
70
|
-
match = expect.detect {|pattern| matching_hashes? actual,expect}
|
71
|
-
return false if match.blank?
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|