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 +4 -4
- data/lib/create-tests/create_helper.rb +37 -0
- data/lib/create-tests/create_settings.rb +38 -0
- data/lib/create-tests/create_test.rb +146 -0
- data/lib/create-tests/from.rb +185 -0
- data/lib/create-tests/get_modules.rb +21 -0
- data/lib/create_tests.rb +5 -405
- metadata +17 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c8cf432126f8d8c0bdde1c3607a570ae0372ecbe40e997ee3df748e5244d54b
|
4
|
+
data.tar.gz: 76542de51984d7851304b675defe86b8403e44753f5bda3d5e11cf66c9f25737
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/create_tests.rb
CHANGED
@@ -1,408 +1,8 @@
|
|
1
1
|
|
2
2
|
require "logger"
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
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
|
+
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-
|
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.
|
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.
|
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
|
-
|
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
|