require 'spec_helper_acceptance' describe 'ini_setting resource' do after :all do shell("rm /tmp/*.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 with no stderr' do expect(apply_manifest(pp, :catch_failures => true).stderr).to eq("") expect(apply_manifest(pp, :catch_changes => true).stderr).to eq("") end describe file(path) do it { should be_file } it { should contain(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 => '/tmp/ini_setting.ini', section => 'one', setting => 'two', value => 'three', } ini_setting { 'ensure => present for global': ensure => present, path => '/tmp/ini_setting.ini', section => '', setting => 'four', value => 'five', } EOS it 'applies the manifest twice with no stderr' do expect(apply_manifest(pp, :catch_failures => true).stderr).to eq("") expect(apply_manifest(pp, :catch_changes => true).stderr).to eq("") end describe file('/tmp/ini_setting.ini') do it { should be_file } it { should contain("four = five\n[one]\ntwo = three") } end end context '=> absent for key/value' do before :all do shell('echo -e "four = five\n[one]\ntwo = three" > /tmp/ini_setting.ini') end pp = <<-EOS ini_setting { 'ensure => absent for key/value': ensure => absent, path => '/tmp/ini_setting.ini', section => 'one', setting => 'two', value => 'three', } EOS it 'applies the manifest twice with no stderr' do expect(apply_manifest(pp, :catch_failures => true).stderr).to eq("") expect(apply_manifest(pp, :catch_changes => true).stderr).to eq("") end describe file('/tmp/ini_setting.ini') do it { should be_file } it { should contain('four = five') } it { should contain('[one]') } it { should_not contain('two = three') } end end context '=> absent for section', :pending => "cannot ensure absent on a section" do before :all do shell('echo -e "four = five\n[one]\ntwo = three" > /tmp/ini_setting.ini') end after :all do shell("cat /tmp/ini_setting.ini", :acceptable_exit_codes => [0,1,2]) shell("rm /tmp/ini_setting.ini", :acceptable_exit_codes => [0,1,2]) end pp = <<-EOS ini_setting { 'ensure => absent for section': ensure => absent, path => '/tmp/ini_setting.ini', section => 'one', } EOS it 'applies the manifest twice with no stderr' do expect(apply_manifest(pp, :catch_failures => true).stderr).to eq("") expect(apply_manifest(pp, :catch_changes => true).stderr).to eq("") end describe file('/tmp/ini_setting.ini') do it { should be_file } it { should contain('four = five') } it { should_not contain('[one]') } it { should_not contain('two = three') } end end context '=> absent for global' do before :all do shell('echo -e "four = five\n[one]\ntwo = three" > /tmp/ini_setting.ini') end after :all do shell("cat /tmp/ini_setting.ini", :acceptable_exit_codes => [0,1,2]) shell("rm /tmp/ini_setting.ini", :acceptable_exit_codes => [0,1,2]) end pp = <<-EOS ini_setting { 'ensure => absent for global': ensure => absent, path => '/tmp/ini_setting.ini', section => '', setting => 'four', value => 'five', } EOS it 'applies the manifest twice with no stderr' do expect(apply_manifest(pp, :catch_failures => true).stderr).to eq("") expect(apply_manifest(pp, :catch_changes => true).stderr).to eq("") end describe file('/tmp/ini_setting.ini') do it { should be_file } it { should_not contain('four = five') } it { should contain('[one]') } it { should contain('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", }.each do |parameter_list, content| context parameter_list do pp = <<-EOS ini_setting { "#{parameter_list}": ensure => present, path => '/tmp/ini_setting.ini', #{parameter_list} } EOS it_behaves_like 'has_content', '/tmp/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 => '/tmp/ini_setting.ini', #{parameter_list} } EOS it_behaves_like 'has_error', '/tmp/ini_setting.ini', pp, error end end end describe 'path parameter' do [ "/tmp/one.ini", "/tmp/two.ini", "/tmp/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 => '/tmp/key_val_separator.ini', #{parameter} } EOS it_behaves_like 'has_content', '/tmp/key_val_separator.ini', pp, content end end { "key_val_separator => ''," => /must contain exactly one/, "key_val_separator => ','," => /must contain exactly one/, "key_val_separator => ' '," => /must contain exactly one/, "key_val_separator => ' == '," => /must contain exactly one/, }.each do |parameter, error| context "with \"#{parameter}\" raises \"#{error}\"" do pp = <<-EOS ini_setting { "with #{parameter} raises #{error}": ensure => present, section => 'one', setting => 'two', value => 'three', path => '/tmp/key_val_separator.ini', #{parameter} } EOS it_behaves_like 'has_error', '/tmp/key_val_separator.ini', pp, error end end end end