1require 'rubygems/test_case'
2require 'rubygems/commands/specification_command'
3
4class TestGemCommandsSpecificationCommand < Gem::TestCase
5
6  def setup
7    super
8
9    @cmd = Gem::Commands::SpecificationCommand.new
10  end
11
12  def test_execute
13    foo = quick_spec 'foo'
14
15    install_specs foo
16
17    @cmd.options[:args] = %w[foo]
18
19    use_ui @ui do
20      @cmd.execute
21    end
22
23    assert_match %r|Gem::Specification|, @ui.output
24    assert_match %r|name: foo|, @ui.output
25    assert_equal '', @ui.error
26  end
27
28  def test_execute_all
29    quick_spec 'foo', '0.0.1'
30    quick_spec 'foo', '0.0.2'
31
32    @cmd.options[:args] = %w[foo]
33    @cmd.options[:all] = true
34
35    use_ui @ui do
36      @cmd.execute
37    end
38
39    assert_match %r|Gem::Specification|, @ui.output
40    assert_match %r|name: foo|, @ui.output
41    assert_match %r|version: 0.0.1|, @ui.output
42    assert_match %r|version: 0.0.2|, @ui.output
43    assert_equal '', @ui.error
44  end
45
46  def test_execute_all_conflicts_with_version
47    quick_spec 'foo', '0.0.1'
48    quick_spec 'foo', '0.0.2'
49
50    @cmd.options[:args] = %w[foo]
51    @cmd.options[:all] = true
52    @cmd.options[:version] = "1"
53
54    assert_raises Gem::MockGemUi::TermError do
55      use_ui @ui do
56        @cmd.execute
57      end
58    end
59
60    assert_equal '', @ui.output
61    assert_equal "ERROR:  Specify --all or -v, not both\n", @ui.error
62  end
63
64  def test_execute_bad_name
65    @cmd.options[:args] = %w[foo]
66
67    assert_raises Gem::MockGemUi::TermError do
68      use_ui @ui do
69        @cmd.execute
70      end
71    end
72
73    assert_equal '', @ui.output
74    assert_equal "ERROR:  No gem matching 'foo (>= 0)' found\n", @ui.error
75  end
76
77  def test_execute_bad_name_with_version
78    @cmd.options[:args] = %w[foo]
79    @cmd.options[:version] = "1.3.2"
80
81    assert_raises Gem::MockGemUi::TermError do
82      use_ui @ui do
83        @cmd.execute
84      end
85    end
86
87    assert_equal '', @ui.output
88    assert_equal "ERROR:  No gem matching 'foo (= 1.3.2)' found\n", @ui.error
89  end
90
91  def test_execute_exact_match
92    quick_spec 'foo'
93    quick_spec 'foo_bar'
94
95    @cmd.options[:args] = %w[foo]
96
97    use_ui @ui do
98      @cmd.execute
99    end
100
101    assert_match %r|Gem::Specification|, @ui.output
102    assert_match %r|name: foo|, @ui.output
103    assert_equal '', @ui.error
104  end
105
106  def test_execute_field
107    foo = new_spec 'foo', '2'
108
109    install_specs foo
110
111    @cmd.options[:args] = %w[foo name]
112
113    use_ui @ui do
114      @cmd.execute
115    end
116
117    assert_equal "foo", YAML.load(@ui.output)
118  end
119
120  def test_execute_file
121    foo = quick_spec 'foo' do |s|
122      s.files = %w[lib/code.rb]
123    end
124
125    util_build_gem foo
126
127    @cmd.options[:args] = [foo.cache_file]
128
129    use_ui @ui do
130      @cmd.execute
131    end
132
133    assert_match %r|Gem::Specification|, @ui.output
134    assert_match %r|name: foo|, @ui.output
135    assert_equal '', @ui.error
136  end
137
138  def test_execute_marshal
139    foo = new_spec 'foo', '2'
140
141    install_specs foo
142
143    @cmd.options[:args] = %w[foo]
144    @cmd.options[:format] = :marshal
145
146    use_ui @ui do
147      @cmd.execute
148    end
149
150    assert_equal foo, Marshal.load(@ui.output)
151    assert_equal '', @ui.error
152  end
153
154  def test_execute_remote
155    foo = quick_gem 'foo'
156
157    @fetcher = Gem::FakeFetcher.new
158    Gem::RemoteFetcher.fetcher = @fetcher
159
160    util_setup_spec_fetcher foo
161
162    FileUtils.rm File.join(@gemhome, 'specifications', foo.spec_name)
163
164    @cmd.options[:args] = %w[foo]
165    @cmd.options[:domain] = :remote
166
167    use_ui @ui do
168      @cmd.execute
169    end
170
171    assert_match %r|\A--- !ruby/object:Gem::Specification|, @ui.output
172    assert_match %r|name: foo|, @ui.output
173  end
174
175  def test_execute_remote_with_version
176    foo1 = quick_gem 'foo', "1"
177    foo2 = quick_gem 'foo', "2"
178
179    @fetcher = Gem::FakeFetcher.new
180    Gem::RemoteFetcher.fetcher = @fetcher
181
182    util_setup_spec_fetcher foo1, foo2
183
184    FileUtils.rm File.join(@gemhome, 'specifications', foo1.spec_name)
185    FileUtils.rm File.join(@gemhome, 'specifications', foo2.spec_name)
186
187    @cmd.options[:args] = %w[foo]
188    @cmd.options[:version] = "1"
189    @cmd.options[:domain] = :remote
190
191    use_ui @ui do
192      @cmd.execute
193    end
194
195    spec = Gem::Specification.from_yaml @ui.output
196
197    assert_equal Gem::Version.new("1"), spec.version
198  end
199
200  def test_execute_remote_without_prerelease
201    foo = new_spec 'foo', '2.0.0'
202    foo_pre = new_spec 'foo', '2.0.1.pre'
203
204    install_specs foo, foo_pre
205
206    @fetcher = Gem::FakeFetcher.new
207    Gem::RemoteFetcher.fetcher = @fetcher
208
209    util_setup_spec_fetcher foo
210    util_setup_spec_fetcher foo_pre
211
212    @cmd.options[:args] = %w[foo]
213    @cmd.options[:domain] = :remote
214
215    use_ui @ui do
216      @cmd.execute
217    end
218
219    assert_match %r|\A--- !ruby/object:Gem::Specification|, @ui.output
220    assert_match %r|name: foo|, @ui.output
221
222    spec = YAML.load @ui.output
223
224    assert_equal Gem::Version.new("2.0.0"), spec.version
225  end
226
227  def test_execute_remote_with_prerelease
228    foo = new_spec 'foo', '2.0.0'
229    foo_pre = new_spec 'foo', '2.0.1.pre'
230
231    install_specs foo, foo_pre
232
233    @fetcher = Gem::FakeFetcher.new
234    Gem::RemoteFetcher.fetcher = @fetcher
235
236    util_setup_spec_fetcher foo
237    util_setup_spec_fetcher foo_pre
238
239    @cmd.options[:args] = %w[foo]
240    @cmd.options[:domain] = :remote
241    @cmd.options[:prerelease] = true
242
243    use_ui @ui do
244      @cmd.execute
245    end
246
247    assert_match %r|\A--- !ruby/object:Gem::Specification|, @ui.output
248    assert_match %r|name: foo|, @ui.output
249
250    spec = YAML.load @ui.output
251
252    assert_equal Gem::Version.new("2.0.1.pre"), spec.version
253  end
254
255  def test_execute_ruby
256    foo = quick_spec 'foo'
257
258    install_specs foo
259
260    @cmd.options[:args] = %w[foo]
261    @cmd.options[:format] = :ruby
262
263    use_ui @ui do
264      @cmd.execute
265    end
266
267    assert_match %r|Gem::Specification.new|, @ui.output
268    assert_match %r|s.name = "foo"|, @ui.output
269    assert_equal '', @ui.error
270  end
271
272end
273
274