Merge pull request #3201 from evazion/fix-transitive-implications

Fix #3200: Disallow creation of superfluous implications
This commit is contained in:
Albert Yi
2017-07-05 11:50:51 -07:00
committed by GitHub
3 changed files with 53 additions and 4 deletions

View File

@@ -62,6 +62,35 @@ class BulkUpdateRequestTest < ActiveSupport::TestCase
end
end
context "for an implication that is redundant with an existing implication" do
should "not validate" do
FactoryGirl.create(:tag_implication, :antecedent_name => "a", :consequent_name => "b")
FactoryGirl.create(:tag_implication, :antecedent_name => "b", :consequent_name => "c")
bur = FactoryGirl.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
FactoryGirl.create(:tag_implication, :antecedent_name => "b", :consequent_name => "c")
@bur = FactoryGirl.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 "with an associated forum topic" do
setup do
@topic = FactoryGirl.create(:forum_topic, :title => "[bulk] hoge")

View File

@@ -66,12 +66,21 @@ class TagImplicationTest < ActiveSupport::TestCase
assert_equal("Tag implication can not create a circular relation with another tag implication", ti2.errors.full_messages.join(""))
end
should "not validate when a transitive relation is created" do
ti_ab = FactoryGirl.create(:tag_implication, :antecedent_name => "a", :consequent_name => "b")
ti_bc = FactoryGirl.create(:tag_implication, :antecedent_name => "b", :consequent_name => "c")
ti_ac = FactoryGirl.build(:tag_implication, :antecedent_name => "a", :consequent_name => "c")
ti_ac.save
assert_equal("a already implies c through another implication", ti_ac.errors.full_messages.join(""))
end
should "not allow for duplicates" do
ti1 = FactoryGirl.create(:tag_implication, :antecedent_name => "aaa", :consequent_name => "bbb")
ti2 = FactoryGirl.build(:tag_implication, :antecedent_name => "aaa", :consequent_name => "bbb")
ti2.save
assert(ti2.errors.any?, "Tag implication should not have validated.")
assert_equal("Antecedent name has already been taken", ti2.errors.full_messages.join(""))
assert_includes(ti2.errors.full_messages, "Antecedent name has already been taken")
end
should "not validate if its consequent is aliased to another tag" do