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 | |