spec/gem_spec.rb in polisher-0.9.1 vs spec/gem_spec.rb in polisher-0.10.1
- old
+ new
@@ -7,110 +7,210 @@
require 'polisher/gem'
module Polisher
describe Gem do
+ describe "#file_name" do
+ it "returns name-version.gem" do
+ expected = 'rails-4.0.0.gem'
+ Polisher::Gem.new(:name => 'rails', :version => '4.0.0')
+ .file_name.should == expected
+ end
+ end
+
describe "#initialize" do
it "sets gem attributes" do
- gem = Polisher::Gem.new :name => 'rails',
- :version => '4.0.0',
- :deps => ['activesupport', 'activerecord'],
- :dev_deps => ['rake']
+ gem = described_class.new :name => 'rails',
+ :version => '4.0.0',
+ :deps => %w(activesupport activerecord),
+ :dev_deps => ['rake']
gem.name.should == 'rails'
gem.version.should == '4.0.0'
gem.deps.should == ['activesupport', 'activerecord']
gem.dev_deps.should == ['rake']
end
end
describe "#ignorable_file?" do
context "args matches an ignorable file" do
it "returns true" do
- Polisher::Gem.ignorable_file?('foo.gemspec').should be_true
- Polisher::Gem.ignorable_file?('Gemfile').should be_true
+ described_class.ignorable_file?('foo.gemspec').should be_true
+ described_class.ignorable_file?('Gemfile').should be_true
end
end
context "args does not match an ignorable file" do
it "returns false" do
- Polisher::Gem.ignorable_file?('.rvmra').should be_false
- Polisher::Gem.ignorable_file?('foo.gemspoc').should be_false
+ described_class.ignorable_file?('.rvmra').should be_false
+ described_class.ignorable_file?('foo.gemspoc').should be_false
end
end
end
+ describe "#doc_file?" do
+ context "file is on doc file list" do
+ it "returns true" do
+ described_class.doc_file?('CHANGELOG').should be_true
+ end
+ end
+
+ context "file is not on doc file list" do
+ it "returns false" do
+ described_class.doc_file?('foobar.rb').should be_false
+ end
+ end
+ end
+
describe "#local_versions_for" do
- it "returns versions of specified gem in local db"
- it "invokes cb with versions retrieved"
+ before(:each) do
+ # XXX clear the cached version of the gem specification db
+ described_class.instance_variable_set(:@local_db, nil)
+
+ gem1 = ::Gem::Specification.new 'rake', '1.0'
+ gem2 = ::Gem::Specification.new 'rake', '2.0'
+ gem3 = ::Gem::Specification.new 'rails', '3.0'
+ ::Gem::Specification.should_receive(:all).and_return([gem1, gem2, gem3])
+
+ @version1 = ::Gem::Version.new '1.0'
+ @version2 = ::Gem::Version.new '2.0'
+ end
+
+ it "returns versions of specified gem in local db" do
+ described_class.local_versions_for('rake').should == [@version1, @version2]
+ end
+
+ it "invokes cb with versions retrieved" do
+ cb = proc {}
+ cb.should_receive(:call).with(:local_gem, 'rake', [@version1, @version2])
+ described_class.local_versions_for('rake', &cb)
+ end
end
describe "#parse" do
it "returns new gem" do
- gem = Polisher::Gem.parse
- gem.should be_an_instance_of(Polisher::Gem)
+ gem = described_class.parse
+ gem.should be_an_instance_of(described_class)
end
it "parses gem from gem spec" do
spec = Polisher::Test::GEM_SPEC
- gem = Polisher::Gem.parse(:gemspec => spec[:path])
+ gem = described_class.parse(:gemspec => spec[:path])
gem.name.should == spec[:name]
gem.version.should == spec[:version]
gem.deps.should == spec[:deps]
gem.dev_deps.should == spec[:dev_deps]
end
it "parses gem from gem at path"
it "parses gem from metadata hash" do
gemj = Polisher::Test::GEM_JSON
- gem = Polisher::Gem.parse gemj[:json]
+ gem = described_class.parse gemj[:json]
gem.name.should == gemj[:name]
gem.version.should == gemj[:version]
gem.deps.should == gemj[:deps]
gem.dev_deps.should == gemj[:dev_deps]
end
end
+ describe "#remote_versions_for" do
+ it "retrieves versions from rubygems.org" do
+ curl = Curl::Easy.new
+ described_class.should_receive(:client)
+ .at_least(:once).and_return(curl)
+ curl.should_receive(:http_get)
+ # actual output too verbose, just including bits we need
+ curl.should_receive(:body_str)
+ .and_return([{'number' => 1.1}, {'number' => 2.2}].to_json)
+ described_class.remote_versions_for('polisher').should == [1.1, 2.2]
+ curl.url.should == "https://rubygems.org/api/v1/versions/polisher.json"
+ end
+ end
+
+ describe "#lastest_version_of" do
+ it "retrieves latests version of gem available on rubygems.org" do
+ described_class.should_receive(:remote_versions_for)
+ .with('polisher')
+ .and_return([2.2, 1.1])
+ described_class.latest_version_of('polisher').should == 2.2
+ end
+ end
+
describe "#download_gem" do
context "gem in GemCache" do
- it "returns GemCache gem"
+ it "returns GemCache gem" do
+ gem = described_class.new
+ GemCache.should_receive(:get).with('polisher', '1.1')
+ .and_return(gem)
+ described_class.download_gem('polisher', '1.1').should == gem
+ end
end
- it "uses curl to download gem"
- it "sets gem in gem cached"
- it "returns downloaded gem binary contents"
+ it "uses curl to download gem" do
+ GemCache.should_receive(:get).and_return(nil)
+ curl = Curl::Easy.new
+ described_class.should_receive(:client)
+ .at_least(:once).and_return(curl)
+ curl.should_receive(:http_get)
+ curl.should_receive(:body_str).and_return('') # stub out body_str
+
+ described_class.download_gem 'polisher', '2.2'
+ curl.url.should == "https://rubygems.org/gems/polisher-2.2.gem"
+ end
+
+ it "sets gem in gem cache" do
+ GemCache.should_receive(:get).and_return(nil)
+ curl = Curl::Easy.new
+ described_class.should_receive(:client)
+ .at_least(:once).and_return(curl)
+ curl.stub(:http_get) # stub out http_get
+ curl.should_receive(:body_str).and_return('gem')
+ GemCache.should_receive(:set)
+ .with('polisher', '1.1', 'gem')
+ described_class.download_gem 'polisher', '1.1'
+ end
+
+ it "returns downloaded gem binary contents" do
+ GemCache.should_receive(:get).and_return(nil)
+ curl = Curl::Easy.new
+ described_class.should_receive(:client)
+ .at_least(:once).and_return(curl)
+ curl.stub(:http_get) # stub out http_get
+ curl.should_receive(:body_str).and_return('gem')
+ described_class.download_gem('polisher', '1.1').should == 'gem'
+ end
end
describe "#download_gem_path" do
it "downloads gem" do
- gem = Polisher::Gem.new
- Polisher::Gem.should_receive(:download_gem)
+ gem = described_class.new
+ described_class.should_receive(:download_gem)
gem.downloaded_gem_path
end
it "returns gem cache path for gem" do
# stub out d/l
- gem = Polisher::Gem.new :name => 'rails', :version => '1.0'
- Polisher::Gem.should_receive(:download_gem)
- Polisher::GemCache.should_receive(:path_for).
- with('rails', '1.0').
- at_least(:once).
- and_return('rails_path')
+ gem = described_class.new :name => 'rails', :version => '1.0'
+ described_class.should_receive(:download_gem)
+ Polisher::GemCache.should_receive(:path_for)
+ .with('rails', '1.0')
+ .at_least(:once)
+ .and_return('rails_path')
gem.downloaded_gem_path.should == 'rails_path'
end
end
describe "#gem_path" do
it "returns specified path" do
- gem = Polisher::Gem.new :path => 'gem_path'
+ gem = described_class.new :path => 'gem_path'
gem.gem_path.should == 'gem_path'
end
context "specified path is null" do
it "returns downloaded gem path" do
- gem = Polisher::Gem.new
+ gem = described_class.new
gem.should_receive(:downloaded_gem_path).and_return('gem_path')
gem.gem_path.should == 'gem_path'
end
end
end
@@ -124,52 +224,135 @@
it "returns nil"
end
end
describe "#file_paths" do
- it "returns list of file paths in gem"
+ it "returns list of file paths in gem" do
+ gem = described_class.new
+ gem.should_receive(:each_file).and_yield('file1').and_yield('file2')
+ gem.file_paths.should == %w(file1 file2)
+ end
end
describe "#retrieve" do
- before(:each) do
- @local_gem = Polisher::Test::LOCAL_GEM
- end
-
it "returns gem retrieved from rubygems" do
- gem = Polisher::Gem.retrieve(@local_gem[:name])
- gem.should be_an_instance_of(Polisher::Gem)
- gem.name.should == @local_gem[:name]
- gem.version.should == @local_gem[:version]
- gem.deps.should == @local_gem[:deps]
- gem.dev_deps.should == @local_gem[:dev_deps]
+ curl = Curl::Easy.new
+ curl.should_receive(:body_str).and_return('spec')
+
+ url = "https://rubygems.org/api/v1/gems/rails.json"
+ Curl::Easy.should_receive(:http_get).with(url).and_return(curl)
+
+ gem = described_class.new
+ described_class.should_receive(:parse).with('spec').and_return(gem)
+
+ described_class.retrieve('rails').should == gem
end
end
describe "#versions" do
- it "looks up and returns versions for gemname in polisher version checker"
+ it "looks up and returns versions of gem" do
+ gem = described_class.new :name => 'rails'
+ Polisher::VersionChecker.should_receive(:versions_for)
+ .with('rails')
+ .and_return(:koji => ['1.1.1'])
+ gem.versions.should == {'rails' => {:koji => ['1.1.1']}}
+ end
context "recursive is true" do
- it "appends versions of gem dependencies to versions list"
+ it "retrieves dependency versions" do
+ # stub out version checker
+ retrieved = {:koji => ['1.0']}
+ Polisher::VersionChecker.should_receive(:versions_for)
+ .and_return(retrieved)
+
+ versions = {}
+ gem = described_class.new :name => 'rails'
+ gem.should_receive(:dependency_versions)
+ .with(:recursive => true, :versions => {'rails' => retrieved})
+ .and_call_original
+ gem.versions(:recursive => true, :versions => versions)
+ .should == {'rails' => {:koji => ['1.0']}}
+ end
+
context "dev_deps is true" do
- it "appends versions of gem dev dependencies to versions list"
+ it "retrieves dev dependency versions" do
+ # stub out version checker
+ retrieved = {:koji => ['1.0']}
+ Polisher::VersionChecker.should_receive(:versions_for)
+ .and_return(retrieved)
+
+ versions = {}
+ gem = described_class.new :name => 'rails'
+ gem.should_receive(:dependency_versions)
+ .with(:recursive => true, :dev_deps => true,
+ :versions => {'rails' => retrieved})
+ .and_call_original
+ gem.should_receive(:dependency_versions)
+ .with(:recursive => true, :dev => true, :dev_deps => true,
+ :versions => {'rails' => retrieved})
+ .and_call_original
+ gem.versions(:recursive => true, :dev_deps => true,
+ :versions => versions)
+ .should == {'rails' => {:koji => ['1.0']}}
+ end
end
end
end
+ describe "#dependency_versions" do
+ it "retrieves dependency versions" do
+ gem = described_class.new
+ gem.should_receive(:deps).and_return([::Gem::Dependency.new('rake')])
+ described_class.should_receive(:retrieve)
+ .with('rake').and_return(gem)
+
+ versions = {'rake' => {:koji => ['2.1']}}
+ gem.should_receive(:versions).and_return(versions)
+ gem.dependency_versions.should == versions
+ end
+
+ it "retrieves dev dependency versions" do
+ gem = described_class.new
+ gem.should_receive(:dev_deps).and_return([::Gem::Dependency.new('rake')])
+ described_class.should_receive(:retrieve)
+ .with('rake').and_return(gem)
+
+ versions = {'rake' => {:koji => ['2.1']}}
+ gem.should_receive(:versions).and_return(versions)
+ gem.dependency_versions(:dev => true).should == versions
+ end
+
+ context "error during gem or version retrieval" do
+ it "sets version to 'unknown'" do
+ gem = described_class.new
+ gem.should_receive(:deps).and_return([::Gem::Dependency.new('rake')])
+ described_class.should_receive(:retrieve)
+ .with('rake').and_raise(RuntimeError)
+
+ versions = {:all => [:unknown]}
+ gem.should_not_receive(:versions)
+ Polisher::VersionChecker.should_receive(:unknown_version)
+ .with(:all, 'rake')
+ .and_return(versions)
+ gem.dependency_versions.should == {'rake' => versions}
+ end
+ end
+ end
+
describe "#diff" do
before(:each) do
- @gem1 = Polisher::Gem.new
- @gem2 = Polisher::Gem.new
+ @gem1 = described_class.new
+ @gem2 = described_class.new
@result = AwesomeSpawn::CommandResult.new '', 'diff_out', '', 0
end
it "runs diff against unpacked local and other gems and returns output" do
@gem1.should_receive(:unpack).and_return('dir1')
@gem2.should_receive(:unpack).and_return('dir2')
- AwesomeSpawn.should_receive(:run).
- with("#{Polisher::Gem::DIFF_CMD} -r dir1 dir2").
- and_return(@result)
+ AwesomeSpawn.should_receive(:run)
+ .with("#{Polisher::Gem.diff_cmd} -r dir1 dir2")
+ .and_return(@result)
@gem1.diff(@gem2).should == @result.output
end
it "removes unpacked gem dirs" do
@gem1.should_receive(:unpack).and_return('dir1')