require "rails_helper"

describe ConsulFormBuilder do
  before do
    dummy_model = Class.new do
      include ActiveModel::Model
      attr_accessor :title, :quality, :published
    end

    stub_const("DummyModel", dummy_model)
    stub_const("DummyModel::OPTIONS", %w[Good Bad Ugly].freeze)
  end

  let(:builder) { ConsulFormBuilder.new(:dummy, DummyModel.new, ApplicationController.new.view_context, {}) }

  describe "label" do
    it "accepts links that open in a new window in its content" do
      render builder.text_field(:title, label: 'My <a href="/" target="_blank" title="New tab">title</a>')

      expect(page).to have_link count: 1
      expect(page).to have_link "title"
      expect(page).to have_link "New tab"
      expect(page).to have_css "a[target=_blank]"
    end
  end

  describe "hints" do
    it "does not generate hints by default" do
      render builder.text_field(:title)

      expect(page).not_to have_css ".help-text"
      expect(page).not_to have_css "input[aria-describedby]"
    end

    it "generates text with a hint if provided" do
      render builder.text_field(:title, hint: "Make it quick")

      expect(page).to have_css ".help-text", text: "Make it quick"
      expect(page).to have_css "input[aria-describedby='dummy_title-help-text']"
    end

    it "does not generate empty hints" do
      render builder.text_field(:title, hint: "")

      expect(page).not_to have_css ".help-text"
      expect(page).not_to have_css "input[aria-describedby]"
    end

    it "does not generate a hint attribute" do
      render builder.text_field(:title)

      expect(page).not_to have_css "input[hint]"
    end

    describe "attributes requiring interpolation parameters" do
      before { I18n.backend.store_translations(:en, { attributes: { title: "Title %{info}" }}) }
      after { I18n.backend.reload! }

      it "generates a hint" do
        render builder.text_field(:title, label: "Title whatever", hint: "Make it quick")

        expect(page).to have_css ".help-text", text: "Make it quick"
        expect(page).to have_css "input[aria-describedby='dummy_title-help-text']"
      end
    end
  end

  describe "#select" do
    it "renders the label and the select with the given options" do
      render builder.select(:quality, DummyModel::OPTIONS)

      expect(page).to have_css "label", count: 1
      expect(page).to have_css "label", text: "Quality"
      expect(page).to have_css "select", count: 1
      expect(page).to have_css "option", count: 3
      expect(page).to have_css "option", text: "Good"
      expect(page).to have_css "option", text: "Bad"
      expect(page).to have_css "option", text: "Ugly"
    end

    it "accepts hints" do
      render builder.select(:quality, DummyModel::OPTIONS, hint: "Ugly is neither good nor bad")

      expect(page).to have_css ".help-text", text: "Ugly is neither good nor bad"
      expect(page).to have_css "select[aria-describedby='dummy_quality-help-text']"
    end
  end

  describe "#check_box" do
    it "adds a checkbox-label class to the label by default" do
      render builder.check_box(:published)

      expect(page).to have_css "label", count: 1
      expect(page).to have_css ".checkbox-label"
    end
  end

  attr_reader :content

  def render(content)
    @content = content
  end

  def page
    Capybara::Node::Simple.new(content)
  end
end
