1require 'rubygems/test_case' 2require 'rubygems/commands/sources_command' 3 4class TestGemCommandsSourcesCommand < Gem::TestCase 5 6 def setup 7 super 8 9 util_setup_fake_fetcher 10 11 @cmd = Gem::Commands::SourcesCommand.new 12 13 @new_repo = "http://beta-gems.example.com" 14 end 15 16 def test_initialize_proxy 17 assert @cmd.handles?(['--http-proxy', 'http://proxy.example.com']) 18 end 19 20 def test_execute 21 util_setup_spec_fetcher 22 @cmd.handle_options [] 23 24 use_ui @ui do 25 @cmd.execute 26 end 27 28 expected = <<-EOF 29*** CURRENT SOURCES *** 30 31#{@gem_repo} 32 EOF 33 34 assert_equal expected, @ui.output 35 assert_equal '', @ui.error 36 end 37 38 def test_execute_add 39 util_setup_fake_fetcher 40 41 install_specs @a1 42 43 specs = Gem::Specification.map { |spec| 44 [spec.name, spec.version, spec.original_platform] 45 } 46 47 specs_dump_gz = StringIO.new 48 Zlib::GzipWriter.wrap specs_dump_gz do |io| 49 Marshal.dump specs, io 50 end 51 52 @fetcher.data["#{@new_repo}/specs.#{@marshal_version}.gz"] = 53 specs_dump_gz.string 54 55 @cmd.handle_options %W[--add #{@new_repo}] 56 57 util_setup_spec_fetcher 58 59 use_ui @ui do 60 @cmd.execute 61 end 62 63 assert_equal [@gem_repo, @new_repo], Gem.sources 64 65 expected = <<-EOF 66#{@new_repo} added to sources 67 EOF 68 69 assert_equal expected, @ui.output 70 assert_equal '', @ui.error 71 end 72 73 def test_execute_add_nonexistent_source 74 util_setup_fake_fetcher 75 76 uri = "http://beta-gems.example.com/specs.#{@marshal_version}.gz" 77 @fetcher.data[uri] = proc do 78 raise Gem::RemoteFetcher::FetchError.new('it died', uri) 79 end 80 81 Gem::RemoteFetcher.fetcher = @fetcher 82 83 @cmd.handle_options %w[--add http://beta-gems.example.com] 84 85 util_setup_spec_fetcher 86 87 use_ui @ui do 88 assert_raises Gem::MockGemUi::TermError do 89 @cmd.execute 90 end 91 end 92 93 expected = <<-EOF 94Error fetching http://beta-gems.example.com: 95\tit died (#{uri}) 96 EOF 97 98 assert_equal expected, @ui.output 99 assert_equal '', @ui.error 100 end 101 102 def test_execute_add_redundant_source 103 @cmd.handle_options %W[--add #{@gem_repo}] 104 105 util_setup_spec_fetcher 106 107 use_ui @ui do 108 @cmd.execute 109 end 110 111 assert_equal [@gem_repo], Gem.sources 112 113 expected = <<-EOF 114source #{@gem_repo} already present in the cache 115 EOF 116 117 assert_equal expected, @ui.output 118 assert_equal '', @ui.error 119 end 120 121 def test_execute_add_http_rubygems_org 122 http_rubygems_org = 'http://rubygems.org' 123 util_setup_fake_fetcher 124 125 install_specs @a1 126 127 specs = Gem::Specification.map { |spec| 128 [spec.name, spec.version, spec.original_platform] 129 } 130 131 specs_dump_gz = StringIO.new 132 Zlib::GzipWriter.wrap specs_dump_gz do |io| 133 Marshal.dump specs, io 134 end 135 136 @fetcher.data["#{http_rubygems_org}/specs.#{@marshal_version}.gz"] = 137 specs_dump_gz.string 138 139 @cmd.handle_options %W[--add #{http_rubygems_org}] 140 141 util_setup_spec_fetcher 142 143 ui = Gem::MockGemUi.new "n" 144 145 use_ui ui do 146 assert_raises Gem::MockGemUi::TermError do 147 @cmd.execute 148 end 149 end 150 151 assert_equal [@gem_repo], Gem.sources 152 153 expected = <<-EXPECTED 154 EXPECTED 155 156 assert_equal expected, @ui.output 157 assert_empty @ui.error 158 end 159 160 def test_execute_add_bad_uri 161 @cmd.handle_options %w[--add beta-gems.example.com] 162 163 util_setup_spec_fetcher 164 165 use_ui @ui do 166 assert_raises Gem::MockGemUi::TermError do 167 @cmd.execute 168 end 169 end 170 171 assert_equal [@gem_repo], Gem.sources 172 173 expected = <<-EOF 174beta-gems.example.com is not a URI 175 EOF 176 177 assert_equal expected, @ui.output 178 assert_equal '', @ui.error 179 end 180 181 def test_execute_clear_all 182 @cmd.handle_options %w[--clear-all] 183 184 util_setup_spec_fetcher 185 186 use_ui @ui do 187 @cmd.execute 188 end 189 190 expected = <<-EOF 191*** Removed specs cache *** 192 EOF 193 194 assert_equal expected, @ui.output 195 assert_equal '', @ui.error 196 197 dir = File.join Gem.user_home, '.gem', 'specs' 198 refute File.exist?(dir), 'cache dir removed' 199 end 200 201 def test_execute_remove 202 @cmd.handle_options %W[--remove #{@gem_repo}] 203 204 util_setup_spec_fetcher 205 206 use_ui @ui do 207 @cmd.execute 208 end 209 210 expected = "#{@gem_repo} removed from sources\n" 211 212 assert_equal expected, @ui.output 213 assert_equal '', @ui.error 214 end 215 216 def test_execute_remove_no_network 217 @cmd.handle_options %W[--remove #{@gem_repo}] 218 219 util_setup_fake_fetcher 220 221 @fetcher.data["#{@gem_repo}Marshal.#{Gem.marshal_version}"] = proc do 222 raise Gem::RemoteFetcher::FetchError 223 end 224 225 use_ui @ui do 226 @cmd.execute 227 end 228 229 expected = "#{@gem_repo} removed from sources\n" 230 231 assert_equal expected, @ui.output 232 assert_equal '', @ui.error 233 end 234 235 def test_execute_update 236 @cmd.handle_options %w[--update] 237 238 util_setup_fake_fetcher 239 util_setup_spec_fetcher @a1 240 241 specs = Gem::Specification.map { |spec| 242 [spec.name, spec.version, spec.original_platform] 243 } 244 245 @fetcher.data["#{@gem_repo}specs.#{Gem.marshal_version}.gz"] = 246 util_gzip Marshal.dump(specs) 247 248 latest_specs = Gem::Specification.latest_specs.map { |spec| 249 [spec.name, spec.version, spec.original_platform] 250 } 251 252 @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = 253 util_gzip Marshal.dump(latest_specs) 254 255 use_ui @ui do 256 @cmd.execute 257 end 258 259 assert_equal "source cache successfully updated\n", @ui.output 260 assert_equal '', @ui.error 261 end 262 263end 264 265