From 02e0e19e927d87f45c86458995f6b14ce9280341 Mon Sep 17 00:00:00 2001 From: gemshrine <113778529+gemshrine@users.noreply.github.com> Date: Sat, 3 Oct 2026 10:23:14 +0300 Subject: [PATCH] #977: Reject empty if_absent keys --- lib/fbe/if_absent.rb | 4 +++- test/fbe/test_if_absent.rb | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/fbe/if_absent.rb b/lib/fbe/if_absent.rb index 0141b000..b60e84f4 100644 --- a/lib/fbe/if_absent.rb +++ b/lib/fbe/if_absent.rb @@ -65,7 +65,9 @@ def Fbe.if_absent(fb: Fbe.fb, always: false) end end yield(f) - q = attrs.except(:_id, :_time, :_version).map do |k, v| + matching = attrs.except(:_id, :_time, :_version) + raise(Fbe::Error, 'At least one non-system attribute is required by if_absent') if matching.empty? + q = matching.map do |k, v| raise(Fbe::Error, "Can't match #{k} by an array, only by one value") if v.is_a?(Array) vv = v.to_s if v.is_a?(String) diff --git a/test/fbe/test_if_absent.rb b/test/fbe/test_if_absent.rb index 08654c2a..916dafba 100644 --- a/test/fbe/test_if_absent.rb +++ b/test/fbe/test_if_absent.rb @@ -49,6 +49,25 @@ def test_ignores assert_nil(n) end + def test_raises_when_block_sets_no_attributes + fb = Factbase.new + fb.insert.foo = 'unrelated' + error = assert_raises(Fbe::Error) do + Fbe.if_absent(fb:) { |_fact| } + end + assert_equal('At least one non-system attribute is required by if_absent', error.message) + assert_equal(1, fb.size) + end + + def test_raises_when_only_system_attributes_are_set + fb = Factbase.new + error = assert_raises(Fbe::Error) do + Fbe.if_absent(fb:) { |fact| fact._id = 42 } + end + assert_equal('At least one non-system attribute is required by if_absent', error.message) + assert_equal(0, fb.size) + end + def test_raises_on_empty_value assert_raises(StandardError) do Fbe.if_absent(fb: Factbase.new) do |f|