--- /dev/null
+#!/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
+ expect(provider_class).to 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)
+
+ expect(provider_class.modules).to eq(%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 { expect(provider_class.modules).to eq(%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)
+
+ expect(provider_class.modules).to eq(%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