# coding: utf-8
require File.dirname(__FILE__) + '/spec_helper'

describe 'SemanticFormHelper' do
  
  include FormtasticSpecHelper
  
  before do
    @output_buffer = ''
    mock_everything
  end
  
  describe '#semantic_form_for' do

    it 'yields an instance of SemanticFormBuilder' do
      semantic_form_for(:post, ::Post.new, :url => '/hello') do |builder|
        builder.class.should == ::Formtastic::SemanticFormBuilder
      end
    end

    it 'adds a class of "formtastic" to the generated form' do
      semantic_form_for(:post, ::Post.new, :url => '/hello') do |builder|
      end
      output_buffer.should have_tag("form.formtastic")
    end

    it 'adds class matching the object name to the generated form when a symbol is provided' do
      semantic_form_for(:post, ::Post.new, :url => '/hello') do |builder|
      end
      output_buffer.should have_tag("form.post")

      semantic_form_for(:project, :url => '/hello') do |builder|
      end
      output_buffer.should have_tag("form.project")
    end

    it 'adds class matching the object\'s class to the generated form when an object is provided' do
      semantic_form_for(@new_post) do |builder|
      end
      output_buffer.should have_tag("form.post")
    end

    describe 'allows :html options' do
      before(:each) do
        semantic_form_for(:post, ::Post.new, :url => '/hello', :html => { :id => "something-special", :class => "something-extra", :multipart => true }) do |builder|
        end
      end

      it 'to add a id of "something-special" to generated form' do
        output_buffer.should have_tag("form#something-special")
      end

      it 'to add a class of "something-extra" to generated form' do
        output_buffer.should have_tag("form.something-extra")
      end

      it 'to add enctype="multipart/form-data"' do
        output_buffer.should have_tag('form[@enctype="multipart/form-data"]')
      end
    end

    it 'can be called with a resource-oriented style' do
      semantic_form_for(@new_post) do |builder|
        builder.object.class.should == ::Post
        builder.object_name.should == "post"
      end
    end

    it 'can be called with a generic style and instance variable' do
      semantic_form_for(:post, @new_post, :url => new_post_path) do |builder|
        builder.object.class.should == ::Post
        builder.object_name.to_s.should == "post" # TODO: is this forced .to_s a bad assumption somewhere?
      end
    end

    it 'can be called with a generic style and inline object' do
      semantic_form_for(:post, ::Post.new, :url => new_post_path) do |builder|
        builder.object.class.should == ::Post
        builder.object_name.to_s.should == "post" # TODO: is this forced .to_s a bad assumption somewhere?
      end
    end

  end

  describe '#semantic_fields_for' do
    it 'yields an instance of SemanticFormBuilder' do
      semantic_fields_for(:post, ::Post.new, :url => '/hello') do |builder|
        builder.class.should == ::Formtastic::SemanticFormBuilder
      end
    end
  end

  describe '#semantic_form_remote_for' do
    it 'yields an instance of SemanticFormBuilder' do
      semantic_form_remote_for(:post, ::Post.new, :url => '/hello') do |builder|
        builder.class.should == ::Formtastic::SemanticFormBuilder
      end
    end
  end

  describe '#semantic_form_for_remote' do
    it 'yields an instance of SemanticFormBuilder' do
      semantic_remote_form_for(:post, ::Post.new, :url => '/hello') do |builder|
        builder.class.should == ::Formtastic::SemanticFormBuilder
      end
    end
  end

end

