require "test_helper"

class AcceptanceTest < Minitest::Test

  VALID_CASES = [
      ["example.com",             "example.com",        [nil, "example", "com"]],
      ["foo.example.com",         "example.com",        ["foo", "example", "com"]],

      ["verybritish.co.uk",       "verybritish.co.uk",  [nil, "verybritish", "co.uk"]],
      ["foo.verybritish.co.uk",   "verybritish.co.uk",  ["foo", "verybritish", "co.uk"]],

      ["parliament.uk",           "parliament.uk",      [nil, "parliament", "uk"]],
      ["foo.parliament.uk",       "parliament.uk",      ["foo", "parliament", "uk"]],
  ].freeze

  def test_valid
    VALID_CASES.each do |input, domain, results|
      parsed = PublicSuffix.parse(input)
      trd, sld, tld = results
      assert_equal tld, parsed.tld, "Invalid tld for `#{name}`"
      assert_equal sld, parsed.sld, "Invalid sld for `#{name}`"
      if trd.nil?
        assert_nil parsed.trd, "Invalid trd for `#{name}`"
      else
        assert_equal trd, parsed.trd, "Invalid trd for `#{name}`"
      end

      assert_equal domain, PublicSuffix.domain(input)
      assert PublicSuffix.valid?(input)
    end
  end


  INVALID_CASES = [
      ["nic.ke",                  PublicSuffix::DomainNotAllowed],
      [nil,                       PublicSuffix::DomainInvalid],
      ["",                        PublicSuffix::DomainInvalid],
      ["  ",                      PublicSuffix::DomainInvalid],
  ].freeze

  def test_invalid
    INVALID_CASES.each do |(name, error)|
      assert_raises(error) { PublicSuffix.parse(name) }
      assert !PublicSuffix.valid?(name)
    end
  end


  REJECTED_CASES = [
      ["www. .com",           true],
      ["foo.co..uk",          true],
      ["goo,gle.com",         true],
      ["-google.com",         true],
      ["google-.com",         true],

      # This case was covered in GH-15.
      # I decided to cover this case because it's not easily reproducible with URI.parse
      # and can lead to several false positives.
      ["http://google.com",   false],
  ].freeze

  def test_rejected
    REJECTED_CASES.each do |name, expected|
      assert_equal expected, PublicSuffix.valid?(name),
                   "Expected %s to be %s" % [name.inspect, expected.inspect]
      assert !valid_domain?(name),
             "#{name} expected to be invalid"
    end
  end


  CASE_CASES = [
      ["Www.google.com", %w( www google com )],
      ["www.Google.com", %w( www google com )],
      ["www.google.Com", %w( www google com )],
  ].freeze

  def test_ignore_case
    CASE_CASES.each do |name, results|
      domain = PublicSuffix.parse(name)
      trd, sld, tld = results
      assert_equal tld, domain.tld, "Invalid tld for `#{name}'"
      assert_equal sld, domain.sld, "Invalid sld for `#{name}'"
      assert_equal trd, domain.trd, "Invalid trd for `#{name}'"
      assert PublicSuffix.valid?(name)
    end
  end


  INCLUDE_PRIVATE_CASES = [
      ["blogspot.com", true, "blogspot.com"],
      ["blogspot.com", false, nil],
      ["subdomain.blogspot.com", true, "blogspot.com"],
      ["subdomain.blogspot.com", false, "subdomain.blogspot.com"],
  ].freeze

  def test_ignore_private
    # test domain and parse
    INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected|
      if expected.nil?
        assert_nil PublicSuffix.domain(given, ignore_private: ignore_private)
      else
        assert_equal expected, PublicSuffix.domain(given, ignore_private: ignore_private)
      end
    end
    # test valid?
    INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected|
      assert_equal !expected.nil?, PublicSuffix.valid?(given, ignore_private: ignore_private)
    end
  end


  def valid_uri?(name)
    uri = URI.parse(name)
    !uri.host.nil?
  rescue
    false
  end

  def valid_domain?(name)
    uri = URI.parse(name)
    !uri.host.nil? && uri.scheme.nil?
  rescue
    false
  end

end
