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

class RevisionsTest < ActiveSupport::TestCase
  
  def test_fixtures_validity
    assert_equal ({
      'content' => 'revision {{cms:page:default_page_text}}', 
      'css'     => 'revision css',
      'js'      => 'revision js' }), cms_revisions(:layout).data
      
    assert_equal ({'blocks_attributes' => [
      { 'identifier' => 'default_page_text',   'content' => 'revision page content'  },
      { 'identifier' => 'default_field_text',  'content' => 'revision field content' }
    ]}), cms_revisions(:page).data
    
    assert_equal ({
      'content' => 'revision content'
    }), cms_revisions(:snippet).data
  end
  
  def test_init_for_layouts
    assert_equal ['content', 'css', 'js'], cms_layouts(:default).revision_fields
  end
  
  def test_init_for_pages
    assert_equal ['blocks_attributes'], cms_pages(:default).revision_fields
  end
  
  def test_init_for_snippets
    assert_equal ['content'], cms_snippets(:default).revision_fields
  end
  
  def test_creation_for_layout
    layout = cms_layouts(:default)
    old_attributes = layout.attributes.slice('content', 'css', 'js')
    
    assert_difference 'layout.revisions.count' do
      layout.update_attributes!(
        :content  => 'new {{cms:page:content}}',
        :js       => 'new js'
      )
      layout.reload
      assert_equal 2, layout.revisions.count
      revision = layout.revisions.first
      assert_equal old_attributes, revision.data
    end
  end
  
  def test_creation_for_layout_ignore
    layout = cms_layouts(:default)
    assert_no_difference 'layout.revisions.count' do
      layout.update_attribute(:label, 'new label')
    end
  end
  
  def test_creation_for_page
    page = cms_pages(:default)
    
    assert_difference 'page.revisions.count' do
      page.update_attributes!(
        :blocks_attributes => [
          { :identifier => 'default_page_text',
            :content    => 'new content' }
        ]
      )
      page.reload
      assert_equal 2, page.revisions.count
      revision = page.revisions.first
      assert_equal ({
        'blocks_attributes' => [
          { :identifier => 'default_field_text',
            :content    => 'default_field_text_content' },
          { :identifier => 'default_page_text',
            :content    => "default_page_text_content_a\n{{cms:snippet:default}}\ndefault_page_text_content_b" }]
      }), revision.data
    end
  end
  
  def test_creation_for_page_ignore
    page = cms_pages(:default)
    assert_no_difference 'page.revisions.count' do
      page.update_attribute(:label, 'new label')
    end
  end
  
  def test_creation_for_snippet
    snippet = cms_snippets(:default)
    old_attributes  = snippet.attributes.slice('content')
    
    assert_difference 'snippet.revisions.count' do
      snippet.update_attribute(:content, 'new content')
      snippet.reload
      assert_equal 2, snippet.revisions.count
      revision = snippet.revisions.first
      assert_equal old_attributes, revision.data
    end
  end
  
  def test_creation_for_snippet_ignore
    snippet = cms_snippets(:default)
    assert_no_difference 'snippet.revisions.count' do
      snippet.update_attribute(:label, 'new label')
    end
  end
  
  def test_creation_for_new_record
    assert_difference 'Cms::Snippet.count' do
      assert_no_difference 'Cms::Revision.count' do
        snippet = cms_sites(:default).snippets.create!(
          :label      => 'test snippet',
          :identifier => 'test_snippet',
          :content    => 'test content'
        )
        assert_equal 0, snippet.revisions.count
      end
    end
  end
  
  def test_restore_from_revision_for_layout
    layout = cms_layouts(:default)
    revision = cms_revisions(:layout)
    
    assert_difference 'layout.revisions.count' do
      layout.restore_from_revision(revision)
      layout.reload
      assert_equal 'revision {{cms:page:default_page_text}}', layout.content
      assert_equal 'revision css', layout.css
      assert_equal 'revision js', layout.js
    end
  end
  
  def test_restore_from_revision_for_page
    page = cms_pages(:default)
    revision = cms_revisions(:page)
    
    assert_difference 'page.revisions.count' do
      page.restore_from_revision(revision)
      page.reload
      assert_equal [
        { :identifier => 'default_field_text', :content => 'revision field content'  },
        { :identifier => 'default_page_text',  :content => 'revision page content'   }
      ], page.blocks_attributes
    end
  end
  
  def test_restore_from_revision_for_snippet
    snippet = cms_snippets(:default)
    revision = cms_revisions(:snippet)
    
    assert_difference 'snippet.revisions.count' do
      snippet.restore_from_revision(revision)
      snippet.reload
      assert_equal 'revision content', snippet.content
    end
  end
  
  def test_restore_from_revision_with_wrong_revision_type
    snippet = cms_snippets(:default)
    revision = cms_revisions(:layout)
    
    assert_no_difference 'snippet.revisions.count' do
      snippet.restore_from_revision(revision)
      snippet.reload
      assert_equal 'default_snippet_content', snippet.content
    end
  end
  
  def test_creation_with_limit
    ComfortableMexicanSofa.config.revisions_limit = 1
    snippet = cms_snippets(:default)
    revision = cms_revisions(:snippet)
    
    assert_equal 1, snippet.revisions.count
    
    assert_no_difference 'snippet.revisions.count' do
      snippet.update_attribute(:content, 'new content')
      assert_nil Cms::Revision.find_by_id(revision.id)
      
      snippet.reload
      revision = snippet.revisions.first
      assert_equal ({ 'content' => 'default_snippet_content' }), revision.data
    end
  end
  
end