Update stdlib and concat to 6.1.0 both
[mirror/dsa-puppet.git] / 3rdparty / modules / concat / spec / acceptance / force_spec.rb
diff --git a/3rdparty/modules/concat/spec/acceptance/force_spec.rb b/3rdparty/modules/concat/spec/acceptance/force_spec.rb
new file mode 100644 (file)
index 0000000..2aa92ed
--- /dev/null
@@ -0,0 +1,147 @@
+require 'spec_helper_acceptance'
+
+describe 'force merge of file' do
+  before(:all) do
+    @basedir = setup_test_directory
+  end
+
+  describe 'when run should not force' do
+    let(:pp) do
+      <<-MANIFEST
+        concat { '#{@basedir}/file':
+          format => 'yaml',
+          force => false,
+        }
+
+        concat::fragment { '1':
+          target  => '#{@basedir}/file',
+          content => '{"one": "foo"}',
+        }
+
+        concat::fragment { '2':
+          target  => '#{@basedir}/file',
+          content => '{"one": "bar"}',
+        }
+      MANIFEST
+    end
+
+    it 'applies manifest twice with stderr check' do
+      expect(apply_manifest(pp, expect_failures: true).stderr).to match("Duplicate key 'one' found with values 'foo' and bar'. Use 'force' attribute to merge keys.")
+      expect(apply_manifest(pp, expect_failures: true).stderr).to match("Duplicate key 'one' found with values 'foo' and bar'. Use 'force' attribute to merge keys.")
+      expect(file("#{@basedir}/file")).to be_file
+      expect(file("#{@basedir}/file").content).to match 'file exists'
+      expect(file("#{@basedir}/file").content).not_to match 'one: foo'
+      expect(file("#{@basedir}/file").content).not_to match 'one: bar'
+    end
+  end
+
+  describe 'when run should not force by default' do
+    let(:pp) do
+      <<-MANIFEST
+        concat { '#{@basedir}/file':
+          format => 'yaml',
+        }
+
+        concat::fragment { '1':
+          target  => '#{@basedir}/file',
+          content => '{"one": "foo"}',
+        }
+
+        concat::fragment { '2':
+          target  => '#{@basedir}/file',
+          content => '{"one": "bar"}',
+        }
+      MANIFEST
+    end
+
+    it 'applies manifest twice with stderr check' do
+      expect(apply_manifest(pp, expect_failures: true).stderr).to match("Duplicate key 'one' found with values 'foo' and bar'. Use 'force' attribute to merge keys.")
+      expect(apply_manifest(pp, expect_failures: true).stderr).to match("Duplicate key 'one' found with values 'foo' and bar'. Use 'force' attribute to merge keys.")
+      expect(file("#{@basedir}/file")).to be_file
+      expect(file("#{@basedir}/file").content).to match 'file exists'
+      expect(file("#{@basedir}/file").content).not_to match 'one: foo'
+      expect(file("#{@basedir}/file").content).not_to match 'one: bar'
+    end
+  end
+
+  describe 'when run should force' do
+    let(:pp) do
+      <<-MANIFEST
+        concat { '#{@basedir}/file':
+          format => 'yaml',
+          force => true,
+        }
+
+        concat::fragment { '1':
+          target  => '#{@basedir}/file',
+          content => '{"one": "foo"}',
+        }
+
+        concat::fragment { '2':
+          target  => '#{@basedir}/file',
+          content => '{"one": "bar"}',
+        }
+      MANIFEST
+    end
+
+    it 'applies the manifest twice with no stderr' do
+      idempotent_apply(pp)
+      expect(file("#{@basedir}/file")).to be_file
+      expect(file("#{@basedir}/file").content).to match 'one: foo'
+    end
+  end
+
+  describe 'when run should force merge nested arrays' do
+    let(:pp) do
+      <<-MANIFEST
+        concat { '#{@basedir}/file':
+          format => 'json',
+          force => true,
+        }
+
+        concat::fragment { '1':
+          target  => '#{@basedir}/file',
+          content => '{"one": [1]}',
+        }
+
+        concat::fragment { '2':
+          target  => '#{@basedir}/file',
+          content => '{"one": [2]}',
+        }
+      MANIFEST
+    end
+
+    it 'applies the manifest twice with no stderr' do
+      idempotent_apply(pp)
+      expect(file("#{@basedir}/file")).to be_file
+      expect(file("#{@basedir}/file").content).to contain '{"one":\[1,2\]}'
+    end
+  end
+
+  describe 'when run should not force on plain' do
+    let(:pp) do
+      <<-MANIFEST
+        concat { '#{@basedir}/file':
+          force => true,
+          format => plain,
+        }
+
+        concat::fragment { '1':
+          target  => '#{@basedir}/file',
+          content => '{"one": "foo"}',
+        }
+
+        concat::fragment { '2':
+          target  => '#{@basedir}/file',
+          content => '{"one": "bar"}',
+        }
+      MANIFEST
+    end
+
+    it 'applies the manifest twice with no stderr' do
+      idempotent_apply(pp)
+      expect(file("#{@basedir}/file")).to be_file
+      expect(file("#{@basedir}/file").content).to match '{"one": "foo"}{"one": "bar"}'
+    end
+  end
+end