# frozen_string_literal: true

require "helper"

class TestURL < JekyllUnitTest
  context "The URL class" do
    should "throw an exception if neither permalink or template is specified" do
      assert_raises ArgumentError do
        URL.new(:placeholders => {})
      end
    end

    should "replace placeholders in templates" do
      assert_equal "/foo/bar", URL.new(
        :template     => "/:x/:y",
        :placeholders => { :x => "foo", :y => "bar" }
      ).to_s
    end

    should "handle multiple of the same key in the template" do
      assert_equal "/foo/bar/foo/", URL.new(
        :template     => "/:x/:y/:x/",
        :placeholders => { :x => "foo", :y => "bar" }
      ).to_s
    end

    should "use permalink if given" do
      assert_equal "/le/perma/link", URL.new(
        :template     => "/:x/:y",
        :placeholders => { :x => "foo", :y => "bar" },
        :permalink    => "/le/perma/link"
      ).to_s
    end

    should "replace placeholders in permalinks" do
      assert_equal "/foo/bar", URL.new(
        :template     => "/baz",
        :permalink    => "/:x/:y",
        :placeholders => { :x => "foo", :y => "bar" }
      ).to_s
    end

    should "handle multiple of the same key in the permalink" do
      assert_equal "/foo/bar/foo/", URL.new(
        :template     => "/baz",
        :permalink    => "/:x/:y/:x/",
        :placeholders => { :x => "foo", :y => "bar" }
      ).to_s
    end

    should "handle nil values for keys in the template" do
      assert_equal "/foo/bar/", URL.new(
        :template     => "/:x/:y/:z/",
        :placeholders => { :x => "foo", :y => "bar", :z => nil }
      ).to_s
    end

    should "handle UrlDrop as a placeholder in addition to a hash" do
      _, matching_doc = fixture_document("_methods/escape-+ #%20[].md")
      assert_equal "/methods/escape-+-20/escape-20.html", URL.new(
        :template     => "/methods/:title/:name:output_ext",
        :placeholders => matching_doc.url_placeholders
      ).to_s
    end

    should "check for key without trailing underscore" do
      _, matching_doc = fixture_document("_methods/configuration.md")
      assert_equal "/methods/configuration-configuration_methods_configuration", URL.new(
        :template     => "/methods/:name-:slug_:collection_:title",
        :placeholders => matching_doc.url_placeholders
      ).to_s
    end

    should "raise custom error when URL placeholder doesn't have key" do
      _, matching_doc = fixture_document("_methods/escape-+ #%20[].md")
      assert_raises NoMethodError do
        URL.new(
          :template     => "/methods/:headline",
          :placeholders => matching_doc.url_placeholders
        ).to_s
      end
    end

    should "not treat colons in placeholders as uri delimiters" do
      assert_equal "/foo/foo%20bar:foobar/", URL.new(
        :template     => "/:x/:y/",
        :placeholders => { :x => "foo", :y => "foo bar:foobar" }
      ).to_s
    end

    should "unescape urls with colons" do
      assert_equal "/foo/foo bar:foobar/", Jekyll::URL.unescape_path("/foo/foo%20bar:foobar/")
    end
  end
end
