module ClientApi

Constants

VERSION

Public Class Methods

configuration() click to toggle source
# File lib/client-api/settings.rb, line 9
def self.configuration
  RSpec.configuration
end
configure() { |config| ... } click to toggle source
# File lib/client-api/settings.rb, line 3
def self.configure
  RSpec.configure do |config|
    yield config
  end
end

Public Instance Methods

base_url() click to toggle source
# File lib/client-api/settings.rb, line 13
def base_url
  ClientApi.configuration.base_url || ''
end
basic_auth() click to toggle source
# File lib/client-api/settings.rb, line 21
def basic_auth
  ClientApi.configuration.basic_auth || ''
end
datatype(type, value) click to toggle source
# File lib/client-api/validator.rb, line 296
def datatype(type, value)
  if (type.downcase == 'string') || (type.downcase.== 'str')
    String
  elsif (type.downcase.== 'integer') || (type.downcase.== 'int')
    Integer
  elsif (type.downcase == 'symbol') || (type.downcase == 'sym')
    Symbol
  elsif (type.downcase == 'array') || (type.downcase == 'arr')
    Array
  elsif (type.downcase == 'object') || (type.downcase == 'obj')
    Object
  elsif (type.downcase == 'boolean') || (type.downcase == 'bool')
    value === true ? TrueClass : FalseClass
  elsif (type.downcase == 'falseclass') || (type.downcase == 'false')
    FalseClass
  elsif (type.downcase == 'trueclass') || (type.downcase == 'true')
    TrueClass
  elsif type.downcase == 'float'
    Float
  elsif type.downcase == 'hash'
    Hash
  elsif type.downcase == 'complex'
    Complex
  elsif type.downcase == 'rational'
    Rational
  elsif type.downcase == 'fixnum'
    Fixnum
  elsif type.downcase == 'bignum'
    Bignum
  else
  end
end
deep_traverse(hash) { |key, value| ... } click to toggle source
# File lib/client-api/validator.rb, line 401
def deep_traverse(hash, &block)
  stack = hash.map {|k, v| [[k], v]}

  while not stack.empty?
    key, value = stack.pop
    yield(key, value)
    if value.is_a? Hash
      value.each do |k, v|
        if v.is_a?(String) then
          if v.empty? then
            v = ""
          end
        end
        stack.push [key.dup << k, v]
      end
    end
  end
end
headers() click to toggle source
# File lib/client-api/settings.rb, line 17
def headers
  ClientApi.configuration.headers || ''
end
is_num?(str) click to toggle source
# File lib/client-api/validator.rb, line 329
def is_num?(str)
  if Float(str)
    true
  end
rescue ArgumentError, TypeError
  false
end
json_output() click to toggle source
# File lib/client-api/settings.rb, line 25
def json_output
  ClientApi.configuration.json_output || ''
end
payload(args) click to toggle source
# File lib/client-api/base.rb, line 122
def payload(args)
  if args['type'].nil?
    JSON.parse(File.read(args))
  else
    case args['type'].downcase
    when 'multipart/form-data', 'application/x-www-form-urlencoded'
      args
    else
      raise "invalid body type | try: payload('./data/request/file.png', 'multipart/form-data')"
    end
  end
end
Also aliased as: schema_from_json
schema_from_json(args)
Alias for: payload
time_out() click to toggle source
# File lib/client-api/settings.rb, line 29
def time_out
  ClientApi.configuration.time_out || 60
end
url_generator(url) click to toggle source
# File lib/client-api/base.rb, line 135
def url_generator(url)
  begin
    if url.count == 2
      raise('":url"'.green + ' field is missing in url'.red) if url[:url].nil?
      raise('":query"'.green + ' field is missing in url'.red) if url[:query].nil?

      query = url[:url].include?('?') ? [url[:url]] : [url[:url].concat('?')]

      url[:query].map do |val|
        query <<  val[0].to_s + "=" + val[1].gsub(' ','%20') + "&"
      end
      return query.join.delete_suffix('&')
    end
  rescue ArgumentError
    url
  end
end
validate(res, *options) click to toggle source
# File lib/client-api/validator.rb, line 5
def validate(res, *options)

  # noinspection RubyScope
  options.map do |data|
    raise('"key": ""'.green + ' field is missing'.red) if data[:key].nil?
    raise('Need at least one field to validate'.green) if data[:value].nil? && data[:type].nil? && data[:size].nil? && data[:empty].nil? && data[:has_key].nil?

    data.keys.map do |val|
      raise "invalid key: " + "#{val}".green unless [:key, :operator, :value, :type, :size, :has_key, :empty].include? val
    end

    value ||= data[:value]
    operator ||= (data[:operator] || '==').downcase
    type ||= data[:type]
    size ||= data[:size]
    empty ||= data[:empty]
    has_key ||= data[:has_key]

    @resp = JSON.parse(res.to_json)
    key = data[:key].split("->")

    @err_method = []

    key.map do |method|
      method = method.to_i if is_num?(method)
      @err_method = @err_method << method

      begin
        if (method.is_a? Integer) && (has_key != nil)
          @valid_key = false
        elsif (!method.is_a? Integer) && (has_key != nil)
          @valid_key = @resp.has_key? method
        elsif (method.is_a? Integer) && has_key.nil?
          raise %[key: ]+ %[#{@err_method.join('->')}].green + %[ does not exist! please check the key once again].red if ((@resp.class != Array) || (method.to_i >= @resp.count))
        elsif (method.is_a? String) && has_key.nil?
          raise %[key: ]+ %[#{@err_method.join('->')}].green + %[ does not exist! please check the key once again].red if !@resp.include?(method)
        end
        @resp = @resp.send(:[], method)
      rescue NoMethodError
        raise %[key: ]+ %[#{@err_method.join('->')}].green + %[ does not exist! please check the key once again].red if has_key.nil?
      end
    end

    case operator
    when '=', '==', 'eql', 'eql?', 'equal', 'equal?'
      # has key validation
      validate_key(@valid_key, has_key, data) if has_key != nil

      # value validation
      expect(value).to eq(@resp), lambda {"[key]: \"#{data[:key]}\"".blue + "\n  didn't match \n[value]: \"#{data[:value]}\"\n"} if value != nil

      # datatype validation
      if (type == 'boolean') || (type == 'bool')
        expect(%w[TrueClass, FalseClass].any? {|bool| bool.include? @resp.class.to_s}).to eq(true), lambda {"[key]: \"#{data[:key]}\"".blue + "\n  datatype shouldn't be \n[type]: \"#{data[:type]}\"\n"}
      elsif ((type != 'boolean') || (type != 'bool')) && (type != nil)
        expect(datatype(type, value)).to eq(@resp.class), lambda {"[key]: \"#{data[:key]}\"".blue + "\n  datatype shouldn't be \n[type]: \"#{data[:type]}\"\n"}
      end

      # size validation
      validate_size(size, data) if size != nil

      # is empty validation
      validate_empty(empty, data) if empty != nil

    when '!', '!=', '!eql', '!eql?', 'not eql', 'not equal', '!equal?'
      # has key validation
      validate_key(@valid_key, has_key, data) if has_key != nil

      # value validation
      expect(value).not_to eq(@resp), lambda {"[key]: \"#{data[:key]}\"".blue + "\n  didn't match \n[value]: \"#{data[:value]}\"\n"} if value != nil

      # datatype validation
      if (type == 'boolean') || (type == 'bool')
        expect(%w[TrueClass, FalseClass].any? {|bool| bool.include? @resp.class.to_s}).not_to eq(true), lambda {"[key]: \"#{data[:key]}\"".blue + "\n  datatype shouldn't be \n[type]: \"#{data[:type]}\"\n"}
      elsif ((type != 'boolean') || (type != 'bool')) && (type != nil)
        expect(datatype(type, value)).not_to eq(@resp.class), lambda {"[key]: \"#{data[:key]}\"".blue + "\n  datatype shouldn't be \n[type]: \"#{data[:type]}\"\n"}
      end

      # size validation
      if size != nil
        begin
          expect(size).not_to eq(@resp.count), lambda {"[key]: \"#{data[:key]}\"".blue + "\n" + "size shouldn't match" + "\n\n" + "[   actual size   ]: #{@resp.count}" + "\n" + "[size not expected]: #{size}".green}
        rescue NoMethodError
          expect(size).not_to eq(0), lambda {"[key]: \"#{data[:key]}\"".blue + "\n" + "size shouldn't match" + "\n\n" + "[   actual size   ]: 0" + "\n" + "[size not expected]: #{size}".green}
        rescue ArgumentError
          expect(size).not_to eq(0), lambda {"[key]: \"#{data[:key]}\"".blue + "\n" + "size shouldn't match" + "\n\n" + "[   actual size   ]: 0" + "\n" + "[size not expected]: #{size}".green}
        end
      end

      # is empty validation
      validate_empty(empty, data) if empty != nil

    when '>', '>=', '<', '<=', 'greater than', 'greater than or equal to', 'less than', 'less than or equal to', 'lesser than', 'lesser than or equal to'
      message = 'is not greater than (or) equal to' if operator == '>=' || operator == 'greater than or equal to'
      message = 'is not greater than' if operator == '>' || operator == 'greater than'
      message = 'is not lesser than (or) equal to' if operator == '<=' || operator == 'less than or equal to'
      message = 'is not lesser than' if operator == '<' || operator == 'less than' || operator == 'lesser than'

      # has key validation
      validate_key(@valid_key, has_key, data) if has_key != nil

      # value validation
      expect(@resp.to_i.public_send(operator, value)).to eq(true), "[key]: \"#{data[:key]}\"".blue + "\n  #{message} \n[value]: \"#{data[:value]}\"\n" if value != nil

      # datatype validation
      expect(datatype(type, value)).to eq(@resp.class), lambda {"[key]: \"#{data[:key]}\"".blue + "\n  datatype shouldn't be \n[type]: \"#{data[:type]}\"\n"} if type != nil

      # size validation
      if size != nil
        begin
          expect(@resp.count.to_i.public_send(operator, size)).to eq(true), lambda {"[key]: \"#{data[:key]}\"".blue + "\n" + "#{message} #{size}" + "\n\n" + "[ actual size ]: #{@resp.count}" + "\n" + "expected size to be #{operator} #{size}".green}
        rescue NoMethodError
          expect(0.public_send(operator, size)).to eq(true), lambda {"[key]: \"#{data[:key]}\"".blue + "\n" + "#{message} #{size}" + "\n\n" + "[ actual size ]: 0" + "\n" + "expected size to be #{operator} #{size}".green}
        rescue ArgumentError
          expect(0.public_send(operator, size)).to eq(true), lambda {"[key]: \"#{data[:key]}\"".blue + "\n" + "#{message} #{size}" + "\n\n" + "[ actual size ]: 0" + "\n" + "expected size to be #{operator} #{size}".green}
        end
      end

      # is empty validation
      validate_empty(empty, data) if empty != nil

    when 'contains', 'has', 'contains?', 'has?', 'include', 'include?'
      # has key validation
      validate_key(@valid_key, has_key, data) if has_key != nil

      # value validation
      expect(@resp.to_s).to include(value.to_s), lambda {"[key]: \"#{data[:key]} => #{@resp}\"".blue + "\n  not contains \n[value]: \"#{data[:value]}\"\n"} if value != nil

      # datatype validation
      if (type == 'boolean') || (type == 'bool')
        expect(%w[TrueClass, FalseClass].any? {|bool| bool.include? @resp.class.to_s}).to eq(true), lambda {"[key]: \"#{data[:key]}\"".blue + "\n  datatype shouldn't be \n[type]: \"#{data[:type]}\"\n"}
      elsif ((type != 'boolean') || (type != 'bool')) && (type != nil)
        expect(datatype(type, value)).to eq(@resp.class), lambda {"[key]: \"#{data[:key]}\"".blue + "\n  datatype shouldn't be \n[type]: \"#{data[:type]}\"\n"}
      end

      # size validation
      if size != nil
        begin
          expect(@resp.count.to_s).to include(size.to_s), lambda {"[key]: \"#{data[:key]} => #{@resp}\"".blue + "\n"+ "size not contains #{size}"+ "\n\n" + "[ actual size ]: #{@resp.count}" + "\n" + "expected size to contain: #{size}".green}
        rescue NoMethodError
          expect(0.to_s).to include(size.to_s), lambda {"[key]: \"#{data[:key]} => #{@resp}\"".blue + "\n"+ "size not contains #{size}"+ "\n\n" + "[ actual size ]: 0" + "\n" + "expected size to contain: #{size}".green}
        rescue ArgumentError
          expect(0.to_s).to include(size.to_s), lambda {"[key]: \"#{data[:key]} => #{@resp}\"".blue + "\n"+ "size not contains #{size}"+ "\n\n" + "[ actual size ]: 0" + "\n" + "expected size to contain: #{size}".green}
        end
      end

      # is empty validation
      validate_empty(empty, data) if empty != nil

    when 'not contains', '!contains', 'not include', '!include'
      # has key validation
      validate_key(@valid_key, has_key, data) if has_key != nil

      # value validation
      expect(@resp.to_s).not_to include(value.to_s), lambda {"[key]: \"#{data[:key]} => #{@resp}\"".blue + "\n  should not contain \n[value]: \"#{data[:value]}\"\n"} if value != nil

      # datatype validation
      if (type == 'boolean') || (type == 'bool')
        expect(%w[TrueClass, FalseClass].any? {|bool| bool.include? @resp.class.to_s}).not_to eq(true), lambda {"[key]: \"#{data[:key]}\"".blue + "\n  datatype shouldn't be \n[type]: \"#{data[:type]}\"\n"}
      elsif ((type != 'boolean') || (type != 'bool')) && (type != nil)
        expect(datatype(type, value)).not_to eq(@resp.class), lambda {"[key]: \"#{data[:key]}\"".blue + "\n  datatype shouldn't be \n[type]: \"#{data[:type]}\"\n"}
      end

      # size validation
      if size != nil
        begin
          expect(@resp.count.to_s).not_to include(size.to_s), lambda {"[key]: \"#{data[:key]} => #{@resp}\"".blue + "\n"+ "size should not contain #{size}"+ "\n\n" + "[ actual size ]: #{@resp.count}" + "\n" + "expected size not to contain: #{size}".green}
        rescue NoMethodError
          expect(0.to_s).not_to include(size.to_s), lambda {"[key]: \"#{data[:key]} => #{@resp}\"".blue + "\n"+ "size should not contain #{size}"+ "\n\n" + "[ actual size ]: 0" + "\n" + "expected size not to contain: #{size}".green}
        rescue ArgumentError
          expect(0.to_s).not_to include(size.to_s), lambda {"[key]: \"#{data[:key]} => #{@resp}\"".blue + "\n"+ "size should not contain #{size}"+ "\n\n" + "[ actual size ]: 0" + "\n" + "expected size not to contain: #{size}".green}
        end
      end

      # is empty validation
      validate_empty(empty, data) if empty != nil

    else
      raise('operator not matching')
    end

  end

end
validate_empty(empty, data) click to toggle source
# File lib/client-api/validator.rb, line 244
def validate_empty(empty, data)
  case empty
  when true
    expect(@resp.nil?).to eq(empty), lambda {"[key]: \"#{data[:key]}\"".blue + "\n is not empty"+"\n"} if [Integer, TrueClass, FalseClass, Float].include? @resp.class
    expect(@resp.empty?).to eq(empty), lambda {"[key]: \"#{data[:key]}\"".blue + "\n is not empty"+"\n"} if [String, Hash, Array].include? @resp.class
  when false
    expect(@resp.nil?).to eq(empty), lambda {"[key]: \"#{data[:key]}\"".blue + "\n is empty"+"\n"} if [Integer, TrueClass, FalseClass, Float].include? @resp.class
    expect(@resp.empty?).to eq(empty), lambda {"[key]: \"#{data[:key]}\"".blue + "\n is empty"+"\n"} if [String, Hash, Array].include? @resp.class
  end
end
validate_headers(res, *options) click to toggle source
# File lib/client-api/validator.rb, line 271
def validate_headers(res, *options)
  options.map do |data|
    raise('key is not given!') if data[:key].nil?
    raise('operator is not given!') if data[:operator].nil?
    raise('value is not given!') if data[:value].nil?

    @resp_header = JSON.parse(res.to_json)

    key = data[:key]
    value = data[:value]
    operator = data[:operator]

    case operator
    when '=', '==', 'eql?', 'equal', 'equal?'
      expect(value).to eq(@resp_header[key][0]), lambda {"\"#{key}\" => \"#{value}\"".blue + "\n  didn't match \n\"#{key}\" => \"#{@resp_header[key][0]}\"\n"}

    when '!', '!=', '!eql?', 'not equal', '!equal?'
      expect(value).not_to eq(@resp_header[key][0]), lambda {"\"#{key}\" => \"#{value}\"".blue + "\n  shouldn't match \n\"#{key}\" => \"#{@resp_header[key][0]}\"\n"}

    else
      raise('operator not matching')
    end
  end
end
validate_json(actual, expected) click to toggle source
# File lib/client-api/validator.rb, line 337
def validate_json(actual, expected)
  param1 = JSON.parse(actual.to_json)
  param2 = JSON.parse(expected.to_json)

  @actual_key, @actual_value = [], []
  deep_traverse(param2) do |path, value|
    if !value.is_a?(Hash)
      key_path = path.map! {|k| k}
      @actual_key << key_path.join("->").to_s
      @actual_value << value
    end
  end

  Hash[@actual_key.zip(@actual_value)].map do |data|
    @resp = param1
    key = data[0].split("->")

    key.map do |method|
      method = method.to_i if is_num?(method)
      @resp = @resp.send(:[], method)
    end

    value = data[1]
    @assert, @final_assert, @overall = [], [], []

    if !value.is_a?(Array)
      expect(value).to eq(@resp)
    else
      @resp.each_with_index do |resp, i|
        value.to_a.each_with_index do |val1, j|
          val1.to_a.each_with_index do |val2, k|
            if resp.to_a.include? val2
              @assert << true
            else
              @assert << false
            end
          end
          @final_assert << @assert
          @assert = []

          if @resp.count == @final_assert.count
            @final_assert.each_with_index do |result, i|
              if result.count(true) == val1.count
                @overall << true
                break
              elsif @final_assert.count == i+1
                expect(value).to eq(@resp)
              end
            end
            @final_assert = []
          end

        end
      end

      if @overall.count(true) == value.count
      else
        expect(value).to eq(@resp)
      end

    end
  end
end
validate_key(valid_key, has_key, data) click to toggle source
# File lib/client-api/validator.rb, line 255
def validate_key(valid_key, has_key, data)
  case valid_key
  when true
    expect(valid_key).to eq(true), lambda {"[key]: \"#{data[:key]}\"".blue + "\n does not exist"+"\n"} if has_key == true
    expect(valid_key).to eq(false), lambda {"[key]: \"#{data[:key]}\"".blue + "\n does exist"+"\n"} if has_key == false
  when false
    expect(@resp.nil?).to eq(false), lambda {"[key]: \"#{data[:key]}\"".blue + "\n does not exist"+"\n"} if has_key == true
    expect(@resp.nil?).to eq(true), lambda {"[key]: \"#{data[:key]}\"".blue + "\n does exist"+"\n"} if has_key == false
  end
end
validate_list(res, *options) click to toggle source
# File lib/client-api/validator.rb, line 190
def validate_list(res, *options)
  options.map do |data|

    raise('"sort": ""'.green + ' field is missing'.red) if data[:sort].nil?

    sort ||= data[:sort]
    unit ||= data[:unit].split("->")

    @value = []
    @resp = JSON.parse(res.to_json)

    key = data[:key].split("->")

    key.map do |method|
      @resp = @resp.send(:[], method)
    end

    @cls = []
    @resp.map do |val|
      unit.map do |list|
        val = val.send(:[], list)
      end
      @value << val
      begin
        @cls << (val.scan(/^\d+$/).any? ? Integer : val.class)
      rescue NoMethodError
        @cls << val.class
      end
    end

    @value =
        if @cls.all? {|e| e == Integer}
          @value.map(&:to_i)
        elsif (@cls.all? {|e| e == String}) || (@cls.include? String)
          @value.map(&:to_s)
        else
          @value
        end
    expect(@value).to eq(@value.sort) if sort == 'ascending'
    expect(@value).to eq(@value.sort.reverse) if sort == 'descending'

  end
end
validate_schema(param1, param2) click to toggle source
# File lib/client-api/validator.rb, line 266
def validate_schema(param1, param2)
  expected_schema = JSON::Validator.validate(param1, param2)
  expect(expected_schema).to eq(true)
end
validate_size(size, data) click to toggle source
# File lib/client-api/validator.rb, line 234
def validate_size(size, data)
  begin
    expect(size).to eq(@resp.count), lambda {"[key]: \"#{data[:key]}\"".blue + "\n" + "size didn't match" + "\n\n" + "[ actual size ]: #{@resp.count}" + "\n" + "[expected size]: #{size}".green}
  rescue NoMethodError
    expect(size).to eq(0), lambda {"[key]: \"#{data[:key]}\"".blue + "\n" + "size didn't match" + "\n\n" + "[ actual size ]: 0" + "\n" + "[expected size]: #{size}".green}
  rescue ArgumentError
    expect(size).to eq(0), lambda {"[key]: \"#{data[:key]}\"".blue + "\n" + "size didn't match" + "\n\n" + "[ actual size ]: 0" + "\n" + "[expected size]: #{size}".green}
  end
end