require File.expand_path('../test_helper', __FILE__) class DiffTestEntity def self.column_names ["text"] end attr_accessor :text def initialize(text) @text = text end end describe "RevisionSan::Diff" do it "should return correctly formatted html" do [ [long_text[:before], long_text[:after], long_text[:diff]], [nil, "First words.", "First words."], ["First words.", nil, "First words."], ["No changes.", "No changes.", "No changes."], ["Bla", "Foo", "BlaFoo"], ["Bar!", "Baz!", "BarBaz!"], ["Begin\n\nEnd", "Begin\n\nMiddle\n\nEnd", "Begin\n\nMiddle\n\nEnd"], ["Multiple added.", "Multiple words are added.", "Multiple words are added."], ["Multiple words are removed.", "Multiple removed.", "Multiple words are removed."] ].each do |from, to, html| diff_html(from, to).should == html end end def long_text { :before => %{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce gravida. Ut orci orci, molestie et, scelerisque ut, faucibus pharetra, enim. Morbi vehicula consequat nunc. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque ac orci. Proin adipiscing tempor erat. Phasellus gravida tincidunt sapien. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In venenatis libero sit amet quam. Nam sapien diam, tempor placerat, feugiat quis, congue in, elit. Vivamus nec enim eget elit posuere tincidunt. Quisque scelerisque lobortis risus. Quisque cursus dolor sit amet arcu. Suspendisse auctor. Quisque sodales dapibus pede. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras blandit tellus id libero. Morbi sed purus sed sapien ornare facilisis. Vestibulum rutrum egestas mauris. Vestibulum luctus velit vitae ante. In dictum, metus sed lacinia sagittis, leo diam elementum tortor, rutrum elementum justo tellus eget risus. Curabitur faucibus mauris eget nisi. Nam mattis nunc eget turpis. In porta. Aliquam risus ante, sodales quis, consequat vitae, fermentum ut, nisi. Etiam congue ipsum id ante aliquet dictum.}, :after => %{Landscape architecture involves the investigation and designed response to the landscape. The scope of the profession includes architectural design, site planning, environmental restoration, town or urban planning, urban design, parks and recreation planning. A practitioner in the field of landscape architecture is called a landscape architect. Suspendisse auctor. Quisque sodales dapibus pede. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras blandit tellus id libero. Morbi sed purus sed sapien ornare facilisis. Vestibulum rutrum egestas mauris. Vestibulum luctus velit vitae ante. In dictum, metus sed lacinia sagittis, leo diam elementum tortor, rutrum elementum justo tellus eget risus. Curabitur faucibus mauris eget nisi. Nam mattis nunc eget turpis. In porta. Aliquam risus ante, sodales quis, consequat vitae, fermentum ut, nisi. Etiam congue ipsum id ante aliquet dictum.}, :diff => %{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce gravida. Ut orci orci, molestie et, scelerisque ut, faucibus pharetra, enim. Morbi vehicula consequat nunc. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque ac orci. Proin adipiscing tempor erat. Phasellus gravida tincidunt sapien. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In venenatis libero sit amet quam. Nam sapien diam, tempor placerat, feugiat quis, congue in, elit. Vivamus nec enim eget elit posuere tincidunt. Quisque scelerisque lobortis risus. Quisque cursus dolor sit amet arcu.Landscape architecture involves the investigation and designed response to the landscape. The scope of the profession includes architectural design, site planning, environmental restoration, town or urban planning, urban design, parks and recreation planning. A practitioner in the field of landscape architecture is called a landscape architect. Suspendisse auctor. Quisque sodales dapibus pede. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras blandit tellus id libero. Morbi sed purus sed sapien ornare facilisis. Vestibulum rutrum egestas mauris. Vestibulum luctus velit vitae ante. In dictum, metus sed lacinia sagittis, leo diam elementum tortor, rutrum elementum justo tellus eget risus. Curabitur faucibus mauris eget nisi. Nam mattis nunc eget turpis. In porta. Aliquam risus ante, sodales quis, consequat vitae, fermentum ut, nisi. Etiam congue ipsum id ante aliquet dictum.} } end private def diff_html(from, to) RevisionSan::Diff.new(DiffTestEntity.new(from), DiffTestEntity.new(to)).text end end class Artist def real_method obj = Object.new def obj.to_s 'Real method' end obj end end describe "RevisionSan, looking at diff methods" do before do RevisionSanTest::Initializer.setup_database @artist_rev_2 = Artist.create(:name => 'van Gogh', :bio => 'He painted a lot.') @artist_rev_2.update_attributes(:name => 'Vincent van Gogh', :bio => 'He occasionally drew a lot.') @artist_rev_1 = @artist_rev_2.revisions.first @diff = @artist_rev_1.compare_against_revision(2) end after do RevisionSanTest::Initializer.teardown_database end it "should take an older revision number to compare against" do @artist_rev_2.compare_against_revision(1).should.be.instance_of RevisionSan::Diff end it "should have instantiated a RevisionSan::Diff object with the correct revisions" do @diff.from.should == @artist_rev_1 @diff.to.should == @artist_rev_2 end it "should lazy define accessors for requested columns" do @diff.name @diff.bio @diff.should.respond_to :name @diff.should.respond_to :bio end it "should also work with real existing methods instead of a column" do @diff.real_method @diff.should.respond_to :real_method end it "should coerce the value to a string before trying to diff them" do @diff.real_method.should == 'Real method' end it "should yield the from and to strings, if a block is given, so the user can adjust the text before diffing" do @diff.real_method { |text| text.reverse }.should == 'dohtem laeR' end it "should only define the accessors on the singleton, not the class" do @diff.name RevisionSan::Diff.instance_methods.should.not.include 'name' end it "should still raise a NoMethodError for column names that don't exist" do lambda { @diff.foo }.should.raise NoMethodError end it "should return html with the diff for a requested column" do @diff.name.should == "Vincent van Gogh" @diff.bio.should == "He paintedoccasionally drew a lot." end end