From f0ed6120423eb00a7bd8d4dbfbdeda4f70ac3fb2 Mon Sep 17 00:00:00 2001 From: albert Date: Fri, 12 Feb 2010 13:43:00 -0500 Subject: [PATCH] added tag alias unit test --- app/models/tag.rb | 2 +- app/models/tag_alias.rb | 23 +++++++++++++++++++-- test/factories/tag_alias.rb | 5 +++++ test/unit/deleted_post_test.rb | 8 -------- test/unit/post_test.rb | 12 +++++++++++ test/unit/post_version_test.rb | 8 -------- test/unit/tag_alias_test.rb | 37 ++++++++++++++++++++++++++++++---- test/unit/unapproval_test.rb | 8 -------- 8 files changed, 72 insertions(+), 31 deletions(-) create mode 100644 test/factories/tag_alias.rb delete mode 100644 test/unit/deleted_post_test.rb delete mode 100644 test/unit/post_version_test.rb delete mode 100644 test/unit/unapproval_test.rb diff --git a/app/models/tag.rb b/app/models/tag.rb index a4d6ffc04..a34b40f5e 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -1,7 +1,7 @@ class Tag < ActiveRecord::Base attr_accessible :category after_save :update_category_cache - named_scope :by_pattern, lambda {|name| where(["name LIKE ? ESCAPE E'\\\\'", name.to_escaped_for_sql_like])} + scope :by_pattern, lambda {|name| where(["name LIKE ? ESCAPE E'\\\\'", name.to_escaped_for_sql_like])} class CategoryMapping Danbooru.config.reverse_tag_category_mapping.each do |value, category| diff --git a/app/models/tag_alias.rb b/app/models/tag_alias.rb index cc9cc6c36..fee5ab714 100644 --- a/app/models/tag_alias.rb +++ b/app/models/tag_alias.rb @@ -1,8 +1,14 @@ class TagAlias < ActiveRecord::Base + attr_accessor :updater_id, :updater_ip_addr after_save :update_posts + after_save :update_cache + validates_presence_of :updater_id, :updater_ip_addr + validates_uniqueness_of :antecedent_name + belongs_to :updater, :class_name => "User" + belongs_to :creator, :class_name => "User" def self.to_aliased(names) - alias_hash = Cache.get_multi(names, "ta") do |name| + alias_hash = Cache.get_multi(names.flatten, "ta") do |name| ta = TagAlias.find_by_antecedent_name(name) if ta ta.consequent_name @@ -11,9 +17,22 @@ class TagAlias < ActiveRecord::Base end end - alias_hash.values + alias_hash.values.uniq + end + + def update_cache + Cache.put("ta:#{Cache.sanitize(antecedent_name)}", consequent_name, 24.hours) end def update_posts + Post.find_by_tags(antecedent_name).find_each do |post| + escaped_antecedent_name = Regexp.escape(antecedent_name) + fixed_tags = post.tag_string.sub(/\A#{escaped_antecedent_name} | #{escaped_antecedent_name} | #{escaped_antecedent_name}\Z/, " #{consequent_name} ").strip + post.update_attributes( + :tag_string => fixed_tags, + :updater_id => updater_id, + :updater_ip_addr => updater_ip_addr + ) + end end end diff --git a/test/factories/tag_alias.rb b/test/factories/tag_alias.rb new file mode 100644 index 000000000..a0d5d5858 --- /dev/null +++ b/test/factories/tag_alias.rb @@ -0,0 +1,5 @@ +Factory.define(:tag_alias) do |f| + f.creator {|x| x.association(:user)} + f.updater_id {|x| x.creator_id} + f.updater_ip_addr "127.0.0.1" +end diff --git a/test/unit/deleted_post_test.rb b/test/unit/deleted_post_test.rb deleted file mode 100644 index 5afbebf21..000000000 --- a/test/unit/deleted_post_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class DeletedPostTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index fd46d6a05..3c5d9e88c 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -83,9 +83,21 @@ class PostTest < ActiveSupport::TestCase post1 = Factory.create(:post, :tag_string => "aaa bbb ccc") post2 = Factory.create(:post, :tag_string => "bbb ccc ddd") post3 = Factory.create(:post, :tag_string => "ccc ddd eee") + user = Factory.create(:user) assert_equal(1, Tag.find_by_name("aaa").post_count) assert_equal(2, Tag.find_by_name("bbb").post_count) assert_equal(3, Tag.find_by_name("ccc").post_count) + post3.update_attributes( + :tag_string => "xxx", + :updater_id => user.id, + :updater_ip_addr => "127.0.0.1" + ) + assert_equal(1, Tag.find_by_name("aaa").post_count) + assert_equal(2, Tag.find_by_name("bbb").post_count) + assert_equal(2, Tag.find_by_name("ccc").post_count) + assert_equal(1, Tag.find_by_name("ddd").post_count) + assert_equal(0, Tag.find_by_name("eee").post_count) + assert_equal(1, Tag.find_by_name("xxx").post_count) end should "be counted" do diff --git a/test/unit/post_version_test.rb b/test/unit/post_version_test.rb deleted file mode 100644 index 756d5fd54..000000000 --- a/test/unit/post_version_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class PostVersionTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/unit/tag_alias_test.rb b/test/unit/tag_alias_test.rb index 6a61bc71c..1fb99da6f 100644 --- a/test/unit/tag_alias_test.rb +++ b/test/unit/tag_alias_test.rb @@ -1,8 +1,37 @@ -require 'test_helper' +require File.dirname(__FILE__) + '/../test_helper' class TagAliasTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true + context "A tag alias" do + setup do + MEMCACHE.flush_all + end + + should "convert a tag to its normalized version" do + tag1 = Factory.create(:tag, :name => "aaa") + tag2 = Factory.create(:tag, :name => "bbb") + ta = Factory.create(:tag_alias, :antecedent_name => "aaa", :consequent_name => "bbb") + normalized_tags = TagAlias.to_aliased(["aaa", "ccc"]) + assert_equal(["bbb", "ccc"], normalized_tags.sort) + end + + should "update the cache" do + tag1 = Factory.create(:tag, :name => "aaa") + tag2 = Factory.create(:tag, :name => "bbb") + ta = Factory.create(:tag_alias, :antecedent_name => "aaa", :consequent_name => "bbb") + assert_equal("bbb", MEMCACHE.get("ta:aaa")) + end + + should "update any affected posts when saved" do + assert_equal(0, TagAlias.count) + post1 = Factory.create(:post, :tag_string => "aaa bbb") + post2 = Factory.create(:post, :tag_string => "ccc ddd") + assert_equal("aaa bbb", post1.tag_string) + assert_equal("ccc ddd", post2.tag_string) + ta = Factory.create(:tag_alias, :antecedent_name => "aaa", :consequent_name => "ccc") + post1.reload + post2.reload + assert_equal("ccc bbb", post1.tag_string) + assert_equal("ccc ddd", post2.tag_string) + end end end diff --git a/test/unit/unapproval_test.rb b/test/unit/unapproval_test.rb deleted file mode 100644 index de18601b9..000000000 --- a/test/unit/unapproval_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class PostUnapprovalTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end