summaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
authorRichard Crowley <r@rcrowley.org>2011-03-01 20:44:11 +0000
committerMatt Robinson <matt@puppetlabs.com>2011-03-22 15:35:18 -0700
commitaf42367dce6ab1ad18a1a8d10e4d54b5accae449 (patch)
tree4afe00813f6d3f5239e0ff2736f9872860e27caa /spec
parente80063468e404a6827ea6ec458ae34ca84619eed (diff)
downloadpuppet-af42367dce6ab1ad18a1a8d10e4d54b5accae449.tar.gz
puppet-af42367dce6ab1ad18a1a8d10e4d54b5accae449.tar.xz
puppet-af42367dce6ab1ad18a1a8d10e4d54b5accae449.zip
(#6527) Added pip package provider.
Python's pip package manager is analogous to RubyGems and should be included in Puppet. Reviewed-by: Matt Robinson <matt@puppetlabs.com>
Diffstat (limited to 'spec')
-rw-r--r--spec/unit/provider/package/pip_spec.rb190
1 files changed, 190 insertions, 0 deletions
diff --git a/spec/unit/provider/package/pip_spec.rb b/spec/unit/provider/package/pip_spec.rb
new file mode 100644
index 000000000..ad8201aa0
--- /dev/null
+++ b/spec/unit/provider/package/pip_spec.rb
@@ -0,0 +1,190 @@
+#!/usr/bin/env ruby
+
+require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
+
+provider_class = Puppet::Type.type(:package).provider(:pip)
+
+describe provider_class do
+
+ before do
+ @resource = stub("resource")
+ @provider = provider_class.new
+ @provider.instance_variable_set(:@resource, @resource)
+ end
+
+ describe "parse" do
+
+ it "should return a hash on valid input" do
+ provider_class.parse("Django==1.2.5").should == {
+ :ensure => "1.2.5",
+ :name => "Django",
+ :provider => :pip,
+ }
+ end
+
+ it "should return nil on invalid input" do
+ provider_class.parse("foo").should == nil
+ end
+
+ end
+
+ describe "instances" do
+
+ it "should return an array when pip is present" do
+ provider_class.expects(:command).with(:pip).returns("/fake/bin/pip")
+ p = stub("process")
+ p.expects(:collect).yields("Django==1.2.5")
+ provider_class.expects(:execpipe).with("/fake/bin/pip freeze").yields(p)
+ provider_class.instances
+ end
+
+ it "should return an empty array when pip is missing" do
+ provider_class.expects(:command).with(:pip).raises(
+ Puppet::DevError.new("Pretend pip isn't installed."))
+ provider_class.instances.should == []
+ end
+
+ end
+
+ describe "query" do
+
+ before do
+ @resource.stubs(:[]).with(:name).returns("Django")
+ end
+
+ it "should return a hash when pip and the package are present" do
+ @provider.expects(:command).with(:pip).returns("/fake/bin/pip")
+ p = stub("process")
+ p.expects(:each).yields("Django==1.2.5")
+ @provider.expects(:execpipe).with("/fake/bin/pip freeze").yields(p)
+ @provider.query.should == {
+ :ensure => "1.2.5",
+ :name => "Django",
+ :provider => :pip,
+ }
+ end
+
+ it "should return nil when pip is missing" do
+ @provider.expects(:command).with(:pip).raises(
+ Puppet::DevError.new("Pretend pip isn't installed."))
+ @provider.query.should == nil
+ end
+
+ it "should return nil when the package is missing" do
+ @provider.expects(:command).with(:pip).returns("/fake/bin/pip")
+ p = stub("process")
+ p.expects(:each).yields("sdsfdssdhdfyjymdgfcjdfjxdrssf==0.0.0")
+ @provider.expects(:execpipe).with("/fake/bin/pip freeze").yields(p)
+ @provider.query.should == nil
+ end
+
+ end
+
+ describe "latest" do
+
+ it "should find a version number for Django" do
+ @resource.stubs(:[]).with(:name).returns "Django"
+ @provider.latest.should_not == nil
+ end
+
+ it "should not find a version number for sdsfdssdhdfyjymdgfcjdfjxdrssf" do
+ @resource.stubs(:[]).with(:name).returns "sdsfdssdhdfyjymdgfcjdfjxdrssf"
+ @provider.latest.should == nil
+ end
+
+ end
+
+ describe "install" do
+
+ before do
+ @resource.stubs(:[]).with(:name).returns("sdsfdssdhdfyjymdgfcjdfjxdrssf")
+ @url = "git+https://example.com/sdsfdssdhdfyjymdgfcjdfjxdrssf.git"
+ end
+
+ it "should install" do
+ @resource.stubs(:[]).with(:ensure).returns(:installed)
+ @resource.stubs(:[]).with(:source).returns(nil)
+ @provider.expects(:lazy_pip).with do |*args|
+ "install" == args[0] && "sdsfdssdhdfyjymdgfcjdfjxdrssf" == args[-1]
+ end.returns nil
+ @provider.install
+ end
+
+ it "should install from SCM" do
+ @resource.stubs(:[]).with(:ensure).returns(:installed)
+ @resource.stubs(:[]).with(:source).returns(@url)
+ @provider.expects(:lazy_pip).with do |*args|
+ "#{@url}#egg=sdsfdssdhdfyjymdgfcjdfjxdrssf" == args[-1]
+ end.returns nil
+ @provider.install
+ end
+
+ it "should install a particular revision" do
+ @resource.stubs(:[]).with(:ensure).returns("0123456")
+ @resource.stubs(:[]).with(:source).returns(@url)
+ @provider.expects(:lazy_pip).with do |*args|
+ "#{@url}@0123456#egg=sdsfdssdhdfyjymdgfcjdfjxdrssf" == args[-1]
+ end.returns nil
+ @provider.install
+ end
+
+ it "should install a particular version" do
+ @resource.stubs(:[]).with(:ensure).returns("0.0.0")
+ @resource.stubs(:[]).with(:source).returns(nil)
+ @provider.expects(:lazy_pip).with do |*args|
+ "sdsfdssdhdfyjymdgfcjdfjxdrssf==0.0.0" == args[-1]
+ end.returns nil
+ @provider.install
+ end
+
+ it "should upgrade" do
+ @resource.stubs(:[]).with(:ensure).returns(:latest)
+ @resource.stubs(:[]).with(:source).returns(nil)
+ @provider.expects(:lazy_pip).with do |*args|
+ "--upgrade" == args[-2] && "sdsfdssdhdfyjymdgfcjdfjxdrssf" == args[-1]
+ end.returns nil
+ @provider.install
+ end
+
+ end
+
+ describe "uninstall" do
+
+ it "should uninstall" do
+ @resource.stubs(:[]).with(:name).returns("sdsfdssdhdfyjymdgfcjdfjxdrssf")
+ @provider.expects(:lazy_pip).returns(nil)
+ @provider.uninstall
+ end
+
+ end
+
+ describe "update" do
+
+ it "should just call install" do
+ @provider.expects(:install).returns(nil)
+ @provider.update
+ end
+
+ end
+
+ describe "lazy_pip" do
+
+ it "should succeed if pip is present" do
+ @provider.stubs(:pip).returns(nil)
+ @provider.method(:lazy_pip).call "freeze"
+ end
+
+ it "should retry if pip has not yet been found" do
+ @provider.stubs(:pip).raises(NoMethodError).returns("/fake/bin/pip")
+ @provider.method(:lazy_pip).call "freeze"
+ end
+
+ it "should fail if pip is missing" do
+ @provider.stubs(:pip).twice.raises(NoMethodError)
+ expect { @provider.method(:lazy_pip).call("freeze") }.to \
+ raise_error(NoMethodError)
+ end
+
+ end
+
+end