upgrade to concat 2.0.0
[mirror/dsa-puppet.git] / 3rdparty / modules / concat / spec / acceptance / replace_spec.rb
diff --git a/3rdparty/modules/concat/spec/acceptance/replace_spec.rb b/3rdparty/modules/concat/spec/acceptance/replace_spec.rb
new file mode 100644 (file)
index 0000000..68d7383
--- /dev/null
@@ -0,0 +1,261 @@
+require 'spec_helper_acceptance'
+
+describe 'replacement of' do
+  basedir = default.tmpdir('concat')
+  context 'file' do
+    context 'should not succeed' do
+      before(:all) do
+        pp = <<-EOS
+          file { '#{basedir}':
+            ensure => directory,
+          }
+          file { '#{basedir}/file':
+            content => "file exists\n"
+          }
+        EOS
+        apply_manifest(pp)
+      end
+      pp = <<-EOS
+        concat { '#{basedir}/file':
+          replace => false,
+        }
+
+        concat::fragment { '1':
+          target  => '#{basedir}/file',
+          content => '1',
+        }
+
+        concat::fragment { '2':
+          target  => '#{basedir}/file',
+          content => '2',
+        }
+      EOS
+
+      it 'applies the manifest twice with no stderr' do
+        apply_manifest(pp, :catch_failures => true)
+        apply_manifest(pp, :catch_changes => true)
+      end
+
+      describe file("#{basedir}/file") do
+        it { should be_file }
+        its(:content) {
+          should match 'file exists'
+          should_not match '1'
+          should_not match '2'
+        }
+      end
+    end
+
+    context 'should succeed' do
+      before(:all) do
+        pp = <<-EOS
+          file { '#{basedir}':
+            ensure => directory,
+          }
+          file { '#{basedir}/file':
+            content => "file exists\n"
+          }
+        EOS
+        apply_manifest(pp)
+      end
+      pp = <<-EOS
+        concat { '#{basedir}/file':
+          replace => true,
+        }
+
+        concat::fragment { '1':
+          target  => '#{basedir}/file',
+          content => '1',
+        }
+
+        concat::fragment { '2':
+          target  => '#{basedir}/file',
+          content => '2',
+        }
+      EOS
+
+      it 'applies the manifest twice with no stderr' do
+        apply_manifest(pp, :catch_failures => true)
+        apply_manifest(pp, :catch_changes => true)
+      end
+
+      describe file("#{basedir}/file") do
+        it { should be_file }
+        its(:content) {
+          should_not match 'file exists'
+          should match '1'
+          should match '2'
+        }
+      end
+    end
+  end # file
+
+  context 'symlink', :unless => (fact("osfamily") == "windows") do
+    context 'should not succeed' do
+      # XXX the core puppet file type will replace a symlink with a plain file
+      # when using ensure => present and source => ... but it will not when using
+      # ensure => present and content => ...; this is somewhat confusing behavior
+      before(:all) do
+        pp = <<-EOS
+          file { '#{basedir}':
+            ensure => directory,
+          }
+          file { '#{basedir}/file':
+            ensure => link,
+            target => '#{basedir}/dangling',
+          }
+        EOS
+        apply_manifest(pp)
+      end
+
+      pp = <<-EOS
+        concat { '#{basedir}/file':
+          replace => false,
+        }
+
+        concat::fragment { '1':
+          target  => '#{basedir}/file',
+          content => '1',
+        }
+
+        concat::fragment { '2':
+          target  => '#{basedir}/file',
+          content => '2',
+        }
+      EOS
+
+      it 'applies the manifest twice with no stderr' do
+        apply_manifest(pp, :catch_failures => true)
+        apply_manifest(pp, :catch_changes => true)
+      end
+
+      # XXX specinfra doesn't support be_linked_to on AIX
+      describe file("#{basedir}/file"), :unless => (fact("osfamily") == "AIX" or fact("osfamily") == "windows") do
+        it { should be_linked_to "#{basedir}/dangling" }
+      end
+
+      describe file("#{basedir}/dangling") do
+        # XXX serverspec does not have a matcher for 'exists'
+        it { should_not be_file }
+        it { should_not be_directory }
+      end
+    end
+
+    context 'should succeed' do
+      # XXX the core puppet file type will replace a symlink with a plain file
+      # when using ensure => present and source => ... but it will not when using
+      # ensure => present and content => ...; this is somewhat confusing behavior
+      before(:all) do
+        pp = <<-EOS
+          file { '#{basedir}':
+            ensure => directory,
+          }
+          file { '#{basedir}/file':
+            ensure => link,
+            target => '#{basedir}/dangling',
+          }
+        EOS
+        apply_manifest(pp)
+      end
+
+      pp = <<-EOS
+        concat { '#{basedir}/file':
+          replace => true,
+        }
+
+        concat::fragment { '1':
+          target  => '#{basedir}/file',
+          content => '1',
+        }
+
+        concat::fragment { '2':
+          target  => '#{basedir}/file',
+          content => '2',
+        }
+      EOS
+
+      it 'applies the manifest twice with no stderr' do
+        apply_manifest(pp, :catch_failures => true)
+        apply_manifest(pp, :catch_changes => true)
+      end
+
+      describe file("#{basedir}/file") do
+        it { should be_file }
+        its(:content) {
+          should match '1'
+          should match '2'
+        }
+      end
+    end
+  end # symlink
+
+  context 'directory' do
+    context 'should not succeed' do
+      before(:all) do
+        pp = <<-EOS
+          file { '#{basedir}':
+            ensure => directory,
+          }
+          file { '#{basedir}/file':
+            ensure => directory,
+          }
+        EOS
+        apply_manifest(pp)
+      end
+      pp = <<-EOS
+        concat { '#{basedir}/file': }
+
+        concat::fragment { '1':
+          target  => '#{basedir}/file',
+          content => '1',
+        }
+
+        concat::fragment { '2':
+          target  => '#{basedir}/file',
+          content => '2',
+        }
+      EOS
+
+      it 'applies the manifest twice with stderr for changing to file' do
+        expect(apply_manifest(pp, :expect_failures => true).stderr).to match(/change from directory to file failed/)
+        expect(apply_manifest(pp, :expect_failures => true).stderr).to match(/change from directory to file failed/)
+      end
+
+      describe file("#{basedir}/file") do
+        it { should be_directory }
+      end
+    end
+
+    # XXX 
+    # when there are no fragments, and the replace param will only replace
+    # files and symlinks, not directories.  The semantics either need to be
+    # changed, extended, or a new param introduced to control directory
+    # replacement.
+    context 'should succeed', :pending => 'not yet implemented' do
+      pp = <<-EOS
+        concat { '#{basedir}/file':
+        }
+
+        concat::fragment { '1':
+          target  => '#{basedir}/file',
+          content => '1',
+        }
+
+        concat::fragment { '2':
+          target  => '#{basedir}/file',
+          content => '2',
+        }
+      EOS
+
+      it 'applies the manifest twice with no stderr' do
+        apply_manifest(pp, :catch_failures => true)
+        apply_manifest(pp, :catch_changes => true)
+      end
+
+      describe file("#{basedir}/file") do
+        it { should be_file }
+        its(:content) { should match '1' }
+      end
+    end
+  end # directory
+end