require 'helper'

class TestAttribute < TestCase

  context "attribute" do

    setup do
      setup_fixtures
    end

    should "generate output" do
      expected = html <<-EOHTML
        <li class="attribute">
          <span class="label">Full name</span>
          <span class="value">Doe, John</span>
        </li>
      EOHTML

      actual = @user_builder.attribute(:full_name)
      assert_equal expected, actual
    end

    should "not show attribute when value is blank" do
      actual = @user_builder.attribute(:title)
      assert_nil actual
    end

    should "show attribute with :display_empty => true" do
      expected = html <<-EOHTML
        <li class="attribute">
          <span class="label">Title</span>
          <span class="value"></span>
        </li>
      EOHTML

      actual = @user_builder.attribute(:title, :display_empty => true)
      assert_equal expected, actual
    end

    should "convert nested object to value" do
      expected = html <<-EOHTML
        <li class="attribute">
          <span class="label">Author</span>
          <span class="value">Doe, John</span>
        </li>
      EOHTML

      actual = @blog_builder.attribute(:author_full_name, :label => "Author")
      assert_equal expected, actual

      actual = @blog_builder.attribute(:author)
      assert_equal expected, actual
    end

    should "show custom label" do
      expected = html <<-EOHTML
        <li class="attribute">
          <span class="label">Name</span>
          <span class="value">Doe, John</span>
        </li>
      EOHTML

      actual = @user_builder.attribute(:full_name, :label => "Name")
      assert_equal expected, actual
    end

    should "show custom value" do
      expected = html <<-EOHTML
        <li class="attribute">
          <span class="label">Full name</span>
          <span class="value">Sir Doe, John</span>
        </li>
      EOHTML

      actual = @user_builder.attribute(:full_name, :value => "Sir #{@user.full_name}")
      assert_equal expected, actual
    end

    should "work with custom value blank" do
      assert_nil @user_builder.attribute(:full_name, :value => nil)
      assert_nil @user_builder.attribute(:full_name, :value => "")

      expected = html <<-EOHTML
        <li class="attribute">
          <span class="label">Full name</span>
          <span class="value"></span>
        </li>
      EOHTML

      actual = @user_builder.attribute(:full_name, :value => nil, :display_empty => true)
      assert_equal expected, actual

      actual = @user_builder.attribute(:full_name, :value => "", :display_empty => true)
      assert_equal expected, actual
    end


    context "with block" do

      should "yield block" do
        block_run = false
        @user_builder.attribute :full_name do
          block_run = true
        end
        assert block_run
      end

      should "generate output" do
        expected = html <<-EOHTML
        <li class="attribute">
          <span class="label">Full name</span>
          <span class="value">John Doe!!!</span>
        </li>
        EOHTML

        actual = @user_builder.attribute :full_name do
          @user_builder.template.output_buffer << "John Doe"
          3.times do
            @user_builder.template.output_buffer << "!"
          end
        end
        assert_equal expected, actual
      end

      should "show custom label" do
        expected = html <<-EOHTML
        <li class="attribute">
          <span class="label">Full name</span>
          <span class="value">John Doe!!!</span>
        </li>
        EOHTML

        actual = @user_builder.attribute :label => "Full name" do
          @user_builder.template.output_buffer << "John Doe"
          3.times do
            @user_builder.template.output_buffer << "!"
          end
        end
        assert_equal expected, actual
      end

    end
  end

end