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.
@@ -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
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .idea
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org' do
2
+ gemspec
3
+ end
4
+
@@ -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
@@ -0,0 +1,8 @@
1
+ require 'qaa/helpers/version'
2
+ require 'qaa/uri_helper'
3
+ require 'qaa/logger_helper'
4
+ require 'qaa/report_helper'
5
+ require 'qaa/browser_formatter_helper'
6
+ require 'qaa/api_handler'
7
+
8
+ include Qaa
@@ -0,0 +1,5 @@
1
+ module Qaa
2
+ class Helpers
3
+ VERSION = "6.0.1"
4
+ end
5
+ end
@@ -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
@@ -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
@@ -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: []