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