mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Fixed find_by("sql fragment without bindings") on master
* Also duplicated find_by tests from relations_test.rb to finder_test.rb now that we have a completely different implementation on the class (in core.rb with AST caching stuff). * Also removed a (failing) test that used mocks. Now that we have tests for the behavior, there's no point having another test that tests the implementation (that it delegates). Further, what the test was implying is nolonger true with the current implementation, because Class.find_by is a real method now.
This commit is contained in:
parent
3041b0b203
commit
58c5261efa
4 changed files with 23 additions and 17 deletions
|
@ -151,7 +151,7 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
def find_by(*args)
|
||||
return super if current_scope || args.length > 1 || reflect_on_all_aggregations.any?
|
||||
return super if current_scope || !(Hash === args.first) || reflect_on_all_aggregations.any?
|
||||
|
||||
hash = args.first
|
||||
|
||||
|
|
|
@ -1540,20 +1540,6 @@ class BasicsTest < ActiveRecord::TestCase
|
|||
assert_equal "", Company.new.description
|
||||
end
|
||||
|
||||
["find_by", "find_by!"].each do |meth|
|
||||
test "#{meth} delegates to scoped" do
|
||||
record = stub
|
||||
|
||||
scope = mock
|
||||
scope.expects(meth).with(:foo, :bar).returns(record)
|
||||
|
||||
klass = Class.new(ActiveRecord::Base)
|
||||
klass.stubs(:all => scope)
|
||||
|
||||
assert_equal record, klass.public_send(meth, :foo, :bar)
|
||||
end
|
||||
end
|
||||
|
||||
test "scoped can take a values hash" do
|
||||
klass = Class.new(ActiveRecord::Base)
|
||||
assert_equal ['foo'], klass.all.merge!(select: 'foo').select_values
|
||||
|
|
|
@ -1027,6 +1027,26 @@ class FinderTest < ActiveRecord::TestCase
|
|||
assert_nothing_raised(ActiveRecord::StatementInvalid) { Topic.offset("3").to_a }
|
||||
end
|
||||
|
||||
test "find_by with hash conditions returns the first matching record" do
|
||||
assert_equal posts(:eager_other), Post.find_by(id: posts(:eager_other).id)
|
||||
end
|
||||
|
||||
test "find_by with non-hash conditions returns the first matching record" do
|
||||
assert_equal posts(:eager_other), Post.find_by("id = #{posts(:eager_other).id}")
|
||||
end
|
||||
|
||||
test "find_by with multi-arg conditions returns the first matching record" do
|
||||
assert_equal posts(:eager_other), Post.find_by('id = ?', posts(:eager_other).id)
|
||||
end
|
||||
|
||||
test "find_by returns nil if the record is missing" do
|
||||
assert_equal nil, Post.find_by("1 = 0")
|
||||
end
|
||||
|
||||
test "find_by doesn't have implicit ordering" do
|
||||
assert_sql(/^((?!ORDER).)*$/) { Post.find_by(id: posts(:eager_other).id) }
|
||||
end
|
||||
|
||||
protected
|
||||
def bind(statement, *vars)
|
||||
if vars.first.is_a?(Hash)
|
||||
|
|
|
@ -1570,7 +1570,7 @@ class RelationTest < ActiveRecord::TestCase
|
|||
end
|
||||
|
||||
test "find_by doesn't have implicit ordering" do
|
||||
assert_sql(/^((?!ORDER).)*$/) { Post.find_by(author_id: 2) }
|
||||
assert_sql(/^((?!ORDER).)*$/) { Post.all.find_by(author_id: 2) }
|
||||
end
|
||||
|
||||
test "find_by! with hash conditions returns the first matching record" do
|
||||
|
@ -1586,7 +1586,7 @@ class RelationTest < ActiveRecord::TestCase
|
|||
end
|
||||
|
||||
test "find_by! doesn't have implicit ordering" do
|
||||
assert_sql(/^((?!ORDER).)*$/) { Post.find_by!(author_id: 2) }
|
||||
assert_sql(/^((?!ORDER).)*$/) { Post.all.find_by!(author_id: 2) }
|
||||
end
|
||||
|
||||
test "find_by! raises RecordNotFound if the record is missing" do
|
||||
|
|
Loading…
Reference in a new issue