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 +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
|