The belongs_to_creator macro was used to initialize the creator_id field to the CurrentUser. This made tests complicated because it meant you had to create and set the current user every time you wanted to create an object, when lead to the current user being set over and over again. It also meant you had to constantly be aware of what the CurrentUser was in many different contexts, which was often confusing. Setting creators explicitly simplifies everything greatly.
254 lines
8.6 KiB
Ruby
254 lines
8.6 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
|
|
assert_difference("ForumTopic.count", 1) do
|
|
BulkUpdateRequest.create(:title => "abc", :reason => "zzz", :script => "create alias aaa -> bbb", :skip_secondary_validations => true)
|
|
end
|
|
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
|