Files
danbooru/test/unit/pool_test.rb
evazion 7d503f088e posts: stop using pool_string attribute.
Stop using the pool_string attribute on posts:

* Stop updating it when adding or removing posts from pools.
* Stop returning pool_string in the /posts.json API.
* Stop including the `data-pools` attribute on thumbnails.

The pool_string attribute was used in the past to facilitate pool:X
searches. Posts had a hidden pool_string attribute that contained a list
of every pool the post belonged to. These pools were treated like fake
hidden tags on the post and a search for `pool:X` was treated like a tag
search.

The pool_string has no longer been used for this purpose for a long time
now, and was only maintained for API compatibility purposes. Getting rid
of it eliminates a bunch of legacy cruft relating to adding and removing
posts from pools.

If you need to see which pools a post belongs to, do this:

* https://danbooru.donmai.us/pools.json?search[post_ids_include_any]=318550

The `data-pools` attribute on thumbnails was used by some people to add
custom borders to pooled posts with custom CSS. This will no longer
work. This was already broken because it included things like collection
pools and deleted pools, which you probably didn't want. Use a
userscript to add this attribute back to thumbnails if you need it.
2021-10-07 05:55:43 -05:00

275 lines
7.8 KiB
Ruby

require 'test_helper'
class PoolTest < ActiveSupport::TestCase
setup do
travel_to(1.month.ago) do
@user = FactoryBot.create(:user)
CurrentUser.user = @user
end
CurrentUser.ip_addr = "127.0.0.1"
end
teardown do
CurrentUser.user = nil
CurrentUser.ip_addr = nil
end
context "Searching pools" do
should "find pools by name" do
@pool = FactoryBot.create(:pool, name: "Test Pool")
assert_equal(@pool.id, Pool.find_by_name("test pool").id)
assert_equal(@pool.id, Pool.search(name_matches: "test pool").first.id)
end
should "find pools by post id" do
@pool1 = create(:pool, name: "pool1")
@pool2 = create(:pool, name: "pool2")
@post1 = create(:post, tag_string: "pool:pool1")
@post2 = create(:post, tag_string: "pool:pool2")
assert_equal([@pool1.id], Pool.search(post_ids_include_any: @post1.id).pluck(:id))
assert_equal([@pool2.id, @pool1.id], Pool.search(post_ids_include_any: "#{@post1.id} #{@post2.id}").pluck(:id))
end
should "find pools by post id count" do
@pool1 = create(:pool, name: "pool1")
@pool2 = create(:pool, name: "pool2")
@post1 = create(:post, tag_string: "pool:pool1")
@post2 = create(:post, tag_string: "pool:pool1")
assert_equal([@pool1.id], Pool.search(post_id_count: 2).pluck(:id))
end
should "find pools by post tags" do
@pool1 = create(:pool, name: "pool1")
@pool2 = create(:pool, name: "pool2")
@post1 = create(:post, tag_string: "pool:pool1 bkub")
@post2 = create(:post, tag_string: "pool:pool1 fumimi")
@post3 = create(:post, tag_string: "pool:pool2 bkub fumimi")
assert_equal([@pool2.id, @pool1.id], Pool.search(post_tags_match: "bkub").pluck(:id))
assert_equal([@pool2.id, @pool1.id], Pool.search(post_tags_match: "fumimi").pluck(:id))
assert_equal([@pool2.id], Pool.search(post_tags_match: "bkub fumimi").pluck(:id))
assert_equal(2, Pool.search(post_tags_match: "bkub").count)
assert_equal(2, Pool.search(post_tags_match: "fumimi").count)
assert_equal(1, Pool.search(post_tags_match: "bkub fumimi").count)
end
end
context "Creating a pool" do
setup do
@posts = FactoryBot.create_list(:post, 5)
@pool = FactoryBot.create(:pool, post_ids: @posts.map(&:id))
end
should "initialize the post count" do
assert_equal(@posts.size, @pool.post_count)
end
end
context "Reverting a pool" do
setup do
@p1 = create(:post)
@p2 = create(:post)
@u1 = create(:user, created_at: 1.month.ago)
@u2 = create(:user, created_at: 1.month.ago)
@pool = create(:pool)
as(@u1) { @pool.add!(@p1) }
as(@u2) { @pool.add!(@p2) }
end
should "have the correct versions" do
assert_equal(3, @pool.reload.versions.size)
assert_equal([], @pool.versions[0].post_ids)
assert_equal([@p1.id], @pool.versions[1].post_ids)
assert_equal([@p1.id, @p2.id], @pool.versions[2].post_ids)
assert_equal([@p1.id, @p2.id], @pool.reload.post_ids)
end
should "update its post_ids" do
@pool.revert_to!(@pool.versions[1])
assert_equal([@p1.id], @pool.post_ids)
@pool.revert_to!(@pool.versions[0])
assert_equal([], @pool.reload.post_ids)
end
end
context "Updating a pool" do
setup do
@pool = FactoryBot.create(:pool, category: "series")
@p1 = FactoryBot.create(:post)
@p2 = FactoryBot.create(:post)
end
context "by adding a new post" do
setup do
@pool.add!(@p1)
end
context "by #attributes=" do
setup do
@pool.attributes = {post_ids: [@p1.id, @p2.id]}
@pool.save
end
should "initialize the post count" do
assert_equal(2, @pool.post_count)
end
end
should "add the post to the pool" do
assert_equal([@p1.id], @pool.post_ids)
end
should "increment the post count" do
assert_equal(1, @pool.post_count)
end
context "to a pool that already has the post" do
setup do
@pool.add!(@p1)
end
should "not double add the post to the pool" do
assert_equal([@p1.id], @pool.post_ids)
end
should "not double increment the post count" do
assert_equal(1, @pool.post_count)
end
end
context "to a deleted pool" do
setup do
# must be a builder to update deleted pools.
CurrentUser.user = FactoryBot.create(:builder_user)
@pool.update_attribute(:is_deleted, true)
@pool.post_ids += [@p2.id]
@pool.save
@pool.reload
@p2.reload
end
should "add the post to the pool" do
assert_equal([@p1.id, @p2.id], @pool.post_ids)
end
should "increment the post count" do
assert_equal(2, @pool.post_count)
end
end
end
context "by removing a post" do
setup do
@pool.add!(@p1)
end
context "that is in the pool" do
setup do
@pool.remove!(@p1)
end
should "remove the post from the pool" do
assert_equal([], @pool.post_ids)
end
should "update the post count" do
assert_equal(0, @pool.post_count)
end
end
context "that is not in the pool" do
setup do
@pool.remove!(@p2)
end
should "not affect the pool" do
assert_equal([@p1.id], @pool.post_ids)
end
should "not affect the post count" do
assert_equal(1, @pool.post_count)
end
end
end
should "create new versions for each distinct user" do
assert_equal(1, @pool.versions.size)
user2 = create(:user)
as(user2) { @pool.update!(post_ids: [@p1.id]) }
assert_equal(2, @pool.reload.versions.size)
assert_equal(user2.id, @pool.versions.last.updater_id)
user3 = create(:user)
as(user3) { @pool.update!(post_ids: [@p1.id, @p2.id]) }
assert_equal(3, @pool.reload.versions.size)
assert_equal(user3.id, @pool.versions.last.updater_id)
end
should "should create a version if the name changes" do
as(create(:user)) { @pool.update!(name: "blah") }
assert_equal("blah", @pool.versions.last.name)
assert_equal(2, @pool.versions.size)
end
should "know what its post ids were previously" do
@pool.post_ids = [@p1.id]
assert_equal([], @pool.post_ids_was)
end
should "normalize its name" do
@pool.update(:name => " A B ")
assert_equal("A_B", @pool.name)
@pool.update(:name => "__A__B__")
assert_equal("A_B", @pool.name)
end
should "normalize its post ids" do
@pool.update(category: "collection", post_ids: [1, 2, 2, 3, 1])
assert_equal([1, 2, 3], @pool.post_ids)
end
context "when validating names" do
["foo,bar", "foo*bar", "123", "___", " ", "any", "none", "series", "collection"].each do |bad_name|
should_not allow_value(bad_name).for(:name)
end
end
end
context "An existing pool" do
setup do
@pool = FactoryBot.create(:pool)
@p1 = FactoryBot.create(:post)
@p2 = FactoryBot.create(:post)
@p3 = FactoryBot.create(:post)
@pool.add!(@p1)
@pool.add!(@p2)
@pool.add!(@p3)
end
should "find the neighbors for the first post" do
assert_nil(@pool.previous_post_id(@p1.id))
assert_equal(@p2.id, @pool.next_post_id(@p1.id))
end
should "find the neighbors for the middle post" do
assert_equal(@p1.id, @pool.previous_post_id(@p2.id))
assert_equal(@p3.id, @pool.next_post_id(@p2.id))
end
should "find the neighbors for the last post" do
assert_equal(@p2.id, @pool.previous_post_id(@p3.id))
assert_nil(@pool.next_post_id(@p3.id))
end
end
end