From b50b7f2a91054aa0e390fdb8b6b4938df5655319 Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 12 Aug 2019 18:10:49 -0500 Subject: [PATCH] tag aliases: fix bug in alias resolution. Bug: Searching for an aliased tag returns an empty page instead of showing the results for the real tag. Cause: The query parsing code runs the search string through `.mb_chars.downcase` before calling `TagAlias.to_aliased`, so the input to `to_aliased` is actually a ActiveSupport::Multibyte::Chars object. This breaks the `aliases[name]` hash lookup because `name` is not a plain string. Fixup for c7bcce429. --- app/models/tag_alias.rb | 4 ++-- test/unit/post_test.rb | 9 +++++++++ test/unit/tag_alias_test.rb | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/models/tag_alias.rb b/app/models/tag_alias.rb index d848bf4e7..ab4c16704 100644 --- a/app/models/tag_alias.rb +++ b/app/models/tag_alias.rb @@ -44,8 +44,8 @@ class TagAlias < TagRelationship end def self.to_aliased(names) - names = Array(names) - return names if names.empty? + names = Array(names).map(&:to_s) + return [] if names.empty? aliases = active.where(antecedent_name: names).map { |ta| [ta.antecedent_name, ta.consequent_name] }.to_h names.map { |name| aliases[name] || name } end diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index d2c917061..601dc2c91 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -2407,6 +2407,15 @@ class PostTest < ActiveSupport::TestCase assert_tag_match([], "filesize:1048000") end + should "resolve aliases to the actual tag" do + create(:tag_alias, antecedent_name: "kitten", consequent_name: "cat") + post1 = create(:post, tag_string: "cat") + post2 = create(:post, tag_string: "dog") + + assert_tag_match([post1], "kitten") + assert_tag_match([post2], "-kitten") + end + should "fail for more than 6 tags" do post1 = FactoryBot.create(:post, :rating => "s") diff --git a/test/unit/tag_alias_test.rb b/test/unit/tag_alias_test.rb index 1c4933da2..ea7e58c0c 100644 --- a/test/unit/tag_alias_test.rb +++ b/test/unit/tag_alias_test.rb @@ -111,6 +111,7 @@ class TagAliasTest < ActiveSupport::TestCase ta = create(:tag_alias, antecedent_name: "aaa", consequent_name: "bbb") assert_equal(["bbb"], TagAlias.to_aliased("aaa")) + assert_equal(["bbb"], TagAlias.to_aliased("aaa".mb_chars)) assert_equal(["bbb", "ccc"], TagAlias.to_aliased(["aaa", "ccc"])) assert_equal(["ccc", "bbb"], TagAlias.to_aliased(["ccc", "bbb"])) assert_equal(["bbb", "bbb"], TagAlias.to_aliased(["aaa", "aaa"]))