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