require 'helper'

module Coupler
  class TestHelpers < Coupler::Test::UnitTest
    include ::Coupler::Helpers

    def test_error_messages_for
      valid_object = mock("valid object", :errors => [])
      assert_equal "", error_messages_for(valid_object)

      invalid_object = mock("invalid object")
      invalid_object.expects(:errors).twice.returns([[:base, ['foo']], [:pants, ['are dirty', 'are smelly']]])
      result = error_messages_for(invalid_object)

      doc = Nokogiri::HTML(result)
      assert (div = doc.at("div.errors"))
      assert (ul = div.at('ul'))

      assert_equal 3, (li = ul.css('li')).length
      assert_equal "foo", li[0].inner_html
      assert_equal "Pants are dirty", li[1].inner_html
      assert_equal "Pants are smelly", li[2].inner_html
    end

    def test_delete_link
      expected = %^<a href="/foo/bar" onclick="if (confirm('Are you sure?')) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href; var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); f.appendChild(m); f.submit(); }; return false;">Foo bar</a>^
      assert_equal expected, delete_link("Foo bar", "/foo/bar")
    end

    def test_timeago
      now = Time.now
      dt  = now.send(:to_datetime)
      expected = %{<div class="timeago" title="#{dt.to_s}">#{now.to_s}</div>}
      assert_equal expected, timeago(now)
    end

    def test_timeago_with_nil_time
      assert_equal "Never", timeago(nil)
    end

    def test_timeago_with_additional_classes
      now = Time.now
      dt  = now.send(:to_datetime)
      expected = %{<div class="timeago leet" title="#{dt.to_s}">#{now.to_s}</div>}
      assert_equal expected, timeago(now, "leet")
    end

    def test_form_tag_for
      obj = Models::Project.new
      result = form_tag_for(obj, :base_url => "/projects")
      assert_equal %{<form action="/projects" method="post">}, result

      obj = Factory(:project)
      result = form_tag_for(obj, :base_url => "/projects")
      assert_equal %{<form action="/projects/#{obj.id}" method="post"><div style="display: none;"><input type="hidden" name="_method" value="put" /></div>}, result
    end
  end
end