spec/gem_spec.rb in polisher-0.10.2 vs spec/gem_spec.rb in polisher-0.11.1

- old
+ new

@@ -1,207 +1,31 @@ # Polisher Gem Specs # # Licensed under the MIT license # Copyright (C) 2013-2014 Red Hat, Inc. -require 'spec_helper' - 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 = described_class.new :name => 'rails', + gem = described_class.new :spec => 'spec', + :name => 'rails', :version => '4.0.0', + :path => 'path', :deps => %w(activesupport activerecord), :dev_deps => ['rake'] + gem.spec.should == 'spec' gem.name.should == 'rails' gem.version.should == '4.0.0' + gem.path.should == 'path' 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 - 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 - 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 - 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 = 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 = 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 = 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" 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" 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 = 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 = 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 = described_class.new :path => 'gem_path' gem.gem_path.should == 'gem_path' end @@ -212,173 +36,7 @@ gem.should_receive(:downloaded_gem_path).and_return('gem_path') gem.gem_path.should == 'gem_path' end end end - - describe "#unpack" do - it "unpacks gem at gem_path into temp dir" - it "returns tmp dir" - context "block specified" do - it "invokes block with tmp dir" - it "removes tmp dir" - it "returns nil" - end - end - - describe "#file_paths" do - 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 - it "returns gem retrieved from rubygems" do - 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 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 "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 "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 = 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) - @gem1.diff(@gem2).should == @result.output - end - - it "removes unpacked gem dirs" do - @gem1.should_receive(:unpack).and_return('dir1') - @gem2.should_receive(:unpack).and_return('dir2') - AwesomeSpawn.should_receive(:run).and_return(@result) - FileUtils.should_receive(:rm_rf).with('dir1') - FileUtils.should_receive(:rm_rf).with('dir2') - # XXX for the GemCache dir cleaning: - FileUtils.should_receive(:rm_rf).at_least(:once) - @gem1.diff(@gem2) - end - - context "error during operations" do - it "removes unpacked gem dirs" do - @gem1.should_receive(:unpack).and_return('dir1') - @gem2.should_receive(:unpack).and_return('dir2') - AwesomeSpawn.should_receive(:run). - and_raise(AwesomeSpawn::CommandResultError.new('', '')) - FileUtils.should_receive(:rm_rf).with('dir1') - FileUtils.should_receive(:rm_rf).with('dir2') - FileUtils.should_receive(:rm_rf).at_least(:once) - @gem1.diff(@gem2) - end - end - end - end # describe Gem end # module Polisher