require File.expand_path('../../test_helper', File.dirname(__FILE__))

class CmsAdmin::SnippetsControllerTest < ActionController::TestCase

  def test_get_index
    get :index, :site_id => cms_sites(:default)
    assert_response :success
    assert assigns(:snippets)
    assert_template :index
  end

  def test_get_index_with_no_snippets
    Cms::Snippet.delete_all
    get :index, :site_id => cms_sites(:default)
    assert_response :redirect
    assert_redirected_to :action => :new
  end
  
  def test_get_index_with_category
    category = cms_sites(:default).categories.create!(:label => 'Test Category', :categorized_type => 'Cms::Snippet')
    category.categorizations.create!(:categorized => cms_snippets(:default))
    
    get :index, :site_id => cms_sites(:default), :category => category.label
    assert_response :success
    assert assigns(:snippets)
    assert_equal 1, assigns(:snippets).count
    assert assigns(:snippets).first.categories.member? category
  end
  
  def test_get_index_with_category_invalid
    get :index, :site_id => cms_sites(:default), :category => 'invalid'
    assert_response :success
    assert assigns(:snippets)
    assert_equal 0, assigns(:snippets).count
  end

  def test_get_new
    site = cms_sites(:default)
    get :new, :site_id => site
    assert_response :success
    assert assigns(:snippet)
    assert_template :new
    assert_select "form[action=/cms-admin/sites/#{site.id}/snippets]"
    assert_select "form[action='/cms-admin/sites/#{site.id}/files']"
  end

  def test_get_edit
    snippet = cms_snippets(:default)
    get :edit, :site_id => snippet.site, :id => snippet
    assert_response :success
    assert assigns(:snippet)
    assert_template :edit
    assert_select "form[action=/cms-admin/sites/#{snippet.site.id}/snippets/#{snippet.id}]"
  end

  def test_get_edit_failure
    get :edit, :site_id => cms_sites(:default), :id => 'not_found'
    assert_response :redirect
    assert_redirected_to :action => :index
    assert_equal 'Snippet not found', flash[:error]
  end
  
  def test_create
    assert_difference 'Cms::Snippet.count' do
      post :create, :site_id => cms_sites(:default), :snippet => {
        :label      => 'Test Snippet',
        :identifier => 'test-snippet',
        :content    => 'Test Content'
      }
      assert_response :redirect
      snippet = Cms::Snippet.last
      assert_equal cms_sites(:default), snippet.site
      assert_redirected_to :action => :edit, :id => snippet
      assert_equal 'Snippet created', flash[:notice]
    end
  end

  def test_creation_failure
    assert_no_difference 'Cms::Snippet.count' do
      post :create, :site_id => cms_sites(:default), :snippet => { }
      assert_response :success
      assert_template :new
      assert_equal 'Failed to create snippet', flash[:error]
    end
  end

  def test_update
    snippet = cms_snippets(:default)
    put :update, :site_id => snippet.site, :id => snippet, :snippet => {
      :label    => 'New-Snippet',
      :content  => 'New Content'
    }
    assert_response :redirect
    assert_redirected_to :action => :edit, :site_id => snippet.site, :id => snippet
    assert_equal 'Snippet updated', flash[:notice]
    snippet.reload
    assert_equal 'New-Snippet', snippet.label
    assert_equal 'New Content', snippet.content
  end

  def test_update_failure
    snippet = cms_snippets(:default)
    put :update, :site_id => snippet.site, :id => snippet, :snippet => {
      :identifier => ''
    }
    assert_response :success
    assert_template :edit
    snippet.reload
    assert_not_equal '', snippet.identifier
    assert_equal 'Failed to update snippet', flash[:error]
  end

  def test_destroy
    assert_difference 'Cms::Snippet.count', -1 do
      delete :destroy, :site_id => cms_sites(:default), :id => cms_snippets(:default)
      assert_response :redirect
      assert_redirected_to :action => :index
      assert_equal 'Snippet deleted', flash[:notice]
    end
  end
  
  def test_reorder
    snippet_one = cms_snippets(:default)
    snippet_two = cms_sites(:default).snippets.create!(
      :label      => 'test',
      :identifier => 'test'
    )
    assert_equal 0, snippet_one.position
    assert_equal 1, snippet_two.position

    post :reorder, :site_id => cms_sites(:default), :cms_snippet => [snippet_two.id, snippet_one.id]
    assert_response :success
    snippet_one.reload
    snippet_two.reload

    assert_equal 1, snippet_one.position
    assert_equal 0, snippet_two.position
  end

end