create_tests 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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