Skip to content

Commit f45880e

Browse files
fix: nil scope values being excluded from scope filtering (#476)
1 parent 31fbb28 commit f45880e

2 files changed

Lines changed: 61 additions & 3 deletions

File tree

lib/closure_tree/support.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,12 +238,12 @@ def scope_values_from_instance(instance)
238238
case scope_option
239239
when Symbol
240240
value = instance.read_attribute(scope_option)
241-
scope_hash[scope_option] = value unless value.nil?
241+
scope_hash[scope_option] = value
242242
when Array
243243
scope_option.each do |item|
244244
if item.is_a?(Symbol)
245245
value = instance.read_attribute(item)
246-
scope_hash[item] = value unless value.nil?
246+
scope_hash[item] = value
247247
end
248248
end
249249
end

test/closure_tree/scope_test.rb

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,5 +175,63 @@ def test_scope_columns_method
175175
assert_equal [:user_id], ScopedItem._ct.scope_columns
176176
assert_equal [:user_id, :group_id], MultiScopedItem._ct.scope_columns
177177
end
178-
end
179178

179+
def test_scope_values_from_instance_with_nil_value_symbol_scope
180+
instance = ScopedItem.new(user_id: nil)
181+
scope_values = instance._ct.scope_values_from_instance(instance)
182+
assert_equal({ user_id: nil }, scope_values)
183+
end
184+
185+
def test_scope_values_from_instance_with_nil_value_array_scope
186+
instance = MultiScopedItem.new(user_id: nil, group_id: nil)
187+
scope_values = instance._ct.scope_values_from_instance(instance)
188+
assert_equal({ user_id: nil, group_id: nil }, scope_values)
189+
end
190+
191+
def test_ordering_with_nil_scope_values_symbol_scope
192+
root1 = ScopedItem.create!(name: 'root1', user_id: nil)
193+
root2 = ScopedItem.create!(name: 'root2', user_id: 1)
194+
root3 = ScopedItem.create!(name: 'root3', user_id: nil)
195+
196+
assert_equal 0, root1.order_value
197+
assert_equal 1, root3.order_value
198+
assert_equal 0, root2.order_value
199+
end
200+
201+
def test_ordering_with_nil_scope_values_array_scope
202+
root1 = MultiScopedItem.create!(name: 'root1', user_id: nil, group_id: nil)
203+
root2 = MultiScopedItem.create!(name: 'root2', user_id: 1, group_id: 1)
204+
root3 = MultiScopedItem.create!(name: 'root3', user_id: nil, group_id: nil)
205+
206+
assert_equal 0, root1.order_value
207+
assert_equal 1, root3.order_value
208+
assert_equal 0, root2.order_value
209+
end
210+
211+
def test_build_scope_where_clause_with_nil_value_pg
212+
support = ScopedItem._ct
213+
scope_conditions = { user_id: nil, group_id: 789 }
214+
clause = support.build_scope_where_clause(scope_conditions)
215+
216+
assert_includes clause, 'IS NULL'
217+
assert_includes clause, '789'
218+
end
219+
220+
def test_build_scope_where_clause_with_nil_value_mysql
221+
support = SecondaryTag._ct
222+
scope_conditions = { user_id: nil, group_id: 123 }
223+
clause = support.build_scope_where_clause(scope_conditions)
224+
225+
assert_includes clause, 'IS NULL'
226+
assert_includes clause, '123'
227+
end
228+
229+
def test_build_scope_where_clause_with_nil_value_sqlite
230+
support = MemoryTag._ct
231+
scope_conditions = { user_id: nil, group_id: 456 }
232+
clause = support.build_scope_where_clause(scope_conditions)
233+
234+
assert_includes clause, 'IS NULL'
235+
assert_includes clause, '456'
236+
end
237+
end

0 commit comments

Comments
 (0)