# frozen_string_literal: true

describe Onebox::Engine do
  class OneboxEngineExample
    include Onebox::Engine

    def to_html
      "Hello #{link}"
    end

    def data
      { foo: raw[:key], url: @url }
    end

    def raw
      { key: "value" }
    end
  end

  describe "#link" do
    before do
      Onebox::View.stubs(:template).returns(%|this should be a template|)
    end

    it "escapes `link`" do
      html = OneboxEngineExample.new(%|http://foo.com/bar?a='&b=2|).to_html
      expect(html).not_to match(/'/)
    end
  end

  describe '.placeholder_html' do
    let(:onebox) { OneboxEngineExample.new('http://eviltrout.com') }

    it "returns `to_html` by default" do
      expect(onebox.to_html).to eq(onebox.placeholder_html)
    end
  end

  describe ".===" do
    class OneboxEngineTripleEqual
      include Onebox::Engine
      @@matcher = /example/
    end

    it "returns true if argument matches the matcher" do
      result = OneboxEngineTripleEqual === URI("http://www.example.com/product/5?var=foo&bar=5")
      expect(result).to eq(true)
    end
  end

  describe "origins_to_regexes" do
    it "converts URLs to regexes" do
      result = Onebox::Engine.origins_to_regexes(["https://example.com", "https://example2.com"])
      expect(result).to eq([/\Ahttps:\/\/example\.com/i, /\Ahttps:\/\/example2\.com/i])
    end

    it "treats '*' as a catch-all" do
      result = Onebox::Engine.origins_to_regexes(["https://example.com", "*", "https://example2.com"])
      expect(result).to eq([/.*/])
    end
  end

  describe "handles_content_type?" do
    class OneboxEngineImages
      include Onebox::Engine
      @@matcher_content_type = /^image\/png$/
    end

    it "returns true if argument matches the matcher" do
      result = OneboxEngineImages.handles_content_type?('image/png')
      expect(result).to eq(true)
    end
  end

  class AlwaysHttpsEngineExample < OneboxEngineExample
    always_https
  end

  describe "always_https" do
    it "never returns a plain http url" do
      url = 'http://play.google.com/store/apps/details?id=com.google.android.inputmethod.latin'
      onebox = AlwaysHttpsEngineExample.new(url)
      result = onebox.to_html
      expect(result).to_not match(/http(?!s)/)
      expect(result).to_not match(/['"]\/\//)
      expect(result).to match(/https/)
    end
  end
end

describe ".onebox_name" do
  module ScopeForTemplateName
    class TemplateNameOnebox
      include Onebox::Engine
    end
  end

  let(:onebox_name) { ScopeForTemplateName::TemplateNameOnebox.onebox_name }

  it "should not include the scope" do
    expect(onebox_name).not_to include("ScopeForTemplateName", "scopefortemplatename")
  end

  it "should not include the word Onebox" do
    expect(onebox_name).not_to include("onebox", "Onebox")
  end
end