“2096448bb1268ffef91be4e013842cc685605683”上不存在“...fluid/framework/git@gitcode.net:qq_51447496/Paddle.git”
relations_test.rb 7.7 KB
Newer Older
1
require "cases/helper"
2 3
require 'models/tag'
require 'models/tagging'
4 5
require 'models/post'
require 'models/topic'
6
require 'models/comment'
7 8
require 'models/reply'
require 'models/author'
9
require 'models/comment'
10 11 12 13
require 'models/entrant'
require 'models/developer'
require 'models/company'

E
Emilio Tagua 已提交
14
class RelationTest < ActiveRecord::TestCase
15 16
  fixtures :authors, :topics, :entrants, :developers, :companies, :developers_projects, :accounts, :categories, :categorizations, :posts, :comments,
    :taggings
17

18 19 20 21 22 23
  def test_scoped
    topics = Topic.scoped
    assert_kind_of ActiveRecord::Relation, topics
    assert_equal 4, topics.size
  end

24 25 26 27 28 29
  def test_scoped_all
    topics = Topic.scoped.all
    assert_kind_of Array, topics
    assert_no_queries { assert_equal 4, topics.size }
  end

P
Pratik Naik 已提交
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
  def test_loaded_all
    topics = Topic.scoped

    assert_queries(1) do
      2.times { assert_equal 4, topics.all.size }
    end

    assert topics.loaded?
  end

  def test_scoped_first
    topics = Topic.scoped

    assert_queries(1) do
      2.times { assert_equal "The First Topic", topics.first.title }
    end

    assert ! topics.loaded?
  end

  def test_loaded_first
    topics = Topic.scoped

    assert_queries(1) do
      topics.all # force load
      2.times { assert_equal "The First Topic", topics.first.title }
    end

    assert topics.loaded?
  end

61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
  def test_reload
    topics = Topic.scoped

    assert_queries(1) do
      2.times { topics.to_a }
    end

    assert topics.loaded?

    topics.reload
    assert ! topics.loaded?

    assert_queries(1) { topics.to_a }
  end

76
  def test_finding_with_conditions
77 78
    assert_equal ["David"], Author.where(:name => 'David').map(&:name)
    assert_equal ['Mary'],  Author.where(["name = ?", 'Mary']).map(&:name)
79
    assert_equal ['Mary'],  Author.where("name = ?", 'Mary').map(&:name)
80 81 82
  end

  def test_finding_with_order
83
    topics = Topic.order('id')
84 85 86 87 88
    assert_equal 4, topics.size
    assert_equal topics(:first).title, topics.first.title
  end

  def test_finding_with_order_and_take
89
    entrants = Entrant.order("id ASC").limit(2).to_a
90

P
Pratik Naik 已提交
91 92
    assert_equal 2, entrants.size
    assert_equal entrants(:first).name, entrants.first.name
93 94 95
  end

  def test_finding_with_order_limit_and_offset
96
    entrants = Entrant.order("id ASC").limit(2).offset(1)
97

P
Pratik Naik 已提交
98 99
    assert_equal 2, entrants.size
    assert_equal entrants(:second).name, entrants.first.name
100

101
    entrants = Entrant.order("id ASC").limit(2).offset(2)
P
Pratik Naik 已提交
102 103
    assert_equal 1, entrants.size
    assert_equal entrants(:third).name, entrants.first.name
104 105 106
  end

  def test_finding_with_group
107
    developers = Developer.group("salary").select("salary").to_a
108 109 110 111 112
    assert_equal 4, developers.size
    assert_equal 4, developers.map(&:salary).uniq.size
  end

  def test_finding_with_hash_conditions_on_joined_table
113
    firms = DependentFirm.joins(:account).where({:name => 'RailsCore', :accounts => { :credit_limit => 55..60 }}).to_a
114 115 116 117 118
    assert_equal 1, firms.size
    assert_equal companies(:rails_core), firms.first
  end

  def test_find_all_with_join
119
    developers_on_project_one = Developer.joins('LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id').
120
      where('project_id=1').to_a
121 122 123 124 125 126 127 128

    assert_equal 3, developers_on_project_one.length
    developer_names = developers_on_project_one.map { |d| d.name }
    assert developer_names.include?('David')
    assert developer_names.include?('Jamis')
  end

  def test_find_on_hash_conditions
129
    assert_equal Topic.find(:all, :conditions => {:approved => false}), Topic.where({ :approved => false }).to_a
130 131 132
  end

  def test_joins_with_string_array
133
    person_with_reader_and_post = Post.joins([
134 135 136 137 138 139
        "INNER JOIN categorizations ON categorizations.post_id = posts.id",
        "INNER JOIN categories ON categories.id = categorizations.category_id AND categories.type = 'SpecialCategory'"
      ]
    ).to_a
    assert_equal 1, person_with_reader_and_post.size
  end
140

141 142
  def test_scoped_responds_to_delegated_methods
    relation = Topic.scoped
143 144

    ["map", "uniq", "sort", "insert", "delete", "update"].each do |method|
J
Jeremy Kemper 已提交
145
      assert relation.respond_to?(method), "Topic.all should respond to #{method.inspect}"
146 147
    end
  end
148 149

  def test_find_with_readonly_option
150 151
    Developer.scoped.each { |d| assert !d.readonly? }
    Developer.scoped.readonly.each { |d| assert d.readonly? }
152
  end
153 154

  def test_eager_association_loading_of_stis_with_multiple_references
155
    authors = Author.eager_load(:posts => { :special_comments => { :post => [ :special_comments, :very_special_comment ] } }).
156
      order('comments.body, very_special_comments_posts.body').where('posts.id = 4').to_a
157

158 159 160 161 162 163 164 165 166
    assert_equal [authors(:david)], authors
    assert_no_queries do
      authors.first.posts.first.special_comments.first.post.special_comments
      authors.first.posts.first.special_comments.first.post.very_special_comment
    end
  end

  def test_find_with_included_associations
    assert_queries(2) do
167
      posts = Post.preload(:comments)
168
      assert posts.first.comments.first
169
    end
170

171
    assert_queries(2) do
172
      posts = Post.preload(:comments).to_a
173
      assert posts.first.comments.first
174
    end
175

176
    assert_queries(2) do
177
      posts = Post.preload(:author)
178
      assert posts.first.author
179
    end
180

181
    assert_queries(2) do
182
      posts = Post.preload(:author).to_a
183 184 185 186 187 188 189
      assert posts.first.author
    end

    assert_queries(3) do
      posts = Post.preload(:author, :comments).to_a
      assert posts.first.author
      assert posts.first.comments.first
190 191
    end
  end
192

P
Pratik Naik 已提交
193
  def test_default_scope_with_conditions_string
194
    assert_equal Developer.find_all_by_name('David').map(&:id).sort, DeveloperCalledDavid.scoped.map(&:id).sort
195 196 197 198
    assert_equal nil, DeveloperCalledDavid.create!.name
  end

  def test_default_scope_with_conditions_hash
199
    assert_equal Developer.find_all_by_name('Jamis').map(&:id).sort, DeveloperCalledJamis.scoped.map(&:id).sort
200 201 202
    assert_equal 'Jamis', DeveloperCalledJamis.create!.name
  end

203 204 205 206 207
  def test_default_scoping_finder_methods
    developers = DeveloperCalledDavid.order('id').map(&:id).sort
    assert_equal Developer.find_all_by_name('David').map(&:id).sort, developers
  end

208 209
  def test_loading_with_one_association
    posts = Post.preload(:comments)
210 211 212 213
    post = posts.find { |p| p.id == 1 }
    assert_equal 2, post.comments.size
    assert post.comments.include?(comments(:greetings))

214
    post = Post.where("posts.title = 'Welcome to the weblog'").preload(:comments).first
215 216 217
    assert_equal 2, post.comments.size
    assert post.comments.include?(comments(:greetings))

218
    posts = Post.preload(:last_comment)
219 220 221 222 223
    post = posts.find { |p| p.id == 1 }
    assert_equal Post.find(1).last_comment, post.last_comment
  end

  def test_loading_with_one_association_with_non_preload
224
    posts = Post.eager_load(:last_comment).order('comments.id DESC')
225 226 227
    post = posts.find { |p| p.id == 1 }
    assert_equal Post.find(1).last_comment, post.last_comment
  end
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256

  def test_dynamic_find_by_attributes
    david = authors(:david)
    author = Author.preload(:taggings).find_by_id(david.id)
    expected_taggings = taggings(:welcome_general, :thinking_general)

    assert_no_queries do
      assert_equal expected_taggings, author.taggings.uniq.sort_by { |t| t.id }
    end

    authors = Author.scoped
    assert_equal david, authors.find_by_id_and_name(david.id, david.name)
    assert_equal david, authors.find_by_id_and_name!(david.id, david.name)
  end

  def test_dynamic_find_by_attributes_bang
    author = Author.scoped.find_by_id!(authors(:david).id)
    assert_equal "David", author.name

    assert_raises(ActiveRecord::RecordNotFound) { Author.scoped.find_by_id_and_name!('invalid', 'wt') }
  end

  def test_dynamic_find_all_by_attributes
    authors = Author.scoped

    davids = authors.find_all_by_name('David')
    assert_kind_of Array, davids
    assert_equal [authors(:david)], davids
  end
257 258
end