newer pg module
[mirror/dsa-puppet.git] / 3rdparty / modules / postgresql / spec / acceptance / postgresql_psql_spec.rb
diff --git a/3rdparty/modules/postgresql/spec/acceptance/postgresql_psql_spec.rb b/3rdparty/modules/postgresql/spec/acceptance/postgresql_psql_spec.rb
new file mode 100644 (file)
index 0000000..34a258c
--- /dev/null
@@ -0,0 +1,183 @@
+require 'spec_helper_acceptance'
+
+describe 'postgresql_psql', :unless => UNSUPPORTED_PLATFORMS.include?(fact('osfamily')) do
+
+  it 'should always run SQL' do
+    pp = <<-EOS
+      class { 'postgresql::server': } ->
+      postgresql_psql { 'foobar':
+        db        => 'postgres',
+        psql_user => 'postgres',
+        command   => 'select 1',
+      }
+    EOS
+
+    apply_manifest(pp, :catch_failures => true)
+    apply_manifest(pp, :expect_changes => true)
+  end
+
+  it 'should run some SQL when the unless query returns no rows' do
+    pp = <<-EOS
+      class { 'postgresql::server': } ->
+      postgresql_psql { 'foobar':
+        db        => 'postgres',
+        psql_user => 'postgres',
+        command   => 'select 1',
+        unless    => 'select 1 where 1=2',
+      }
+    EOS
+
+    apply_manifest(pp, :catch_failures => true)
+    apply_manifest(pp, :expect_changes  => true)
+  end
+
+  it 'should not run SQL when the unless query returns rows' do
+    pp = <<-EOS
+      class { 'postgresql::server': } ->
+      postgresql_psql { 'foobar':
+        db        => 'postgres',
+        psql_user => 'postgres',
+        command   => 'select * from pg_database limit 1',
+        unless    => 'select 1 where 1=1',
+      }
+    EOS
+
+    apply_manifest(pp, :catch_failures => true)
+    apply_manifest(pp, :catch_changes => true)
+  end
+
+  it 'should not run SQL when refreshed and the unless query returns rows' do
+    pp = <<-EOS
+      class { 'postgresql::server': } ->
+      notify { 'trigger': } ~>
+      postgresql_psql { 'foobar':
+        db        => 'postgres',
+        psql_user => 'postgres',
+        command   => 'invalid sql statement',
+        unless    => 'select 1 where 1=1',
+      }
+    EOS
+
+    apply_manifest(pp, :catch_failures => true)
+    apply_manifest(pp, :expect_changes => true)
+  end
+
+  context 'with refreshonly' do
+    it 'should not run SQL when the unless query returns no rows' do
+      pp = <<-EOS
+        class { 'postgresql::server': } ->
+        postgresql_psql { 'foobar':
+          db          => 'postgres',
+          psql_user   => 'postgres',
+          command     => 'select 1',
+          unless      => 'select 1 where 1=2',
+          refreshonly => true,
+        }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true)
+      apply_manifest(pp, :catch_changes  => true)
+    end
+
+    it 'should run SQL when refreshed and the unless query returns no rows' do
+      pp = <<-EOS.unindent
+        class { 'postgresql::server': } ->
+        notify { 'trigger': } ~>
+        postgresql_psql { 'foobar':
+          db          => 'postgres',
+          psql_user   => 'postgres',
+          command     => 'select 1',
+          unless      => 'select 1 where 1=2',
+          refreshonly => true,
+        }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true)
+      apply_manifest(pp, :expect_changes => true)
+    end
+
+    it 'should not run SQL when refreshed and the unless query returns rows' do
+      pp = <<-EOS.unindent
+        class { 'postgresql::server': } ->
+        notify { 'trigger': } ~>
+        postgresql_psql { 'foobar':
+          db          => 'postgres',
+          psql_user   => 'postgres',
+          command     => 'invalid sql query',
+          unless      => 'select 1 where 1=1',
+          refreshonly => true,
+        }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true)
+      apply_manifest(pp, :expect_changes => true)
+    end
+  end
+
+  it 'should not run some SQL when the onlyif query returns no rows' do
+    pp = <<-EOS
+      class { 'postgresql::server': } ->
+      postgresql_psql { 'foobar':
+        db        => 'postgres',
+        psql_user => 'postgres',
+        command   => 'select 1',
+        onlyif    => 'select 1 where 1=2',
+      }
+    EOS
+
+    apply_manifest(pp, :catch_failures => true)
+    apply_manifest(pp, :catch_changes  => true)
+  end
+
+  it 'should run SQL when the onlyif query returns rows' do
+    pp = <<-EOS
+      class { 'postgresql::server': } ->
+      postgresql_psql { 'foobar':
+        db        => 'postgres',
+        psql_user => 'postgres',
+        command   => 'select * from pg_database limit 1',
+        onlyif    => 'select 1 where 1=1',
+      }
+    EOS
+
+    apply_manifest(pp, :catch_failures => true)
+    apply_manifest(pp, :expect_changes => true)
+  end
+
+  context 'with secure password passing by environment' do
+    it 'should run SQL that contanins password passed by environment' do
+      select = "select \\'$PASS_TO_EMBED\\'"
+      pp = <<-EOS.unindent
+        class { 'postgresql::server': } ->
+        postgresql_psql { 'password embedded by environment: #{select}':
+          db          => 'postgres',
+          psql_user   => 'postgres',
+          command     => '#{select}',
+          environment => [
+            'PASS_TO_EMBED=pa$swD',
+          ],
+        }
+      EOS
+      apply_manifest(pp, :catch_failures => true)
+      apply_manifest(pp, :expect_changes => false)
+    end
+    it 'should run SQL that contanins password passed by environment in check' do
+      select = "select 1 where \\'$PASS_TO_EMBED\\'=\\'passwD\\'"
+      pp = <<-EOS.unindent
+        class { 'postgresql::server': } ->
+        postgresql_psql { 'password embedded by environment in check: #{select}':
+          db          => 'postgres',
+          psql_user   => 'postgres',
+          command     => 'invalid sql query',
+          unless      => '#{select}',
+          environment => [
+            'PASS_TO_EMBED=passwD',
+          ],
+        }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true)
+      apply_manifest(pp, :expect_changes => false)
+    end
+  end
+end