create_tests 0.4.4 → 0.5.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e285a4225073454e9b37382f2fec7445ff50b35e5f1c84147fea5d164c33cd8
4
- data.tar.gz: '019ccbf556d02b2cc1b2d907445fc606f674c5d6c3a20c23cd9eb130cecbfc4a'
3
+ metadata.gz: 7c8cf432126f8d8c0bdde1c3607a570ae0372ecbe40e997ee3df748e5244d54b
4
+ data.tar.gz: 76542de51984d7851304b675defe86b8403e44753f5bda3d5e11cf66c9f25737
5
5
  SHA512:
6
- metadata.gz: 5d0001a0c1f7ffeab8c6ef08603cc57259c76df08ebf55c07a1347e9daf49d01cd11271c6ea9f683bd1fef2d7ff9da6701aa2d7e6b849cd5cddfc102b13e56d0
7
- data.tar.gz: 4d3c20f87e5a4c31e632e81dcb36cf550927175aaf879af69ca74256c1e8d43fc67c563d81febb44656f301edc641035d0a2954d61b951d8d6e449e35fe6d272
6
+ metadata.gz: 10be0f1d965a933d965d7b8dc468e36c79be3037cfd7ef7b36392332b843d77f64397f3657524f3223973d16a3fe7a95bfac3843b69450f39f4c321e0457aa0a
7
+ data.tar.gz: 70d6fec75ec337e6d98c72c1d43aa300a5f1ef544603e37b9754777bd26a218070865a46ab9e3c099d3a31809d249bd8383b6529ad715e1b171f6d58338cf706
@@ -0,0 +1,37 @@
1
+
2
+ class CreateTests
3
+
4
+ class << self
5
+
6
+ # Create the helper file
7
+ private def create_helper(params, helper_txt)
8
+ if helper_txt == ""
9
+ output = "# for the case we want to use it standalone, not inside the project
10
+ require_relative '../settings/general' unless defined?(ROOT_DIR)
11
+
12
+ # On the methods you can pass the active http connection or none, then it will be created a new one.
13
+ # Examples from tests:
14
+ # Helper.the_method_i_call(@http)
15
+ # Helper.the_method_i_call()
16
+ module Helper\n"
17
+ else
18
+ output = helper_txt
19
+ output.gsub!(/\s*end\s*\Z/,"\n")
20
+ end
21
+
22
+ params.each do |p|
23
+ unless output.include?("def self.#{p.gsub("@","")}(")
24
+ @logger.info "= Helper: added method #{p.gsub("@","")}" unless helper_txt == ""
25
+ output += "def self.#{p.gsub("@","")}(http = NiceHttp.new())\n"
26
+ output += 'http.logger.info "Helper.#{__method__}"'
27
+ output += "\n\n"
28
+ output += "return ''"
29
+ output += "end\n"
30
+ end
31
+ end
32
+
33
+ output += "\nend"
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+
2
+ class CreateTests
3
+
4
+ class << self
5
+
6
+ # Create the settings file
7
+ private def create_settings(requests_file_orig, modules_to_include)
8
+ output = "# required libraries
9
+ require 'nice_http'
10
+ require 'nice_hash'
11
+ require 'string_pattern'
12
+ require 'pathname'
13
+
14
+ # Root directory for the project
15
+ ROOT_DIR = Pathname.new(__FILE__).join('..').join('..')
16
+
17
+ # Global settings
18
+ # in case supplied HOST=XXXXX in command line or added to ENV variables
19
+ # fex: HOST=myhosttotest
20
+ ENV['HOST'] ||= 'defaulthost'
21
+ NiceHttp.host = ENV['HOST']
22
+ NiceHttp.log = :file_run
23
+ # Add here the headers for authentication for example
24
+ NiceHttp.headers = {
25
+ Auhentication: 'Token'
26
+ }
27
+
28
+ # Requests
29
+ require_relative '.#{requests_file_orig}'\n
30
+ require_relative '../spec/helper.rb'\n"
31
+
32
+ modules_to_include.each do |m|
33
+ output += "include #{m}\n"
34
+ end
35
+ output
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,146 @@
1
+
2
+ class CreateTests
3
+
4
+ class << self
5
+
6
+ # Return true or false and the test source code
7
+ private def create_test(module_txt, method_txt, method_obj, test_txt)
8
+ modified = false
9
+ mod_name = module_txt.scan(/::(\w+)$/).join
10
+ req_txt = "#{method_txt}("
11
+ params = []
12
+ method_obj.parameters.each do |p|
13
+ if p[0] == :req #required
14
+ params << "@#{p[1]}"
15
+ end
16
+ end
17
+ req_txt += params.join(", ")
18
+ req_txt += ")"
19
+ request = eval("require 'nice_hash';#{module_txt}.#{req_txt}")
20
+
21
+ req_txt = "#{mod_name}.#{req_txt}"
22
+ params_declaration_txt = ""
23
+ ## todo: add param in case of :append
24
+ params.each do |p|
25
+ params_declaration_txt << "#{p} = Helper.#{p.gsub('@','')}(@http)\n"
26
+ @params << p
27
+ end
28
+
29
+ if test_txt ==""
30
+ modified = true
31
+ output = "
32
+ require_relative '../../settings/general'
33
+
34
+ RSpec.describe #{mod_name}, '##{method_txt}' do
35
+ before(:all) do
36
+ @http = NiceHttp.new()
37
+ #{params_declaration_txt}@request = #{req_txt}
38
+ @http.logger.info(\"\\n\#{'+'*50} Before All ends \#{'+'*50}\")
39
+ end
40
+ before(:each) do |example|
41
+ @http.logger.info(\"\\n\\n\#{'='*100}\\nTest: \#{example.description}\\n\#{'-'*100}\")
42
+ end\n"
43
+ else
44
+ output = test_txt
45
+ output.gsub!(/\s*end\s*\Z/,"\n")
46
+ end
47
+
48
+
49
+ tests = Hash.new()
50
+
51
+ # first response on responses is the one expected to be returned when success
52
+ if request.key?(:responses) and request[:responses].size > 0
53
+ code = request[:responses].keys[0]
54
+ title="it 'has correct structure in successful response' "
55
+ tests[title] = "do
56
+ resp = @http.#{request[:method]}(@request)
57
+ expect(resp.code).to eq #{code}\n"
58
+
59
+ if request[:responses][code].is_a?(Hash) and request[:responses][code].key?(:data)
60
+ if request.key?(:data_pattern)
61
+ tests[title] +="expect(NiceHash.compare_structure(@request.responses._#{code}.data, resp.data.json, true, @request.data_pattern)).to be true\n"
62
+ else
63
+ tests[title] +="expect(NiceHash.compare_structure(@request.responses._#{code}.data, resp.data.json, true)).to be true\n"
64
+ end
65
+ end
66
+ tests[title] += "end\n"
67
+ end
68
+
69
+ title = "it 'doesn\\'t retrieve data if not authenticated'"
70
+ tests[title] = "do
71
+ http = NiceHttp.new()
72
+ http.headers = {}
73
+ resp = http.#{request[:method]}(@request)
74
+ expect(resp.code).to be_between('400', '499')\n"
75
+ if request.key?(:responses) and (request[:responses].keys.select{|c| c.to_s.to_i>=400&&c.to_s.to_i<=499}).size>0
76
+ tests[title] += "expect(NiceHash.compare_structure(@request.responses[resp.code.to_sym].data, resp.data.json)).to eq true
77
+ expect(resp.message).to eq @request.responses[resp.code.to_sym].message\n"
78
+ end
79
+ tests[title] += "end\n"
80
+
81
+ if params.size > 0
82
+ empty_param = ""
83
+ params.each do |p|
84
+ r = req_txt.gsub(/#{p}([),])/, '""\1')
85
+ empty_param += "
86
+ request = #{r}
87
+ resp = @http.#{request[:method]}(request)
88
+ expect(resp.code).to be_between('400', '499')\n"
89
+ if request.key?(:responses) and (request[:responses].keys.select{|c| c.to_s.to_i>=400&&c.to_s.to_i<=499}).size>0
90
+ empty_param += "expect(resp.message).to match /\#{request.responses[resp.code.to_sym].message}/i\n"
91
+ end
92
+ end
93
+ empty_param += "end\n"
94
+ tests["it 'returns error if required parameter empty' "] = "do\n#{empty_param}"
95
+ end
96
+
97
+ if request.key?(:data) and request.key?(:data_required)
98
+ empty_param_data = ""
99
+ empty_param_data += "
100
+ @request[:data_required].each do |p|
101
+ request = @request.deep_copy
102
+ request.values_for[p] = ''
103
+ resp = @http.#{request[:method]}(request)
104
+ expect(resp.code).not_to be_between('200', '299')
105
+ if request.responses.key?(resp.code.to_sym)
106
+ expect(resp.message).to match /\#{request.responses[resp.code.to_sym].message}/i
107
+ end
108
+ end
109
+ "
110
+ empty_param_data += "end\n"
111
+ tests["it 'returns error if required parameter on data empty' do\n"] = empty_param_data
112
+
113
+ missing_param_data = ""
114
+ missing_param_data += "
115
+ @request[:data_required].each do |p|
116
+ request = @request.deep_copy
117
+ NiceHash.delete_nested(request[:data], p)
118
+ resp = @http.#{request[:method]}(request)
119
+ expect(resp.code).not_to be_between('200', '299')
120
+ if request.responses.key?(resp.code.to_sym)
121
+ expect(resp.message).to match /\#{request.responses[resp.code.to_sym].message}/i
122
+ end
123
+ end
124
+ "
125
+ missing_param_data += "end\n"
126
+ tests["it 'returns error if required parameter on data missing' do\n"] = missing_param_data
127
+ end
128
+
129
+ tests.each do |k,v|
130
+ unless output.include?(k.gsub(" '",' "').gsub("' ",'" ').gsub("\n",'').gsub(/\s+do$/,'').gsub(/^\s*it/,'')) or
131
+ output.include?(k.gsub(' "'," '").gsub('" ',"' ").gsub("\n",'').gsub(/\s+do$/,'').gsub(/^\s*it/,''))
132
+ modified = true
133
+ message = " = test added #{k} for #{method_txt}"
134
+ @logger.info message
135
+ unless test_txt == ''
136
+ puts message
137
+ output +="# Appended #{Time.now.stamp}\n"
138
+ end
139
+ output += "#{k}#{v}"
140
+ end
141
+ end
142
+ output += "\nend"
143
+ return modified, output
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,185 @@
1
+
2
+ class CreateTests
3
+
4
+ ##############################################################################
5
+ # Generate tests from a file that contains Request Hashes.
6
+ # More info about Request Hashes: https://github.com/MarioRuiz/Request-Hash
7
+ # @param requests_file [String]. Path and file name. Could be absolute or relative to project root folder.
8
+ # @param type [Symbol]. (default :request_hash). The kind of content that requests_file contains.
9
+ # @param test [Symbol]. (default :rspec). What kind of tests we want to create
10
+ # @param mode [Symbol]. (default :append). :overwrite, :append, :dont_overwrite. How we want to create the tests.
11
+ # :overwrite, it will overwrite the test, settings, helper... files in case they exist so you will loose your original source code.
12
+ # :dont_overwrite, it will create only the files that don't exist previously
13
+ # :append, it will append or create the tests or helpers that corrently don't exist on every file, but it won't modify any other code.
14
+ ##############################################################################
15
+ def self.from(requests_file, type: :request_hash, test: :rspec, mode: :append)
16
+ begin
17
+ f = File.new("#{requests_file}_create_tests.log", "w")
18
+ f.sync = true
19
+ @logger = Logger.new f
20
+ puts "- Logs: #{requests_file}_create_tests.log"
21
+ rescue StandardError => e
22
+ warn "** Not possible to create the Logger file"
23
+ warn e
24
+ @logger = Logger.new nil
25
+ end
26
+ @logger.info "requests_file: #{requests_file}, type: #{type}, test: #{test}, mode: #{mode}"
27
+ requests_file_orig = requests_file
28
+
29
+ requests_file = if requests_file["./"].nil?
30
+ requests_file
31
+ else
32
+ Dir.pwd.to_s + "/" + requests_file.gsub("./", "")
33
+ end
34
+ unless File.exist?(requests_file)
35
+ message = "** The file #{requests_file} doesn't exist"
36
+ @logger.fatal message
37
+ raise message
38
+ end
39
+
40
+ unless [:request_hash].include?(type)
41
+ message = "** Wrong type parameter: #{type}"
42
+ @logger.fatal message
43
+ raise message
44
+ end
45
+
46
+ unless [:rspec].include?(test)
47
+ message = "** Wrong test parameter: #{test}"
48
+ @logger.fatal message
49
+ raise message
50
+ end
51
+
52
+ unless [:overwrite, :dont_overwrite, :append].include?(mode)
53
+ message = "** Wrong mode parameter: #{mode}"
54
+ @logger.fatal message
55
+ raise message
56
+ end
57
+
58
+ if mode == :overwrite
59
+ message = "** Pay attention, if any of the files exist, will be overwritten"
60
+ @logger.warn message
61
+ warn message
62
+ elsif mode == :append
63
+ if Dir["./spec/*/**_spec.rb"].size > 0
64
+ message = "** Pay attention, if any of the test files exist or the help file exist only will be added the tests, methods that are missing."
65
+ @logger.warn message
66
+ warn message
67
+ end
68
+ end
69
+
70
+ @params = Array.new
71
+
72
+ Dir.mkdir "./spec" unless test != :rspec or Dir.exist?("./spec")
73
+
74
+ add_settings = true
75
+ settings_file = "./settings/general.rb"
76
+ helper_file = './spec/helper.rb'
77
+ Dir.mkdir "./settings" unless Dir.exist?("./settings")
78
+ if File.exist?(settings_file) and mode!=:overwrite
79
+ message = "** The file #{settings_file} already exists so no content will be added to it.\n"
80
+ message += " Remove the settings file to be able to be generated by create_tests or set mode: :overwrite"
81
+ @logger.warn message
82
+ warn message
83
+ add_settings = false
84
+ end
85
+ add_helper = true
86
+ helper_txt = ""
87
+ if File.exist?(helper_file)
88
+ if mode == :dont_overwrite
89
+ message = "** The file #{helper_file} already exists so no content will be added to it.\n"
90
+ message += " Remove the helper file to be able to be generated by create_tests or set mode: :overwrite or :append"
91
+ @logger.warn message
92
+ warn message
93
+ add_helper = false
94
+ elsif mode == :append
95
+ helper_txt = File.read(helper_file)
96
+ end
97
+ end
98
+
99
+ begin
100
+ eval("require '#{requests_file}'")
101
+ rescue Exception => stack
102
+ message = "\n\n** Error evaluating the ruby file containing the requests: \n" + stack.to_s
103
+ @logger.fatal message
104
+ raise message
105
+ end
106
+
107
+ if Kernel.const_defined?(:Swagger)
108
+ first_module = Swagger
109
+ elsif Kernel.const_defined?(:OpenApi)
110
+ first_module = OpenApi
111
+ elsif Kernel.const_defined?(:Requests)
112
+ first_module = Requests
113
+ else
114
+ message = "** The requests need to be inside a module named Swagger, OpenApi or Requests. For example:\n"
115
+ message += " module Swagger\n module UberApi\n module Products\n def self.list_products\n"
116
+ @logger.fatal message
117
+ raise message
118
+ end
119
+
120
+ modules = get_modules(first_module)
121
+ modules.uniq!
122
+
123
+ if add_settings
124
+ mods_to_include = []
125
+ modules.each do |m|
126
+ mods_to_include << m.scan(/^(.+)::/).join
127
+ end
128
+ mods_to_include.uniq!
129
+ File.open(settings_file, "w") { |file| file.write(create_settings(requests_file_orig, mods_to_include)) }
130
+ message = "- Settings: #{settings_file}"
131
+ @logger.info message
132
+ puts message
133
+ `rufo #{settings_file}`
134
+ end
135
+
136
+ modules.each do |mod_txt|
137
+ mod_name = mod_txt.scan(/::(\w+)$/).join
138
+ folder = "./spec/#{mod_name}"
139
+ unless Dir.exist?(folder)
140
+ Dir.mkdir folder
141
+ @logger.info "Created folder: #{folder}"
142
+ end
143
+ mod_obj = eval("#{mod_txt}")
144
+ mod_methods_txt = eval ("#{mod_txt}.methods(false)")
145
+ mod_methods_txt.each do |method_txt|
146
+ test_file = "#{folder}/#{method_txt}_spec.rb"
147
+ if File.exist?(test_file) and mode==:dont_overwrite
148
+ message = "** The file #{test_file} already exists so no content will be added to it.\n"
149
+ message += " Remove the test file to be able to be generated by create_tests or set mode: :overwrite, or mode: :append"
150
+ @logger.warn message
151
+ warn message
152
+ else
153
+ if File.exist?(test_file) and mode == :append
154
+ test_txt = File.read(test_file)
155
+ else
156
+ test_txt = ''
157
+ end
158
+ modified, txt = create_test(mod_txt, method_txt, mod_obj.method(method_txt),test_txt)
159
+ File.open(test_file, "w") { |file| file.write(txt) }
160
+ `rufo #{test_file}`
161
+ if test_txt == ""
162
+ message = "- Test created: #{test_file}"
163
+ elsif modified
164
+ message = "- Test updated: #{test_file}"
165
+ else
166
+ message = "- Test without changes: #{test_file}"
167
+ end
168
+ @logger.info message
169
+ unless message.include?("without changes")
170
+ puts message
171
+ end
172
+ end
173
+ end
174
+ end
175
+
176
+ if add_helper
177
+ @params.uniq!
178
+ File.open(helper_file, "w") { |file| file.write(create_helper(@params, helper_txt)) }
179
+ message = "- Helper: #{helper_file}"
180
+ @logger.info message
181
+ puts message
182
+ `rufo #{helper_file}`
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,21 @@
1
+
2
+ class CreateTests
3
+
4
+ class << self
5
+ # Returns array with the modules that include the http methods
6
+ # fex: ['Swagger::UberApi::V1_0_0::Products', 'Swagger::UberApi::V1_0_0::Cities']
7
+ private def get_modules(mod)
8
+ modules = []
9
+ mod = eval(mod) if mod.kind_of?(String)
10
+ mod.constants.each do |m|
11
+ o = eval ("#{mod}::#{m}.constants")
12
+ if o.size == 0
13
+ modules << "#{mod}::#{m}"
14
+ else
15
+ modules = get_modules("#{mod}::#{m}")
16
+ end
17
+ end
18
+ modules
19
+ end
20
+ end
21
+ end
@@ -1,408 +1,8 @@
1
1
 
2
2
  require "logger"
3
3
 
4
- ##############################################################################
5
- #
6
- ##############################################################################
7
- class CreateTests
8
-
9
- ##############################################################################
10
- # Generate tests from a file that contains Request Hashes.
11
- # More info about Request Hashes: https://github.com/MarioRuiz/Request-Hash
12
- # @param requests_file [String]. Path and file name. Could be absolute or relative to project root folder.
13
- # @param type [Symbol]. (default :request_hash). The kind of content that requests_file contains.
14
- # @param test [Symbol]. (default :rspec). What kind of tests we want to create
15
- # @param mode [Symbol]. (default :append). :overwrite, :append, :dont_overwrite. How we want to create the tests.
16
- # :overwrite, it will overwrite the test, settings, helper... files in case they exist so you will loose your original source code.
17
- # :dont_overwrite, it will create only the files that don't exist previously
18
- # :append, it will append or create the tests or helpers that corrently don't exist on every file, but it won't modify any other code.
19
- ##############################################################################
20
- def self.from(requests_file, type: :request_hash, test: :rspec, mode: :append)
21
- begin
22
- f = File.new("#{requests_file}_create_tests.log", "w")
23
- f.sync = true
24
- @logger = Logger.new f
25
- puts "- Logs: #{requests_file}_create_tests.log"
26
- rescue StandardError => e
27
- warn "** Not possible to create the Logger file"
28
- warn e
29
- @logger = Logger.new nil
30
- end
31
- @logger.info "requests_file: #{requests_file}, type: #{type}, test: #{test}, mode: #{mode}"
32
- requests_file_orig = requests_file
33
-
34
- requests_file = if requests_file["./"].nil?
35
- requests_file
36
- else
37
- Dir.pwd.to_s + "/" + requests_file.gsub("./", "")
38
- end
39
- unless File.exist?(requests_file)
40
- message = "** The file #{requests_file} doesn't exist"
41
- @logger.fatal message
42
- raise message
43
- end
44
-
45
- unless [:request_hash].include?(type)
46
- message = "** Wrong type parameter: #{type}"
47
- @logger.fatal message
48
- raise message
49
- end
50
-
51
- unless [:rspec].include?(test)
52
- message = "** Wrong test parameter: #{test}"
53
- @logger.fatal message
54
- raise message
55
- end
56
-
57
- unless [:overwrite, :dont_overwrite, :append].include?(mode)
58
- message = "** Wrong mode parameter: #{mode}"
59
- @logger.fatal message
60
- raise message
61
- end
62
-
63
- if mode == :overwrite
64
- message = "** Pay attention, if any of the files exist, will be overwritten"
65
- @logger.warn message
66
- warn message
67
- elsif mode == :append
68
- message = "** Pay attention, if any of the test files exist or the help file exist only will be added the tests, methods that are missing."
69
- @logger.warn message
70
- warn message
71
- end
72
-
73
- @params = Array.new
74
-
75
- Dir.mkdir "./spec" unless test != :rspec or Dir.exist?("./spec")
76
-
77
- add_settings = true
78
- settings_file = "./settings/general.rb"
79
- helper_file = './spec/helper.rb'
80
- Dir.mkdir "./settings" unless Dir.exist?("./settings")
81
- if File.exist?(settings_file) and mode!=:overwrite
82
- message = "** The file #{settings_file} already exists so no content will be added to it.\n"
83
- message += " Remove the settings file to be able to be generated by create_tests or set mode: :overwrite"
84
- @logger.warn message
85
- warn message
86
- add_settings = false
87
- end
88
- add_helper = true
89
- helper_txt = ""
90
- if File.exist?(helper_file)
91
- if mode == :dont_overwrite
92
- message = "** The file #{helper_file} already exists so no content will be added to it.\n"
93
- message += " Remove the helper file to be able to be generated by create_tests or set mode: :overwrite or :append"
94
- @logger.warn message
95
- warn message
96
- add_helper = false
97
- elsif mode == :append
98
- helper_txt = File.read(helper_file)
99
- end
100
- end
101
-
102
- begin
103
- eval("require '#{requests_file}'")
104
- rescue Exception => stack
105
- message = "\n\n** Error evaluating the ruby file containing the requests: \n" + stack.to_s
106
- @logger.fatal message
107
- raise message
108
- end
109
-
110
- if Kernel.const_defined?(:Swagger)
111
- first_module = Swagger
112
- elsif Kernel.const_defined?(:OpenApi)
113
- first_module = OpenApi
114
- elsif Kernel.const_defined?(:Requests)
115
- first_module = Requests
116
- else
117
- message = "** The requests need to be inside a module named Swagger, OpenApi or Requests. For example:\n"
118
- message += " module Swagger\n module UberApi\n module Products\n def self.list_products\n"
119
- @logger.fatal message
120
- raise message
121
- end
122
-
123
- modules = get_modules(first_module)
124
- modules.uniq!
125
-
126
- if add_settings
127
- mods_to_include = []
128
- modules.each do |m|
129
- mods_to_include << m.scan(/^(.+)::/).join
130
- end
131
- mods_to_include.uniq!
132
- File.open(settings_file, "w") { |file| file.write(create_settings(requests_file_orig, mods_to_include)) }
133
- message = "- Settings: #{settings_file}"
134
- @logger.info message
135
- puts message
136
- `rufo #{settings_file}`
137
- end
138
-
139
- modules.each do |mod_txt|
140
- mod_name = mod_txt.scan(/::(\w+)$/).join
141
- folder = "./spec/#{mod_name}"
142
- unless Dir.exist?(folder)
143
- Dir.mkdir folder
144
- @logger.info "Created folder: #{folder}"
145
- end
146
- mod_obj = eval("#{mod_txt}")
147
- mod_methods_txt = eval ("#{mod_txt}.methods(false)")
148
- mod_methods_txt.each do |method_txt|
149
- test_file = "#{folder}/#{method_txt}_spec.rb"
150
- if File.exist?(test_file) and mode==:dont_overwrite
151
- message = "** The file #{test_file} already exists so no content will be added to it.\n"
152
- message += " Remove the test file to be able to be generated by create_tests or set mode: :overwrite, or mode: :append"
153
- @logger.warn message
154
- warn message
155
- else
156
- if File.exist?(test_file) and mode == :append
157
- test_txt = File.read(test_file)
158
- else
159
- test_txt = ''
160
- end
161
- modified, txt = create_test(mod_txt, method_txt, mod_obj.method(method_txt),test_txt)
162
- File.open(test_file, "w") { |file| file.write(txt) }
163
- `rufo #{test_file}`
164
- if test_txt == ""
165
- message = "- Test created: #{test_file}"
166
- elsif modified
167
- message = "- Test updated: #{test_file}"
168
- else
169
- message = "- Test without changes: #{test_file}"
170
- end
171
- @logger.info message
172
- unless message.include?("without changes")
173
- puts message
174
- end
175
- end
176
- end
177
- end
178
-
179
- if add_helper
180
- @params.uniq!
181
- File.open(helper_file, "w") { |file| file.write(create_helper(@params, helper_txt)) }
182
- message = "- Helper: #{helper_file}"
183
- @logger.info message
184
- puts message
185
- `rufo #{helper_file}`
186
- end
187
-
188
-
189
- end
190
-
191
- class << self
192
- # Returns array with the modules that include the http methods
193
- # fex: ['Swagger::UberApi::V1_0_0::Products', 'Swagger::UberApi::V1_0_0::Cities']
194
- private def get_modules(mod)
195
- modules = []
196
- mod = eval(mod) if mod.kind_of?(String)
197
- mod.constants.each do |m|
198
- o = eval ("#{mod}::#{m}.constants")
199
- if o.size == 0
200
- modules << "#{mod}::#{m}"
201
- else
202
- modules = get_modules("#{mod}::#{m}")
203
- end
204
- end
205
- modules
206
- end
207
-
208
- # Create the settings file
209
- private def create_settings(requests_file_orig, modules_to_include)
210
- output = "# required libraries
211
- require 'nice_http'
212
- require 'nice_hash'
213
- require 'string_pattern'
214
- require 'pathname'
215
-
216
- # Root directory for the project
217
- ROOT_DIR = Pathname.new(__FILE__).join('..').join('..')
218
-
219
- # Global settings
220
- # in case supplied HOST=XXXXX in command line or added to ENV variables
221
- # fex: HOST=myhosttotest
222
- ENV['HOST'] ||= 'defaulthost'
223
- NiceHttp.host = ENV['HOST']
224
- NiceHttp.log = :file_run
225
- # Add here the headers for authentication for example
226
- NiceHttp.headers = {
227
- Auhentication: 'Token'
228
- }
229
-
230
- # Requests
231
- require_relative '.#{requests_file_orig}'\n
232
- require_relative '../spec/helper.rb'\n"
233
-
234
- modules_to_include.each do |m|
235
- output += "include #{m}\n"
236
- end
237
- output
238
- end
239
-
240
- # Create the helper file
241
- private def create_helper(params, helper_txt)
242
- if helper_txt == ""
243
- output = "# for the case we want to use it standalone, not inside the project
244
- require_relative '../settings/general' unless defined?(ROOT_DIR)
245
-
246
- # On the methods you can pass the active http connection or none, then it will be created a new one.
247
- # Examples from tests:
248
- # Helper.the_method_i_call(@http)
249
- # Helper.the_method_i_call()
250
- module Helper\n"
251
- else
252
- output = helper_txt
253
- output.gsub!(/\s*end\s*\Z/,"\n")
254
- end
255
-
256
- params.each do |p|
257
- unless output.include?("def self.#{p.gsub("@","")}(")
258
- @logger.info "= Helper: added method #{p.gsub("@","")}" unless helper_txt == ""
259
- output += "def self.#{p.gsub("@","")}(http = NiceHttp.new())\n"
260
- output += 'http.logger.info "Helper.#{__method__}"'
261
- output += "\n\n"
262
- output += "return ''"
263
- output += "end\n"
264
- end
265
- end
266
-
267
- output += "\nend"
268
-
269
- end
270
-
271
- # Return true or false and the test source code
272
- private def create_test(module_txt, method_txt, method_obj, test_txt)
273
- modified = false
274
- mod_name = module_txt.scan(/::(\w+)$/).join
275
- req_txt = "#{method_txt}("
276
- params = []
277
- method_obj.parameters.each do |p|
278
- if p[0] == :req #required
279
- params << "@#{p[1]}"
280
- end
281
- end
282
- req_txt += params.join(", ")
283
- req_txt += ")"
284
- request = eval("require 'nice_hash';#{module_txt}.#{req_txt}")
285
-
286
- req_txt = "#{mod_name}.#{req_txt}"
287
- params_declaration_txt = ""
288
- ## todo: add param in case of :append
289
- params.each do |p|
290
- params_declaration_txt << "#{p} = Helper.#{p.gsub('@','')}(@http)\n"
291
- @params << p
292
- end
293
-
294
- if test_txt ==""
295
- modified = true
296
- output = "
297
- require_relative '../../settings/general'
298
-
299
- RSpec.describe #{mod_name}, '##{method_txt}' do
300
- before(:all) do
301
- @http = NiceHttp.new()
302
- #{params_declaration_txt}@request = #{req_txt}
303
- @http.logger.info(\"\\n\#{'+'*50} Before All ends \#{'+'*50}\")
304
- end
305
- before(:each) do |example|
306
- @http.logger.info(\"\\n\\n\#{'='*100}\\nTest: \#{example.description}\\n\#{'-'*100}\")
307
- end\n"
308
- else
309
- output = test_txt
310
- output.gsub!(/\s*end\s*\Z/,"\n")
311
- end
312
-
313
-
314
- tests = Hash.new()
315
-
316
- # first response on responses is the one expected to be returned when success
317
- if request.key?(:responses) and request[:responses].size > 0
318
- code = request[:responses].keys[0]
319
- title="it 'has correct structure in successful response' "
320
- tests[title] = "do
321
- resp = @http.#{request[:method]}(@request)
322
- expect(resp.code).to eq #{code}\n"
323
-
324
- if request[:responses][code].is_a?(Hash) and request[:responses][code].key?(:data)
325
- if request.key?(:data_pattern)
326
- tests[title] +="expect(NiceHash.compare_structure(@request.responses._#{code}.data, resp.data.json, true, @request.data_pattern)).to be true\n"
327
- else
328
- tests[title] +="expect(NiceHash.compare_structure(@request.responses._#{code}.data, resp.data.json, true)).to be true\n"
329
- end
330
- end
331
- tests[title] += "end\n"
332
- end
333
-
334
- title = "it 'doesn\\'t retrieve data if not authenticated'"
335
- tests[title] = "do
336
- http = NiceHttp.new()
337
- http.headers = {}
338
- resp = http.#{request[:method]}(@request)
339
- expect(resp.code).to be_between('400', '499')\n"
340
- if request.key?(:responses) and (request[:responses].keys.select{|c| c.to_s.to_i>=400&&c.to_s.to_i<=499}).size>0
341
- tests[title] += "expect(NiceHash.compare_structure(@request.responses[resp.code.to_sym].data, resp.data.json)).to eq true
342
- expect(resp.message).to eq @request.responses[resp.code.to_sym].message\n"
343
- end
344
- tests[title] += "end\n"
345
-
346
- if params.size > 0
347
- empty_param = ""
348
- params.each do |p|
349
- r = req_txt.gsub(/#{p}([),])/, '""\1')
350
- empty_param += "
351
- request = #{r}
352
- resp = @http.#{request[:method]}(request)
353
- expect(resp.code).to be_between('400', '499')\n"
354
- if request.key?(:responses) and (request[:responses].keys.select{|c| c.to_s.to_i>=400&&c.to_s.to_i<=499}).size>0
355
- empty_param += "expect(resp.message).to match /\#{request.responses[resp.code.to_sym].message}/i\n"
356
- end
357
- end
358
- empty_param += "end\n"
359
- tests["it 'returns error if required parameter empty' "] = "do\n#{empty_param}"
360
- end
361
-
362
- if request.key?(:data) and request.key?(:data_required)
363
- empty_param_data = ""
364
- empty_param_data += "
365
- @request[:data_required].each do |p|
366
- request = @request.deep_copy
367
- request.values_for[p] = ''
368
- resp = @http.#{request[:method]}(request)
369
- expect(resp.code).not_to be_between('200', '299')
370
- if request.responses.key?(resp.code.to_sym)
371
- expect(resp.message).to match /\#{request.responses[resp.code.to_sym].message}/i
372
- end
373
- end
374
- "
375
- empty_param_data += "end\n"
376
- tests["it 'returns error if required parameter on data empty' do\n"] = empty_param_data
377
-
378
- missing_param_data = ""
379
- missing_param_data += "
380
- @request[:data_required].each do |p|
381
- request = @request.deep_copy
382
- NiceHash.delete_nested(request[:data], p)
383
- resp = @http.#{request[:method]}(request)
384
- expect(resp.code).not_to be_between('200', '299')
385
- if request.responses.key?(resp.code.to_sym)
386
- expect(resp.message).to match /\#{request.responses[resp.code.to_sym].message}/i
387
- end
388
- end
389
- "
390
- missing_param_data += "end\n"
391
- tests["it 'returns error if required parameter on data missing' do\n"] = missing_param_data
392
- end
393
-
394
- tests.each do |k,v|
395
- unless output.include?(k.gsub(" '",' "').gsub("' ",'" ')) or
396
- output.include?(k.gsub(' "'," '").gsub('" ',"' "))
397
- modified = true
398
- message = " = test added #{k} for #{method_txt}"
399
- @logger.info message
400
- puts message unless test_txt == ''
401
- output += "#{k}#{v}"
402
- end
403
- end
404
- output += "\nend"
405
- return modified, output
406
- end
407
- end
408
- end
4
+ require_relative 'create-tests/create_helper'
5
+ require_relative 'create-tests/create_settings'
6
+ require_relative 'create-tests/create_test'
7
+ require_relative 'create-tests/from'
8
+ require_relative 'create-tests/get_modules'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: create_tests
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mario Ruiz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-30 00:00:00.000000000 Z
11
+ date: 2019-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rufo
@@ -34,42 +34,36 @@ dependencies:
34
34
  name: nice_hash
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: 1.14.0
40
37
  - - "~>"
41
38
  - !ruby/object:Gem::Version
42
- version: '1.14'
39
+ version: '1.15'
43
40
  type: :runtime
44
41
  prerelease: false
45
42
  version_requirements: !ruby/object:Gem::Requirement
46
43
  requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: 1.14.0
50
44
  - - "~>"
51
45
  - !ruby/object:Gem::Version
52
- version: '1.14'
46
+ version: '1.15'
53
47
  - !ruby/object:Gem::Dependency
54
48
  name: rspec
55
49
  requirement: !ruby/object:Gem::Requirement
56
50
  requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- version: 3.8.0
60
51
  - - "~>"
61
52
  - !ruby/object:Gem::Version
62
53
  version: '3.8'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 3.8.0
63
57
  type: :development
64
58
  prerelease: false
65
59
  version_requirements: !ruby/object:Gem::Requirement
66
60
  requirements:
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- version: 3.8.0
70
61
  - - "~>"
71
62
  - !ruby/object:Gem::Version
72
63
  version: '3.8'
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 3.8.0
73
67
  - !ruby/object:Gem::Dependency
74
68
  name: coveralls
75
69
  requirement: !ruby/object:Gem::Requirement
@@ -105,6 +99,11 @@ files:
105
99
  - LICENSE
106
100
  - README.md
107
101
  - bin/create_tests
102
+ - lib/create-tests/create_helper.rb
103
+ - lib/create-tests/create_settings.rb
104
+ - lib/create-tests/create_test.rb
105
+ - lib/create-tests/from.rb
106
+ - lib/create-tests/get_modules.rb
108
107
  - lib/create_tests.rb
109
108
  homepage: https://github.com/MarioRuiz/create_tests
110
109
  licenses:
@@ -125,7 +124,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
124
  - !ruby/object:Gem::Version
126
125
  version: '0'
127
126
  requirements: []
128
- rubygems_version: 3.0.3
127
+ rubyforge_project:
128
+ rubygems_version: 2.7.6
129
129
  signing_key:
130
130
  specification_version: 4
131
131
  summary: CreateTests -- Create Tests automatically from a Requests file. Perfect to