]> git.donarmstrong.com Git - dsa-puppet.git/blobdiff - 3rdparty/modules/inifile/spec/acceptance/ini_setting_spec.rb
add puppetlabs/inifile to 3rdparty
[dsa-puppet.git] / 3rdparty / modules / inifile / spec / acceptance / ini_setting_spec.rb
diff --git a/3rdparty/modules/inifile/spec/acceptance/ini_setting_spec.rb b/3rdparty/modules/inifile/spec/acceptance/ini_setting_spec.rb
new file mode 100644 (file)
index 0000000..b7e2b6a
--- /dev/null
@@ -0,0 +1,248 @@
+require 'spec_helper_acceptance'
+
+tmpdir = default.tmpdir('tmp')
+
+describe 'ini_setting resource' do
+  after :all do
+    shell("rm #{tmpdir}/*.ini", :acceptable_exit_codes => [0, 1, 2])
+  end
+
+  shared_examples 'has_content' do |path, pp, content|
+    before :all do
+      shell("rm #{path}", :acceptable_exit_codes => [0, 1, 2])
+    end
+    after :all do
+      shell("cat #{path}", :acceptable_exit_codes => [0, 1, 2])
+      shell("rm #{path}", :acceptable_exit_codes => [0, 1, 2])
+    end
+
+    it 'applies the manifest twice' do
+      apply_manifest(pp, :catch_failures => true)
+      apply_manifest(pp, :catch_changes => true)
+    end
+
+    describe file(path) do
+      it { should be_file }
+      its(:content) { should match content }
+    end
+  end
+
+  shared_examples 'has_error' do |path, pp, error|
+    before :all do
+      shell("rm #{path}", :acceptable_exit_codes => [0, 1, 2])
+    end
+    after :all do
+      shell("cat #{path}", :acceptable_exit_codes => [0, 1, 2])
+      shell("rm #{path}", :acceptable_exit_codes => [0, 1, 2])
+    end
+
+    it 'applies the manifest and gets a failure message' do
+      expect(apply_manifest(pp, :expect_failures => true).stderr).to match(error)
+    end
+
+    describe file(path) do
+      it { should_not be_file }
+    end
+  end
+
+  describe 'ensure parameter' do
+    context '=> present for global and section' do
+      pp = <<-EOS
+      ini_setting { 'ensure => present for section':
+        ensure  => present,
+        path    => "#{tmpdir}/ini_setting.ini",
+        section => 'one',
+        setting => 'two',
+        value   => 'three',
+      }
+      ini_setting { 'ensure => present for global':
+        ensure  => present,
+        path    => "#{tmpdir}/ini_setting.ini",
+        section => '',
+        setting => 'four',
+        value   => 'five',
+      }
+      EOS
+
+      it 'applies the manifest twice' do
+        apply_manifest(pp, :catch_failures => true)
+        apply_manifest(pp, :catch_changes => true)
+      end
+
+      it_behaves_like 'has_content', "#{tmpdir}/ini_setting.ini", pp, /four = five\n\n\[one\]\ntwo = three/
+    end
+
+    context '=> absent for key/value' do
+      before :all do
+        if fact('osfamily') == 'Darwin'
+          shell("echo \"four = five[one]\ntwo = three\" > #{tmpdir}/ini_setting.ini")
+        else
+          shell("echo -e \"four = five\n[one]\ntwo = three\" > #{tmpdir}/ini_setting.ini")
+        end
+      end
+
+      pp = <<-EOS
+      ini_setting { 'ensure => absent for key/value':
+        ensure  => absent,
+        path    => "#{tmpdir}/ini_setting.ini",
+        section => 'one',
+        setting => 'two',
+        value   => 'three',
+      }
+      EOS
+
+      it 'applies the manifest twice' do
+        apply_manifest(pp, :catch_failures => true)
+        apply_manifest(pp, :catch_changes => true)
+      end
+
+      describe file("#{tmpdir}/ini_setting.ini") do
+        it { should be_file }
+        its(:content) {
+          should match /four = five/
+          should match /\[one\]/
+          should_not match /two = three/
+        }
+      end
+    end
+
+    context '=> absent for global' do
+      before :all do
+        if fact('osfamily') == 'Darwin'
+          shell("echo \"four = five\n[one]\ntwo = three\" > #{tmpdir}/ini_setting.ini")
+        else
+          shell("echo -e \"four = five\n[one]\ntwo = three\" > #{tmpdir}/ini_setting.ini")
+        end
+      end
+      after :all do
+        shell("cat #{tmpdir}/ini_setting.ini", :acceptable_exit_codes => [0, 1, 2])
+        shell("rm #{tmpdir}/ini_setting.ini", :acceptable_exit_codes => [0, 1, 2])
+      end
+
+      pp = <<-EOS
+      ini_setting { 'ensure => absent for global':
+        ensure  => absent,
+        path    => "#{tmpdir}/ini_setting.ini",
+        section => '',
+        setting => 'four',
+        value   => 'five',
+      }
+      EOS
+
+      it 'applies the manifest twice' do
+        apply_manifest(pp, :catch_failures => true)
+        apply_manifest(pp, :catch_changes => true)
+      end
+
+      describe file("#{tmpdir}/ini_setting.ini") do
+        it { should be_file }
+        its(:content) {
+          should_not match /four = five/
+          should match /\[one\]/
+          should match /two = three/
+        }
+      end
+    end
+  end
+
+  describe 'section, setting, value parameters' do
+    {
+        "section => 'test', setting => 'foo', value => 'bar',"         => /\[test\]\nfoo = bar/,
+        "section => 'more', setting => 'baz', value => 'quux',"        => /\[more\]\nbaz = quux/,
+        "section => '',     setting => 'top', value => 'level',"       => /top = level/,
+        "section => 'z',    setting => 'sp aces', value => 'foo bar'," => /\[z\]\nsp aces = foo bar/,
+    }.each do |parameter_list, content|
+      context parameter_list do
+        pp = <<-EOS
+        ini_setting { "#{parameter_list}":
+          ensure  => present,
+          path    => "#{tmpdir}/ini_setting.ini",
+          #{parameter_list}
+        }
+        EOS
+
+        it_behaves_like 'has_content', "#{tmpdir}/ini_setting.ini", pp, content
+      end
+    end
+
+    {
+        "section => 'test',"                   => /setting is a required.+value is a required/,
+        "setting => 'foo',  value   => 'bar'," => /section is a required/,
+        "section => 'test', setting => 'foo'," => /value is a required/,
+        "section => 'test', value   => 'bar'," => /setting is a required/,
+        "value   => 'bar',"                    => /section is a required.+setting is a required/,
+        "setting => 'foo',"                    => /section is a required.+value is a required/,
+    }.each do |parameter_list, error|
+      context parameter_list, :pending => 'no error checking yet' do
+        pp = <<-EOS
+        ini_setting { "#{parameter_list}":
+          ensure  => present,
+          path    => "#{tmpdir}/ini_setting.ini",
+          #{parameter_list}
+        }
+        EOS
+
+        it_behaves_like 'has_error', "#{tmpdir}/ini_setting.ini", pp, error
+      end
+    end
+  end
+
+  describe 'path parameter' do
+    [
+        "#{tmpdir}/one.ini",
+        "#{tmpdir}/two.ini",
+        "#{tmpdir}/three.ini",
+    ].each do |path|
+      context "path => #{path}" do
+        pp = <<-EOS
+        ini_setting { 'path => #{path}':
+          ensure  => present,
+          section => 'one',
+          setting => 'two',
+          value   => 'three',
+          path    => '#{path}',
+        }
+        EOS
+
+        it_behaves_like 'has_content', path, pp, /\[one\]\ntwo = three/
+      end
+    end
+
+    context "path => foo" do
+      pp = <<-EOS
+        ini_setting { 'path => foo':
+          ensure     => present,
+          section    => 'one',
+          setting    => 'two',
+          value      => 'three',
+          path       => 'foo',
+        }
+      EOS
+
+      it_behaves_like 'has_error', 'foo', pp, /must be fully qualified/
+    end
+  end
+
+  describe 'key_val_separator parameter' do
+    {
+        ""                             => /two = three/,
+        "key_val_separator => '=',"    => /two=three/,
+        "key_val_separator => ' =  '," => /two =  three/,
+    }.each do |parameter, content|
+      context "with \"#{parameter}\" makes \"#{content}\"" do
+        pp = <<-EOS
+        ini_setting { "with #{parameter} makes #{content}":
+          ensure  => present,
+          section => 'one',
+          setting => 'two',
+          value   => 'three',
+          path    => "#{tmpdir}/key_val_separator.ini",
+          #{parameter}
+        }
+        EOS
+
+        it_behaves_like 'has_content', "#{tmpdir}/key_val_separator.ini", pp, content
+      end
+    end
+  end
+end