diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index f3ccd25f6..dde81334e 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -255,8 +255,7 @@ class PostQueryBuilder end end - def posts(post_query, includes: nil) - relation = Post.all + def posts(post_query, relation = Post.unscoped, includes: nil) relation = add_joins(post_query, relation) relation = build_relation(post_query, relation) diff --git a/app/models/post.rb b/app/models/post.rb index 25488c84c..6cb2ce65d 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -1390,7 +1390,8 @@ class Post < ApplicationRecord def user_tag_match(query, user = CurrentUser.user, tag_limit: user.tag_query_limit, safe_mode: CurrentUser.safe_mode?) post_query = PostQuery.normalize(query, current_user: user, tag_limit: tag_limit, safe_mode: safe_mode) post_query.validate_tag_limit! - post_query.with_implicit_metatags.posts + posts = post_query.with_implicit_metatags.posts + merge(posts) end def search(params, current_user) @@ -1408,7 +1409,7 @@ class Post < ApplicationRecord ) if params[:tags].present? - q = q.user_tag_match(params[:tags]) + q = q.user_tag_match(params[:tags], current_user) end if params[:order].present? diff --git a/test/functional/modqueue_controller_test.rb b/test/functional/modqueue_controller_test.rb index 59c9321fa..8d5542e2f 100644 --- a/test/functional/modqueue_controller_test.rb +++ b/test/functional/modqueue_controller_test.rb @@ -5,21 +5,25 @@ class ModqueueControllerTest < ActionDispatch::IntegrationTest setup do @admin = create(:admin_user) @user = create(:user) - @post = create(:post, is_pending: true) end context "index action" do should "render" do + create(:post, is_pending: true) get_auth modqueue_index_path, @admin + assert_response :success end should "render for a json response" do + create(:post, is_pending: true) get_auth modqueue_index_path, @admin, as: :json + assert_response :success end should "support the only= URL param" do + @post = create(:post, is_pending: true) get_auth modqueue_index_path(only: "rating"), @admin, as: :json assert_response :success @@ -37,6 +41,23 @@ class ModqueueControllerTest < ActionDispatch::IntegrationTest assert_equal([post1.id, post2.id, post3.id], response.parsed_body.pluck("id")) end + should "filter negated tags correctly" do + post1 = create(:post, tag_string: "touhou", is_pending: false) + post2 = create(:post, tag_string: "touhou", is_pending: true) + + get_auth modqueue_index_path(search: { tags: "-solo" }), @admin, as: :json + assert_response :success + assert_equal([post2.id], response.parsed_body.pluck("id")) + + get_auth modqueue_index_path(search: { tags: "touhou -solo" }), @admin, as: :json + assert_response :success + assert_equal([post2.id], response.parsed_body.pluck("id")) + + get_auth modqueue_index_path(search: { tags: "-touhou" }), @admin, as: :json + assert_response :success + assert_equal([], response.parsed_body.pluck("id")) + end + should "include appealed posts in the modqueue" do @appeal = create(:post_appeal) get_auth modqueue_index_path, @admin diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index 517cfd089..2f5999333 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -1995,4 +1995,18 @@ class PostTest < ActiveSupport::TestCase assert_equal("https://www.example.com/data/original/77/d8/77d89bda37ea3af09158ed3282f8334f.gif", @post.file_url) end end + + context "Searching:" do + context "the user_tag_match method" do + should "should not negate conditions before the search" do + @post1 = create(:post, tag_string: "solo", is_pending: true) + @post2 = create(:post, tag_string: "touhou", is_deleted: true) + + assert_equal([@post1.id], Post.pending.anon_tag_match("solo").pluck(:id)) + assert_equal([], Post.pending.anon_tag_match("-solo").pluck(:id)) + assert_equal([@post2.id], Post.deleted.anon_tag_match("touhou").pluck(:id)) + assert_equal([], Post.deleted.anon_tag_match("-touhou").pluck(:id)) + end + end + end end