#!/usr/bin/env rspec
require 'spec_helper'
provider_class = Puppet::Type.type(:a2mod).provider(:gentoo)
describe provider_class do
before :each do
provider_class.clear
end
[:conf_file, :instances, :modules, :initvars, :conf_file, :clear].each do |method|
it "should respond to the class method #{method}" do
provider_class.should respond_to(method)
end
end
describe "when fetching modules" do
before do
@filetype = mock()
end
it "should return a sorted array of the defined parameters" do
@filetype.expects(:read).returns(%Q{APACHE2_OPTS="-D FOO -D BAR -D BAZ"\n})
provider_class.expects(:filetype).returns(@filetype)
provider_class.modules.should == %w{bar baz foo}
end
it "should cache the module list" do
@filetype.expects(:read).once.returns(%Q{APACHE2_OPTS="-D FOO -D BAR -D BAZ"\n})
provider_class.expects(:filetype).once.returns(@filetype)
2.times { provider_class.modules.should == %w{bar baz foo} }
end
it "should normalize parameters" do
@filetype.expects(:read).returns(%Q{APACHE2_OPTS="-D FOO -D BAR -D BAR"\n})
provider_class.expects(:filetype).returns(@filetype)
provider_class.modules.should == %w{bar foo}
end
end
describe "when prefetching" do
it "should match providers to resources" do
provider = mock("ssl_provider", :name => "ssl")
resource = mock("ssl_resource")
resource.expects(:provider=).with(provider)
provider_class.expects(:instances).returns([provider])
provider_class.prefetch("ssl" => resource)
end
end
describe "when flushing" do
before :each do
@filetype = mock()
@filetype.stubs(:backup)
provider_class.expects(:filetype).at_least_once.returns(@filetype)
@info = mock()
@info.stubs(:[]).with(:name).returns("info")
@info.stubs(:provider=)
@mpm = mock()
@mpm.stubs(:[]).with(:name).returns("mpm")
@mpm.stubs(:provider=)
@ssl = mock()
@ssl.stubs(:[]).with(:name).returns("ssl")
@ssl.stubs(:provider=)
end
it "should add modules whose ensure is present" do
@filetype.expects(:read).at_least_once.returns(%Q{APACHE2_OPTS=""})
@filetype.expects(:write).with(%Q{APACHE2_OPTS="-D INFO"})
@info.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("info" => @info)
provider_class.flush
end
it "should remove modules whose ensure is present" do
@filetype.expects(:read).at_least_once.returns(%Q{APACHE2_OPTS="-D INFO"})
@filetype.expects(:write).with(%Q{APACHE2_OPTS=""})
@info.stubs(:should).with(:ensure).returns(:absent)
@info.stubs(:provider=)
provider_class.prefetch("info" => @info)
provider_class.flush
end
it "should not modify providers without resources" do
@filetype.expects(:read).at_least_once.returns(%Q{APACHE2_OPTS="-D INFO -D MPM"})
@filetype.expects(:write).with(%Q{APACHE2_OPTS="-D MPM -D SSL"})
@info.stubs(:should).with(:ensure).returns(:absent)
provider_class.prefetch("info" => @info)
@ssl.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("ssl" => @ssl)
provider_class.flush
end
it "should write the modules in sorted order" do
@filetype.expects(:read).at_least_once.returns(%Q{APACHE2_OPTS=""})
@filetype.expects(:write).with(%Q{APACHE2_OPTS="-D INFO -D MPM -D SSL"})
@mpm.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("mpm" => @mpm)
@info.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("info" => @info)
@ssl.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("ssl" => @ssl)
provider_class.flush
end
it "should write the records back once" do
@filetype.expects(:read).at_least_once.returns(%Q{APACHE2_OPTS=""})
@filetype.expects(:write).once.with(%Q{APACHE2_OPTS="-D INFO -D SSL"})
@info.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("info" => @info)
@ssl.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("ssl" => @ssl)
provider_class.flush
end
it "should only modify the line containing APACHE2_OPTS" do
@filetype.expects(:read).at_least_once.returns(%Q{# Comment\nAPACHE2_OPTS=""\n# Another comment})
@filetype.expects(:write).once.with(%Q{# Comment\nAPACHE2_OPTS="-D INFO"\n# Another comment})
@info.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("info" => @info)
provider_class.flush
end
it "should restore any arbitrary arguments" do
@filetype.expects(:read).at_least_once.returns(%Q{APACHE2_OPTS="-Y -D MPM -X"})
@filetype.expects(:write).once.with(%Q{APACHE2_OPTS="-Y -X -D INFO -D MPM"})
@info.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("info" => @info)
provider_class.flush
end
it "should backup the file once if changes were made" do
@filetype.expects(:read).at_least_once.returns(%Q{APACHE2_OPTS=""})
@filetype.expects(:write).once.with(%Q{APACHE2_OPTS="-D INFO -D SSL"})
@info.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("info" => @info)
@ssl.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("ssl" => @ssl)
@filetype.unstub(:backup)
@filetype.expects(:backup)
provider_class.flush
end
it "should not write the file or run backups if no changes were made" do
@filetype.expects(:read).at_least_once.returns(%Q{APACHE2_OPTS="-X -D INFO -D SSL -Y"})
@filetype.expects(:write).never
@info.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("info" => @info)
@ssl.stubs(:should).with(:ensure).returns(:present)
provider_class.prefetch("ssl" => @ssl)
@filetype.unstub(:backup)
@filetype.expects(:backup).never
provider_class.flush
end
end
end