Fix bulk update requests generating invalid [bur:<id>] links in forum
posts. The id was missing because the BUR created the forum topic in a
before_create hook, which created the post before the BUR was saved so
the BUR didn't have an id yet. Fix regression caused by b4ce2d83.
256 lines
8.7 KiB
Ruby
256 lines
8.7 KiB
Ruby
require 'test_helper'
|
|
|
|
class BulkUpdateRequestTest < ActiveSupport::TestCase
|
|
context "a bulk update request" do
|
|
setup do
|
|
@admin = FactoryBot.create(:admin_user)
|
|
CurrentUser.user = @admin
|
|
CurrentUser.ip_addr = "127.0.0.1"
|
|
end
|
|
|
|
teardown do
|
|
CurrentUser.user = nil
|
|
CurrentUser.ip_addr = nil
|
|
end
|
|
|
|
context "#estimate_update_count" do
|
|
setup do
|
|
FactoryBot.create(:post, tag_string: "aaa")
|
|
FactoryBot.create(:post, tag_string: "bbb")
|
|
FactoryBot.create(:post, tag_string: "ccc")
|
|
FactoryBot.create(:post, tag_string: "ddd")
|
|
FactoryBot.create(:post, tag_string: "eee")
|
|
|
|
@script = "create alias aaa -> 000\n" +
|
|
"create implication bbb -> 111\n" +
|
|
"remove alias ccc -> 222\n" +
|
|
"remove implication ddd -> 333\n" +
|
|
"mass update eee -> 444\n"
|
|
end
|
|
|
|
subject { BulkUpdateRequest.new(script: @script) }
|
|
|
|
should "return the correct count" do
|
|
assert_equal(3, subject.estimate_update_count)
|
|
end
|
|
end
|
|
|
|
context "#update_notice" do
|
|
setup do
|
|
@forum_topic = create(:forum_topic, creator: @admin)
|
|
end
|
|
|
|
should "update the cache" do
|
|
@script = "create alias aaa -> 000\n" +
|
|
"create implication bbb -> 111\n" +
|
|
"remove alias ccc -> 222\n" +
|
|
"remove implication ddd -> 333\n" +
|
|
"mass update eee -> 444\n"
|
|
FactoryBot.create(:bulk_update_request, script: @script, forum_topic: @forum_topic)
|
|
|
|
assert_equal(@forum_topic.id, Cache.get("tcn:aaa"))
|
|
assert_equal(@forum_topic.id, Cache.get("tcn:000"))
|
|
assert_equal(@forum_topic.id, Cache.get("tcn:bbb"))
|
|
assert_equal(@forum_topic.id, Cache.get("tcn:111"))
|
|
assert_equal(@forum_topic.id, Cache.get("tcn:ccc"))
|
|
assert_equal(@forum_topic.id, Cache.get("tcn:222"))
|
|
assert_equal(@forum_topic.id, Cache.get("tcn:ddd"))
|
|
assert_equal(@forum_topic.id, Cache.get("tcn:333"))
|
|
assert_equal(@forum_topic.id, Cache.get("tcn:eee"))
|
|
assert_equal(@forum_topic.id, Cache.get("tcn:444"))
|
|
end
|
|
end
|
|
|
|
context "on approval" do
|
|
setup do
|
|
@post = create(:post, tag_string: "foo aaa")
|
|
@script = '
|
|
create alias foo -> bar
|
|
create implication bar -> baz
|
|
mass update aaa -> bbb
|
|
'
|
|
|
|
@bur = create(:bulk_update_request, script: @script, user: @admin)
|
|
@bur.approve!(@admin)
|
|
|
|
assert_enqueued_jobs(3)
|
|
perform_enqueued_jobs
|
|
|
|
@ta = TagAlias.where(:antecedent_name => "foo", :consequent_name => "bar").first
|
|
@ti = TagImplication.where(:antecedent_name => "bar", :consequent_name => "baz").first
|
|
end
|
|
|
|
should "reference the approver in the automated message" do
|
|
assert_match(Regexp.compile(@admin.name), @bur.forum_post.body)
|
|
end
|
|
|
|
should "set the BUR approver" do
|
|
assert_equal(@admin.id, @bur.approver.id)
|
|
end
|
|
|
|
should "create aliases/implications" do
|
|
assert_equal("active", @ta.status)
|
|
assert_equal("active", @ti.status)
|
|
end
|
|
|
|
should "process mass updates" do
|
|
assert_equal("bar baz bbb", @post.reload.tag_string)
|
|
end
|
|
|
|
should "set the alias/implication approvers" do
|
|
assert_equal(@admin.id, @ta.approver.id)
|
|
assert_equal(@admin.id, @ti.approver.id)
|
|
end
|
|
end
|
|
|
|
should "create a forum topic" do
|
|
bur = create(:bulk_update_request, reason: "zzz", script: "create alias aaa -> bbb")
|
|
|
|
assert_equal(true, bur.forum_post.present?)
|
|
assert_match(/\[bur:#{bur.id}\]/, bur.forum_post.body)
|
|
assert_match(/zzz/, bur.forum_post.body)
|
|
end
|
|
|
|
context "that has an invalid alias" do
|
|
setup do
|
|
@alias1 = create(:tag_alias, creator: @admin)
|
|
@req = FactoryBot.build(:bulk_update_request, :script => "create alias bbb -> aaa")
|
|
end
|
|
|
|
should "not validate" do
|
|
assert_difference("TagAlias.count", 0) do
|
|
@req.save
|
|
end
|
|
assert_equal(["Error: A tag alias for aaa already exists (create alias bbb -> aaa)"], @req.errors.full_messages)
|
|
end
|
|
end
|
|
|
|
context "for an implication that is redundant with an existing implication" do
|
|
should "not validate" do
|
|
FactoryBot.create(:tag_implication, :antecedent_name => "a", :consequent_name => "b")
|
|
FactoryBot.create(:tag_implication, :antecedent_name => "b", :consequent_name => "c")
|
|
bur = FactoryBot.build(:bulk_update_request, :script => "imply a -> c")
|
|
bur.save
|
|
|
|
assert_equal(["Error: a already implies c through another implication (create implication a -> c)"], bur.errors.full_messages)
|
|
end
|
|
end
|
|
|
|
context "for an implication that is redundant with another implication in the same BUR" do
|
|
setup do
|
|
FactoryBot.create(:tag_implication, :antecedent_name => "b", :consequent_name => "c")
|
|
@bur = FactoryBot.build(:bulk_update_request, :script => "imply a -> b\nimply a -> c")
|
|
@bur.save
|
|
end
|
|
|
|
should "not process" do
|
|
assert_no_difference("TagImplication.count") do
|
|
@bur.approve!(@admin)
|
|
end
|
|
end
|
|
|
|
should_eventually "not validate" do
|
|
assert_equal(["Error: a already implies c through another implication (create implication a -> c)"], @bur.errors.full_messages)
|
|
end
|
|
end
|
|
|
|
context "for a `category <tag> -> type` change" do
|
|
should "work" do
|
|
tag = Tag.find_or_create_by_name("tagme")
|
|
bur = FactoryBot.create(:bulk_update_request, :script => "category tagme -> meta")
|
|
bur.approve!(@admin)
|
|
|
|
assert_equal(Tag.categories.meta, tag.reload.category)
|
|
end
|
|
|
|
should "work for a new tag" do
|
|
bur = FactoryBot.create(:bulk_update_request, :script => "category new_tag -> meta")
|
|
bur.approve!(@admin)
|
|
|
|
assert_not_nil(Tag.find_by_name("new_tag"))
|
|
assert_equal(Tag.categories.meta, Tag.find_by_name("new_tag").category)
|
|
end
|
|
end
|
|
|
|
context "with an associated forum topic" do
|
|
setup do
|
|
@topic = create(:forum_topic, title: "[bulk] hoge", creator: @admin)
|
|
@post = create(:forum_post, topic: @topic, creator: @admin)
|
|
@req = FactoryBot.create(:bulk_update_request, :script => "create alias AAA -> BBB", :forum_topic_id => @topic.id, :forum_post_id => @post.id, :title => "[bulk] hoge")
|
|
end
|
|
|
|
should "gracefully handle validation errors during approval" do
|
|
@req.stubs(:update!).raises(AliasAndImplicationImporter::Error.new("blah"))
|
|
assert_difference("ForumPost.count", 1) do
|
|
@req.approve!(@admin)
|
|
end
|
|
|
|
assert_equal("pending", @req.reload.status)
|
|
assert_match(/\[FAILED\]/, @topic.reload.title)
|
|
end
|
|
|
|
should "leave the BUR pending if there is an unexpected error during approval" do
|
|
@req.forum_updater.stubs(:update).raises(RuntimeError.new("blah"))
|
|
assert_raises(RuntimeError) { @req.approve!(@admin) }
|
|
|
|
# XXX Raises "Couldn't find BulkUpdateRequest without an ID". Possible
|
|
# rails bug? (cf rails #34637, #34504, #30167, #15018).
|
|
# @req.reload
|
|
|
|
@req = BulkUpdateRequest.find(@req.id)
|
|
assert_equal("pending", @req.status)
|
|
end
|
|
|
|
should "downcase the text" do
|
|
assert_equal("create alias aaa -> bbb", @req.script)
|
|
end
|
|
|
|
should "update the topic when processed" do
|
|
assert_difference("ForumPost.count") do
|
|
@req.approve!(@admin)
|
|
end
|
|
|
|
@topic.reload
|
|
@post.reload
|
|
assert_match(/\[APPROVED\]/, @topic.title)
|
|
end
|
|
|
|
should "update the topic when rejected" do
|
|
@req.approver_id = @admin.id
|
|
|
|
assert_difference("ForumPost.count") do
|
|
@req.reject!(@admin)
|
|
end
|
|
|
|
@topic.reload
|
|
@post.reload
|
|
assert_match(/\[REJECTED\]/, @topic.title)
|
|
end
|
|
|
|
should "reference the rejector in the automated message" do
|
|
@req.reject!(@admin)
|
|
assert_match(Regexp.compile(@admin.name), @req.forum_post.body)
|
|
end
|
|
|
|
should "not send @mention dmails to the approver" do
|
|
assert_no_difference("Dmail.count") do
|
|
@req.approve!(@admin)
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when searching" do
|
|
setup do
|
|
@bur1 = FactoryBot.create(:bulk_update_request, title: "foo", script: "create alias aaa -> bbb", user_id: @admin.id)
|
|
@bur2 = FactoryBot.create(:bulk_update_request, title: "bar", script: "create implication bbb -> ccc", user_id: @admin.id)
|
|
@bur1.approve!(@admin)
|
|
end
|
|
|
|
should "work" do
|
|
assert_equal([@bur2.id, @bur1.id], BulkUpdateRequest.search.map(&:id))
|
|
assert_equal([@bur1.id], BulkUpdateRequest.search(user_name: @admin.name, approver_name: @admin.name, status: "approved").map(&:id))
|
|
end
|
|
end
|
|
end
|
|
end
|