almost can create revisions

Oleg committed May 06, 2011
commit 41f197f627f018afbc2d98793208e1558a94d3d0
Showing 3 changed files with 89 additions and 8 deletions
comfortable_mexican_sofa/has_revisions.rb b/lib/comfortable_mexican_sofa/has_revisions.rb +16 -3
@@ @@ -9,22 +9,35 @@ module ComfortableMexicanSofa::HasRevisions
def has_revisions_for(*fields)
+ attr_accessor :revision_data
+
has_many :revisions,
:as => :record,
:dependent => :destroy
- before_save :create_revision
+ before_save :prepare_revision
+ after_save :create_revision
define_method(:revision_fields) do
- fields
+ fields.collect(&:to_s)
end
end
end
module InstanceMethods
+ def prepare_revision
+ if !(self.changed & revision_fields).empty?
+ self.revision_data = revision_fields.inject({}) do |c, field|
+ c[field] = self.send("#{field}_was")
+ c
+ end
+ end
+ end
+
def create_revision
- # ...
+ return unless self.revision_data
+ self.revisions.create!(:data => self.revision_data)
end
end
test/fixtures/cms/revisions.yml +1 -1
@@ @@ -1,7 +1,7 @@
layout:
record: default (Cms::Layout)
data: <%= {
- 'content' => 'revision content',
+ 'content' => 'revision {{cms:page:default_page_text}}',
'css' => 'revision css',
'js' => 'revision js' }.to_yaml.inspect %>
test/unit/revisions_test.rb +72 -4
@@ @@ -4,7 +4,7 @@ class RevisionsTest < ActiveSupport::TestCase
def test_fixtures_validity
assert_equal ({
- 'content' => 'revision content',
+ 'content' => 'revision {{cms:page:default_page_text}}',
'css' => 'revision css',
'js' => 'revision js' }), cms_revisions(:layout).data
@@ @@ -19,15 +19,83 @@ class RevisionsTest < ActiveSupport::TestCase
end
def test_init_for_layouts
- assert_equal [:content, :css, :js], cms_layouts(:default).revision_fields
+ 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
+ assert_equal ['blocks_attributes'], cms_pages(:default).revision_fields
end
def test_init_for_snippets
- assert_equal [:content], cms_snippets(:default).revision_fields
+ 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.last
+ 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)
+ old_attributes = page.attributes.slice('blocks_attributes')
+
+ assert_difference 'page.revisions.count' do
+ page.update_attributes!(
+ :blocks_attributes => [
+ { :label => 'default_page_text',
+ :content => 'new content' }
+ ]
+ )
+ page.reload
+ assert_equal 2, page.revisions.count
+ revision = page.revisions.last
+ assert_equal old_attributes, 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.last
+ 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
end
\ No newline at end of file