aboutsummaryrefslogblamecommitdiffstats
path: root/activesupport/test/file_update_checker_with_enumerable_test_cases.rb
blob: 4885a14f81707d2ea7fbe1628e435b48f96e21b3 (plain) (tree)
1
2
3
4
5
6
7
8
9

                   
                                               

                   
           
                                        

                                                                 
                           


              
                            



                                                             
 
                                    
 
                                      




                                                             
 
                                            

                                      




                                                        
 
                                            
 
                 
 



                                     
                                                                    

         

                                            
 
                
 
                           

     
                                      
         
 
                                            
 
                
 





                                                                    
 

                                                                                      
                                     
 
                                            
 
                        
 





                                                    
 
                                            

                            
                 
 




                            
                                                           
         
 
                                                        
 
                 
 



                                     
                                                                       
         
 
                                                         
 
                 
 


                                      







                                                       

















                                                        













                                                                                     





                                                                       




                                     



                                     
   
require 'fileutils'

module FileUpdateCheckerWithEnumerableTestCases
  include FileUtils

  def setup
    @tmpdir = Dir.mktmpdir(nil, __dir__)

    @files = %w(foo.rb bar.rb baz.rb).map {|f| "#{@tmpdir}/#{f}"}
    FileUtils.touch(@files)
  end

  def teardown
    FileUtils.rm_rf(@tmpdir)
  end

  def test_should_not_execute_the_block_if_no_paths_are_given
    i = 0

    checker = new_checker { i += 1 }

    assert !checker.execute_if_updated
    assert_equal 0, i
  end

  def test_should_not_invoke_the_block_if_no_file_has_changed
    i = 0

    checker = new_checker(@files) { i += 1 }

    assert !checker.execute_if_updated
    assert_equal 0, i
  end

  def test_should_invoke_the_block_if_a_file_has_changed
    i = 0

    checker = new_checker(@files) { i += 1 }

    touch(@files)

    assert checker.execute_if_updated
    assert_equal 1, i
  end

  def test_updated_should_become_true_when_watched_files_are_deleted
    i = 0

    checker = new_checker(@files) { i += 1 }
    assert !checker.updated?

    rm_f(@files)

    assert checker.updated?
  end

  def test_should_detect_deleted_files
    i = 0

    checker = new_checker(@files) { i += 1 }

    rm_f(@files)

    assert checker.execute_if_updated
    assert_equal 1, i
  end

  def test_should_be_robust_to_handle_files_with_wrong_modified_time
    i = 0

    now = Time.now
    time = Time.mktime(now.year + 1, now.month, now.day) # wrong mtime from the future
    File.utime(time, time, @files[0])

    checker = new_checker(@files) { i += 1 }

    touch(@files[1..-1])

    assert checker.execute_if_updated
    assert_equal 1, i
  end

  def test_should_cache_updated_result_until_execute
    i = 0

    checker = new_checker(@files) { i += 1 }
    assert !checker.updated?

    touch(@files)

    assert checker.updated?
    checker.execute
    assert !checker.updated?
  end

  def test_should_invoke_the_block_if_a_watched_dir_changes
    i = 0

    checker = new_checker([], @tmpdir => :rb) { i += 1 }

    touch(@files)

    assert checker.execute_if_updated
    assert_equal 1, i
  end

  def test_should_not_invoke_the_block_if_a_watched_dir_does_not_change
    i = 0

    checker = new_checker([], @tmpdir => :txt) { i += 1 }

    touch(@files)

    assert !checker.execute_if_updated
    assert_equal 0, i
  end

  def test_does_not_assume_files_exist_on_instantiation
    i = 0

    non_existing = "#{@tmpdir}/non_existing.rb"
    checker = new_checker([non_existing]) { i += 1 }

    touch(non_existing)

    assert checker.execute_if_updated
    assert_equal 1, i
  end

  def test_detects_files_in_new_subdirectories
    i = 0

    checker = new_checker([], @tmpdir => :rb) { i += 1 }

    subdir = "#{@tmpdir}/subdir"
    mkdir(subdir)
    wait

    assert !checker.execute_if_updated
    assert_equal 0, i

    touch("#{subdir}/nested.rb")

    assert checker.execute_if_updated
    assert_equal 1, i
  end

  def test_looked_up_extensions_are_inherited_in_subdirectories_not_listening_to_them
    i = 0

    subdir = "#{@tmpdir}/subdir"
    mkdir(subdir)

    checker = new_checker([], @tmpdir => :rb, subdir => :txt) { i += 1 }

    touch("#{@tmpdir}/new.txt")

    assert !checker.execute_if_updated
    assert_equal 0, i

    # subdir does not look for Ruby files, but its parent @tmpdir does.
    touch("#{subdir}/nested.rb")

    assert checker.execute_if_updated
    assert_equal 1, i

    touch("#{subdir}/nested.txt")

    assert checker.execute_if_updated
    assert_equal 2, i
  end
end