Merge pull request #52339 from Shopify/fix-file-update-shared-tests

Simplify FileUpdateCheckerSharedTests
This commit is contained in:
Jean Boussier 2024-07-25 18:46:24 +02:00 committed by GitHub
commit bfd3cfdbfc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 175 additions and 179 deletions

View File

@ -3,277 +3,273 @@
require "fileutils" require "fileutils"
module FileUpdateCheckerSharedTests module FileUpdateCheckerSharedTests
def self.included(kls) extend ActiveSupport::Testing::Declarative
kls.class_eval do
extend ActiveSupport::Testing::Declarative
def tmpdir def tmpdir
@tmpdir @tmpdir
end end
def tmpfile(name) def tmpfile(name)
File.join(tmpdir, name) File.join(tmpdir, name)
end end
def tmpfiles def tmpfiles
@tmpfiles ||= %w(foo.rb bar.rb baz.rb).map { |f| tmpfile(f) } @tmpfiles ||= %w(foo.rb bar.rb baz.rb).map { |f| tmpfile(f) }
end end
def run(*args) def run(*args)
capture_exceptions do capture_exceptions do
Dir.mktmpdir(nil, __dir__) { |dir| @tmpdir = dir; super } Dir.mktmpdir(nil, __dir__) { |dir| @tmpdir = dir; super }
end end
end end
test "should not execute the block if no paths are given" do test "should not execute the block if no paths are given" do
silence_warnings { require "listen" } silence_warnings { require "listen" }
i = 0 i = 0
checker = new_checker { i += 1 } checker = new_checker { i += 1 }
assert_not checker.execute_if_updated assert_not checker.execute_if_updated
assert_equal 0, i assert_equal 0, i
end end
test "should not execute the block if no files change" do test "should not execute the block if no files change" do
i = 0 i = 0
FileUtils.touch(tmpfiles) FileUtils.touch(tmpfiles)
checker = new_checker(tmpfiles) { i += 1 } checker = new_checker(tmpfiles) { i += 1 }
assert_not checker.execute_if_updated assert_not checker.execute_if_updated
assert_equal 0, i assert_equal 0, i
end end
test "should execute the block once when files are created" do test "should execute the block once when files are created" do
i = 0 i = 0
checker = new_checker(tmpfiles) { i += 1 } checker = new_checker(tmpfiles) { i += 1 }
touch(tmpfiles) touch(tmpfiles)
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 1, i assert_equal 1, i
end end
test "should execute the block once when files are modified" do test "should execute the block once when files are modified" do
i = 0 i = 0
FileUtils.touch(tmpfiles) FileUtils.touch(tmpfiles)
checker = new_checker(tmpfiles) { i += 1 } checker = new_checker(tmpfiles) { i += 1 }
touch(tmpfiles) touch(tmpfiles)
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 1, i assert_equal 1, i
end end
test "should execute the block once when files are deleted" do test "should execute the block once when files are deleted" do
i = 0 i = 0
FileUtils.touch(tmpfiles) FileUtils.touch(tmpfiles)
checker = new_checker(tmpfiles) { i += 1 } checker = new_checker(tmpfiles) { i += 1 }
rm_f(tmpfiles) rm_f(tmpfiles)
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 1, i assert_equal 1, i
end end
test "updated should become true when watched files are created" do test "updated should become true when watched files are created" do
i = 0 i = 0
checker = new_checker(tmpfiles) { i += 1 } checker = new_checker(tmpfiles) { i += 1 }
assert_not_predicate checker, :updated? assert_not_predicate checker, :updated?
touch(tmpfiles) touch(tmpfiles)
assert_predicate checker, :updated? assert_predicate checker, :updated?
end end
test "updated should become true when watched files are modified" do test "updated should become true when watched files are modified" do
i = 0 i = 0
FileUtils.touch(tmpfiles) FileUtils.touch(tmpfiles)
checker = new_checker(tmpfiles) { i += 1 } checker = new_checker(tmpfiles) { i += 1 }
assert_not_predicate checker, :updated? assert_not_predicate checker, :updated?
touch(tmpfiles) touch(tmpfiles)
assert_predicate checker, :updated? assert_predicate checker, :updated?
end end
test "updated should become true when watched files are deleted" do test "updated should become true when watched files are deleted" do
i = 0 i = 0
FileUtils.touch(tmpfiles) FileUtils.touch(tmpfiles)
checker = new_checker(tmpfiles) { i += 1 } checker = new_checker(tmpfiles) { i += 1 }
assert_not_predicate checker, :updated? assert_not_predicate checker, :updated?
rm_f(tmpfiles) rm_f(tmpfiles)
assert_predicate checker, :updated? assert_predicate checker, :updated?
end end
test "should be robust to handle files with wrong modified time" do test "should be robust to handle files with wrong modified time" do
i = 0 i = 0
FileUtils.touch(tmpfiles) FileUtils.touch(tmpfiles)
now = Time.now now = Time.now
time = Time.mktime(now.year + 1, now.month, now.day) # wrong mtime from the future time = Time.mktime(now.year + 1, now.month, now.day) # wrong mtime from the future
File.utime(time, time, tmpfiles[0]) File.utime(time, time, tmpfiles[0])
checker = new_checker(tmpfiles) { i += 1 } checker = new_checker(tmpfiles) { i += 1 }
touch(tmpfiles[1..-1]) touch(tmpfiles[1..-1])
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 1, i assert_equal 1, i
end end
test "should return max_time for files with mtime = Time.at(0)" do test "should return max_time for files with mtime = Time.at(0)" do
i = 0 i = 0
FileUtils.touch(tmpfiles) FileUtils.touch(tmpfiles)
time = Time.at(0) # wrong mtime from the future time = Time.at(0) # wrong mtime from the future
File.utime(time, time, tmpfiles[0]) File.utime(time, time, tmpfiles[0])
checker = new_checker(tmpfiles) { i += 1 } checker = new_checker(tmpfiles) { i += 1 }
touch(tmpfiles[1..-1]) touch(tmpfiles[1..-1])
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 1, i assert_equal 1, i
end end
test "should cache updated result until execute" do test "should cache updated result until execute" do
i = 0 i = 0
checker = new_checker(tmpfiles) { i += 1 } checker = new_checker(tmpfiles) { i += 1 }
assert_not_predicate checker, :updated? assert_not_predicate checker, :updated?
touch(tmpfiles) touch(tmpfiles)
assert_predicate checker, :updated? assert_predicate checker, :updated?
checker.execute checker.execute
assert_not_predicate checker, :updated? assert_not_predicate checker, :updated?
end end
test "should execute the block if files change in a watched directory one extension" do test "should execute the block if files change in a watched directory one extension" do
i = 0 i = 0
checker = new_checker([], tmpdir => :rb) { i += 1 } checker = new_checker([], tmpdir => :rb) { i += 1 }
touch(tmpfile("foo.rb")) touch(tmpfile("foo.rb"))
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 1, i assert_equal 1, i
end end
test "should execute the block if files change in a watched directory any extensions" do test "should execute the block if files change in a watched directory any extensions" do
i = 0 i = 0
checker = new_checker([], tmpdir => []) { i += 1 } checker = new_checker([], tmpdir => []) { i += 1 }
touch(tmpfile("foo.rb")) touch(tmpfile("foo.rb"))
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 1, i assert_equal 1, i
end end
test "should execute the block if files change in a watched directory several extensions" do test "should execute the block if files change in a watched directory several extensions" do
i = 0 i = 0
checker = new_checker([], tmpdir => [:rb, :txt]) { i += 1 } checker = new_checker([], tmpdir => [:rb, :txt]) { i += 1 }
touch(tmpfile("foo.rb")) touch(tmpfile("foo.rb"))
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 1, i assert_equal 1, i
touch(tmpfile("foo.txt")) touch(tmpfile("foo.txt"))
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 2, i assert_equal 2, i
end end
test "should not execute the block if the file extension is not watched" do test "should not execute the block if the file extension is not watched" do
i = 0 i = 0
checker = new_checker([], tmpdir => :txt) { i += 1 } checker = new_checker([], tmpdir => :txt) { i += 1 }
touch(tmpfile("foo.rb")) touch(tmpfile("foo.rb"))
assert_not checker.execute_if_updated assert_not checker.execute_if_updated
assert_equal 0, i assert_equal 0, i
end end
test "does not assume files exist on instantiation" do test "does not assume files exist on instantiation" do
i = 0 i = 0
non_existing = tmpfile("non_existing.rb") non_existing = tmpfile("non_existing.rb")
checker = new_checker([non_existing]) { i += 1 } checker = new_checker([non_existing]) { i += 1 }
touch(non_existing) touch(non_existing)
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 1, i assert_equal 1, i
end end
test "detects files in new subdirectories" do test "detects files in new subdirectories" do
i = 0 i = 0
checker = new_checker([], tmpdir => :rb) { i += 1 } checker = new_checker([], tmpdir => :rb) { i += 1 }
subdir = tmpfile("subdir") subdir = tmpfile("subdir")
mkdir(subdir) mkdir(subdir)
assert_not checker.execute_if_updated assert_not checker.execute_if_updated
assert_equal 0, i assert_equal 0, i
touch(File.join(subdir, "nested.rb")) touch(File.join(subdir, "nested.rb"))
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 1, i assert_equal 1, i
end end
test "looked up extensions are inherited in subdirectories not listening to them" do test "looked up extensions are inherited in subdirectories not listening to them" do
i = 0 i = 0
subdir = tmpfile("subdir") subdir = tmpfile("subdir")
FileUtils.mkdir(subdir) FileUtils.mkdir(subdir)
checker = new_checker([], tmpdir => :rb, subdir => :txt) { i += 1 } checker = new_checker([], tmpdir => :rb, subdir => :txt) { i += 1 }
touch(tmpfile("new.txt")) touch(tmpfile("new.txt"))
assert_not checker.execute_if_updated assert_not checker.execute_if_updated
assert_equal 0, i assert_equal 0, i
# subdir does not look for Ruby files, but its parent tmpdir does. # subdir does not look for Ruby files, but its parent tmpdir does.
touch(File.join(subdir, "nested.rb")) touch(File.join(subdir, "nested.rb"))
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 1, i assert_equal 1, i
touch(File.join(subdir, "nested.txt")) touch(File.join(subdir, "nested.txt"))
assert checker.execute_if_updated assert checker.execute_if_updated
assert_equal 2, i assert_equal 2, i
end end
test "initialize raises an ArgumentError if no block given" do test "initialize raises an ArgumentError if no block given" do
assert_raise ArgumentError do assert_raise ArgumentError do
new_checker([]) new_checker([])
end
end
end end
end end

View File

@ -11,7 +11,7 @@ class FileUpdateCheckerTest < ActiveSupport::TestCase
end end
def touch(files) def touch(files)
sleep 1 # let's wait a bit to ensure there's a new mtime sleep 0.1 # let's wait a bit to ensure there's a new mtime
super super
end end
end end