qaa_helpers 6.0.1

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