aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/deprecated_finder_test.rb
blob: 796e46f8c2ff8c83368239bd92d773ad8d0fdd59 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
require 'abstract_unit'
require 'fixtures/company'
require 'fixtures/topic'
require 'fixtures/reply'
require 'fixtures/entrant'
require 'fixtures/developer'

class DeprecatedFinderTest < Test::Unit::TestCase
  fixtures :companies, :topics, :entrants, :developers

  def test_find_all_with_limit
    entrants = assert_deprecated { Entrant.find_all nil, "id ASC", 2 }
    assert_equal 2, entrants.size
    assert_equal entrants(:first), entrants.first
  end

  def test_find_all_with_prepared_limit_and_offset
    entrants = assert_deprecated { Entrant.find_all nil, "id ASC", [2, 1] }
    assert_equal 2, entrants.size
    assert_equal entrants(:second), entrants.first
  end

  def test_find_first
    first = assert_deprecated { Topic.find_first "title = 'The First Topic'" }
    assert_equal topics(:first), first
  end

  def test_find_first_failing
    first = assert_deprecated { Topic.find_first "title = 'The First Topic!'" }
    assert_nil first
  end

  def test_deprecated_find_on_conditions
    assert_deprecated 'find_on_conditions' do
      assert Topic.find_on_conditions(1, ["approved = ?", false])
      assert_raises(ActiveRecord::RecordNotFound) { Topic.find_on_conditions(1, ["approved = ?", true]) }
    end
  end

  def test_condition_interpolation
    assert_deprecated do
      assert_kind_of Firm, Company.find_first(["name = '%s'", "37signals"])
      assert_nil Company.find_first(["name = '%s'", "37signals!"])
      assert_nil Company.find_first(["name = '%s'", "37signals!' OR 1=1"])
      assert_kind_of Time, Topic.find_first(["id = %d", 1]).written_on
    end
  end

  def test_bind_variables
    assert_deprecated do
      assert_kind_of Firm, Company.find_first(["name = ?", "37signals"])
      assert_nil Company.find_first(["name = ?", "37signals!"])
      assert_nil Company.find_first(["name = ?", "37signals!' OR 1=1"])
      assert_kind_of Time, Topic.find_first(["id = ?", 1]).written_on
      assert_raises(ActiveRecord::PreparedStatementInvalid) {
        Company.find_first(["id=? AND name = ?", 2])
      }
      assert_raises(ActiveRecord::PreparedStatementInvalid) {
             Company.find_first(["id=?", 2, 3, 4])
      }
    end
  end
  
  def test_bind_variables_with_quotes
    Company.create("name" => "37signals' go'es agains")
    assert_deprecated do
      assert_not_nil Company.find_first(["name = ?", "37signals' go'es agains"])
    end
  end

  def test_named_bind_variables_with_quotes
    Company.create("name" => "37signals' go'es agains")
    assert_deprecated do
      assert_not_nil Company.find_first(["name = :name", {:name => "37signals' go'es agains"}])
    end
  end

  def test_named_bind_variables
    assert_equal '1', bind(':a', :a => 1) # ' ruby-mode
    assert_equal '1 1', bind(':a :a', :a => 1)  # ' ruby-mode

    assert_deprecated do
      assert_kind_of Firm, Company.find_first(["name = :name", { :name => "37signals" }])
      assert_nil Company.find_first(["name = :name", { :name => "37signals!" }])
      assert_nil Company.find_first(["name = :name", { :name => "37signals!' OR 1=1" }])
      assert_kind_of Time, Topic.find_first(["id = :id", { :id => 1 }]).written_on
    end
  end

  def test_count
    assert_equal(0, Entrant.count(:conditions => "id > 3"))
    assert_equal(1, Entrant.count(:conditions => ["id > ?", 2]))
    assert_equal(2, Entrant.count(:conditions => ["id > ?", 1]))
  end

  def test_count_by_sql
    assert_equal(0, Entrant.count_by_sql("SELECT COUNT(*) FROM entrants WHERE id > 3"))
    assert_equal(1, Entrant.count_by_sql(["SELECT COUNT(*) FROM entrants WHERE id > ?", 2]))
    assert_equal(2, Entrant.count_by_sql(["SELECT COUNT(*) FROM entrants WHERE id > ?", 1]))
  end

  def test_find_all_with_limit
    assert_deprecated do
      first_five_developers = Developer.find_all nil, 'id ASC', 5
      assert_equal 5, first_five_developers.length
      assert_equal 'David', first_five_developers.first.name
      assert_equal 'fixture_5', first_five_developers.last.name

      no_developers = Developer.find_all nil, 'id ASC', 0
      assert_equal 0, no_developers.length

      assert_equal first_five_developers, Developer.find_all(nil, 'id ASC', [5])
      assert_equal no_developers, Developer.find_all(nil, 'id ASC', [0])
    end
  end

  def test_find_all_with_limit_and_offset
    assert_deprecated do
      first_three_developers = Developer.find_all nil, 'id ASC', [3, 0]
      second_three_developers = Developer.find_all nil, 'id ASC', [3, 3]
      last_two_developers = Developer.find_all nil, 'id ASC', [2, 8]

      assert_equal 3, first_three_developers.length
      assert_equal 3, second_three_developers.length
      assert_equal 2, last_two_developers.length

      assert_equal 'David', first_three_developers.first.name
      assert_equal 'fixture_4', second_three_developers.first.name
      assert_equal 'fixture_9', last_two_developers.first.name
    end
  end

  def test_find_all_by_one_attribute_with_options
    assert_not_deprecated do
      topics = Topic.find_all_by_content("Have a nice day", "id DESC")
      assert topics(:first), topics.last

      topics = Topic.find_all_by_content("Have a nice day", "id DESC")
      assert topics(:first), topics.first
    end
  end

  protected
    def bind(statement, *vars)
      if vars.first.is_a?(Hash)
        ActiveRecord::Base.send(:replace_named_bind_variables, statement, vars.first)
      else
        ActiveRecord::Base.send(:replace_bind_variables, statement, vars)
      end
    end
end