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

                                 
                                       

                        

                                     
 

                     














                                                                                
 




                                                          
    








                                                          
 






































                                                                            
                 
                                           



                           
                                           



                           
                                           



                               
                                          


                           
         

























                                                   

                        
    






                                                          
    
















                                                          


       
                                  
                                                           



                           





                                                                                   

   



                                     



                                             


                   



                                                     


                 








                                               


                 
                                    


                 
                                       




                                             
     
 





                                      







                                     


                 
                       


                                  



















                                                           


                                   


                                 


                                  
   
require 'abstract_unit'
require 'active_record/acts/tree'
require 'active_record/acts/list'
require 'active_record/acts/nested_set'
require 'fixtures/mixin'

class ListTest < Test::Unit::TestCase
  fixtures :mixins
 
  def test_reordering
    
    assert_equal [@mixins['list_1'].find, 
                  @mixins['list_2'].find, 
                  @mixins['list_3'].find, 
                  @mixins['list_4'].find], 
                  ListMixin.find_all("parent_id=5", "pos")
                  
    @mixins['list_2'].find.move_lower
                  
    assert_equal [@mixins['list_1'].find, 
                  @mixins['list_3'].find, 
                  @mixins['list_2'].find, 
                  @mixins['list_4'].find], 
                  ListMixin.find_all("parent_id=5", "pos")                      
                  
    @mixins['list_2'].find.move_higher

    assert_equal [@mixins['list_1'].find, 
                  @mixins['list_2'].find, 
                  @mixins['list_3'].find, 
                  @mixins['list_4'].find], 
                  ListMixin.find_all("parent_id=5", "pos")
    
    @mixins['list_1'].find.move_to_bottom

    assert_equal [@mixins['list_2'].find, 
                  @mixins['list_3'].find, 
                  @mixins['list_4'].find, 
                  @mixins['list_1'].find], 
                  ListMixin.find_all("parent_id=5", "pos")

    @mixins['list_1'].find.move_to_top

    assert_equal [@mixins['list_1'].find, 
                  @mixins['list_2'].find, 
                  @mixins['list_3'].find, 
                  @mixins['list_4'].find],
                  ListMixin.find_all("parent_id=5", "pos")
                  
                  
    @mixins['list_2'].find.move_to_bottom
  
    assert_equal [@mixins['list_1'].find, 
                  @mixins['list_3'].find, 
                  @mixins['list_4'].find, 
                  @mixins['list_2'].find],
                  ListMixin.find_all("parent_id=5", "pos")                  

    @mixins['list_4'].find.move_to_top

    assert_equal [@mixins['list_4'].find, 
                  @mixins['list_1'].find, 
                  @mixins['list_3'].find, 
                  @mixins['list_2'].find],
                  ListMixin.find_all("parent_id=5", "pos")                  
        
  end
  
  def test_next_prev
    assert_equal @list_2, @list_1.lower_item
    assert_nil @list_1.higher_item
    assert_equal @list_3, @list_4.higher_item
    assert_nil @list_4.lower_item
  end
  
  
  def test_injection
    item = ListMixin.new("parent_id"=>1)
    assert_equal "parent_id = 1", item.scope_condition
    assert_equal "pos", item.position_column
  end  
  
  def test_insert
    new = ListMixin.create("parent_id"=>20)
    assert_equal 1, new.pos
    assert new.first?
    assert new.last?

    new = ListMixin.create("parent_id"=>20)
    assert_equal 2, new.pos
    assert !new.first?
    assert new.last?
    
    new = ListMixin.create("parent_id"=>20)
    assert_equal 3, new.pos    
    assert !new.first?
    assert new.last?
    
    new = ListMixin.create("parent_id"=>0)
    assert_equal 1, new.pos
    assert new.first?
    assert new.last?
  end    

  def test_insert_at
    new = ListMixin.create("parent_id" => 20)
    assert_equal 1, new.pos

	 new = ListMixin.create("parent_id" => 20)
	 assert_equal 2, new.pos
	
	 new = ListMixin.create("parent_id" => 20)
	 assert_equal 3, new.pos

	 new4 = ListMixin.create("parent_id" => 20)
	 assert_equal 4, new4.pos

	 new4.insert_at(3)
	 assert_equal 3, new4.pos

	 new.reload
	 assert_equal 4, new.pos
    
    new.insert_at(2)
    assert_equal 2, new.pos

    new4.reload
    assert_equal 4, new4.pos
  end
  
  def test_delete_middle
    
    assert_equal [@mixins['list_1'].find, 
                  @mixins['list_2'].find, 
                  @mixins['list_3'].find, 
                  @mixins['list_4'].find], 
                  ListMixin.find_all("parent_id=5", "pos")
              
    @mixins['list_2'].find.destroy
    
    assert_equal [@mixins['list_1'].find, 
                  @mixins['list_3'].find, 
                  @mixins['list_4'].find], 
                  ListMixin.find_all("parent_id=5", "pos")
                  
    assert_equal 1, @mixins['list_1'].find.pos
    assert_equal 2, @mixins['list_3'].find.pos
    assert_equal 3, @mixins['list_4'].find.pos

    @mixins['list_1'].find.destroy

    assert_equal [@mixins['list_3'].find, 
                  @mixins['list_4'].find], 
                  ListMixin.find_all("parent_id=5", "pos")
                  
    assert_equal 1, @mixins['list_3'].find.pos
    assert_equal 2, @mixins['list_4'].find.pos
    
  end  

  def test_with_string_based_scope
    new = ListWithStringScopeMixin.create("parent_id"=>500)
    assert_equal 1, new.pos
    assert new.first?
    assert new.last?
  end 

  def test_nil_scope
    new1, new2, new3 = ListMixin.create, ListMixin.create, ListMixin.create
    new2.move_higher
    assert_equal [new2, new1, new3], ListMixin.find_all("parent_id IS NULL", "pos")
  end
end

class TreeTest < Test::Unit::TestCase
  fixtures :mixins
  
  def test_has_child
    assert_equal true, @tree_1.has_children?
    assert_equal true, @tree_2.has_children?
    assert_equal false, @tree_3.has_children?
    assert_equal false, @tree_4.has_children?
  end

  def test_children
    assert_equal @tree_1.children, [@tree_2, @tree_4]
    assert_equal @tree_2.children, [@tree_3]
    assert_equal @tree_3.children, []
    assert_equal @tree_4.children, []
  end

  def test_parent
    assert_equal @tree_2.parent, @tree_1
    assert_equal @tree_2.parent, @tree_4.parent
    assert_nil @tree_1.parent
  end
  
  def test_delete
    assert_equal 4, TreeMixin.count
    @tree_1.destroy
    assert_equal 0, TreeMixin.count
  end
  
  def test_insert
    @extra = @tree_1.children.create
    
    assert @extra
    
    assert_equal @extra.parent, @tree_1

    assert_equal 3, @tree_1.children.size
    assert @tree_1.children.include?(@extra)
    assert @tree_1.children.include?(@tree_2)
    assert @tree_1.children.include?(@tree_4)
  end

end

class TouchTest < Test::Unit::TestCase
  fixtures :mixins
  
  def test_update
    
    stamped = Mixin.new 
      
    assert_nil stamped.updated_at
    assert_nil stamped.created_at
    stamped.save
    assert_not_nil stamped.updated_at
    assert_not_nil stamped.created_at
  end  

  def test_create
    @obj = Mixin.create
    assert_not_nil @obj.updated_at
    assert_not_nil @obj.created_at
  end  

  def test_many_updates

    stamped = Mixin.new 

    assert_nil stamped.updated_at
    assert_nil stamped.created_at
    stamped.save
    assert_not_nil stamped.created_at
    assert_not_nil stamped.updated_at
    
    old_updated_at = stamped.updated_at

    sleep 1
    stamped.save    
    assert_not_equal stamped.created_at, stamped.updated_at
    assert_not_equal old_updated_at, stamped.updated_at

  end

  def test_create_turned_off
    Mixin.record_timestamps = false

    assert_nil @tree_1.updated_at
    @tree_1.save
    assert_nil @tree_1.updated_at

    Mixin.record_timestamps = true
  end
end