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