aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/file_evented_update_checker_test.rb
blob: 9d09cbca8f910d09a8aa5f03043ada9cdacaafca (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
require 'abstract_unit'
require 'pathname'
require 'file_update_checker_shared_tests'

class FileEventedUpdateCheckerTest < ActiveSupport::TestCase
  include FileUpdateCheckerSharedTests

  def new_checker(files = [], dirs = {}, &block)
    ActiveSupport::FileEventedUpdateChecker.new(files, dirs, &block).tap do
      wait
    end
  end

  def teardown
    super
    Listen.stop
  end

  def wait
    sleep 1
  end

  def touch(files)
    super
    wait # wait for the events to fire
  end

  def rm_f(files)
    super
    wait
  end
end

class FileEventedUpdateCheckerPathHelperTest < ActiveSupport::TestCase
  def pn(path)
    Pathname.new(path)
  end

  setup do
    @ph = ActiveSupport::FileEventedUpdateChecker::PathHelper.new
  end

  test '#xpath returns the expanded path as a Pathname object' do
    assert_equal pn(__FILE__).expand_path, @ph.xpath(__FILE__)
  end

  test '#normalize_extension returns a bare extension as is' do
    assert_equal 'rb', @ph.normalize_extension('rb')
  end

  test '#normalize_extension removes a leading dot' do
    assert_equal 'rb', @ph.normalize_extension('.rb')
  end

  test '#normalize_extension supports symbols' do
    assert_equal 'rb', @ph.normalize_extension(:rb)
  end

  test '#longest_common_subpath finds the longest common subpath, if there is one' do
    paths = %w(
      /foo/bar
      /foo/baz
      /foo/bar/baz/woo/zoo
    ).map { |path| pn(path) }

    assert_equal pn('/foo'), @ph.longest_common_subpath(paths)
  end

  test '#longest_common_subpath returns the root directory as an edge case' do
    paths = %w(
      /foo/bar
      /foo/baz
      /foo/bar/baz/woo/zoo
      /wadus
    ).map { |path| pn(path) }

    assert_equal pn('/'), @ph.longest_common_subpath(paths)
  end

  test '#longest_common_subpath returns nil for an empty collection' do
    assert_nil @ph.longest_common_subpath([])
  end

  test '#existing_parent returns the most specific existing ascendant' do
    wd = Pathname.getwd

    assert_equal wd, @ph.existing_parent(wd)
    assert_equal wd, @ph.existing_parent(wd.join('non-existing/directory'))
    assert_equal pn('/'), @ph.existing_parent(pn('/non-existing/directory'))
  end

  test '#filter_out_descendants returns the same collection if there are no descendants (empty)' do
    assert_equal [], @ph.filter_out_descendants([])
  end

  test '#filter_out_descendants returns the same collection if there are no descendants (one)' do
    assert_equal ['/foo'], @ph.filter_out_descendants(['/foo'])
  end

  test '#filter_out_descendants returns the same collection if there are no descendants (several)' do
    paths = %w(
      /Rails.root/app/controllers
      /Rails.root/app/models
      /Rails.root/app/helpers
    ).map { |path| pn(path) }

    assert_equal paths, @ph.filter_out_descendants(paths)
  end

  test '#filter_out_descendants filters out descendants preserving order' do
    paths = %w(
      /Rails.root/app/controllers
      /Rails.root/app/controllers/concerns
      /Rails.root/app/models
      /Rails.root/app/models/concerns
      /Rails.root/app/helpers
    ).map { |path| pn(path) }

    assert_equal paths.values_at(0, 2, 4), @ph.filter_out_descendants(paths)
  end
end