require "spec_helper"

describe Ballast::Emoji do
  before(:example) do
    ::Emoji.instance_variable_set(:@replace_regex, nil)
  end

  shared_examples_for(:dummy_url) do
    before(:example) do
      ::Emoji.url_mapper = ->(url) { "URL/#{url}" }
    end
  end

  describe ".replace_regex" do
    it "should return the right regexp" do
      allow(::Emoji).to receive(:unicodes_index).and_return({a: 1, b: 2})
      expect(::Emoji.replace_regex).to eq(/(a|b)/)
    end
  end

  describe ".replace" do
    include_examples :dummy_url

    it "should return unicode replaced using the requested method" do
      expect(::Emoji.replace("Phone: \u{1F4F1}, Cat: \u{1F431}, #1: \u{0031}\u{20e3}, Invalid: \u{0000}.", mode: :markup)).to eq("Phone: :iphone:, Cat: :cat:, #1: 1⃣, Invalid: \u0000.")
      expect(Emoji.replace("Phone: \u{1F4F1}, Cat: \u{1F431}, #1: \u{0031}\u{20e3}, Invalid: \u{0000}.", mode: :url)).to eq("Phone: URL/unicode/1f4f1.png, Cat: URL/unicode/1f431.png, #1: 1⃣, Invalid: \u0000.")
      expect(Emoji.replace("Phone: \u{1F4F1}, Cat: \u{1F431}, #1: \u{0031}\u{20e3}, Invalid: \u{0000}.", mode: :image_tag, rel: :tooltip)).to eq("Phone: <img alt=\":iphone:\" title=\":iphone:\" rel=\"tooltip\" src=\"URL/unicode/1f4f1.png\" class=\"emoji\" />, Cat: <img alt=\":cat:\" title=\":cat:\" rel=\"tooltip\" src=\"URL/unicode/1f431.png\" class=\"emoji\" />, #1: 1⃣, Invalid: \u0000.")
    end

    it "should fallback to markup when the method is not valid" do
      expect(Emoji.replace("Phone: \u{1F4F1}, Cat: \u{1F431}, #1: \u{0031}\u{20e3}, Invalid: \u{0000}.", mode: :invalid)).to eq("Phone: :iphone:, Cat: :cat:, #1: 1⃣, Invalid: \u0000.")
    end
  end

  describe ".enumerate" do
    include_examples :dummy_url

    it "should enumerate all the available icons" do
      expect(Emoji.enumerate(keys_method: :raw, values_method: :url)["\u{1f604}"]).to eq("URL/unicode/1f604.png")
      expect(Emoji.enumerate(values_method: :image_tag, rel: :tooltip)[":smile:"]).to eq("<img alt=\":smile:\" title=\":smile:\" rel=\"tooltip\" src=\"URL/unicode/1f604.png\" class=\"emoji\" />")
    end
  end

  describe ".url_mapper=" do
    it "should set the new mapper" do
      ::Emoji.url_mapper = "A"
      expect(::Emoji.url_mapper).to eq("A")
      ::Emoji.url_mapper = nil
    end
  end

  describe ".url_mapper" do
    it "should return a default mapper" do
      ::Emoji.url_mapper = nil
      expect(::Emoji.url_mapper.call("URL")).to eq("URL")
    end

    it "should use the specified mapper" do
      ::Emoji.url_mapper = ->(url) { url * 2 }
      expect(::Emoji.url_mapper.call("URL")).to eq("URLURL")
    end
  end

  describe ".url_for" do
    it "should return an absolute URL for an image, using the URL mapper" do
      ::Emoji.url_mapper = nil
      expect(::Emoji.url_for("URL")).to eq("URL")

      ::Emoji.url_mapper = ->(url) { url * 2 }
      expect(::Emoji.url_for("URL")).to eq("URLURL")

      ::Emoji.url_mapper = nil
    end
  end

  describe "#markup" do
    it "should return the markup" do
      expect(Emoji.find_by_alias("cat").markup).to eq(":cat:")
      expect(Emoji.find_by_alias("dog").markup).to eq(":dog:")
      expect(Emoji.find_by_unicode("\u{1F430}").markup).to eq(":rabbit:")
    end
  end

  describe "#url" do
    include_examples :dummy_url

    it "should return the URL/" do
      expect(Emoji.find_by_alias("cat").url).to eq("URL/unicode/1f431.png")
      expect(Emoji.find_by_alias("dog").url).to eq("URL/unicode/1f436.png")
      expect(Emoji.find_by_unicode("\u{1F430}").url).to eq("URL/unicode/1f430.png")
    end
  end

  describe "#image_tag" do
    include_examples :dummy_url

    it "should return an image" do
      expect(Emoji.find_by_alias("cat").image_tag).to eq("<img alt=\":cat:\" title=\":cat:\" rel=\"tooltip\" src=\"URL/unicode/1f431.png\" class=\"emoji\" />")
      expect(Emoji.find_by_alias("cat").image_tag(class: "foo")).to eq("<img alt=\":cat:\" title=\":cat:\" rel=\"tooltip\" class=\"foo emoji\" src=\"URL/unicode/1f431.png\" />")
      expect(Emoji.find_by_alias("cat").image_tag(rel: "tooltip1", class: "abc emoji")).to eq("<img alt=\":cat:\" title=\":cat:\" rel=\"tooltip1\" class=\"abc emoji\" src=\"URL/unicode/1f431.png\" />")
    end
  end
end