aboutsummaryrefslogblamecommitdiffstats
path: root/activerecord/test/conditions_scoping_test.rb
blob: cf8b670c2606b4a7a3988cfc7af1ac5f987c4e88 (plain) (tree)
1
2
3
4
5
6
7
8






                                                  
                                         


                                                           
                                                                                         

















                                                                               












                                                               
 










                                                                                                  







                                                                     



























                                                                      
                                                 














                                                                                
 














































                                                                                                  
    
require 'abstract_unit'
require 'fixtures/developer'
require 'fixtures/comment'
require 'fixtures/post'
require 'fixtures/category'

class ConditionsScopingTest < Test::Unit::TestCase
  fixtures :developers, :comments, :posts
  
  def test_set_conditions
    Developer.constrain(:conditions => 'just a test...') do
      assert_equal 'just a test...', Thread.current[:constraints][Developer][:conditions]
    end
  end

  def test_scoped_find
    Developer.constrain(:conditions => "name = 'David'") do
      assert_nothing_raised { Developer.find(1) }
    end
  end
  
  def test_scoped_find_first
    Developer.constrain(:conditions => "salary = 100000") do
      assert_equal Developer.find(10), Developer.find(:first, :order => 'name')
    end
  end
  
  def test_scoped_find_all
    Developer.constrain(:conditions => "name = 'David'") do
      assert_equal [Developer.find(1)], Developer.find(:all)
    end      
  end
  
  def test_scoped_count
    Developer.constrain(:conditions => "name = 'David'") do
      assert_equal 1, Developer.count
    end        

    Developer.constrain(:conditions => 'salary = 100000') do
      assert_equal 8, Developer.count
      assert_equal 1, Developer.count("name LIKE 'fixture_1%'")
    end        
  end

  def test_scoped_create
    new_comment = nil

    VerySpecialComment.constrain(:creation => { :post_id => 1 }) do
      assert_equal({ :post_id => 1 }, Thread.current[:constraints][VerySpecialComment][:creation])
      new_comment = VerySpecialComment.create :body => "Wonderful world"
    end
    
    assert Post.find(1).comments.include?(new_comment)
  end

  def test_immutable_constraint
    options = { :conditions => "name = 'David'" }
    Developer.constrain(options) do
      assert_equal %w(David), Developer.find(:all).map { |d| d.name }
      options[:conditions] = "name != 'David'"
      assert_equal %w(David), Developer.find(:all).map { |d| d.name }
    end
  end
end

class HasManyScopingTest< Test::Unit::TestCase
  fixtures :comments, :posts
  
  def setup
    @welcome = Post.find(1)
  end
  
  def test_forwarding_of_static_methods
    assert_equal 'a comment...', Comment.what_are_you
    assert_equal 'a comment...', @welcome.comments.what_are_you
  end

  def test_forwarding_to_scoped
    assert_equal 4, Comment.search_by_type('Comment').size
    assert_equal 2, @welcome.comments.search_by_type('Comment').size
  end
  
  def test_forwarding_to_dynamic_finders
    assert_equal 4, Comment.find_all_by_type('Comment').size
    assert_equal 2, @welcome.comments.find_all_by_type('Comment').size
  end
  
end


class HasAndBelongsToManyScopingTest< Test::Unit::TestCase
  fixtures :posts, :categories, :categories_posts

  def setup
    @welcome = Post.find(1)
  end

  def test_forwarding_of_static_methods
    assert_equal 'a category...', Category.what_are_you
    assert_equal 'a category...', @welcome.categories.what_are_you
  end

  def test_forwarding_to_dynamic_finders
    assert_equal 1, Category.find_all_by_type('SpecialCategory').size
    assert_equal 0, @welcome.categories.find_all_by_type('SpecialCategory').size
    assert_equal 2, @welcome.categories.find_all_by_type('Category').size
  end

end


=begin
# We disabled the scoping for has_one and belongs_to as we can't think of a proper use case


class BelongsToScopingTest< Test::Unit::TestCase
  fixtures :comments, :posts

  def setup
    @greetings = Comment.find(1)
  end

  def test_forwarding_of_static_method
    assert_equal 'a post...', Post.what_are_you
    assert_equal 'a post...', @greetings.post.what_are_you
  end

  def test_forwarding_to_dynamic_finders
    assert_equal 4, Post.find_all_by_type('Post').size
    assert_equal 1, @greetings.post.find_all_by_type('Post').size
  end

end


class HasOneScopingTest< Test::Unit::TestCase
  fixtures :comments, :posts

  def setup
    @sti_comments = Post.find(4)
  end

  def test_forwarding_of_static_methods
    assert_equal 'a comment...', Comment.what_are_you
    assert_equal 'a very special comment...', @sti_comments.very_special_comment.what_are_you
  end

  def test_forwarding_to_dynamic_finders
    assert_equal 1, Comment.find_all_by_type('VerySpecialComment').size
    assert_equal 1, @sti_comments.very_special_comment.find_all_by_type('VerySpecialComment').size
    assert_equal 0, @sti_comments.very_special_comment.find_all_by_type('Comment').size
  end

end

=end