qaa_helpers 6.0.1
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 +7 -0
- data/.gitignore +10 -0
- data/Gemfile +4 -0
- data/README.md +39 -0
- data/lib/qaa/api_handler.rb +86 -0
- data/lib/qaa/browser_formatter_helper.rb +24 -0
- data/lib/qaa/helpers.rb +8 -0
- data/lib/qaa/helpers/version.rb +5 -0
- data/lib/qaa/logger_helper.rb +127 -0
- data/lib/qaa/report_helper.rb +72 -0
- data/lib/qaa/uri_helper.rb +27 -0
- data/qaa-helpers.gemspec +39 -0
- data/qaa_helpers-6.0.0.gem +0 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/unit_test/qaa/api_handler_spec.rb +71 -0
- data/spec/unit_test/qaa/logger_helper_spec.rb +75 -0
- data/spec/unit_test/qaa/report_helper_spec.rb +33 -0
- data/spec/unit_test/qaa/uri_helper_spec.rb +65 -0
- metadata +161 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7abf2c04946c67e706c64d188f10e873d32dbb8aa378cfb22fbd92a8a7c43501
|
4
|
+
data.tar.gz: dd07b3ca3e1d00448432a368479f0f22d144e120c16cd35af4e809888c447478
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 370b3a8ddde05ab18528777fdeef84d159952080ddaed587d6bacff1f869fd2693a60f369404209351ee6f64a7d32cf818fedba0223927dc3cedd5ce649278ff
|
7
|
+
data.tar.gz: 5f49d09b3102360d497ce387e4a0c18a79fc5b7ef2a5b5dbf19aa066920c5c1f47ea05dae391a8aa3eb0c0372166bef2fe20c9c1dd9a213eb40d9b33e3e9d1e0
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Qaa_helpers
|
2
|
+
|
3
|
+
## Description
|
4
|
+
This Helpers contains helpers that used in both Mobile and Desktop
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
```ruby
|
9
|
+
gem 'qaa_helpers'
|
10
|
+
```
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
```ruby
|
14
|
+
# get list of helpers for Mobile theme and Desktop theme
|
15
|
+
require 'qaa/qaa_helpers'
|
16
|
+
```
|
17
|
+
## Contributing
|
18
|
+
Create ticket on jira, project WSAT, component qaa_helpers for any bug found, or improvement suggestion
|
19
|
+
|
20
|
+
## Improvement
|
21
|
+
More helpers will be added: logger-helper, report-helper, price-helper, hook-helper
|
22
|
+
|
23
|
+
## More information
|
24
|
+
|
25
|
+
## Version
|
26
|
+
5.0.1 : add HTTP delete method
|
27
|
+
5.0.0 : remove api config in this gem, rename apihelper to api_handler
|
28
|
+
4.0.1 : make apihelper return a full response of an api request
|
29
|
+
4.0.0 : upgrade apihelper, add put and post method
|
30
|
+
3.0.2 : Fix bug: close log file after writing
|
31
|
+
3.0.1 : Fix bug of default severity
|
32
|
+
3.0.0 : change printing log by logger to writing file
|
33
|
+
2.0.0 : Change ReportHelper and LoggerHelper to class. Give more info to ReportHelper
|
34
|
+
1.2.2 : Fix bug logger-helper: cannot debug in ruby 2.3.0
|
35
|
+
1.2.1 : Fix bug report-helper: does not have screenshot
|
36
|
+
1.2.0 : adding report-helper
|
37
|
+
1.1.0 : adding logger-helper
|
38
|
+
1.0.1 : hotfix on name, architectures, dependencies
|
39
|
+
1.0.0 : adding uri-helper
|
@@ -0,0 +1,86 @@
|
|
1
|
+
class APIHandler
|
2
|
+
|
3
|
+
attr_reader :name, :version, :handler
|
4
|
+
|
5
|
+
class << self
|
6
|
+
attr_accessor :api_base_url
|
7
|
+
end
|
8
|
+
|
9
|
+
BASE_URL_MISSING_MSG = 'api_base_url has not been provided. Please use APIHandler.api_base_url = your_api_url to set base url'
|
10
|
+
|
11
|
+
def base_url
|
12
|
+
raise BASE_URL_MISSING_MSG unless self.class.api_base_url
|
13
|
+
self.class.api_base_url
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(api_name, api_version, api_handler)
|
17
|
+
@name = api_name
|
18
|
+
@version = api_version
|
19
|
+
@handler = api_handler
|
20
|
+
end
|
21
|
+
|
22
|
+
def api_post(params)
|
23
|
+
uri = URI.parse(api_handler_url)
|
24
|
+
request = Net::HTTP::Post.new(uri)
|
25
|
+
request.body = params.to_json
|
26
|
+
send_request(uri, request)
|
27
|
+
end
|
28
|
+
|
29
|
+
def api_put(params)
|
30
|
+
uri = URI.parse(api_handler_url)
|
31
|
+
request = Net::HTTP::Put.new(uri)
|
32
|
+
request.body = params.to_json
|
33
|
+
send_request(uri, request)
|
34
|
+
end
|
35
|
+
|
36
|
+
def api_get(params)
|
37
|
+
uri = queried_string_uri(api_handler_url, params)
|
38
|
+
request = Net::HTTP::Get.new(uri)
|
39
|
+
send_request(uri, request)
|
40
|
+
end
|
41
|
+
|
42
|
+
def api_delete(params)
|
43
|
+
uri = queried_string_uri(api_handler_url, params)
|
44
|
+
request = Net::HTTP::Delete.new(uri)
|
45
|
+
send_request(uri, request)
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def queried_string_uri(handler_url, params)
|
51
|
+
params_str = ''
|
52
|
+
params.each {|k, v|
|
53
|
+
if v.is_a? Array
|
54
|
+
v.each {|value| params_str << (params_str.empty? ? "?#{k}=#{value}" : "&#{k}=#{value}")}
|
55
|
+
else
|
56
|
+
params_str << (params_str.empty? ? "?#{k}=#{v}" : "&#{k}=#{v}")
|
57
|
+
end
|
58
|
+
}
|
59
|
+
URI.parse("#{handler_url}#{params_str}")
|
60
|
+
end
|
61
|
+
|
62
|
+
def send_request(uri, request)
|
63
|
+
conn = Net::HTTP.new(uri.host, uri.port)
|
64
|
+
conn.request(request)
|
65
|
+
end
|
66
|
+
|
67
|
+
def api_nodes(nodes_url)
|
68
|
+
nodes_uri = URI.parse(nodes_url)
|
69
|
+
response = send_request(nodes_uri, Net::HTTP::Get.new(nodes_uri))
|
70
|
+
nodes_list = JSON.parse(response.body, symbolize_names: true)[:node][:nodes]
|
71
|
+
nodes_list.reject { |node| node[:value].empty? }
|
72
|
+
end
|
73
|
+
|
74
|
+
def api_url(nodes)
|
75
|
+
api_urls = nodes.map { |node| node[:value] }
|
76
|
+
api_urls.each { |url| url.sub!('-pub', '') }
|
77
|
+
api_urls.sample
|
78
|
+
end
|
79
|
+
|
80
|
+
def api_handler_url
|
81
|
+
nodes_url = "#{base_url}/#{name}/nodes"
|
82
|
+
nodes = api_nodes(nodes_url)
|
83
|
+
url = api_url(nodes)
|
84
|
+
"#{url}/#{version}/#{handler}"
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module BrowserFormatterHelper
|
2
|
+
|
3
|
+
def get_browser_log(type=:browser)
|
4
|
+
@browser.driver.manage.logs.get(type)
|
5
|
+
end
|
6
|
+
|
7
|
+
def get_browser_log_messages(browser_logs)
|
8
|
+
message = ''
|
9
|
+
browser_logs.each{|log| message += log.message + "\n"}
|
10
|
+
message
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_browser_url
|
14
|
+
"URL: #{@browser.url}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_browser_ready_state
|
18
|
+
"ReadyState: #{@browser.ready_state}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_current_cookies
|
22
|
+
"All cookies: #{@browser.driver.manage.all_cookies}"
|
23
|
+
end
|
24
|
+
end
|
data/lib/qaa/helpers.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'qaa/fixtures'
|
3
|
+
|
4
|
+
module Qaa
|
5
|
+
class LoggerHelper
|
6
|
+
attr_accessor :logger_file_path
|
7
|
+
attr_accessor :progname
|
8
|
+
attr_accessor :logger
|
9
|
+
|
10
|
+
DEFAULT_SEVERITY = 'info'
|
11
|
+
|
12
|
+
if (ENV['log_severity'] || Fixtures.instance['log_severity']).empty?
|
13
|
+
LOG_SEVERITY= DEFAULT_SEVERITY
|
14
|
+
else
|
15
|
+
LOG_SEVERITY = ENV['log_severity'] || Fixtures.instance['log_severity']
|
16
|
+
end
|
17
|
+
|
18
|
+
LOGGER_LEVEL = { 'DEBUG': :debug,
|
19
|
+
'INFO': :info,
|
20
|
+
'WARNING': :warn,
|
21
|
+
'ERROR': :error,
|
22
|
+
'SEVERE': :fatal,
|
23
|
+
'UNKNOWN': :unknown }
|
24
|
+
|
25
|
+
def self.log_step_info(info)
|
26
|
+
@logger.info(info)
|
27
|
+
file = File.open(@logger_file_path, "a")
|
28
|
+
file.write("#{info}\n")
|
29
|
+
file.close
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.print_step_info(info)
|
33
|
+
@logger.info(info)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.logger
|
37
|
+
if RUBY_VERSION < '2.3.0'
|
38
|
+
severity = Logger::Severity.const_get(LOG_SEVERITY.upcase)
|
39
|
+
else
|
40
|
+
severity = LOG_SEVERITY
|
41
|
+
end
|
42
|
+
@log = Logger.new(STDOUT)
|
43
|
+
@log.level = severity
|
44
|
+
@log.datetime_format = '%Y-%m-%d %H:%M:%S'
|
45
|
+
@log.progname = @progname if @log.progname != @progname
|
46
|
+
@log.formatter = proc do |severity, datetime, progname, msg|
|
47
|
+
"[#{datetime}]: #{severity[0, 3]} -- #{progname} - #{msg}\n"
|
48
|
+
end
|
49
|
+
@logger = @log
|
50
|
+
@log
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.logger_file_path
|
54
|
+
@logger_file_path
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.logger_file_path=(file_path)
|
58
|
+
@logger_file_path = file_path
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.print_log_for_step(scenario, browser_log, *args)
|
62
|
+
args.each { |arg|
|
63
|
+
@logger.info(arg)
|
64
|
+
file = File.open(@logger_file_path, "a")
|
65
|
+
file.write("#{arg}\n")
|
66
|
+
file.close
|
67
|
+
}
|
68
|
+
print_browser_log(browser_log)
|
69
|
+
scenario.attach_file('info', File.new(@logger_file_path))
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.print_browser_log(browser_log)
|
73
|
+
unless browser_log.empty?
|
74
|
+
browser_log.each do |log|
|
75
|
+
level = LOGGER_LEVEL[log.level.to_sym]
|
76
|
+
@logger.send(level, "Browser logs: #{log.message}")
|
77
|
+
file = File.open(@logger_file_path, "a")
|
78
|
+
file.write("Browser logs: #{log.message}\n")
|
79
|
+
file.close
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.update_step_for_logger(report_directory, report_folder, scenario = nil, step_name = nil)
|
86
|
+
unless scenario.nil?
|
87
|
+
file_path = ReportHelper.generate_report_directory(report_directory, report_folder, scenario, step_name)
|
88
|
+
else
|
89
|
+
file_path = "#{report_directory}/#{report_folder}/Universal_Initialize"
|
90
|
+
end
|
91
|
+
|
92
|
+
@logger_file_path = "#{file_path}_running_log.log"
|
93
|
+
unless step_name.nil?
|
94
|
+
@progname = step_name
|
95
|
+
else
|
96
|
+
@progname = "Universal_Initialize"
|
97
|
+
end
|
98
|
+
|
99
|
+
@logger = logger
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.set_parameter(name, value)
|
103
|
+
if name.nil? || name.to_s.empty?
|
104
|
+
@logger.warn("The teamcity parameter name is required and can't be nil or empty. Parameter ignored")
|
105
|
+
else
|
106
|
+
if value.nil? || value.to_s.empty?
|
107
|
+
@logger.warn("The teamcity parameter named:#{name} have empty or nil value and will be ignored.")
|
108
|
+
else
|
109
|
+
@logger.info "##teamcity[setParameter name='#{name}' value='#{value}']"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.add_stat(key, value)
|
115
|
+
if key.nil? || key.to_s.empty?
|
116
|
+
@logger.warn("The teamcity parameter key is required and can't be nil or empty. Statistic ignored")
|
117
|
+
else
|
118
|
+
if value.nil? || value.to_s.empty?
|
119
|
+
@logger.warn("The teamcity parameter key:#{key} have empty or nil value and will be ignored.")
|
120
|
+
else
|
121
|
+
@logger.info("##teamcity[buildStatisticValue key='#{key}' value='#{value}']")
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require_relative 'browser_formatter_helper'
|
2
|
+
module Qaa
|
3
|
+
class ReportHelper
|
4
|
+
attr_accessor :report_info
|
5
|
+
|
6
|
+
def self.generate_report_directory(project_dir, report_folder, scenario, step_name)
|
7
|
+
if scenario.is_a? RSpec::Core::Example
|
8
|
+
feature_name = File.basename(scenario.file_path, '.rb').underscore_all
|
9
|
+
scenario_name = scenario.example_group.description.underscore_all
|
10
|
+
else
|
11
|
+
feature_name = scenario.feature.name.underscore_all
|
12
|
+
scenario_name = scenario.name.underscore_all
|
13
|
+
end
|
14
|
+
generate_file_path_and_name(project_dir, report_folder, feature_name, scenario_name, step_name.underscore_all)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.generate_file_path_and_name(directory, folder_name, feature_name, scenario_name, step_name)
|
18
|
+
time = Time.now.strftime('%Y-%m-%d_%H-%M-%S')
|
19
|
+
report_folder = File.join("#{directory}", folder_name, feature_name, scenario_name)
|
20
|
+
file_name = step_name||scenario_name
|
21
|
+
report_file_name = "#{file_name}_#{time}_#{Fixtures.instance['env']}_#{Fixtures.instance['venture']}"
|
22
|
+
FileUtils.mkdir_p(report_folder)
|
23
|
+
"#{report_folder}/#{report_file_name}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.generate_report_for_step(scenario, report_directory, report_file)
|
27
|
+
file = File.open("#{report_directory}_#{report_file.file_name}.#{report_file.file_extension}", "a")
|
28
|
+
file.write(report_file.file_content) unless report_file.file_content.nil? || report_file.file_content.empty?
|
29
|
+
file.close
|
30
|
+
attach_file_to_allure(scenario, report_file)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.take_step_screenshot(browser, scenario, screenshot_file_path)
|
34
|
+
screenshot_file_name = "#{screenshot_file_path}_screenshot.png"
|
35
|
+
browser.screenshot.save(screenshot_file_name)
|
36
|
+
attach_file_to_allure(scenario, ReportFile.new(file_name: 'screenshot', file_path: screenshot_file_path, file_extension: 'png'))
|
37
|
+
screenshot_file_name
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.attach_file_to_allure(scenario, report_file)
|
41
|
+
file = "#{report_file.file_path}_#{report_file.file_name}.#{report_file.file_extension}"
|
42
|
+
attachment = scenario.attach_file(report_file.file_name, File.new(file)) if File.exist?(file)
|
43
|
+
attachment
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.report_info
|
47
|
+
@report_info
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.add_info_report(info)
|
51
|
+
if @report_info.nil?
|
52
|
+
@report_info = info
|
53
|
+
else
|
54
|
+
@report_info += info
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def underscore_all
|
59
|
+
gsub(/[^a-zA-Z0-9]/, '_').gsub(/^_*|_*$/, '')
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class ReportFile
|
64
|
+
attr_accessor :file_path, :file_name, :file_extension, :file_content
|
65
|
+
def initialize(data={})
|
66
|
+
@file_name = data[:file_name]
|
67
|
+
@file_extension = data[:file_extension]
|
68
|
+
@file_content = data[:file_content]
|
69
|
+
@file_path = data[:file_path]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'net/http'
|
3
|
+
|
4
|
+
module Qaa
|
5
|
+
class UriHelper
|
6
|
+
ALLOWED_HTTP_CODE_RESPONSE ||= ['200', '301']
|
7
|
+
|
8
|
+
def self.get_hostname(url)
|
9
|
+
uri = URI(url)
|
10
|
+
uri.hostname
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.format_uri(url_string)
|
14
|
+
url_string = "http://#{url_string}" unless url_string.match(/^http(s|):\/\//)
|
15
|
+
URI.parse(url_string)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.check_url_response(uri)
|
19
|
+
response = Net::HTTP.get_response(uri)
|
20
|
+
raise Net::HTTPError.new("Wrong response from #{uri}: \nresponse code:#{response.code}", response) if (response && !ALLOWED_HTTP_CODE_RESPONSE.include?(response.code))
|
21
|
+
if response.is_a? Net::HTTPMovedPermanently
|
22
|
+
uri= URI.parse(response['location'])
|
23
|
+
end
|
24
|
+
uri
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/qaa-helpers.gemspec
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'qaa/helpers/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "qaa_helpers"
|
8
|
+
spec.version = Qaa::Helpers::VERSION
|
9
|
+
spec.authors = ["Hang Nguyen"]
|
10
|
+
spec.email = ["hang.nguyen.161@gmail.com"]
|
11
|
+
spec.description = 'Small functions to use as toolbox'
|
12
|
+
spec.summary = %q{Qaa helpers.}
|
13
|
+
spec.homepage = "https://rubygems.org/"
|
14
|
+
spec.license = "hang.nguyen.161@gmail.com"
|
15
|
+
|
16
|
+
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
17
|
+
# delete this section to allow pushing this gem to any host.
|
18
|
+
if spec.respond_to?(:metadata)
|
19
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org/'
|
20
|
+
else
|
21
|
+
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
22
|
+
end
|
23
|
+
|
24
|
+
ignores = File.readlines(".gitignore").grep(/\S+/).map(&:chomp)
|
25
|
+
dot_files = %w[.gitignore]
|
26
|
+
|
27
|
+
all_files_without_ignores = Dir["**/*"].reject { |f|
|
28
|
+
File.directory?(f) || ignores.any? { |i| File.fnmatch(i, f) }
|
29
|
+
}
|
30
|
+
|
31
|
+
spec.files = (all_files_without_ignores + dot_files).sort
|
32
|
+
spec.add_development_dependency 'rspec'
|
33
|
+
spec.add_development_dependency 'simplecov-teamcity-summary', '~> 0'
|
34
|
+
spec.add_development_dependency 'qaa-fixtures'
|
35
|
+
spec.add_development_dependency 'allure-cucumber'
|
36
|
+
spec.add_development_dependency 'allure-rspec'
|
37
|
+
spec.add_runtime_dependency 'watir'
|
38
|
+
spec.add_runtime_dependency "bundler"
|
39
|
+
end
|
Binary file
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
|
3
|
+
require_relative '../lib/qaa/helpers'
|
4
|
+
require_relative '../lib/qaa/api_handler'
|
5
|
+
require 'simplecov'
|
6
|
+
require 'simplecov-teamcity-summary/formatter'
|
7
|
+
|
8
|
+
PROJECT_DIRECTORY = File.expand_path(File.dirname(__FILE__) + "/build" )
|
9
|
+
|
10
|
+
SimpleCov.start do
|
11
|
+
at_exit do
|
12
|
+
SimpleCov::Formatter::TeamcitySummaryFormatter.new.format(SimpleCov.result) if ENV['TEAMCITY_VERSION']
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe APIHandler do
|
4
|
+
before (:all) do
|
5
|
+
api_base_url ||= {
|
6
|
+
staging: {
|
7
|
+
id: 'http://10.34.17.10:2379/v2/keys/lazada_api/id/staging',
|
8
|
+
my: 'http://10.18.21.40:2379/v2/keys/lazada_api/my/staging',
|
9
|
+
ph: 'http://10.18.23.31:2379/v2/keys/lazada_api/ph/staging',
|
10
|
+
sg: 'http://10.18.21.16:2379/v2/keys/lazada_api/sg/staging',
|
11
|
+
th: 'http://10.18.24.10:2379/v2/keys/lazada_api/th/staging',
|
12
|
+
vn: 'http://10.18.20.10:2379/v2/keys/lazada_api/vn/staging'
|
13
|
+
},
|
14
|
+
|
15
|
+
live: {
|
16
|
+
id: 'http://10.34.25.106:2379/v2/keys/lazada_api/id/live',
|
17
|
+
my: 'http://10.18.16.73:2379/v2/keys/lazada_api/my/live',
|
18
|
+
ph: 'http://10.2.16.69:2379/v2/keys/lazada_api/ph/live',
|
19
|
+
sg: 'http://10.18.16.26:2379/v2/keys/lazada_api/sg/live',
|
20
|
+
th: 'http://10.18.18.81:2379/v2/keys/lazada_api/th/live',
|
21
|
+
vn: 'http://10.18.16.65:2379/v2/keys/lazada_api/vn/live'
|
22
|
+
}
|
23
|
+
}
|
24
|
+
VENTURE = [:id, :ph, :sg, :th, :vn, :my].sample
|
25
|
+
ENVIRONMENT = [:staging, :live].sample
|
26
|
+
APIHandler.api_base_url = api_base_url[ENVIRONMENT][VENTURE]
|
27
|
+
@ask_api_question = APIHandler.new('ask_api', 'v1', 'question')
|
28
|
+
@ask_api_product_info = APIHandler.new('ask_api', 'v1', 'product_info')
|
29
|
+
@ask_api_report = APIHandler.new('ask_api', 'v1', 'question')
|
30
|
+
@ask_api_answer = APIHandler.new('ask_api', 'v1', 'answer')
|
31
|
+
@review_api_approve = APIHandler.new('review_api', 'v3', 'approve')
|
32
|
+
@review_api = APIHandler.new('review_api', 'v3', 'reviews')
|
33
|
+
@verify_message = "#{VENTURE.to_s}lzd#{ENVIRONMENT==:staging ? 'stg' : 'live'}"
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'get method' do
|
37
|
+
expect((@ask_api_question.api_get({}).uri).inspect).to include @verify_message
|
38
|
+
expect((@ask_api_product_info.api_get({}).uri).to_s).to include @verify_message
|
39
|
+
expect((@ask_api_report.api_get({}).uri).to_s).to include @verify_message
|
40
|
+
expect((@ask_api_answer.api_get({}).uri).to_s).to include @verify_message
|
41
|
+
expect((@review_api_approve.api_get({}).uri).to_s).to include @verify_message
|
42
|
+
expect((@review_api.api_get({}).uri).to_s).to include @verify_message
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'put method' do
|
46
|
+
expect((@ask_api_question.api_put({}).uri).to_s).to include @verify_message
|
47
|
+
expect((@ask_api_product_info.api_put({}).uri).to_s).to include @verify_message
|
48
|
+
expect((@ask_api_report.api_put({}).uri).to_s).to include @verify_message
|
49
|
+
expect((@ask_api_answer.api_put({}).uri).to_s).to include @verify_message
|
50
|
+
expect((@review_api_approve.api_put({}).uri).to_s).to include @verify_message
|
51
|
+
expect((@review_api.api_put({}).uri).to_s).to include @verify_message
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'post method' do
|
55
|
+
expect((@ask_api_question.api_post({}).uri).to_s).to include @verify_message
|
56
|
+
expect((@ask_api_product_info.api_post({}).uri).to_s).to include @verify_message
|
57
|
+
expect((@ask_api_report.api_post({}).uri).to_s).to include @verify_message
|
58
|
+
expect((@ask_api_answer.api_post({}).uri).to_s).to include @verify_message
|
59
|
+
expect((@review_api_approve.api_post({}).uri).to_s).to include @verify_message
|
60
|
+
expect((@review_api.api_post({}).uri).to_s).to include @verify_message
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'delete method' do
|
64
|
+
expect((@ask_api_question.api_delete({}).uri).to_s).to include @verify_message
|
65
|
+
expect((@ask_api_product_info.api_delete({}).uri).to_s).to include @verify_message
|
66
|
+
expect((@ask_api_report.api_delete({}).uri).to_s).to include @verify_message
|
67
|
+
expect((@ask_api_answer.api_delete({}).uri).to_s).to include @verify_message
|
68
|
+
expect((@review_api_approve.api_delete({}).uri).to_s).to include @verify_message
|
69
|
+
expect((@review_api.api_delete({}).uri).to_s).to include @verify_message
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qaa::LoggerHelper do
|
4
|
+
before (:all) do
|
5
|
+
LoggerHelper.logger_file_path = "#{PROJECT_DIRECTORY}/test.log"
|
6
|
+
@report_directory = PROJECT_DIRECTORY
|
7
|
+
@report_folder = Time.now.strftime('%Y-%m-%d_%H-%M-%S')
|
8
|
+
@log_severity = LoggerHelper::LOG_SEVERITY
|
9
|
+
@date_time_format = "%Y-%m-%d %H:%M:%S"
|
10
|
+
@scenario = nil
|
11
|
+
@logger = LoggerHelper.logger
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'returns a ruby logger with right format and level' do
|
15
|
+
expect(@logger.class).to eql Logger
|
16
|
+
expect(@logger.level).to eql Logger::Severity::INFO
|
17
|
+
expect(@logger.datetime_format).to eql @date_time_format
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'LoggerHelper.update_logger_progname' do
|
21
|
+
before :all do
|
22
|
+
@logger = LoggerHelper.new.logger
|
23
|
+
end
|
24
|
+
it 'update_logger_progname' do
|
25
|
+
test_step = 'test_step'
|
26
|
+
allow(ReportHelper).to receive(:generate_report_directory).and_return LoggerHelper.logger_file_path
|
27
|
+
LoggerHelper.update_step_for_logger(@report_directory, @report_folder, @scenario, test_step)
|
28
|
+
expect(LoggerHelper.logger.progname).to eql test_step
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'LoggerHelper.set_parameter' do
|
33
|
+
before :all do
|
34
|
+
@logger = LoggerHelper.logger
|
35
|
+
end
|
36
|
+
it 'log a warn if the parameter name is nil or empty' do
|
37
|
+
expect(@logger).to receive(:warn).with("The teamcity parameter name is required and can't be nil or empty. Parameter ignored").twice
|
38
|
+
LoggerHelper.set_parameter(nil, 0)
|
39
|
+
LoggerHelper.set_parameter('', 0)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'log a warn if the value of the parameter is nil or empty' do
|
43
|
+
expect(@logger).to receive(:warn).with("The teamcity parameter named:name have empty or nil value and will be ignored.").twice
|
44
|
+
LoggerHelper.set_parameter('name', nil)
|
45
|
+
LoggerHelper.set_parameter('name', '')
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should log the teamcity parameter' do
|
49
|
+
expect(@logger).to receive(:info).with("##teamcity[setParameter name='name' value='value']")
|
50
|
+
LoggerHelper.set_parameter('name', 'value')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'LoggerHelper.add_stat' do
|
55
|
+
before :all do
|
56
|
+
@logger = LoggerHelper.logger
|
57
|
+
end
|
58
|
+
it 'log a warn if the parameter stat key is nil or empty' do
|
59
|
+
expect(@logger).to receive(:warn).with("The teamcity parameter key is required and can't be nil or empty. Statistic ignored").twice
|
60
|
+
LoggerHelper.add_stat(nil, 0)
|
61
|
+
LoggerHelper.add_stat('', 0)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'log a warn if the value of the parameter is nil or empty' do
|
65
|
+
expect(@logger).to receive(:warn).with("The teamcity parameter key:key have empty or nil value and will be ignored.").twice
|
66
|
+
LoggerHelper.add_stat('key', nil)
|
67
|
+
LoggerHelper.add_stat('key', '')
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should log the teamcity parameter' do
|
71
|
+
expect(@logger).to receive(:info).with("##teamcity[buildStatisticValue key='key' value='10']")
|
72
|
+
LoggerHelper.add_stat('key', '10')
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ReportHelper do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@time_fixed = Time.now.strftime('%Y-%m-%d_%H-%M-%S')
|
7
|
+
@project_dir = PROJECT_DIRECTORY
|
8
|
+
@feature_name = 'feature_name'
|
9
|
+
@scenario_name = 'scenario_name'
|
10
|
+
@step_name = 'step_name'
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'generate_file_path_and_name' do
|
14
|
+
ReportHelper.generate_file_path_and_name(@project_dir, @time_fixed, @feature_name, @scenario_name, @step_name)
|
15
|
+
expect(File.exist? "#{@project_dir}/#{@time_fixed}").to be true
|
16
|
+
expect(File.exist? "#{@project_dir}/#{@time_fixed}/#{@feature_name}").to be true
|
17
|
+
expect(File.exist? "#{@project_dir}/#{@time_fixed}/#{@feature_name}/#{@scenario_name}").to be true
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'generate report folder' do
|
21
|
+
scenario = 'scenario'
|
22
|
+
allow(@feature_name).to receive(:underscore_all).and_return @feature_name
|
23
|
+
allow(@scenario_name).to receive(:underscore_all).and_return @scenario_name
|
24
|
+
allow(@step_name).to receive(:underscore_all).and_return @step_name
|
25
|
+
allow(scenario).to receive(:feature).and_return @feature_name
|
26
|
+
allow(scenario.feature).to receive(:name).and_return @feature_name
|
27
|
+
allow(scenario).to receive(:name).and_return @scenario_name
|
28
|
+
ReportHelper.generate_report_directory(@project_dir, @time_fixed, scenario, @step_name)
|
29
|
+
expect(File.exist? "#{@project_dir}/#{@time_fixed}").to be true
|
30
|
+
expect(File.exist? "#{@project_dir}/#{@time_fixed}/#{@feature_name}").to be true
|
31
|
+
expect(File.exist? "#{@project_dir}/#{@time_fixed}/#{@feature_name}/#{@scenario_name}").to be true
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qaa::UriHelper do
|
4
|
+
|
5
|
+
describe 'UriHelper.hostname' do
|
6
|
+
it 'return the good staging hostname' do
|
7
|
+
expect(UriHelper.get_hostname('http://alice-staging.lazada.vn/all-products/?page=10')).to eq('alice-staging.lazada.vn')
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'return the good showroom hostname' do
|
11
|
+
expect(UriHelper.get_hostname('http://ws-7982.id.russia/all-products/?page=10')).to eq('ws-7982.id.russia')
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'return the good live hostname' do
|
15
|
+
expect(UriHelper.get_hostname('http://www.lazada.vn/all-products/?page=10')).to eq('www.lazada.vn')
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'return the good hostname even on https' do
|
19
|
+
expect(UriHelper.get_hostname('https://www.lazada.vn/all-products/?page=10')).to eq('www.lazada.vn')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'UriHelper.format_uri' do
|
24
|
+
it 'throw an exception if the parameter is not a valid url' do
|
25
|
+
expect { UriHelper.format_uri('<:/:/:/') }.to raise_exception(URI::InvalidURIError)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'to add http by himself' do
|
29
|
+
lzd_uri = URI.parse('http://www.lazada.com')
|
30
|
+
expect(UriHelper.format_uri('www.lazada.com')).to eq(lzd_uri)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'can generate http uri' do
|
34
|
+
expect(UriHelper.format_uri('http://www.lazada.com').hostname).to eq('www.lazada.com')
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'can generate https uri' do
|
38
|
+
expect(UriHelper.format_uri('https://www.lazada.com').hostname).to eq('www.lazada.com')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'UriHelper.check_url_response' do
|
43
|
+
it 'call http.response' do
|
44
|
+
lzd_uri = URI.parse('http://www.lazada.com')
|
45
|
+
expect(Net::HTTP).to receive(:get_response).with(lzd_uri)
|
46
|
+
UriHelper.check_url_response(lzd_uri)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'return moved uri' do
|
50
|
+
lzd_uri = URI.parse('http://lazada.com')
|
51
|
+
lzd_response = Net::HTTPMovedPermanently.new('1.1', '301', 'Moved Permanently')
|
52
|
+
lzd_response['location'] = 'http://www.lazada.com'
|
53
|
+
lzd_expected_url = URI.parse('http://www.lazada.com')
|
54
|
+
allow(Net::HTTP).to receive(:get_response).and_return(lzd_response)
|
55
|
+
expect(UriHelper.check_url_response(lzd_uri)).to eq(lzd_expected_url)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'throw error on bad http response' do
|
59
|
+
lzd_uri = URI.parse('http://www.lazada.com')
|
60
|
+
lzd_response = Net::HTTPBadGateway.new('1.1', '501', 'Bad Gateway')
|
61
|
+
allow(Net::HTTP).to receive(:get_response).and_return(lzd_response)
|
62
|
+
expect { UriHelper.check_url_response(lzd_uri) }.to raise_exception(Net::HTTPError, "Wrong response from http://www.lazada.com: \nresponse code:501")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
metadata
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: qaa_helpers
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 6.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Hang Nguyen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-12-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: simplecov-teamcity-summary
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: qaa-fixtures
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: allure-cucumber
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: allure-rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: watir
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: bundler
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: Small functions to use as toolbox
|
112
|
+
email:
|
113
|
+
- hang.nguyen.161@gmail.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- ".gitignore"
|
119
|
+
- Gemfile
|
120
|
+
- Gemfile.lock
|
121
|
+
- README.md
|
122
|
+
- lib/qaa/api_handler.rb
|
123
|
+
- lib/qaa/browser_formatter_helper.rb
|
124
|
+
- lib/qaa/helpers.rb
|
125
|
+
- lib/qaa/helpers/version.rb
|
126
|
+
- lib/qaa/logger_helper.rb
|
127
|
+
- lib/qaa/report_helper.rb
|
128
|
+
- lib/qaa/uri_helper.rb
|
129
|
+
- qaa-helpers.gemspec
|
130
|
+
- qaa_helpers-6.0.0.gem
|
131
|
+
- spec/spec_helper.rb
|
132
|
+
- spec/unit_test/qaa/api_handler_spec.rb
|
133
|
+
- spec/unit_test/qaa/logger_helper_spec.rb
|
134
|
+
- spec/unit_test/qaa/report_helper_spec.rb
|
135
|
+
- spec/unit_test/qaa/uri_helper_spec.rb
|
136
|
+
homepage: https://rubygems.org/
|
137
|
+
licenses:
|
138
|
+
- hang.nguyen.161@gmail.com
|
139
|
+
metadata:
|
140
|
+
allowed_push_host: https://rubygems.org/
|
141
|
+
post_install_message:
|
142
|
+
rdoc_options: []
|
143
|
+
require_paths:
|
144
|
+
- lib
|
145
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
146
|
+
requirements:
|
147
|
+
- - ">="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - ">="
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '0'
|
155
|
+
requirements: []
|
156
|
+
rubyforge_project:
|
157
|
+
rubygems_version: 2.7.6
|
158
|
+
signing_key:
|
159
|
+
specification_version: 4
|
160
|
+
summary: Qaa helpers.
|
161
|
+
test_files: []
|