aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/file_evented_update_checker_test.rb
blob: ec3a7e28f31118c3be266cba4e35d54f837b5fb8 (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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
require 'abstract_unit'
require 'pathname'
require 'file_update_checker_shared_tests'

class FileEventedUpdateCheckerTest < ActiveSupport::TestCase
  include FileUpdateCheckerSharedTests

  def setup
    skip if ENV['LISTEN'] == '0'
    super
  end

  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

  test '#filter_out_descendants works on path units' do
    paths = %w(
      /foo/bar
      /foo/barrrr
    ).map { |path| pn(path) }

    assert_equal paths, @ph.filter_out_descendants(paths)
  end

  test '#filter_out_descendants deals correctly with the root directory' do
    paths = %w(
      /
      /foo
      /foo/bar
    ).map { |path| pn(path) }

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

  test '#filter_out_descendants preserves duplicates' do
    paths = %w(
      /foo
      /foo/bar
      /foo
    ).map { |path| pn(path) }

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