class Precheck::UnreachableURLRule

Public Class Methods

description() click to toggle source
# File precheck/lib/precheck/rules/unreachable_urls_rule.rb, line 20
def self.description
  "unreachable URLs in app metadata"
end
env_name() click to toggle source
# File precheck/lib/precheck/rules/unreachable_urls_rule.rb, line 12
def self.env_name
  "RULE_UNREACHABLE_URLS"
end
friendly_name() click to toggle source
# File precheck/lib/precheck/rules/unreachable_urls_rule.rb, line 16
def self.friendly_name
  "No broken urls"
end
key() click to toggle source
# File precheck/lib/precheck/rules/unreachable_urls_rule.rb, line 8
def self.key
  :unreachable_urls
end

Public Instance Methods

rule_block() click to toggle source
# File precheck/lib/precheck/rules/unreachable_urls_rule.rb, line 24
def rule_block
  return lambda { |url|
    url = url.to_s.strip
    return RuleReturn.new(validation_state: Precheck::VALIDATION_STATES[:failed], failure_data: "empty url") if url.empty?

    begin
      uri = Addressable::URI.parse(url)
      uri.fragment = nil
      request = Faraday.new(uri.normalize.to_s) do |connection|
        connection.use(FaradayMiddleware::FollowRedirects)
        connection.adapter(:net_http)
      end
      return RuleReturn.new(validation_state: Precheck::VALIDATION_STATES[:failed], failure_data: url) unless request.head.status == 200
    rescue StandardError => e
      UI.verbose("URL #{url} not reachable 😵: #{e.message}")
      # I can only return :fail here, but I also want to return #{url}
      return RuleReturn.new(validation_state: VALIDATION_STATES[:failed], failure_data: "unreachable: #{url}")
    end

    return RuleReturn.new(validation_state: VALIDATION_STATES[:passed])
  }
end