module TestJoska

Constants

VERSION

Public Instance Methods

arrayKeyRemover(object, key) click to toggle source
# File lib/test_joska/builder.rb, line 416
def arrayKeyRemover(object, key)
 
  res = []
 
  object.each do |obj| res.push(keyRemover(obj, key)) end
 
  return res
 
end
checkFloat(value) click to toggle source
# File lib/test_joska/builder.rb, line 305
def checkFloat value 

  true if Float value rescue false

end
comparePrice(price1, price2, type1, type2) click to toggle source
# File lib/test_joska/builder.rb, line 260
def comparePrice(price1, price2, type1, type2)

  range = price1.abs * @@min_price_percent > @@min_price_flat ? price1.abs * @@min_price_percent : @@min_price_flat

  if !(price1.abs-range...price1.abs+range).include?(price2.abs)

    error_message = "Diferença de preço encontrada (#{type1} - #{type2})\n#{type1}: R$#{price1} / #{type2}: R$#{price2}"

    raise error_message if @@raise_on_error

    jskLog(error_message) 

  end

end
compareType(value, type, name) click to toggle source
# File lib/test_joska/builder.rb, line 277
def compareType(value, type, name)

  return if type == Boolean && (value.is_a?(TrueClass) || value.is_a?(FalseClass))

  raise "Variavel #{name} retornou com tipo diferente de #{type}\n(#{value.class}: #{value})" if !value.is_a?(type)

end
compareValues(value1, value2, message, type1, type2) click to toggle source
# File lib/test_joska/builder.rb, line 286
def compareValues(value1, value2, message, type1, type2)

  if value1 != value2

    value1 = "null" if value1 == nil

    value2 = "null" if value2 == nil

    error_message = "Conflito: #{message}  (#{type1} - #{type2})\n#{type1}: #{value1} /  #{type2}: #{value2}"

    raise error_message if @@raise_on_error

    jskLog(error_message)

  end

end
customRequest(method, product, path, query, payload=nil, header=nil, endpoint=nil) click to toggle source
# File lib/test_joska/builder.rb, line 106
def customRequest(method, product, path, query, payload=nil, header=nil, endpoint=nil)

  endpoint = @@standard_endpoint if !endpoint

  header = @@standard_header if !header

  url = "#{URL[product]["base"][endpoint]}#{path}"

  if query

    query.keys.each do |key| url = "#{url}#{key}=#{query[key]}&" end

    url.chomp!('&')

  end

  res = ""
  
  p url if @@verbose

  begin

    RestClient::Request.execute(method: method, url: url, headers: header, payload: payload, timeout: 90) do |response| res = response end

  rescue StandardError => error 
    
    res = error 
  
  end

  return res

end
genericComparator(object1, object2, context, type1 , type2, remove=nil) click to toggle source
# File lib/test_joska/builder.rb, line 312
def genericComparator(object1, object2, context, type1 , type2, remove=nil)

  if remove.kind_of?(Array)

    object1 = genericKeyRemover(object1, remove)

    object2 = genericKeyRemover(object2, remove)

  end

  if object1.is_a?(Hash) && object2.is_a?(Hash)

    compareValues(object1.keys.count, object2.keys.count, "#{context}_keyCount", type1, type2)

    (object1.keys | object2.keys).each do |key|

      genericComparator(object1[key], object2[key], "#{context}_#{key}", type1, type2)

    end

  elsif object1.is_a?(Array) && object2.is_a?(Array)

    if object1.count != object2.count

      genericComparator(object1[0], object2[0], "#{context}_arrayElement", type1, type2) if object1[0] && object2[0] 

      return compareValues(object1.count, object2.count, "#{context}_arrayCount", type1, type2)

    end

    array_count = 0

    while array_count < object1.count do

      genericComparator(object1[array_count], object2[array_count], "#{context}_arrayElement", type1, type2)

      array_count += 1

    end

  elsif (checkFloat(object1) && checkFloat(object2)) && (object1.to_s.include?(".") || object2.to_s.include?("."))

    comparePrice(object1.to_f, object2.to_f, "#{type1}_#{context}", "#{type2}_#{context}")

  elsif context.split("_").last.include?("Token")

    object1 = rateTokenBuilder(object1) if object1.kind_of?(String)

    object2 = rateTokenBuilder(object2) if object2.kind_of?(String)

    genericComparator(object1, object2, "#{context}_decoded", type1, type2)

  else

    compareValues(object1, object2, context, type1, type2)

  end

end
genericKeyRemover(object, keys) click to toggle source
# File lib/test_joska/builder.rb, line 380
def genericKeyRemover(object, keys)
 
  raise "Metodo aceita apenas arrays como chave" if !keys.kind_of?(Array)
 
  keys.each do |key| object = keyRemover(object, key) end
 
  return object
 
end
jskClearLog() click to toggle source
# File lib/test_joska/builder.rb, line 88
def jskClearLog

  @@internal_log = ""

end
jskClearUrlLog() click to toggle source
# File lib/test_joska/builder.rb, line 100
def jskClearUrlLog

  @@url_log = ""

end
jskGetLog() click to toggle source
# File lib/test_joska/builder.rb, line 74
def jskGetLog

  return @@internal_log

end
jskGetUrlLog() click to toggle source
# File lib/test_joska/builder.rb, line 94
def jskGetUrlLog

  return @@url_log

end
jskLog(message) click to toggle source
# File lib/test_joska/builder.rb, line 80
def jskLog(message)

  p message if @@verbose

  @@internal_log = "#{@@internal_log}#{message}\n"

end
jskRoomBuilder(rooms) click to toggle source
# File lib/test_joska/builder.rb, line 373
def jskRoomBuilder(rooms)

  return rooms.gsub(",", "%2C").gsub("+", "%2B")

end
jskSetup(options) click to toggle source
# File lib/test_joska/builder.rb, line 50
def jskSetup(options)

  @@raise_on_error = options["raise_on_error"] if options["raise_on_error"] != nil

  @@verbose = options["verbose"] if options["verbose"] != nil

  @@URL = options["url_parts"] if options["url_parts"] != nil

  @@HEAD = options["headers"] if options["headers"] != nil

  @@standard_endpoint = options["standard_endpoint"] if options["standard_endpoint"] != nil

  @@standard_header = @@HEAD[options["standard_header_name"]] if options["standard_header_name"] != nil

  @@standard_header = options["standard_header"] if options["standard_header"] != nil

  @@has_token = options["has_token"] if options["has_token"] != nil

  @@min_price_flat = options["min_price_flat"] if options["min_price_flat"] != nil

  @@min_price_percent = options["min_price_percent"] if options["min_price_percent"] != nil

end
jskSlackExcelSender(options) click to toggle source
# File lib/test_joska/builder.rb, line 450
def jskSlackExcelSender(options)

  name = options["name"]

  project = options["project"]

  project_type = options["project_type"]

  environment = options["environment"]

  additional_info = options["additional_info"]

  report_path = options["report_path"]

  slack_url = options["slack_url"]

  send_server = options["send_server"]

  send_slack = options["send_slack"]

  send_excel = options["send_excel"]

  rep_id = 0

  slack_payload = {}

  excel_payload = {}

  t = Time.now

  generated_report_path = "#{report_path}/report_#{project}_#{project_type}_#{environment} #{t.strftime('%d_%m_%y %H_%M_%S')}" 

  options = {
    input_path: report_path,
    report_path: generated_report_path,
    report_types: [:html],
    report_title: "Report: #{project} #{project_type} #{environment}",
    additional_info: additional_info
  }

  ReportBuilder.build_report options

  if send_server

    p "Enviando para o servidor..."

    file_to_transfer = "#{generated_report_path}.html"
  
    zipfile_name = "#{report_path}/mandar.zip"
  
    File.delete(zipfile_name) if File.exist?(zipfile_name)
  
    Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
  
      file_to_transfer = file_to_transfer.split('/').last
  
      zipfile.add(file_to_transfer, File.join(report_path, file_to_transfer))
  
    end
  
    file_to_send = File.new(zipfile_name, 'rb')
  
    payload = {
      :report => file_to_send,
      :usr => name,
      :project => "#{project}_#{project_type}",
      :env => environment,
      :simple => true
    }
  
    url = "http://corp-report01.compute.br-sao-1.cvccorp.cloud:4444"  
  
    repId = ""
  
    RestClient::Request.execute(method: 'post', url: "#{url}/generate", payload: payload) do |response| 

      repId = response.body

    end
  
    if repId.to_i == 0
  
      p "Deu algum problema no servidor"

    end

  end

  if send_slack || send_excel

    rep = JSON.parse(File.read("#{report_path}/report.json"))

    scn_status = {}

    step_status = {}

    scn_status["success"] = 0

    excel_report = []

    rep.each do |esq|

      esq["elements"].each do |scn|

        cur_scn = "success" if scn["type"] == "scenario"

        excel_scenario = {
          "Produto"=> project,
          "Cenário"=> esq["name"],
          "Status"=> "passed",
          "Erro"=> nil,
          "Data"=> t.strftime('%d/%m/%y'),
          "Ambiente"=> environment,
          "Tipo"=> project_type,
          "Hora"=> t.strftime('%H:%M:%S')
        }

        scn["steps"].each do |step|

          if cur_scn == "success" && step["result"]["status"] != "passed"

            excel_scenario["Status"] = step["result"]["status"]

            excel_scenario["Erro"] = step["result"]["error_message"].split("\n").first.split("(RuntimeError)").first if step["result"]["error_message"]
          
            cur_scn = step["result"]["status"] 

          end

          step_status[step["result"]["status"]] ? step_status[step["result"]["status"]] += 1 : step_status[step["result"]["status"]] = 1

        end

        excel_report.push(excel_scenario) if scn["keyword"] != "Contexto"

        scn_status[cur_scn] ? scn_status[cur_scn] += 1 : scn_status[cur_scn] = 1 if cur_scn

      end

    end

    not_passed = 0

    slack_title = "Teste de #{project} #{project_type} no ambiente #{environment} concluido"

    slack_msg = "Cenários: "

    scn_status.keys. each do |key| 
      
      slack_msg = "#{slack_msg}#{key} : #{scn_status[key]} / "  
      
      not_passed += scn_status[key] if key != "success"
    
    end

    slack_msg.chomp!("/ ")

    slack_msg = "#{slack_msg}\nSteps: "

    step_status.keys. each do |key| slack_msg = "#{slack_msg}#{key} : #{step_status[key]} / "  end

    slack_msg.chomp!("/ ")

    total = not_passed + scn_status["success"]

    green = (255*scn_status["success"]/total).to_s(16).upcase

    green = "0#{green}" if green.length == 1

    red = (255*not_passed/total).to_s(16).upcase

    red = "0#{red}" if red.length == 1

    slack_color = "##{red}#{green}00"

    link = nil

    link = "#{url}/#{name}/#{project}_#{project_type}/#{environment}/#{repId}" if repId.to_i != 0

    slack_payload = {
      "attachments" => [
        {
          "color": slack_color,
          "title": slack_title,
          "title_link": link,
          "text": slack_msg
        }
      ]
    }.to_json

    excel_payload = {"scenarios"=>excel_report}

  end

  if send_slack

    p "Enviando para o slack..."

    RestClient::Request.execute(method: "post", url: slack_url, payload: slack_payload)

  end

  if send_excel

    p "Envidando para o excel..."

    excel_url = "http://corp-report01.compute.br-sao-1.cvccorp.cloud:8080/upload" 

    p RestClient::Request.execute(method: "post", url: excel_url, payload: excel_payload) 

  end

end
jskUrlBuilder(product, type, details, endpoint) click to toggle source
# File lib/test_joska/builder.rb, line 198
def jskUrlBuilder(product, type, details, endpoint)

  raise "URL_parts não configurada" if !@@URL

  details = "" if !details

  details = [details] if !details.kind_of?(Array)

  url = @@URL[product]["base"][endpoint]

  if !@@URL[product]["path"][type].kind_of?(Array)

    return "#{url}#{@@URL[product]["path"][type]}#{details[0]}"

  else

    query_pos = 0

    @@URL[product]["path"][type].each do |query|

      if details[query_pos] && details[query_pos] != ""

        query = query[0] if query.kind_of?(Array)

        url = "#{url}#{query}#{details[query_pos]}"

      else

        query.kind_of?(Array) ? url = "#{url}#{query[0]}#{query[1]}" : url = "#{url}#{query}"

      end

      query_pos += 1

    end

    return url

  end

end
jskValues() click to toggle source
# File lib/test_joska/builder.rb, line 32
def jskValues
  p "Raise on error: #{@@raise_on_error}" 
  p ""
  p "Verbose: #{@@verbose}"
  p ""
  p "Url parts: #{@@URL}"
  p ""
  p "Headers: #{@@HEAD}"
  p ""
  p "Standard endpoint: #{@@standard_endpoint}"
  p ""
  p "Standard header: #{@@standard_header}"
  p ""
  p "Internal log: #{@@internal_log}"
  p ""
  p "Url log: #{@@url_log}"
end
keyRemover(object, key) click to toggle source
# File lib/test_joska/builder.rb, line 391
def keyRemover(object, key)

  return arrayKeyRemover(object, key) if object.kind_of?(Array)

  object = object.except
 
  key = key.split("|")
 
  if !object[key.first] || key.count == 1
 
    object = object.except(key.first)
 
  else
 
    object[key.first] = rateTokenBuilder(object[key.first]) if key.first.include?("Token") && object[key.first].kind_of?(String)
 
    object[key.first] = object[key.first].kind_of?(Array) ? arrayKeyRemover(object[key.first], key.drop(1).join("|")) : keyRemover(object[key.first], key.drop(1).join("|"))
 
  end
 
  return object
 
end
rateTokenBuilder(rateToken) click to toggle source
# File lib/test_joska/builder.rb, line 240
def rateTokenBuilder(rateToken)

  token_decoded = Base64.decode64(rateToken).gsub(" ", "").gsub("/>", "").gsub("<rateToken", "").gsub("=", "").split('"')

  built_token = {}

  cur_part = 0

  while cur_part < token_decoded.count do

    built_token[token_decoded[cur_part]] = token_decoded[cur_part + 1]

    cur_part += 2

  end

  built_token

end
request(method, product, type, details=nil, payload=nil, header=nil, endpoint=nil) click to toggle source
# File lib/test_joska/builder.rb, line 140
def request(method, product, type, details=nil, payload=nil, header=nil, endpoint=nil)

  raise "URL_parts não configurada" if !@@URL

  endpoint = @@standard_endpoint if !endpoint

  url = jskUrlBuilder(product, type, details, endpoint)

  header = @@standard_header if !header

  header = @@HEAD[header] if header.kind_of?(String)

  payload = payload.to_json if payload

  res = ""

  p url if @@verbose

  @@url_log = "#{@@url_log}\n#{method} #{type}: #{url}"

  @@url_log = "#{@@url_log}\nPayload: #{payload}" if payload && type != "login"

  RestClient::Request.execute(method: method, url: url, headers: header, payload: payload, timeout: 90) do |response|

    res_message = response

    if response.code != 200

      begin

        res_message = JSON.parse(res_message)

      rescue

        p "Não possível converter para json"

      end
    
      raise "Erro no serviço #{type}, codigo: #{response.code} \nURL: #{url} \nResposta: #{res_message}" 

    end

    res = response

  end

  begin

    return JSON.parse(res)

  rescue

    raise "Problema em converter a resposta #{res}" if res != ""

  end

end