diff --git a/app/models/post_archive.rb b/app/models/post_archive.rb index 736fcc5dc..6012489ca 100644 --- a/app/models/post_archive.rb +++ b/app/models/post_archive.rb @@ -205,8 +205,8 @@ class PostArchive < ActiveRecord::Base end def undo - added = changes[:added_tags_with_fields] - changes[:obsolete_added_tags] - removed = changes[:removed_tags_with_fields] - changes[:obsolete_removed_tags] + added = changes[:added_tags] - changes[:obsolete_added_tags] + removed = changes[:removed_tags] - changes[:obsolete_removed_tags] added.each do |tag| if tag =~ /^source:/ diff --git a/test/helpers/post_archive_test_helper.rb b/test/helpers/post_archive_test_helper.rb index 7a0a19453..e47a6d32b 100644 --- a/test/helpers/post_archive_test_helper.rb +++ b/test/helpers/post_archive_test_helper.rb @@ -20,6 +20,12 @@ module PostArchiveTestHelper json.delete("created_at") json["version"] = 1 + PostArchive.where(post_id: json["post_id"]).count prev = PostArchive.where(post_id: json["post_id"]).order("id desc").first + if prev + json["added_tags"] = json["tags"].scan(/\S+/) - prev.tags.scan(/\S+/) + json["removed_tags"] = prev.tags.scan(/\S+/) - json["tags"].scan(/\S+/) + else + json["added_tags"] = json["tags"].scan(/\S+/) + end if merge?(prev, json) prev.update_columns(json) else diff --git a/test/unit/post_archive_test.rb b/test/unit/post_archive_test.rb new file mode 100644 index 000000000..83e05976c --- /dev/null +++ b/test/unit/post_archive_test.rb @@ -0,0 +1,103 @@ +require 'test_helper' + +class PostArchiveTest < ActiveSupport::TestCase + context "A post" do + setup do + Timecop.travel(1.month.ago) do + @user = FactoryGirl.create(:user) + end + CurrentUser.user = @user + CurrentUser.ip_addr = "127.0.0.1" + MEMCACHE.flush_all + end + + teardown do + CurrentUser.user = nil + CurrentUser.ip_addr = nil + end + + context "#undo" do + setup do + PostArchive.sqs_service.stubs(:merge?).returns(false) + @post = FactoryGirl.create(:post, :tag_string => "1") + @post.update_attributes(:tag_string => "1 2") + @post.update_attributes(:tag_string => "2 3") + end + + subject { @post.versions[1] } + + should "undo the changes" do + subject.undo! + @post.reload + assert_equal("3", @post.tag_string) + end + end + + context "that has multiple versions: " do + setup do + PostArchive.sqs_service.stubs(:merge?).returns(false) + @post = FactoryGirl.create(:post, :tag_string => "1") + @post.update_attributes(:tag_string => "1 2") + @post.update_attributes(:tag_string => "2 3") + end + + context "a version record" do + setup do + @version = PostArchive.last + end + + should "know its previous version" do + assert_not_nil(@version.previous) + assert_equal("1 2", @version.previous.tags) + end + end + end + + context "that has been created" do + setup do + @parent = FactoryGirl.create(:post) + @post = FactoryGirl.create(:post, :tag_string => "aaa bbb ccc", :rating => "e", :parent => @parent, :source => "xyz") + end + + should "also create a version" do + assert_equal(1, @post.versions.size) + @version = @post.versions.last + assert_equal("aaa bbb ccc", @version.tags) + assert_equal(@post.rating, @version.rating) + assert_equal(@post.parent_id, @version.parent_id) + assert_equal(@post.source, @version.source) + end + end + + context "that should be merged" do + setup do + @parent = FactoryGirl.create(:post) + @post = FactoryGirl.create(:post, :tag_string => "aaa bbb ccc", :rating => "q", :source => "xyz") + end + + should "delete the previous version" do + assert_equal(1, @post.versions.count) + @post.update_attributes(:tag_string => "bbb ccc xxx", :source => "") + @post.reload + assert_equal(1, @post.versions.count) + end + end + + context "that has been updated" do + setup do + PostArchive.sqs_service.stubs(:merge?).returns(false) + @post = FactoryGirl.create(:post, :tag_string => "aaa bbb ccc", :rating => "q", :source => "xyz") + @post.update_attributes(:tag_string => "bbb ccc xxx", :source => "") + end + + should "also create a version" do + assert_equal(2, @post.versions.size) + @version = @post.versions.last + assert_equal("bbb ccc xxx", @version.tags) + assert_equal("q", @version.rating) + assert_equal("", @version.source) + assert_nil(@version.parent_id) + end + end + end +end