From 878a6336fbba9ceb99825ce1b0035368c4118de2 Mon Sep 17 00:00:00 2001 From: Alexey Verkhovsky Date: Mon, 17 Jan 2005 21:27:38 +0000 Subject: [PATCH] Page#revise raises ValidationError if a revision is exactly same as the page before --- app/models/page.rb | 20 ++++++++----- test/unit/page_test.rb | 68 +++++++++++++++++++++++++----------------- 2 files changed, 54 insertions(+), 34 deletions(-) diff --git a/app/models/page.rb b/app/models/page.rb index 5765cf1e..b2bd0ee6 100755 --- a/app/models/page.rb +++ b/app/models/page.rb @@ -15,13 +15,18 @@ class Page end def revise(content, created_at, author) + if not @revisions.empty? and content == @revisions.last.content + raise Instiki::ValidationError.new( + "You have tried to save page '#{name}' without changing its content") + end + # A user may change a page, look at it and make some more changes - several times. # Not to record every such iteration as a new revision, if the previous revision was done # by the same author, not more than 30 minutes ago, then update the last revision instead of # creating a new one if !@revisions.empty? && continous_revision?(created_at, author) @revisions.last.created_at = created_at - @revisions.last.content = content + @revisions.last.content = content @revisions.last.clear_display_cache else @revisions << Revision.new(self, @revisions.length, content, created_at, author) @@ -38,11 +43,11 @@ class Page def revisions? revisions.length > 1 end - + def revised_on created_on end - + def in_category?(cat) cat.nil? || cat.empty? || categories.include?(cat) end @@ -50,7 +55,7 @@ class Page def categories display_content.find_chunks(Category).map { |cat| cat.list }.flatten end - + def authors revisions.collect { |rev| rev.author } end @@ -67,18 +72,19 @@ class Page def link(options = {}) web.make_link(name, nil, options) end - + def author_link(options = {}) web.make_link(author, nil, options) end - + private def continous_revision?(created_at, author) @revisions.last.author == author && @revisions.last.created_at + 30.minutes > created_at end - + # Forward method calls to the current revision, so the page responds to all revision calls def method_missing(method_symbol) revisions.last.send(method_symbol) end + end diff --git a/test/unit/page_test.rb b/test/unit/page_test.rb index 2d29d174..fe1b513f 100755 --- a/test/unit/page_test.rb +++ b/test/unit/page_test.rb @@ -11,6 +11,7 @@ class MockWeb < Web end class PageTest < Test::Unit::TestCase + def setup @page = Page.new( MockWeb.new, @@ -21,11 +22,7 @@ class PageTest < Test::Unit::TestCase ) end - def test_basics - assert_equal "First Page", @page.plain_name - end - - def test_locking + def test_lock assert !@page.locked?(Time.local(2004, 4, 4, 16, 50)) @page.lock(Time.local(2004, 4, 4, 16, 30), "DavidHeinemeierHansson") @@ -38,19 +35,52 @@ class PageTest < Test::Unit::TestCase assert !@page.locked?(Time.local(2004, 4, 4, 16, 50)) end - def test_locking_duration + def test_lock_duration @page.lock(Time.local(2004, 4, 4, 16, 30), "DavidHeinemeierHansson") assert_equal 15, @page.lock_duration(Time.local(2004, 4, 4, 16, 45)) end - def test_revision - @page.revise("HisWay would be MyWay in kinda lame", Time.local(2004, 4, 4, 16, 55), "MarianneSyhler") - assert_equal 2, @page.revisions.length, "Should have two revisions" - assert_equal "MarianneSyhler", @page.author, "Mary should be the author now" - assert_equal "DavidHeinemeierHansson", @page.revisions.first.author, "David was the first author" + def test_plain_name + assert_equal "First Page", @page.plain_name + end + + def test_revise + @page.revise('HisWay would be MyWay in kinda lame', Time.local(2004, 4, 4, 16, 55), 'MarianneSyhler') + assert_equal 2, @page.revisions.length, 'Should have two revisions' + assert_equal 'MarianneSyhler', @page.author, 'Mary should be the author now' + assert_equal 'DavidHeinemeierHansson', @page.revisions.first.author, 'David was the first author' end + def test_revise_continous_revision + @page.revise('HisWay would be MyWay in kinda lame', Time.local(2004, 4, 4, 16, 55), 'MarianneSyhler') + assert_equal 2, @page.revisions.length + + @page.revise('HisWay would be MyWay in kinda update', Time.local(2004, 4, 4, 16, 57), 'MarianneSyhler') + assert_equal 2, @page.revisions.length + assert_equal 'HisWay would be MyWay in kinda update', @page.revisions.last.content + assert_equal Time.local(2004, 4, 4, 16, 57), @page.revisions.last.created_at + + @page.revise('HisWay would be MyWay in the house', Time.local(2004, 4, 4, 16, 58), 'DavidHeinemeierHansson') + assert_equal 3, @page.revisions.length + assert_equal 'HisWay would be MyWay in the house', @page.revisions.last.content + + @page.revise('HisWay would be MyWay in my way', Time.local(2004, 4, 4, 17, 30), 'DavidHeinemeierHansson') + assert_equal 4, @page.revisions.length + end + + def test_revise_content_unchanged + last_revision_before = @page.revisions.last + revisions_number_before = @page.revisions.size + + assert_raises(Instiki::ValidationError) { + @page.revise(@page.revisions.last.content.dup, Time.now, 'AlexeyVerkhovsky') + } + + assert_same last_revision_before, @page.revisions.last + assert_equal revisions_number_before, @page.revisions.size + end + def test_rollback @page.revise("spot two", Time.now, "David") @page.revise("spot three", Time.now + 2000, "David") @@ -59,20 +89,4 @@ class PageTest < Test::Unit::TestCase assert_equal "spot two", @page.content end - def test_continous_revision - @page.revise("HisWay would be MyWay in kinda lame", Time.local(2004, 4, 4, 16, 55), "MarianneSyhler") - assert_equal 2, @page.revisions.length - - @page.revise("HisWay would be MyWay in kinda update", Time.local(2004, 4, 4, 16, 57), "MarianneSyhler") - assert_equal 2, @page.revisions.length - assert_equal "HisWay would be MyWay in kinda update", @page.revisions.last.content - assert_equal Time.local(2004, 4, 4, 16, 57), @page.revisions.last.created_at - - @page.revise("HisWay would be MyWay in the house", Time.local(2004, 4, 4, 16, 58), "DavidHeinemeierHansson") - assert_equal 3, @page.revisions.length - assert_equal "HisWay would be MyWay in the house", @page.revisions.last.content - - @page.revise("HisWay would be MyWay in my way", Time.local(2004, 4, 4, 17, 30), "DavidHeinemeierHansson") - assert_equal 4, @page.revisions.length - end end \ No newline at end of file