1require 'rubygems/installer_test_case'
2require 'rubygems/commands/uninstall_command'
3
4class TestGemCommandsUninstallCommand < Gem::InstallerTestCase
5
6  def setup
7    super
8
9    build_rake_in do
10      use_ui @ui do
11        @installer.install
12      end
13    end
14
15    @cmd = Gem::Commands::UninstallCommand.new
16    @executable = File.join(@gemhome, 'bin', 'executable')
17  end
18
19  def test_execute_dependency_order
20    c = quick_gem 'c' do |spec|
21      spec.add_dependency 'a'
22    end
23
24    util_build_gem c
25    installer = util_installer c, @gemhome
26    use_ui @ui do installer.install end
27
28    ui = Gem::MockGemUi.new
29
30    @cmd.options[:args] = %w[a c]
31    @cmd.options[:executables] = true
32
33    use_ui ui do
34      @cmd.execute
35    end
36
37    output = ui.output.split "\n"
38
39    assert_equal 'Successfully uninstalled c-2', output.shift
40    assert_equal "Removing executable",          output.shift
41    assert_equal 'Successfully uninstalled a-2', output.shift
42  end
43
44  def test_execute_removes_executable
45    ui = Gem::MockGemUi.new
46    util_setup_gem ui
47
48    build_rake_in do
49      use_ui ui do
50        @installer.install
51      end
52    end
53
54    if win_platform? then
55      assert File.exist?(@executable)
56    else
57      assert File.symlink?(@executable)
58    end
59
60    # Evil hack to prevent false removal success
61    FileUtils.rm_f @executable
62
63    open @executable, "wb+" do |f| f.puts "binary" end
64
65    @cmd.options[:executables] = true
66    @cmd.options[:args] = [@spec.name]
67    use_ui @ui do
68      @cmd.execute
69    end
70
71    output = @ui.output.split "\n"
72    assert_match(/Removing executable/, output.shift)
73    assert_match(/Successfully uninstalled/, output.shift)
74    assert_equal false, File.exist?(@executable)
75    assert_nil output.shift, "UI output should have contained only two lines"
76  end
77
78  def test_execute_removes_formatted_executable
79    FileUtils.rm_f @executable # Wish this didn't happen in #setup
80
81    Gem::Installer.exec_format = 'foo-%s-bar'
82
83    @installer.format_executable = true
84    @installer.install
85
86    formatted_executable = File.join @gemhome, 'bin', 'foo-executable-bar'
87    assert_equal true, File.exist?(formatted_executable)
88
89    @cmd.options[:executables] = true
90    @cmd.options[:format_executable] = true
91    @cmd.execute
92
93    assert_equal false, File.exist?(formatted_executable)
94  rescue
95    Gem::Installer.exec_format = nil
96  end
97
98  def test_execute_prerelease
99    @spec = quick_spec "pre", "2.b"
100    @gem = File.join @tempdir, @spec.file_name
101    FileUtils.touch @gem
102
103    util_setup_gem
104
105    build_rake_in do
106      use_ui @ui do
107        @installer.install
108      end
109    end
110
111    @cmd.options[:executables] = true
112    @cmd.options[:args] = ["pre"]
113
114    use_ui @ui do
115      @cmd.execute
116    end
117
118    output = @ui.output
119    assert_match(/Successfully uninstalled/, output)
120  end
121
122  def test_execute_with_force_leaves_executable
123    ui = Gem::MockGemUi.new
124
125    util_make_gems
126    util_setup_gem ui
127
128    @cmd.options[:version] = '1'
129    @cmd.options[:force] = true
130    @cmd.options[:args] = ['a']
131
132    use_ui ui do
133      @cmd.execute
134    end
135
136    assert !Gem::Specification.all_names.include?('a')
137    assert File.exist? File.join(@gemhome, 'bin', 'executable')
138  end
139
140  def test_execute_with_force_uninstalls_all_versions
141    ui = Gem::MockGemUi.new "y\n"
142
143    util_make_gems
144    util_setup_gem ui
145
146    assert Gem::Specification.find_all_by_name('a').length > 1
147
148    @cmd.options[:force] = true
149    @cmd.options[:args] = ['a']
150
151    use_ui ui do
152      @cmd.execute
153    end
154
155    refute_includes Gem::Specification.all_names, 'a'
156  end
157
158  def test_execute_with_force_ignores_dependencies
159    ui = Gem::MockGemUi.new
160
161    util_make_gems
162    util_setup_gem ui
163
164    assert Gem::Specification.find_all_by_name('dep_x').length > 0
165    assert Gem::Specification.find_all_by_name('x').length > 0
166
167    @cmd.options[:force] = true
168    @cmd.options[:args] = ['x']
169
170    use_ui ui do
171      @cmd.execute
172    end
173
174    assert Gem::Specification.find_all_by_name('dep_x').length > 0
175    assert Gem::Specification.find_all_by_name('x').length == 0
176  end
177
178end
179
180