Files
danbooru/test/unit/saved_search_test.rb
evazion 2bbdc5d143 jobs: migrate saved searches to ActiveJob.
* Fix tests to run the searches for real instead of mocking everything out.

* Fix SavedSearch.populate to only use the read only database in
  production because in breaks things in tests. Specifically:
  the posts get created in one db connection but searched for in
  another, but the second transaction doesn't see the uncommitted posts
  in the first transaction, so the search doesn't work.
2019-08-16 20:49:35 -05:00

175 lines
5.4 KiB
Ruby

require 'test_helper'
class SavedSearchTest < ActiveSupport::TestCase
def setup
super
@user = FactoryBot.create(:user)
CurrentUser.user = @user
CurrentUser.ip_addr = "127.0.0.1"
@mock_redis = MockRedis.new
SavedSearch.stubs(:redis).returns(@mock_redis)
end
def teardown
super
CurrentUser.user = nil
CurrentUser.ip_addr = nil
end
context ".labels_for" do
setup do
FactoryBot.create(:saved_search, user: @user, label_string: "blah", query: "blah")
FactoryBot.create(:saved_search, user: @user, label_string: "zah", query: "blah")
end
should "fetch the labels used by a user" do
assert_equal(%w(blah zah), SavedSearch.labels_for(@user.id))
end
end
context ".queries_for" do
setup do
FactoryBot.create(:tag_alias, antecedent_name: "bbb", consequent_name: "ccc", creator: @user)
FactoryBot.create(:saved_search, user: @user, label_string: "blah", query: "aaa")
FactoryBot.create(:saved_search, user: @user, label_string: "zah", query: "CCC BBB AAA")
FactoryBot.create(:saved_search, user: @user, label_string: "qux", query: " aaa bbb ccc ")
end
should "fetch the queries used by a user for a label" do
assert_equal(%w(aaa), SavedSearch.queries_for(@user.id, label: "blah"))
end
should "fetch the queries used by a user without a label" do
assert_equal(["aaa", "aaa ccc"], SavedSearch.queries_for(@user.id))
end
end
context ".search_labels" do
setup do
FactoryBot.create(:tag_alias, antecedent_name: "bbb", consequent_name: "ccc", creator: @user)
FactoryBot.create(:saved_search, user: @user, label_string: "blah", query: "aaa")
FactoryBot.create(:saved_search, user: @user, label_string: "blahbling", query: "CCC BBB AAA")
FactoryBot.create(:saved_search, user: @user, label_string: "qux", query: " aaa bbb ccc ")
end
should "fetch the queries used by a user for a label" do
assert_equal(%w(blah blahbling), SavedSearch.search_labels(@user.id, label: "blah"))
end
end
context ".post_ids_for" do
context "with a label" do
setup do
create(:saved_search, query: "a", labels: ["blah"], user: @user)
create(:saved_search, query: "b", labels: ["blah"], user: @user)
create(:saved_search, query: "c", labels: ["blah"], user: @user)
create(:post, tag_string: "a")
create(:post, tag_string: "b")
create(:post, tag_string: "c")
end
context "without a primed cache" do
should "return nothing" do
post_ids = SavedSearch.post_ids_for(@user.id, label: "blah")
assert_equal([], post_ids)
end
end
context "with a primed cache" do
setup do
perform_enqueued_jobs do
SavedSearch.post_ids_for(@user.id, label: "blah")
end
end
should "fetch the post ids" do
post_ids = SavedSearch.post_ids_for(@user.id, label: "blah")
assert_equal(Post.pluck(:id).sort, post_ids.sort)
end
end
end
context "without a label" do
setup do
create(:saved_search, query: "a", user: @user)
create(:saved_search, query: "b", user: @user)
create(:saved_search, query: "c", user: @user)
create(:post, tag_string: "a")
create(:post, tag_string: "b")
create(:post, tag_string: "c")
end
context "without a primed cache" do
should "return nothing" do
post_ids = SavedSearch.post_ids_for(@user.id)
assert_equal([], post_ids)
end
end
context "with a primed cache" do
setup do
perform_enqueued_jobs do
SavedSearch.post_ids_for(@user.id)
end
end
should "fetch the post ids" do
post_ids = SavedSearch.post_ids_for(@user.id)
assert_equal(Post.pluck(:id).sort, post_ids.sort)
end
end
end
end
context "Creating a saved search" do
setup do
FactoryBot.create(:tag_alias, antecedent_name: "zzz", consequent_name: "yyy", creator: @user)
@saved_search = @user.saved_searches.create(query: " ZZZ xxx ")
end
should "update the bitpref on the user" do
@user.reload
assert(@user.has_saved_searches?, "should have saved_searches bitpref set")
end
should "normalize the query aside from the order" do
assert_equal("yyy xxx", @saved_search.query)
end
should "normalize the label string" do
@saved_search.label_string = "Foo Bar"
assert_equal(%w[foo bar], @saved_search.labels)
@saved_search.labels = ["Artist 1", "Artist 2"]
assert_equal(%w[artist_1 artist_2], @saved_search.labels)
end
end
context "Destroying a saved search" do
setup do
@saved_search = @user.saved_searches.create(query: "xxx")
@saved_search.destroy
end
should "update the bitpref on the user" do
@user.reload
assert(!@user.has_saved_searches?, "should not have the saved_searches bitpref set")
end
end
context "A user with max saved searches" do
setup do
@user = FactoryBot.create(:gold_user)
CurrentUser.user = @user
User.any_instance.stubs(:max_saved_searches).returns(0)
@saved_search = @user.saved_searches.create(:query => "xxx")
end
should "not be able to create another saved search" do
assert_equal(["You can only have up to 0 saved searches"], @saved_search.errors.full_messages)
end
end
end