poisol 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/poisol/domain.rb +13 -11
  3. data/lib/poisol/server.rb +45 -37
  4. data/lib/poisol/stub/request/query_builder.rb +3 -1
  5. data/lib/poisol/stub/request/request_body_builder.rb +89 -87
  6. data/lib/poisol/stub/request/url_builder.rb +15 -12
  7. data/lib/poisol/stub/response/array_response_body.rb +75 -0
  8. data/lib/poisol/stub/response/response_body_builder.rb +49 -116
  9. data/lib/poisol/stub/response/status_builder.rb +2 -0
  10. data/lib/poisol/stub/stub.rb +22 -21
  11. data/lib/poisol/stub/stub_class_builder.rb +24 -23
  12. data/lib/poisol/stub/stub_instance.rb +62 -44
  13. data/lib/poisol/stub/webrick_stub_builder.rb +34 -32
  14. data/lib/poisol/stub_config/stub_config.rb +10 -8
  15. data/lib/poisol/stub_config/stub_config_builder.rb +91 -89
  16. data/lib/poisol/stub_factory.rb +39 -38
  17. data/lib/poisol/stub_mapper/request_matcher.rb +68 -0
  18. data/lib/poisol/stub_mapper/response_mapper.rb +33 -0
  19. data/lib/poisol/stub_mapper/stubs.rb +27 -0
  20. data/spec/functional/key_value/explicit_inclusion_spec.rb +15 -1
  21. data/spec/functional/key_value/implicit_inclusion_spec.rb +1 -1
  22. data/spec/functional/multi_domain_spec.rb +1 -1
  23. data/spec/functional/post_request_spec.rb +1 -2
  24. data/spec/functional/query/query_explicit_spec.rb +1 -1
  25. data/spec/functional/query/query_implicit_spec.rb +1 -1
  26. data/spec/functional/response/array_spec.rb +14 -7
  27. data/spec/functional/response/dumb_response_spec.rb +1 -1
  28. data/spec/functional/response/hash_params_spec.rb +1 -1
  29. data/spec/functional/response/nested_array_spec.rb +2 -2
  30. data/spec/functional/url_spec.rb +1 -1
  31. data/spec/spec_helper.rb +0 -1
  32. metadata +5 -3
  33. data/lib/poisol/response_mapper.rb +0 -31
  34. data/lib/poisol/stubs.rb +0 -74
@@ -2,34 +2,35 @@ require_relative "webrick_stub_builder"
2
2
  require_relative "stub_class_builder"
3
3
  require_relative "stub_instance"
4
4
 
5
- class Stub
6
- include WebrickStubBuilder
7
- include StubInstance
8
- attr_accessor :request,:response
9
- class << self
10
- include StubClassBuilder
11
-
12
- def set_stub_config stub_config
13
- @stub_config = stub_config
14
- define_method("stub_config") do
15
- return stub_config
5
+ module Poisol
6
+ class Stub
7
+ include WebrickStubBuilder
8
+ include StubInstance
9
+ attr_accessor :request,:response
10
+ class << self
11
+ include StubClassBuilder
12
+
13
+ def set_stub_config stub_config
14
+ @stub_config = stub_config
15
+ define_method("stub_config") do
16
+ return stub_config
17
+ end
16
18
  end
17
19
  end
20
+
18
21
  end
19
22
 
20
- end
23
+ class Request
24
+ attr_accessor :url,:query,:body,:path,:type
21
25
 
22
- class Request
23
- attr_accessor :url,:query,:body,:path,:type
26
+ def to_s
27
+ "#{self.type} #{self.url} #{"Query:#{self.query}" if self.query.present?} #{"\nBody: #{self.body}" if self.body.present?} "
28
+ end
24
29
 
25
- def to_s
26
- "#{self.type} #{self.url} #{"Query:#{self.query}" if self.query.present?} #{"\nBody: #{self.body}" if self.body.present?} "
27
30
  end
28
31
 
29
- end
32
+ class Response
33
+ attr_accessor :body,:status,:header
34
+ end
30
35
 
31
- class Response
32
- attr_accessor :body,:status,:header
33
36
  end
34
-
35
-
@@ -3,34 +3,35 @@ require_relative "request/request_body_builder"
3
3
  require_relative "request/url_builder"
4
4
  require_relative "response/response_body_builder"
5
5
  require_relative "response/status_builder"
6
+ module Poisol
7
+ module StubClassBuilder
8
+ include RequestBodyBuilder
9
+ include ResponseBodyBuilder
10
+ include UrlBuilder
11
+ include QueryBuilder
6
12
 
7
- module StubClassBuilder
8
- include RequestBodyBuilder
9
- include ResponseBodyBuilder
10
- include UrlBuilder
11
- include QueryBuilder
13
+ def generate_methods_to_alter_sutb
14
+ prepare_request
15
+ prepare_response
16
+ end
12
17
 
13
- def generate_methods_to_alter_sutb
14
- prepare_request
15
- prepare_response
16
- end
18
+ def prepare_request
19
+ prepare_request_url
20
+ prepare_request_query
21
+ prepare_request_body
22
+ end
17
23
 
18
- def prepare_request
19
- prepare_request_url
20
- prepare_request_query
21
- prepare_request_body
22
- end
24
+ def prepare_request_url
25
+ generate_methods_to_alter_path_params
26
+ end
23
27
 
24
- def prepare_request_url
25
- generate_methods_to_alter_path_params
26
- end
28
+ def prepare_request_query
29
+ generate_query_methods if @stub_config.request.query.present?
30
+ end
27
31
 
28
- def prepare_request_query
29
- generate_query_methods if @stub_config.request.query.present?
30
- end
32
+ def prepare_response
33
+ prepare_response_body
34
+ end
31
35
 
32
- def prepare_response
33
- prepare_response_body
34
36
  end
35
-
36
37
  end
@@ -1,55 +1,73 @@
1
- module StubInstance
2
- def initialize
3
- init_request
4
- init_response
5
- end
1
+ module Poisol
2
+ module StubInstance
3
+ def initialize
4
+ init_request
5
+ init_response
6
+ @called_methods = []
7
+ end
6
8
 
7
- def init_request
8
- @request = Request.new
9
- @request.path = stub_config.request.url.deep_dup
10
- @request.query = stub_config.request.query_explicit ? {} : stub_config.request.query.deep_dup
11
- @request.body = stub_config.request.body_explicit ? {} : stub_config.request.body.deep_dup
12
- end
9
+ def init_request
10
+ @request = Request.new
11
+ @request.type = stub_config.request.type
12
+ @request.path = stub_config.request.url.deep_dup
13
+ @request.query = stub_config.request.query_explicit ? {} : stub_config.request.query.deep_dup
14
+ @request.body = stub_config.request.body_explicit ? {} : stub_config.request.body.deep_dup
15
+ end
13
16
 
14
- def init_response
15
- @response = Response.new
16
- if stub_config.response.is_column_array or stub_config.response.is_row_array
17
- @response.body = []
18
- else
19
- @response.body = stub_config.response.body.deep_dup
17
+ def init_response
18
+ @response = Response.new
19
+ if stub_config.response.is_column_array or stub_config.response.is_row_array
20
+ @response.body = [stub_config.response.body.deep_dup]
21
+ else
22
+ @response.body = stub_config.response.body.deep_dup
23
+ end
24
+ @response.status = 200
25
+ @response.header = {'Content-Type' => 'application/json'}
20
26
  end
21
- @response.status = 200
22
- @response.header = {'Content-Type' => 'application/json'}
23
- end
24
27
 
25
- def set_dumb_response response_file
26
- @response.body = Parse.json_file_to_hash(response_file)
27
- @is_response_dumped = true
28
- self
29
- end
28
+ def set_dumb_response response_file
29
+ @response.body = Parse.json_file_to_hash(response_file)
30
+ @is_response_dumped = true
31
+ self
32
+ end
30
33
 
31
- def get_assignment_value actual_field_value,input_value
32
- if actual_field_value.class.to_s == "Hash"
33
- input_value = {} if input_value.blank?
34
- actual_field_value.deep_merge(input_value.stringify_keys)
35
- else
36
- input_value
34
+ def get_assignment_value actual_field_value,input_value
35
+ if actual_field_value.class.to_s == "Hash"
36
+ input_value = {} if input_value.blank?
37
+ actual_field_value.deep_merge(input_value.stringify_keys)
38
+ else
39
+ input_value
40
+ end
37
41
  end
38
- end
39
42
 
40
- def has input_hash
41
- @response.body.deep_merge! input_hash.camelize_keys
42
- self
43
- end
43
+ def by input_hash
44
+ @request.body.deep_merge! input_hash
45
+ self
46
+ end
44
47
 
45
- def for input_hash
46
- @request.query.deep_merge! input_hash.camelize_keys
47
- self
48
- end
48
+ def has input_hash
49
+ @response.body.deep_merge! input_hash.camelize_keys
50
+ self
51
+ end
49
52
 
50
- def status input
51
- @response.status = input
52
- self
53
- end
53
+ def is_empty
54
+ @response.body = stub_config.response.is_column_array or stub_config.response.is_row_array ? [] : {}
55
+ self
56
+ end
57
+
58
+ def for input_hash
59
+ @request.query.deep_merge! input_hash.camelize_keys
60
+ self
61
+ end
62
+
63
+ def status input
64
+ @response.status = input
65
+ self
66
+ end
54
67
 
68
+ def remove_array_field_calls
69
+ method_of_array_fileds_of_array = self.methods.select{|method_name|method_name.to_s.start_with?"with_"}
70
+ @called_methods = @called_methods - method_of_array_fileds_of_array
71
+ end
72
+ end
55
73
  end
@@ -1,40 +1,42 @@
1
- module WebrickStubBuilder
2
- def build
3
- build_url
4
- build_query
5
- build_request_body
6
- build_response_body
7
- Stubs.add self
8
- self
9
- end
1
+ module Poisol
2
+ module WebrickStubBuilder
3
+ def build
4
+ build_url
5
+ build_query
6
+ build_request_body
7
+ build_response_body
8
+ Stubs.add self
9
+ self
10
+ end
10
11
 
11
- private
12
- def build_url
13
- remove_path_param_name_from_url
14
- @request.url = "#{stub_config.request.domain}/#{@request.path}"
15
- end
12
+ private
13
+ def build_url
14
+ remove_path_param_name_from_url
15
+ @request.url = "#{stub_config.request.domain}/#{@request.path}"
16
+ end
16
17
 
17
- def build_query
18
- return if @request.query.blank?
19
- @request.query = @request.query.to_query
20
- end
18
+ def build_query
19
+ return if @request.query.blank?
20
+ @request.query = @request.query.to_query
21
+ end
21
22
 
22
- def build_request_body
23
- return if @request.body.blank?
24
- @request.body = Parse.hash_to_concatenated_key_value(@request.body) if stub_config.request.is_body_key_value
25
- end
23
+ def build_request_body
24
+ return if @request.body.blank?
25
+ @request.body = Parse.hash_to_concatenated_key_value(@request.body) if stub_config.request.is_body_key_value
26
+ end
26
27
 
27
- def build_response_body
28
- @response.body = Parse.hash_array_to_column_hash(@response.body) if stub_config.response.is_column_array and !@is_response_dumped.present?
29
- end
28
+ def build_response_body
29
+ @response.body = Parse.hash_array_to_column_hash(@response.body) if stub_config.response.is_column_array and !@is_response_dumped.present?
30
+ end
30
31
 
31
- def remove_path_param_name_from_url
32
- @request.path.scan(/{(.+?)}/).each do |path_params|
33
- path_param = path_params[0]
34
- param_name = path_param.split("|")[0]
35
- param_value = path_param.split("|")[1]
36
- @request.path.sub!("{#{path_param}}",param_value)
32
+ def remove_path_param_name_from_url
33
+ @request.path.scan(/{(.+?)}/).each do |path_params|
34
+ path_param = path_params[0]
35
+ param_name = path_param.split("|")[0]
36
+ param_value = path_param.split("|")[1]
37
+ @request.path.sub!("{#{path_param}}",param_value)
38
+ end
37
39
  end
38
- end
39
40
 
41
+ end
40
42
  end
@@ -1,11 +1,13 @@
1
- class StubConfig
2
- attr_accessor :response,:request,:is_inline,:file
3
- end
1
+ module Poisol
2
+ class StubConfig
3
+ attr_accessor :response,:request,:is_inline,:file
4
+ end
4
5
 
5
- class RequestConfig
6
- attr_accessor :domain,:url,:type,:query,:body,:is_body_key_value,:body_explicit,:query_explicit,:is_column_array,:is_row_array
7
- end
6
+ class RequestConfig
7
+ attr_accessor :domain,:url,:type,:query,:body,:is_body_key_value,:body_explicit,:query_explicit,:is_column_array,:is_row_array
8
+ end
8
9
 
9
- class ResponseConfig
10
- attr_accessor :body,:is_column_array,:is_row_array
10
+ class ResponseConfig
11
+ attr_accessor :body,:is_column_array,:is_row_array
12
+ end
11
13
  end
@@ -1,112 +1,114 @@
1
- class StubConfigBuilder
1
+ module Poisol
2
+ class StubConfigBuilder
2
3
 
3
- def initialize
4
- @stub_config = StubConfig.new
5
- @stub_config.request = RequestConfig.new
6
- @stub_config.response = ResponseConfig.new
7
- end
4
+ def initialize
5
+ @stub_config = StubConfig.new
6
+ @stub_config.request = RequestConfig.new
7
+ @stub_config.response = ResponseConfig.new
8
+ end
8
9
 
9
- def with_file file_name
10
- @stub_config.file = file_name
11
- self
12
- end
10
+ def with_file file_name
11
+ @stub_config.file = file_name
12
+ self
13
+ end
13
14
 
14
- def with_domain domain
15
- @stub_config.request.domain = domain
16
- self
17
- end
15
+ def with_domain domain
16
+ @stub_config.request.domain = domain
17
+ self
18
+ end
18
19
 
19
- def is_inline
20
- @stub_config.is_inline = true
21
- self
22
- end
20
+ def is_inline
21
+ @stub_config.is_inline = true
22
+ self
23
+ end
23
24
 
24
- def is_exploded
25
- @stub_config.is_inline = false
26
- self
27
- end
25
+ def is_exploded
26
+ @stub_config.is_inline = false
27
+ self
28
+ end
28
29
 
29
- def build
30
- @raw_config_hash = Parse.yaml_file @stub_config.file
31
- build_request
32
- build_response
33
- return @stub_config
34
- end
30
+ def build
31
+ @raw_config_hash = Parse.yaml_file @stub_config.file
32
+ build_request
33
+ build_response
34
+ return @stub_config
35
+ end
35
36
 
36
- private
37
- def build_request
38
- load_url
39
- @stub_config.request.type = @raw_config_hash["request"]["type"].intern
40
- load_query
41
- load_request_body
42
- end
43
-
44
- def load_request_body
45
- load_request_body_filed_implicit_option
46
- @stub_config.is_inline ? load_inline_request_body : load_exploaded_request_body
47
- end
37
+ private
38
+ def build_request
39
+ load_url
40
+ @stub_config.request.type = @raw_config_hash["request"]["type"].downcase
41
+ load_query
42
+ load_request_body
43
+ end
48
44
 
45
+ def load_request_body
46
+ load_request_body_filed_implicit_option
47
+ @stub_config.is_inline ? load_inline_request_body : load_exploaded_request_body
48
+ end
49
49
 
50
- def load_query
51
- @stub_config.request.query = @raw_config_hash["request"]["query"]
52
- query_explicit = @raw_config_hash["request"]["query_explicit"]
53
- @stub_config.request.query_explicit = query_explicit.blank? ? false : query_explicit
54
- end
55
50
 
51
+ def load_query
52
+ @stub_config.request.query = @raw_config_hash["request"]["query"]
53
+ query_explicit = @raw_config_hash["request"]["query_explicit"]
54
+ @stub_config.request.query_explicit = query_explicit.blank? ? false : query_explicit
55
+ end
56
56
 
57
- def load_url
58
- url = @raw_config_hash["request"]["url"]
59
- url.strip!
60
- url.sub!("/","") if url[0].eql? "/"
61
- @stub_config.request.url = url
62
- end
63
57
 
64
- def load_request_body_filed_implicit_option
65
- body_explicit = @raw_config_hash["request"]["body_explicit"]
66
- @stub_config.request.body_explicit = body_explicit.blank? ? false : body_explicit
67
- end
58
+ def load_url
59
+ url = @raw_config_hash["request"]["url"]
60
+ url.strip!
61
+ url.sub!("/","") if url[0].eql? "/"
62
+ @stub_config.request.url = url
63
+ end
68
64
 
65
+ def load_request_body_filed_implicit_option
66
+ body_explicit = @raw_config_hash["request"]["body_explicit"]
67
+ @stub_config.request.body_explicit = body_explicit.blank? ? false : body_explicit
68
+ end
69
69
 
70
- def build_response
71
- @stub_config.is_inline ? load_inline_response_body : load_exploaded_response_body
72
- load_resonse_array_type
73
- end
74
70
 
75
- def load_resonse_array_type
76
- return if @raw_config_hash["response"].blank?
77
- array_type = @raw_config_hash["response"]["array_type"]
78
- return if array_type.blank?
79
- @stub_config.response.is_column_array = true if array_type.eql? "column"
80
- @stub_config.response.is_row_array = true if array_type.eql? "row"
81
- end
71
+ def build_response
72
+ @stub_config.is_inline ? load_inline_response_body : load_exploaded_response_body
73
+ load_resonse_array_type
74
+ end
82
75
 
76
+ def load_resonse_array_type
77
+ return if @raw_config_hash["response"].blank?
78
+ array_type = @raw_config_hash["response"]["array_type"]
79
+ return if array_type.blank?
80
+ @stub_config.response.is_column_array = true if array_type.eql? "column"
81
+ @stub_config.response.is_row_array = true if array_type.eql? "row"
82
+ end
83
83
 
84
- def load_inline_response_body
85
- raw_body = @raw_config_hash["response"]["body"]
86
- return if raw_body.blank?
87
- @stub_config.response.body = Parse.json_to_hash raw_body
88
- end
89
84
 
90
- def load_inline_request_body
91
- raw_body = @raw_config_hash["request"]["body"]
92
- return if raw_body.blank?
93
- if raw_body.class.name == "String"
94
- @stub_config.request.body = Parse.json_to_hash raw_body
95
- else
96
- @stub_config.request.is_body_key_value = true
97
- @stub_config.request.body = raw_body
85
+ def load_inline_response_body
86
+ raw_body = @raw_config_hash["response"]["body"]
87
+ return if raw_body.blank?
88
+ @stub_config.response.body = Parse.json_to_hash raw_body
98
89
  end
99
- end
100
90
 
101
- def load_exploaded_request_body
102
- request_file = "#{File.dirname @stub_config.file}/request.json"
103
- return unless File.exists? request_file
104
- @stub_config.request.body = Parse.json_file_to_hash(request_file)
105
- end
91
+ def load_inline_request_body
92
+ raw_body = @raw_config_hash["request"]["body"]
93
+ return if raw_body.blank?
94
+ if raw_body.class.name == "String"
95
+ @stub_config.request.body = Parse.json_to_hash raw_body
96
+ else
97
+ @stub_config.request.is_body_key_value = true
98
+ @stub_config.request.body = raw_body
99
+ end
100
+ end
101
+
102
+ def load_exploaded_request_body
103
+ request_file = "#{File.dirname @stub_config.file}/request.json"
104
+ return unless File.exists? request_file
105
+ @stub_config.request.body = Parse.json_file_to_hash(request_file)
106
+ end
106
107
 
107
- def load_exploaded_response_body
108
- response_file = "#{File.dirname @stub_config.file}/response.json"
109
- return unless File.exists? response_file
110
- @stub_config.response.body = Parse.json_file_to_hash(response_file)
108
+ def load_exploaded_response_body
109
+ response_file = "#{File.dirname @stub_config.file}/response.json"
110
+ return unless File.exists? response_file
111
+ @stub_config.response.body = Parse.json_file_to_hash(response_file)
112
+ end
111
113
  end
112
114
  end
@@ -1,51 +1,52 @@
1
1
  require_relative "stub/stub"
2
+ module Poisol
3
+ class StubFactory
4
+ def build folder
5
+ @folder = folder.chomp '/'
6
+ load_domain
7
+ load_stub_configs
8
+ end
2
9
 
3
- class StubFactory
4
- def build folder
5
- @folder = folder.chomp '/'
6
- load_domain
7
- load_stub_configs
8
- end
10
+ private
9
11
 
10
- private
12
+ def load_domain
13
+ domain_config_file = Dir["#{@folder}/domain.yml"].first
14
+ @domain = Domain.new domain_config_file
15
+ end
11
16
 
12
- def load_domain
13
- domain_config_file = Dir["#{@folder}/domain.yml"].first
14
- @domain = Domain.new domain_config_file
15
- end
17
+ def load_stub_configs
18
+ explolded_configs = Dir["#{@folder}/**/config.yml"]
19
+ inline_configs = Dir["#{@folder}/**/*.yml"] - ( (explolded_configs.nil?) ? [] : explolded_configs) - [@domain.file]
20
+ generate_exploded_config explolded_configs unless explolded_configs.nil?
21
+ generate_inline_config inline_configs unless inline_configs.nil?
22
+ end
16
23
 
17
- def load_stub_configs
18
- explolded_configs = Dir["#{@folder}/**/config.yml"]
19
- inline_configs = Dir["#{@folder}/**/*.yml"] - ( (explolded_configs.nil?) ? [] : explolded_configs) - [@domain.file]
20
- generate_exploded_config explolded_configs unless explolded_configs.nil?
21
- generate_inline_config inline_configs unless inline_configs.nil?
22
- end
23
24
 
25
+ def generate_exploded_config explolded_configs
26
+ explolded_configs.each do |config_file|
27
+ PoisolLog.info "Processing #{config_file}"
28
+ dynamic_name = (FileName.get_dir_name config_file).camelize
29
+ config = StubConfigBuilder.new.is_exploded.with_file(config_file).with_domain(@domain.full_url).build
30
+ create_class dynamic_name,config
31
+ end
32
+ end
24
33
 
25
- def generate_exploded_config explolded_configs
26
- explolded_configs.each do |config_file|
27
- PoisolLog.info "Processing #{config_file}"
28
- dynamic_name = (FileName.get_dir_name config_file).camelize
29
- config = StubConfigBuilder.new.is_exploded.with_file(config_file).with_domain(@domain.full_url).build
30
- create_class dynamic_name,config
34
+ def generate_inline_config inline_configs
35
+ inline_configs.each do |config_file|
36
+ PoisolLog.debug "Processing #{config_file}"
37
+ dynamic_name = (FileName.get_file_name config_file).camelize
38
+ stub_config = StubConfigBuilder.new.is_inline.with_file(config_file).with_domain(@domain.full_url).build
39
+ create_class dynamic_name,stub_config
40
+ end
31
41
  end
32
- end
33
42
 
34
- def generate_inline_config inline_configs
35
- inline_configs.each do |config_file|
36
- PoisolLog.debug "Processing #{config_file}"
37
- dynamic_name = (FileName.get_file_name config_file).camelize
38
- stub_config = StubConfigBuilder.new.is_inline.with_file(config_file).with_domain(@domain.full_url).build
39
- create_class dynamic_name,stub_config
43
+ def create_class class_name,stub_config
44
+ dynamic_stub_class = Object.const_set class_name,Class.new(Stub)
45
+ dynamic_stub_class.set_stub_config stub_config
46
+ dynamic_stub_class.generate_methods_to_alter_sutb
47
+ PoisolLog.info "Generated #{class_name}"
48
+ PoisolLog.debug "with methods #{dynamic_stub_class.instance_methods - Object.methods}"
40
49
  end
41
- end
42
50
 
43
- def create_class class_name,stub_config
44
- dynamic_stub_class = Object.const_set class_name,Class.new(Stub)
45
- dynamic_stub_class.set_stub_config stub_config
46
- dynamic_stub_class.generate_methods_to_alter_sutb
47
- PoisolLog.info "Generated #{class_name}"
48
- PoisolLog.debug "with methods #{dynamic_stub_class.instance_methods - Object.methods}"
49
51
  end
50
-
51
52
  end