From b444f3b11eed1e8484b1662e856501464e143d9d Mon Sep 17 00:00:00 2001 From: Roberto Valentini Date: Tue, 2 Apr 2024 16:02:56 +0200 Subject: [PATCH] Fix Test initial refactoring of acceptance port test to rspec-mock remove unused erlang module from fixture bump dependency version user facts['service_provider] instead facts[systemd] --- .fixtures.yml | 1 - lib/facter/rabbitmq_nodename.rb | 2 +- manifests/config.pp | 2 +- manifests/service.pp | 2 +- metadata.json | 6 +- spec/acceptance/binding_spec.rb | 117 ++++++++ spec/acceptance/class_spec.rb | 132 ++++----- spec/acceptance/clustering_spec.rb | 12 - spec/acceptance/delete_guest_user_spec.rb | 4 - spec/acceptance/parameter_spec.rb | 82 +++--- spec/acceptance/policy_spec.rb | 85 +++--- spec/acceptance/queue_spec.rb | 272 +++--------------- spec/acceptance/rabbitmqadmin_spec.rb | 34 +-- spec/acceptance/user_spec.rb | 68 ++--- spec/acceptance/vhost_spec.rb | 43 +-- spec/classes/rabbitmq_spec.rb | 19 +- spec/setup_acceptance_node.pp | 60 ++++ spec/spec_helper.rb | 9 +- spec/spec_helper_acceptance.rb | 106 +------ .../spec/custom_facts.rb} | 2 +- .../facter/util/fact_erl_ssl_path_spec.rb | 10 +- .../util/fact_rabbitmq_clustername_spec.rb | 22 +- .../util/fact_rabbitmq_nodename_spec.rb | 26 +- .../util/fact_rabbitmq_plugins_dirs_spec.rb | 23 +- .../facter/util/fact_rabbitmq_version_spec.rb | 10 +- .../rabbitmq_binding/rabbitmqadmin_spec.rb | 72 +++-- .../unit/puppet/provider/rabbitmq_cli_spec.rb | 33 ++- .../rabbitmq_cluster/rabbitmqctl_spec.rb | 30 +- .../rabbitmq_exchange/rabbitmqadmin_spec.rb | 32 +-- .../rabbitmqctl_federation_spec.rb | 43 +-- .../rabbitmq_parameter/rabbitmqctl_spec.rb | 58 ++-- .../rabbitmq_plugin/rabbitmqctl_spec.rb | 108 +++---- .../rabbitmq_policy/rabbitmqctl_spec.rb | 80 +++--- .../rabbitmq_queue/rabbitmqadmin_spec.rb | 32 +-- .../rabbitmq_user/rabbitmqctl_spec.rb | 116 ++++---- .../rabbitmqctl_spec.rb | 43 +-- .../rabbitmq_vhost/rabbitmqctl_spec.rb | 59 ++-- .../puppet/type/rabbitmq_parameter_spec.rb | 2 +- .../type/rabbitmq_user_permissions_spec.rb | 2 +- 39 files changed, 843 insertions(+), 1016 deletions(-) create mode 100644 spec/acceptance/binding_spec.rb create mode 100644 spec/setup_acceptance_node.pp rename spec/{spec_helper_local.rb => support/spec/custom_facts.rb} (69%) diff --git a/.fixtures.yml b/.fixtures.yml index d8e86d6ae..acd4e129f 100644 --- a/.fixtures.yml +++ b/.fixtures.yml @@ -3,6 +3,5 @@ fixtures: stdlib: 'https://github.com/puppetlabs/puppetlabs-stdlib' apt: 'https://github.com/puppetlabs/puppetlabs-apt' archive: 'https://github.com/voxpupuli/puppet-archive' - erlang: 'https://github.com/garethr/garethr-erlang' systemd: 'https://github.com/voxpupuli/puppet-systemd' yumrepo_core: 'https://github.com/puppetlabs/puppetlabs-yumrepo_core' diff --git a/lib/facter/rabbitmq_nodename.rb b/lib/facter/rabbitmq_nodename.rb index 812443cbf..0ab1606a8 100644 --- a/lib/facter/rabbitmq_nodename.rb +++ b/lib/facter/rabbitmq_nodename.rb @@ -5,7 +5,7 @@ if Facter::Util::Resolution.which('rabbitmqctl') rabbitmq_nodename = Facter::Core::Execution.execute('rabbitmqctl status 2>&1') begin - %r{^Status of node '?([\w.\-]+@[\w.\-]+)'?}.match(rabbitmq_nodename)[1] + %r{^Status of node '?([\w.-]+@[\w.-]+)'?}.match(rabbitmq_nodename)[1] rescue StandardError Facter.debug("Error: rabbitmq_nodename facter failed. Output was #{rabbitmq_nodename}") end diff --git a/manifests/config.pp b/manifests/config.pp index eb79d8317..e8ac524c3 100644 --- a/manifests/config.pp +++ b/manifests/config.pp @@ -234,7 +234,7 @@ default: {} } - if $facts['systemd'] { # systemd fact provided by systemd module + if $facts['service_provider'] == 'systemd' { # systemd fact provided by systemd module systemd::service_limits { "${service_name}.service": selinux_ignore_defaults => ($facts['os']['family'] == 'RedHat'), limits => { diff --git a/manifests/service.pp b/manifests/service.pp index 03849ec7b..234893ecd 100644 --- a/manifests/service.pp +++ b/manifests/service.pp @@ -27,7 +27,7 @@ hasrestart => true, name => $service_name, } - if $facts['systemd'] and defined(Class['systemd::systemctl::daemon_reload']) { + if $facts['service_provider'] == 'systemd' and defined(Class['systemd::systemctl::daemon_reload']) { Class['systemd::systemctl::daemon_reload'] -> Service['rabbitmq-server'] } } diff --git a/metadata.json b/metadata.json index b24f8098d..b45e8e27c 100644 --- a/metadata.json +++ b/metadata.json @@ -58,15 +58,15 @@ "dependencies": [ { "name": "puppetlabs/stdlib", - "version_requirement": ">= 4.25.0 < 9.0.0" + "version_requirement": ">= 4.25.0 < 10.0.0" }, { "name": "puppet/archive", - "version_requirement": ">= 2.0.0 < 7.0.0" + "version_requirement": ">= 2.0.0 < 8.0.0" }, { "name": "puppet/systemd", - "version_requirement": ">= 2.10.0 < 5.0.0" + "version_requirement": ">= 2.10.0 < 7.0.0" } ], "tags": [ diff --git a/spec/acceptance/binding_spec.rb b/spec/acceptance/binding_spec.rb new file mode 100644 index 000000000..574c718ea --- /dev/null +++ b/spec/acceptance/binding_spec.rb @@ -0,0 +1,117 @@ +# frozen_string_literal: true + +require 'spec_helper_acceptance' + +describe 'rabbitmq_binding:' do + before do + pp = <<-EOS + class { 'rabbitmq': + service_manage => true, + port => 5672, + delete_guest_user => true, + admin_enable => true, + } + -> rabbitmq_user { 'dan': + admin => true, + password => 'bar', + tags => ['monitoring', 'tag1'], + } + -> rabbitmq_user_permissions { 'dan@host1': + configure_permission => '.*', + read_permission => '.*', + write_permission => '.*', + } + rabbitmq_vhost { 'host1': + ensure => present, + } + -> rabbitmq_exchange { 'exchange1@host1': + user => 'dan', + password => 'bar', + type => 'topic', + ensure => present, + } + -> rabbitmq_queue { 'queue1@host1': + user => 'dan', + password => 'bar', + durable => true, + auto_delete => false, + ensure => present, + } + EOS + + apply_manifest(pp, catch_failures: true) + end + + context 'when using one routing_key' do + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + rabbitmq_binding { 'exchange1@queue1@host1': + user => 'dan', + password => 'bar', + destination_type => 'queue', + routing_key => '#', + ensure => present, + } + PUPPET + end + end + + it 'binding exist' do + shell('rabbitmqctl list_bindings -q -p host1') do |r| + expect(r.stdout).to match(%r{exchange1\sexchange\squeue1\squeue\s#}) + expect(r.exit_code).to be_zero + end + end + + it 'resource has the queue' do + shell('rabbitmqctl list_queues -q -p host1') do |r| + expect(r.stdout).to match(%r{queue1}) + expect(r.exit_code).to be_zero + end + end + end + + context 'when using two routing_keys' do + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + rabbitmq_binding { 'binding 1': + source => 'exchange1', + destination => 'queue1', + user => 'dan', + vhost => 'host1', + password => 'bar', + destination_type => 'queue', + routing_key => 'test1', + ensure => present, + } + -> rabbitmq_binding { 'binding 2': + source => 'exchange1', + destination => 'queue1', + user => 'dan', + vhost => 'host1', + password => 'bar', + destination_type => 'queue', + routing_key => 'test2', + ensure => present, + } + PUPPET + end + end + + it 'resource has the bindings' do + shell('rabbitmqctl list_bindings -q -p host1') do |r| + expect(r.stdout).to match(%r{exchange1\sexchange\squeue1\squeue\stest1}) + expect(r.stdout).to match(%r{exchange1\sexchange\squeue1\squeue\stest2}) + expect(r.exit_code).to be_zero + end + end + + it 'puppet resource shows a binding' do + shell('puppet resource rabbitmq_binding') do |r| + expect(r.stdout).to match(%r{source\s+=>\s+'exchange1',}) + end + end + end +end diff --git a/spec/acceptance/class_spec.rb b/spec/acceptance/class_spec.rb index 009b35b08..f9a8ad353 100644 --- a/spec/acceptance/class_spec.rb +++ b/spec/acceptance/class_spec.rb @@ -13,18 +13,14 @@ end context 'default class inclusion' do - let(:pp) do - <<-EOS - class { 'rabbitmq': } - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true} - Class['erlang'] -> Class['rabbitmq'] - } - EOS + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + class { 'rabbitmq': } + PUPPET + end end - it_behaves_like 'an idempotent resource' - describe package(package_name) do it { is_expected.to be_installed } end @@ -49,20 +45,20 @@ class { 'erlang': epel_enable => true} end context 'disable and stop service' do - let(:pp) do - <<-EOS - class { 'rabbitmq': - service_ensure => 'stopped', - } - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true} - Class['erlang'] -> Class['rabbitmq'] - } - EOS + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + class { 'rabbitmq': + service_ensure => 'stopped', + } + if $facts['os']['family'] == 'RedHat' { + class { 'erlang': epel_enable => true} + Class['erlang'] -> Class['rabbitmq'] + } + PUPPET + end end - it_behaves_like 'an idempotent resource' - describe service(service_name) do it { is_expected.not_to be_enabled } it { is_expected.not_to be_running } @@ -73,10 +69,6 @@ class { 'erlang': epel_enable => true} it 'runs successfully' do pp_pre = <<-EOS class { 'rabbitmq': } - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true} - Class['erlang'] -> Class['rabbitmq'] - } EOS pp = <<-EOS @@ -84,10 +76,6 @@ class { 'rabbitmq': service_manage => false, service_ensure => 'stopped', } - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true} - Class['erlang'] -> Class['rabbitmq'] - } EOS apply_manifest(pp_pre, catch_failures: true) @@ -101,19 +89,19 @@ class { 'erlang': epel_enable => true} end context 'binding on all interfaces' do - let(:pp) do - <<-EOS - class { 'rabbitmq': - service_manage => true, - port => 5672, - admin_enable => true, - node_ip_address => '0.0.0.0' - } - EOS + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + class { 'rabbitmq': + service_manage => true, + port => 5672, + admin_enable => true, + node_ip_address => '0.0.0.0' + } + PUPPET + end end - it_behaves_like 'an idempotent resource' - describe service(service_name) do it { is_expected.to be_running } end @@ -134,19 +122,19 @@ class { 'rabbitmq': end context 'binding to localhost only' do - let(:pp) do - <<-EOS - class { 'rabbitmq': - service_manage => true, - port => 5672, - admin_enable => true, - node_ip_address => '127.0.0.1' - } - EOS + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + class { 'rabbitmq': + service_manage => true, + port => 5672, + admin_enable => true, + node_ip_address => '127.0.0.1' + } + PUPPET + end end - it_behaves_like 'an idempotent resource' - describe service(service_name) do it { is_expected.to be_running } end @@ -169,23 +157,23 @@ class { 'rabbitmq': end context 'ssl enabled' do - let(:pp) do - <<-EOS - class { 'rabbitmq': - service_manage => true, - admin_enable => true, - node_ip_address => '0.0.0.0', - ssl_interface => '0.0.0.0', - ssl => true, - ssl_cacert => '/tmp/cacert.crt', - ssl_cert => '/tmp/rabbitmq.crt', - ssl_key => '/tmp/rabbitmq.key', - } - EOS + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + class { 'rabbitmq': + service_manage => true, + admin_enable => true, + node_ip_address => '0.0.0.0', + ssl_interface => '0.0.0.0', + ssl => true, + ssl_cacert => '/tmp/cacert.crt', + ssl_cert => '/tmp/rabbitmq.crt', + ssl_key => '/tmp/rabbitmq.key', + } + PUPPET + end end - it_behaves_like 'an idempotent resource' - describe service(service_name) do it { is_expected.to be_running } end @@ -200,8 +188,9 @@ class { 'rabbitmq': end context 'different management_ip_address and node_ip_address' do - let(:pp) do - <<-EOS + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET class { 'rabbitmq': service_manage => true, port => 5672, @@ -209,11 +198,10 @@ class { 'rabbitmq': node_ip_address => '0.0.0.0', management_ip_address => '127.0.0.1' } - EOS + PUPPET + end end - it_behaves_like 'an idempotent resource' - describe service(service_name) do it { is_expected.to be_running } end diff --git a/spec/acceptance/clustering_spec.rb b/spec/acceptance/clustering_spec.rb index fa689cf42..49e3261cc 100644 --- a/spec/acceptance/clustering_spec.rb +++ b/spec/acceptance/clustering_spec.rb @@ -14,10 +14,6 @@ class { 'rabbitmq': erlang_cookie => 'TESTCOOKIE', wipe_db_on_cookie_change => false, } - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true} - Class['erlang'] -> Class['rabbitmq'] - } EOS apply_manifest(pp, expect_failures: true) @@ -39,10 +35,6 @@ class { 'rabbitmq': erlang_cookie => 'TESTCOOKIE', wipe_db_on_cookie_change => true, } - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true} - Class['erlang'] -> Class['rabbitmq'] - } EOS apply_manifest(pp, catch_failures: true) @@ -84,10 +76,6 @@ class { 'rabbitmq': environment_variables => { 'NODENAME' => 'rabbit@foobar' }, erlang_cookie => 'TESTCOOKIE', } - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true} - Class['erlang'] -> Class['rabbitmq'] - } EOS apply_manifest(pp, expect_failures: true) diff --git a/spec/acceptance/delete_guest_user_spec.rb b/spec/acceptance/delete_guest_user_spec.rb index 15bdff93f..faa9ca957 100644 --- a/spec/acceptance/delete_guest_user_spec.rb +++ b/spec/acceptance/delete_guest_user_spec.rb @@ -10,10 +10,6 @@ class { 'rabbitmq': port => 5672, delete_guest_user => true, } - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true} - Class['erlang'] -> Class['rabbitmq'] - } EOS apply_manifest(pp, catch_failures: true) diff --git a/spec/acceptance/parameter_spec.rb b/spec/acceptance/parameter_spec.rb index 38ed4b53a..be70ecf1c 100644 --- a/spec/acceptance/parameter_spec.rb +++ b/spec/acceptance/parameter_spec.rb @@ -3,42 +3,35 @@ require 'spec_helper_acceptance' describe 'rabbitmq parameter on a vhost:' do - context 'create parameter resource' do - it 'runs successfully' do - pp = <<-EOS - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true } - Class['erlang'] -> Class['rabbitmq'] - } - class { 'rabbitmq': - service_manage => true, - port => 5672, - delete_guest_user => true, - admin_enable => true, - } - - rabbitmq_plugin { [ 'rabbitmq_federation_management', 'rabbitmq_federation' ]: - ensure => present - } ~> Service['rabbitmq-server'] - - rabbitmq_vhost { 'fedhost': - ensure => present, - } -> - - rabbitmq_parameter { 'documentumFed@fedhost': - component_name => 'federation-upstream', - value => { - 'uri' => 'amqp://server', - 'expires' => '3600000', - }, - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + context 'create parameter' do + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + class { 'rabbitmq': + service_manage => true, + port => 5672, + delete_guest_user => true, + admin_enable => true, + } + rabbitmq_plugin { [ 'rabbitmq_federation_management', 'rabbitmq_federation' ]: + ensure => present + } + ~> Service['rabbitmq-server'] + rabbitmq_vhost { 'fedhost': + ensure => present, + } + -> rabbitmq_parameter { 'documentumFed@fedhost': + component_name => 'federation-upstream', + value => { + 'uri' => 'amqp://server', + 'expires' => '3600000', + }, + } + PUPPET + end end - it 'has the parameter' do + it 'parameter created' do shell('rabbitmqctl list_parameters -p fedhost') do |r| expect(r.stdout).to match(%r{federation-upstream.*documentumFed.*expires.*3600000}) expect(r.exit_code).to be_zero @@ -46,19 +39,18 @@ class { 'rabbitmq': end end - context 'destroy parameter resource' do - it 'runs successfully' do - pp = <<-EOS - rabbitmq_parameter { 'documentumFed@fedhost': - ensure => absent, - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + context 'remove parameter' do + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + rabbitmq_parameter { 'documentumFed@fedhost': + ensure => absent, + } + PUPPET + end end - it 'does not have the parameter' do + it 'parameter removed' do shell('rabbitmqctl list_parameters -q') do |r| expect(r.stdout).not_to match(%r{documentumFed\s+}) end diff --git a/spec/acceptance/policy_spec.rb b/spec/acceptance/policy_spec.rb index 1cd126344..24e2164d1 100644 --- a/spec/acceptance/policy_spec.rb +++ b/spec/acceptance/policy_spec.rb @@ -2,54 +2,49 @@ require 'spec_helper_acceptance' -describe 'rabbitmq policy on a vhost:' do - context 'create policy resource' do - it 'runs successfully' do - pp = <<-EOS - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true } - Class['erlang'] -> Class['rabbitmq'] - } - class { 'rabbitmq': - service_manage => true, - port => 5672, - delete_guest_user => true, - admin_enable => true, - } -> - - rabbitmq_vhost { 'myhost': - ensure => present, - } -> - - rabbitmq_policy { 'ha-all@myhost': - pattern => '.*', - priority => 0, - applyto => 'all', - definition => { - 'ha-mode' => 'all', - 'ha-sync-mode' => 'automatic', - }, - } - - rabbitmq_policy { 'eu-federation@myhost': - pattern => '^eu\\.', - priority => 0, - applyto => 'all', - definition => { - 'federation-upstream-set' => 'all', - }, - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) +describe 'rabbitmq_policy' do + before(:all) do + pp = <<-EOS + class { 'rabbitmq': + service_manage => true, + port => 5672, + delete_guest_user => true, + admin_enable => true, + } + -> rabbitmq_vhost { 'myhost': + ensure => present, + } + EOS + + apply_manifest(pp, catch_failures: true) + end - # Apply twice to ensure no changes the second time. - apply_manifest(pp, catch_failures: true) - expect(apply_manifest(pp, catch_changes: true).exit_code).to be_zero + context 'ensure present' do + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + rabbitmq_policy { 'ha-all@myhost': + pattern => '.*', + priority => 0, + applyto => 'all', + definition => { + 'ha-mode' => 'all', + 'ha-sync-mode' => 'automatic', + }, + } + rabbitmq_policy { 'eu-federation@myhost': + pattern => '^eu\\.', + priority => 0, + applyto => 'all', + definition => { + 'federation-upstream-set' => 'all', + }, + } + PUPPET + end end - it 'has the policy' do + it 'policy exist' do shell('rabbitmqctl list_policies -p myhost') do |r| expect(r.stdout).to match(%r{myhost.*ha-all.*ha-sync-mode}) expect(r.stdout).to match(%r{myhost.*eu-federation}) diff --git a/spec/acceptance/queue_spec.rb b/spec/acceptance/queue_spec.rb index 2934796e9..9b78df198 100644 --- a/spec/acceptance/queue_spec.rb +++ b/spec/acceptance/queue_spec.rb @@ -2,241 +2,59 @@ require 'spec_helper_acceptance' -describe 'rabbitmq binding:' do - context 'create binding and queue resources when using default management port' do - it 'runs successfully' do - pp = <<-EOS - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true } - Class['erlang'] -> Class['rabbitmq'] - } - class { 'rabbitmq': - service_manage => true, - port => 5672, - delete_guest_user => true, - admin_enable => true, - } -> - - rabbitmq_user { 'dan': - admin => true, - password => 'bar', - tags => ['monitoring', 'tag1'], - } -> - - rabbitmq_user_permissions { 'dan@host1': - configure_permission => '.*', - read_permission => '.*', - write_permission => '.*', - } - - rabbitmq_vhost { 'host1': - ensure => present, - } -> - - rabbitmq_exchange { 'exchange1@host1': - user => 'dan', - password => 'bar', - type => 'topic', - ensure => present, - } -> - - rabbitmq_queue { 'queue1@host1': - user => 'dan', - password => 'bar', - durable => true, - auto_delete => false, - ensure => present, - } -> - - rabbitmq_binding { 'exchange1@queue1@host1': - user => 'dan', - password => 'bar', - destination_type => 'queue', - routing_key => '#', - ensure => present, - } - - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) - end +describe 'rabbitmq_queue:' do + before do + pp = <<-EOS + class { 'rabbitmq': + service_manage => true, + port => 5672, + delete_guest_user => true, + admin_enable => true, + } + -> rabbitmq_user { 'dan': + admin => true, + password => 'bar', + tags => ['monitoring', 'tag1'], + } + -> rabbitmq_user_permissions { 'dan@host1': + configure_permission => '.*', + read_permission => '.*', + write_permission => '.*', + } + rabbitmq_vhost { 'host1': + ensure => present, + } + -> rabbitmq_exchange { 'exchange1@host1': + user => 'dan', + password => 'bar', + type => 'topic', + ensure => present, + } + EOS + + apply_manifest(pp, catch_failures: true) + end - it 'has the binding' do - shell('rabbitmqctl list_bindings -q -p host1') do |r| - expect(r.stdout).to match(%r{exchange1\sexchange\squeue1\squeue\s#}) - expect(r.exit_code).to be_zero + context 'when using one routing_key' do + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + rabbitmq_queue { 'queue1@host1': + user => 'dan', + password => 'bar', + durable => true, + auto_delete => false, + ensure => present, + } + PUPPET end end - it 'has the queue' do + it 'queue present' do shell('rabbitmqctl list_queues -q -p host1') do |r| expect(r.stdout).to match(%r{queue1}) expect(r.exit_code).to be_zero end end end - - context 'create multiple bindings when same source / destination / vhost but different routing keys' do - it 'runs successfully' do - pp = <<-EOS - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true } - Class['erlang'] -> Class['rabbitmq'] - } - class { 'rabbitmq': - service_manage => true, - port => 5672, - delete_guest_user => true, - admin_enable => true, - } -> - - rabbitmq_user { 'dan': - admin => true, - password => 'bar', - tags => ['monitoring', 'tag1'], - } -> - - rabbitmq_user_permissions { 'dan@host1': - configure_permission => '.*', - read_permission => '.*', - write_permission => '.*', - } - - rabbitmq_vhost { 'host1': - ensure => present, - } -> - - rabbitmq_exchange { 'exchange1@host1': - user => 'dan', - password => 'bar', - type => 'topic', - ensure => present, - } -> - - rabbitmq_queue { 'queue1@host1': - user => 'dan', - password => 'bar', - durable => true, - auto_delete => false, - ensure => present, - } -> - - rabbitmq_binding { 'binding 1': - source => 'exchange1', - destination => 'queue1', - user => 'dan', - vhost => 'host1', - password => 'bar', - destination_type => 'queue', - routing_key => 'test1', - ensure => present, - } -> - - rabbitmq_binding { 'binding 2': - source => 'exchange1', - destination => 'queue1', - user => 'dan', - vhost => 'host1', - password => 'bar', - destination_type => 'queue', - routing_key => 'test2', - ensure => present, - } - - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) - end - - it 'has the bindings' do - shell('rabbitmqctl list_bindings -q -p host1') do |r| - expect(r.stdout).to match(%r{exchange1\sexchange\squeue1\squeue\stest1}) - expect(r.stdout).to match(%r{exchange1\sexchange\squeue1\squeue\stest2}) - expect(r.exit_code).to be_zero - end - end - - it 'puppet resource shows a binding' do - shell('puppet resource rabbitmq_binding') do |r| - expect(r.stdout).to match(%r{source\s+=>\s+'exchange1',}) - end - end - end - - context 'create binding and queue resources when using a non-default management port' do - it 'runs successfully' do - pp = <<-EOS - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true } - Class['erlang'] -> Class['rabbitmq'] - } - class { 'rabbitmq': - service_manage => true, - port => 5672, - management_port => 11111, - delete_guest_user => true, - admin_enable => true, - } -> - - rabbitmq_user { 'dan': - admin => true, - password => 'bar', - tags => ['monitoring', 'tag1'], - } -> - - rabbitmq_user_permissions { 'dan@host2': - configure_permission => '.*', - read_permission => '.*', - write_permission => '.*', - } - - rabbitmq_vhost { 'host2': - ensure => present, - } -> - - rabbitmq_exchange { 'exchange2@host2': - user => 'dan', - password => 'bar', - type => 'topic', - ensure => present, - } -> - - rabbitmq_queue { 'queue2@host2': - user => 'dan', - password => 'bar', - durable => true, - auto_delete => false, - ensure => present, - } -> - - rabbitmq_binding { 'exchange2@queue2@host2': - user => 'dan', - password => 'bar', - destination_type => 'queue', - routing_key => '#', - ensure => present, - } - - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) - end - - it 'has the binding' do - shell('rabbitmqctl list_bindings -q -p host2') do |r| - expect(r.stdout).to match(%r{exchange2\sexchange\squeue2\squeue\s#}) - expect(r.exit_code).to be_zero - end - end - - it 'has the queue' do - shell('rabbitmqctl list_queues -q -p host2') do |r| - expect(r.stdout).to match(%r{queue2}) - expect(r.exit_code).to be_zero - end - end - end end diff --git a/spec/acceptance/rabbitmqadmin_spec.rb b/spec/acceptance/rabbitmqadmin_spec.rb index fa127f1b4..e7e8bf214 100644 --- a/spec/acceptance/rabbitmqadmin_spec.rb +++ b/spec/acceptance/rabbitmqadmin_spec.rb @@ -4,19 +4,15 @@ describe 'rabbitmq::install::rabbitmqadmin class' do context 'downloads the cli tools' do - it 'runs successfully' do - pp = <<-EOS - class { 'rabbitmq': - admin_enable => true, - service_manage => true, - } - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true} - Class['erlang'] -> Class['rabbitmq'] - } - EOS - - apply_manifest(pp, catch_failures: true) + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + class { 'rabbitmq': + admin_enable => true, + service_manage => true, + } + PUPPET + end end describe file('/var/lib/rabbitmq/rabbitmqadmin') do @@ -31,10 +27,6 @@ class { 'rabbitmq': admin_enable => true, service_manage => false, } - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true} - Class['erlang'] -> Class['rabbitmq'] - } EOS shell('rm -f /var/lib/rabbitmq/rabbitmqadmin') @@ -55,10 +47,6 @@ class { 'rabbitmq': default_user => 'foobar', default_pass => 'bazblam', } - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true} - Class['erlang'] -> Class['rabbitmq'] - } EOS pp = <<-EOS @@ -68,10 +56,6 @@ class { 'rabbitmq': default_user => 'foobar', default_pass => 'bazblam', } - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true} - Class['erlang'] -> Class['rabbitmq'] - } EOS shell('rm -f /var/lib/rabbitmq/rabbitmqadmin') diff --git a/spec/acceptance/user_spec.rb b/spec/acceptance/user_spec.rb index a8d369218..33d482ece 100644 --- a/spec/acceptance/user_spec.rb +++ b/spec/acceptance/user_spec.rb @@ -2,32 +2,33 @@ require 'spec_helper_acceptance' -describe 'rabbitmq user:' do - context 'create user resource' do - it 'runs successfully' do - pp = <<-EOS - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true } - Class['erlang'] -> Class['rabbitmq'] - } - class { 'rabbitmq': - service_manage => true, - port => 5672, - delete_guest_user => true, - admin_enable => true, - } -> - - rabbitmq_user { 'dan': - admin => true, - password => 'bar', - } - EOS +describe 'rabbitmq_user' do + before(:all) do + pp = <<-EOS + class { 'rabbitmq': + service_manage => true, + port => 5672, + delete_guest_user => true, + admin_enable => true, + } + EOS + + apply_manifest(pp, catch_failures: true) + end - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + context 'ensure present' do + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + rabbitmq_user { 'dan': + admin => true, + password => 'bar', + } + PUPPET + end end - it 'has the user' do + it 'user exist' do shell('rabbitmqctl list_users -q') do |r| expect(r.stdout).to match(%r{dan.*administrator}) expect(r.exit_code).to be_zero @@ -35,19 +36,18 @@ class { 'rabbitmq': end end - context 'destroy user resource' do - it 'runs successfully' do - pp = <<-EOS - rabbitmq_user { 'dan': - ensure => absent, - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + context 'ensure absent' do + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + rabbitmq_user { 'dan': + ensure => absent, + } + PUPPET + end end - it 'does not have the user' do + it 'user removed' do shell('rabbitmqctl list_users -q') do |r| expect(r.stdout).not_to match(%r{dan\s+}) end diff --git a/spec/acceptance/vhost_spec.rb b/spec/acceptance/vhost_spec.rb index 782e33df9..754e17da5 100644 --- a/spec/acceptance/vhost_spec.rb +++ b/spec/acceptance/vhost_spec.rb @@ -2,31 +2,32 @@ require 'spec_helper_acceptance' -describe 'rabbitmq vhost:' do - context 'create vhost resource' do - it 'runs successfully' do - pp = <<-EOS - if $facts['os']['family'] == 'RedHat' { - class { 'erlang': epel_enable => true } - Class['erlang'] -> Class['rabbitmq'] - } - class { 'rabbitmq': - service_manage => true, - port => 5672, - delete_guest_user => true, - admin_enable => true, - } -> +describe 'rabbitmq_vhost:' do + before(:all) do + pp = <<-EOS + class { 'rabbitmq': + service_manage => true, + port => 5672, + delete_guest_user => true, + admin_enable => true, + } + EOS - rabbitmq_vhost { 'myhost': - ensure => present, - } - EOS + apply_manifest(pp, catch_failures: true) + end - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + context 'ensure present' do + it_behaves_like 'an idempotent resource' do + let(:manifest) do + <<-PUPPET + rabbitmq_vhost { 'myhost': + ensure => present, + } + PUPPET + end end - it 'has the vhost' do + it 'vhost exist' do shell('rabbitmqctl list_vhosts') do |r| expect(r.stdout).to match(%r{myhost}) expect(r.exit_code).to be_zero diff --git a/spec/classes/rabbitmq_spec.rb b/spec/classes/rabbitmq_spec.rb index d89df2839..99be662d0 100644 --- a/spec/classes/rabbitmq_spec.rb +++ b/spec/classes/rabbitmq_spec.rb @@ -144,13 +144,13 @@ it { is_expected.not_to contain_file('/etc/default/rabbitmq-server') } end - if os_facts[:systemd] + if os_facts['service_provider'] == 'systemd' selinux_ignore_defaults = os_facts[:os]['family'] == 'RedHat' it do is_expected.to contain_systemd__service_limits("#{name}.service"). with_selinux_ignore_defaults(selinux_ignore_defaults). - with_limits('LimitNOFILE' => value). + with_limits('LimitNOFILE' => value, 'OOMScoreAdjust' => 0). with_restart_service(false) end else @@ -179,10 +179,10 @@ it { is_expected.not_to contain_file('/etc/default/rabbitmq-server') } end - if os_facts[:systemd] + if os_facts['service_provider'] == 'systemd' it do is_expected.to contain_systemd__service_limits("#{name}.service"). - with_limits('OOMScoreAdjust' => value). + with_limits({ 'LimitNOFILE' => '16384', 'OOMScoreAdjust' => value }). with_restart_service(false) end else @@ -201,14 +201,14 @@ end end - context 'on systems with systemd', if: os_facts[:systemd] do + context 'on systems with systemd', if: os_facts['service_provider'] == 'systemd' do it do is_expected.to contain_systemd__service_limits("#{name}.service"). with_restart_service(false) end end - context 'on systems without systemd', unless: os_facts[:systemd] do + context 'on systems without systemd', unless: os_facts['service_provider'] == 'systemd' do it { is_expected.not_to contain_systemd__service_limits("#{name}.service") } end @@ -372,7 +372,7 @@ describe 'does not contain pre-ranch settings with default config' do it do is_expected.to contain_file('rabbitmq.config'). \ - without_content(%r{binary,}). \ + without_content(%r{binary,}). \ without_content(%r{\{packet, raw\},}). \ without_content(%r{\{reuseaddr, true\},}) end @@ -383,7 +383,7 @@ it do is_expected.to contain_file('rabbitmq.config'). \ - with_content(%r{binary,}). \ + with_content(%r{binary,}). \ with_content(%r{\{packet, raw\},}). \ with_content(%r{\{reuseaddr, true\},}) end @@ -1776,8 +1776,9 @@ } end - context 'on systems with systemd', if: os_facts[:systemd] do + context 'on systems with systemd', if: os_facts['service_provider'] == 'systemd' do it do + skip is_expected.to contain_service('rabbitmq-server'). that_requires('Class[systemd::systemctl::daemon_reload]') end diff --git a/spec/setup_acceptance_node.pp b/spec/setup_acceptance_node.pp new file mode 100644 index 000000000..a8a6ee125 --- /dev/null +++ b/spec/setup_acceptance_node.pp @@ -0,0 +1,60 @@ +case $facts['os']['family'] { + 'Debian': { + $package_name = 'ssl-cert' + $ssl_key_source = '/etc/ssl/private/ssl-cert-snakeoil.key' + $ssl_cert_source = '/etc/ssl/certs/ssl-cert-snakeoil.pem' + } + 'RedHat': { + $package_name = 'mod_ssl' + $ssl_key_source = '/etc/pki/tls/private/localhost.key' + $ssl_cert_source = '/etc/pki/tls/certs/localhost.crt' + } +} +if $facts['os']['family'] == 'RedHat' and versioncmp($facts['os']['release']['major'], '8') >= 0 { + exec { 'gencerts': + command => '/usr/libexec/httpd-ssl-gencerts', + refreshonly => true, + subscribe => Package[$package_name], + before => [ + File['/tmp/rabbitmq.key'], + File['/tmp/rabbitmq.crt'], + ], + } +} + +if $facts['os']['family'] == 'RedHat' { + case $facts['os']['release']['major'] { + '7': { + package { 'epel-release': + ensure => present, + } + } + '8': { + package { 'centos-release-rabbitmq-38': + ensure => present, + } + } + default: { + } + } +} + +package { $package_name: + ensure => installed, +} + +file { '/tmp/rabbitmq.key': + ensure => file, + mode => '0644', + source => $ssl_key_source, +} +file { '/tmp/rabbitmq.crt': + ensure => file, + mode => '0644', + source => $ssl_cert_source, +} +file { '/tmp/cacert.crt': + ensure => file, + mode => '0644', + source => $ssl_cert_source, +} diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 67cc04489..9efb4ae62 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -3,21 +3,18 @@ # Managed by modulesync - DO NOT EDIT # https://voxpupuli.org/docs/updating-files-managed-with-modulesync/ -RSpec.configure do |c| - c.mock_with :mocha -end - # puppetlabs_spec_helper will set up coverage if the env variable is set. # We want to do this if lib exists and it hasn't been explicitly set. ENV['COVERAGE'] ||= 'yes' if Dir.exist?(File.expand_path('../lib', __dir__)) require 'voxpupuli/test/spec_helper' +add_mocked_facts! + if File.exist?(File.join(__dir__, 'default_module_facts.yml')) facts = YAML.safe_load(File.read(File.join(__dir__, 'default_module_facts.yml'))) facts&.each do |name, value| add_custom_fact name.to_sym, value end end - -require 'spec_helper_local' +Dir['./spec/support/spec/**/*.rb'].sort.each { |f| require f } diff --git a/spec/spec_helper_acceptance.rb b/spec/spec_helper_acceptance.rb index 94706e396..2681792ea 100644 --- a/spec/spec_helper_acceptance.rb +++ b/spec/spec_helper_acceptance.rb @@ -1,106 +1,10 @@ # frozen_string_literal: true -require 'voxpupuli/acceptance/spec_helper_acceptance' - -configure_beaker do |host| - case fact_on(host, 'os.family') - when 'Debian' - install_module_from_forge_on(host, 'puppetlabs-apt', '>= 4.1.0 < 9.0.0') - when 'RedHat' - install_module_from_forge_on(host, 'garethr-erlang', '>= 0.3.0 < 1.0.0') - if fact_on(host, 'os.selinux.enabled') - # Make sure selinux is disabled so the tests work. - on host, puppet('resource', 'exec', 'setenforce 0', 'path=/bin:/sbin:/usr/bin:/usr/sbin', 'onlyif=which setenforce && getenforce | grep Enforcing') - end - end +# Managed by modulesync - DO NOT EDIT +# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/ - install_package(host, 'iproute2') if fact('os.release.major').to_i == 18 || fact('os.release.major') == 'buster/sid' - - # Fake certs - on host, 'echo "-----BEGIN RSA PRIVATE KEY----- -MIICXAIBAAKBgQDw1uXI+EAgxk4dOxArPqMNnnCQqmXeQ61XQQXoAgWWjRvY4LAJ -4ALoACYWFlWVKQkLLQfQ2YYM3vNDG/eYfL2tjhp9APeJrJYJEcbmr5COURtuIh/Z -fVKRgV5vtOMdlAHS0HFpk/DP1g520Da9wKwv2nDbfRui0y0ImPWz1uqK8wIDAQAB -AoGBAJ/cNMgyJ/bZSk5SvwfFWtuWWGdeA6IF0BBDo9T9SpJE9b/+XDshyywNtToh -9wq8Izmc2TxCtpzifBwGe1FnM0qvioQhwQwJsGa4JJFzSkIt/MgPmojzutnP59RJ -ozjCgAahX6xEkB6Kn/b2S6D7jgixyMTQ3FdPKq6lJVhXz6Q5AkEA+tSgg/xhrcTs -5W//hYZP/xjrE27xXzfkNrr/cAtVH5ZM2j2qqKFv3wEn9tAKrUvM+KNDhEjgLUSd -MjvvH5DYZQJBAPXNjsg4AG09KqWbvcbB2Cgaf6RRTAe+Hx6A7aB01OQohc5uF0ws -cPxZ8CE/KDbHtNSlx1MAvn8IOoitA06s5HcCQErP/mw/a3bjxHCOXh0aOWPxr7Ol -JHLs/bFhRuzJRINeVd/GAs+3DuHpu1y/ImAbuq/yKiIbhlmaHHSuMZ0tm40CQHHi -FzE0oR37pPKtwbOAxEFwZYsgD3XW5Fwhp/cbqjc7fyMxZqHoRUDl+pesx1j6FhIf -7MXMJnZ8vYHthwbAm+kCQHFH0HULyNcki4zEYSqiLaVMcbB7QybQmBBDA0mJR2HO -KYdYDeFG3kfeBOReFM9jOt39OBS/nNP0GXFBJU2ahpQ= ------END RSA PRIVATE KEY-----" > /tmp/rabbitmq.key' - on host, 'echo "-----BEGIN CERTIFICATE----- -MIIEYTCCAkmgAwIBAgIQVAIiKvJ6YmTSszWEfassuDANBgkqhkiG9w0BAQUFADCB -qjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFDASBgNVBAcMC0xv -cyBBbmdlbGVzMRUwEwYDVQQKDAxBY21lIFdpZGdldHMxETAPBgNVBAsMCFNlY3Vy -aXR5MR0wGwYDVQQDDBRyYWJiaXRtcS5leGFtcGxlLmNvbTEnMCUGCSqGSIb3DQEJ -ARYYcm9nZXIucmFiYml0QGV4YW1wbGUuY29tMB4XDTE3MDkxMzAzMzExMloXDTI3 -MDkxMTAzMzExMlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEQMA4GA1UE -BwwHQ2hpY2FnbzENMAsGA1UECgwEQWNtZTEQMA4GA1UECwwHV2lkZ2V0czEdMBsG -A1UEAwwUcmFiYml0bXEuZXhhbXBsZS5jb20xJzAlBgkqhkiG9w0BCQEWGHJvZ2Vy -LnJhYmJpdEBleGFtcGxlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA -8NblyPhAIMZOHTsQKz6jDZ5wkKpl3kOtV0EF6AIFlo0b2OCwCeAC6AAmFhZVlSkJ -Cy0H0NmGDN7zQxv3mHy9rY4afQD3iayWCRHG5q+QjlEbbiIf2X1SkYFeb7TjHZQB -0tBxaZPwz9YOdtA2vcCsL9pw230botMtCJj1s9bqivMCAwEAAaMaMBgwCQYDVR0T -BAIwADALBgNVHQ8EBAMCBeAwDQYJKoZIhvcNAQEFBQADggIBAIPXqHlxbo+BpBWz -H+E7lFDYZkUQD8c34jybxZbwya7od/f9x5jU3F/+6g1Y7A8NAPPxbs+m3Sye0/sz -WmEz+smKFseGVPWQJ6NgvYJjr8P/MpBUfA7zkkaKs2uuTbPx0tgU1+XGluC1hsZ+ -KQCI0LIEGQlSuT3miPSYL6MPR9o/PTp6TPlYGbL+LLNQedriZRLuiUpOWJzsFyz/ -CcdayANtlWxhuy50A9qUwAa5RzgIJnqfxk5OYuJHq7+p1oCKk+XhgHccHHq7t97M -Ye/xC18NDTMKkAiggCad0+kYTUgUYnuwvYg4eRpQytsncp7Ck83JChb56eJKlsj1 -HnEkQDyi1B/cKxRKwG81fzkSgw7+0nFY6GAIaGz1GdYBkoxlzN9JNd3/MmS+xAtm -HXtCqkTWUJQ5ZBinszauPtG4Inu6H28blstlqGjzKTzwo1w8N27shii14IhEHhEV -tVRxA+ORIt14fZrl04AROsYLqJxqBHy8vJEX4OMm2JTzaO2KdPwEi2gmQK0SkfR8 -TCQc43SF2rqpYs3ZE4fPNlyQR3ZCUcYwjv99s6Nz0Ue4vD9+PuT0McE8NtMgiAMf -DQqmYIMEiYNm15qKW6jJaY7VMUPGNohfEvubsWPlXPQ6/I7e9bNyk5OnA6OGi4qz -M2Fcgn+pqLU7M+epynzgz4bsPsEw ------END CERTIFICATE-----" > /tmp/rabbitmq.crt' - on host, 'echo "-----BEGIN CERTIFICATE----- -MIIGKTCCBBGgAwIBAgIJAMCISMDHjBJpMA0GCSqGSIb3DQEBBQUAMIGqMQswCQYD -VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEUMBIGA1UEBwwLTG9zIEFuZ2Vs -ZXMxFTATBgNVBAoMDEFjbWUgV2lkZ2V0czERMA8GA1UECwwIU2VjdXJpdHkxHTAb -BgNVBAMMFHJhYmJpdG1xLmV4YW1wbGUuY29tMScwJQYJKoZIhvcNAQkBFhhyb2dl -ci5yYWJiaXRAZXhhbXBsZS5jb20wHhcNMTcwOTEzMDMzMTAyWhcNMjcwOTExMDMz -MTAyWjCBqjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFDASBgNV -BAcMC0xvcyBBbmdlbGVzMRUwEwYDVQQKDAxBY21lIFdpZGdldHMxETAPBgNVBAsM -CFNlY3VyaXR5MR0wGwYDVQQDDBRyYWJiaXRtcS5leGFtcGxlLmNvbTEnMCUGCSqG -SIb3DQEJARYYcm9nZXIucmFiYml0QGV4YW1wbGUuY29tMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA2WBjjypMwd4QU2m2K3ChuviDjY/4/c/cwcJBiM2l -ibQdTO77is5Ub017/z+/Y9kZ4BMO86G97nkafG+mqyuWQj7kaOOAtaZ72Vz4Z2wl -3eij08OZO4rr3WvYP1VPqgM0FuGxA3iIuP1wl+IhaHLLH+HW5wsnl74pdBC+q7lv -FKgd1xtCR0bWXVPbiYUi70rL2VA5j+Tp7gJy2XL0/tr3j+KSmqm6zKPrrl4xSLKW -AZ0o8PFxO9eev5qxf9YYa8LGj7nNLpaqD77ituD27AYdQ4nIaRia4WXyJpyUQ6RS -z87JsKZELZnQkd6EOXL5C/H0AZHz6KGbU7f4Zpxg0dj0vArunSxoMZRICfuGespi -KGRCENL12HP7kAM+kdoWXcN5xd+NF+IJqoKORX/P9a8VNA3xn5EGMX/b+gcVOpB3 -0H/gWMYI8M2rnFSDWw+1+qgJfV1meRM6+bj4Fab9mFxMPuqPCsd4YUQdSEOlV7L+ -FpixpbOUEUIGSGCkE0tBdJ2zpStAnB3TsrjYhSU1GsevrdKEa5msfkHTDpZV/9EY -AXo6WMWHWQe+joxnQzr9r8dlmdsyH0mN+cDxUmlQIwwvHqEtf7CVkN0cx7qKPhQ0 -vHX2NmlfmpgTf5LKnC4xrz8M8OsMfMV5efck0lLYuGKe4wFiBdCoTQvHRuCBncP+ -npMCAwEAAaNQME4wHQYDVR0OBBYEFCkQ7/iSfDsHVL0UcA9vuEB5mqL5MB8GA1Ud -IwQYMBaAFCkQ7/iSfDsHVL0UcA9vuEB5mqL5MAwGA1UdEwQFMAMBAf8wDQYJKoZI -hvcNAQEFBQADggIBAEpHP9B7YbsykJ0mMDgXtUog7ZgY5qMf7YFnNrF7Gj0RRRsa -O9oMSyQbOH6hEgr4b89Vval0ojKg0nWjP/KO73IRwb/eXewWV2THJaKW8Nj0T3mP -Zai2OHEKIk33qBlAOMbgjL5GTwAbWuwPg8hQYySscOGblknQEdCLweRoCCU9m0dA -EgQpemsELJoY0i2HkrAVK9+FCmxr0N4ApEckw/+KZxL/Yb0Sz3R3+0FM3JGkbdgi -2zP5xBEpJszHZqpwsxSwrLbnACrwv7xdxso/ojiW2MWPGqB/g3hHY9PexV732ZNK -sRN2WJmRQ1G1RzKs8pi352hbra3WDmeEb0AQEuda6sqx6mu0EiomKN5JOq+pltyK -PvQuBvJV04HwFqpTm7wAJprF1F+9y1B4PDt8c+/CnMBKMOJ9nv84qZEq2ihp65LK -valeoetcimRCEJ5xnqGCza/sSDHjUMUvMhwMJdq56t0zKMk5pFH6lHxzgAKzX3Gt -pct+50AzBHUSn0zpB6QRBow2MddivGmTs1IOFdWaSj+Mfdb6phln1Hkv+KW2Wizv -I28L690yK+Bnk1ezGs+ln6yxiWOdnurckaLkTj6/JFw2x5q/uaTXOxjG/YKKpMQE -Fq8uI2+DbX/zW18ZIEv6UloGEEWbLO1427+Yyb/THMczWYyH20PTyzT8zFOt ------END CERTIFICATE-----" > /tmp/cacert.crt' -end +require 'voxpupuli/acceptance/spec_helper_acceptance' -shared_examples 'an idempotent resource' do - it 'applies with no errors' do - apply_manifest(pp, catch_failures: true) - end +configure_beaker(modules: :metadata) - it 'applies a second time without changes' do - apply_manifest(pp, catch_changes: true) - end -end +Dir['./spec/support/acceptance/**/*.rb'].sort.each { |f| require f } diff --git a/spec/spec_helper_local.rb b/spec/support/spec/custom_facts.rb similarity index 69% rename from spec/spec_helper_local.rb rename to spec/support/spec/custom_facts.rb index b0fca3a88..db6977ee9 100644 --- a/spec/spec_helper_local.rb +++ b/spec/support/spec/custom_facts.rb @@ -1,4 +1,4 @@ # frozen_string_literal: true -add_custom_fact :rabbitmq_version, '3.6.1' # puppet-rabbitmq +add_custom_fact :rabbitmq_version, '3.8.2' # puppet-rabbitmq add_custom_fact :erl_ssl_path, '/usr/lib64/erlang/lib/ssl-7.3.3.1/ebin' # puppet-rabbitmq diff --git a/spec/unit/facter/util/fact_erl_ssl_path_spec.rb b/spec/unit/facter/util/fact_erl_ssl_path_spec.rb index d6e8945f7..63dae52ea 100644 --- a/spec/unit/facter/util/fact_erl_ssl_path_spec.rb +++ b/spec/unit/facter/util/fact_erl_ssl_path_spec.rb @@ -8,23 +8,23 @@ describe 'erl_ssl_path' do context 'with valid value' do it do - Facter::Util::Resolution.expects(:which).with('erl').returns(true) - Facter::Core::Execution.expects(:execute).with("erl -eval 'io:format(\"~p\", [code:lib_dir(ssl, ebin)]),halt().' -noshell").returns('"/usr/lib64/erlang/lib/ssl-5.3.3/ebin"') + allow(Facter::Util::Resolution).to receive(:which).with('erl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with("erl -eval 'io:format(\"~p\", [code:lib_dir(ssl, ebin)]),halt().' -noshell").and_return('"/usr/lib64/erlang/lib/ssl-5.3.3/ebin"') expect(Facter.fact(:erl_ssl_path).value).to eq('/usr/lib64/erlang/lib/ssl-5.3.3/ebin') end end context 'with error message' do it do - Facter::Util::Resolution.expects(:which).with('erl').returns(true) - Facter::Core::Execution.expects(:execute).with("erl -eval 'io:format(\"~p\", [code:lib_dir(ssl, ebin)]),halt().' -noshell").returns('{error,bad_name}') + allow(Facter::Util::Resolution).to receive(:which).with('erl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with("erl -eval 'io:format(\"~p\", [code:lib_dir(ssl, ebin)]),halt().' -noshell").and_return('{error,bad_name}') expect(Facter.fact(:erl_ssl_path).value).to be_nil end end context 'with erl not present' do it do - Facter::Util::Resolution.expects(:which).with('erl').returns(false) + allow(Facter::Util::Resolution).to receive(:which).with('erl').and_return(false) expect(Facter.fact(:erl_ssl_path).value).to be_nil end end diff --git a/spec/unit/facter/util/fact_rabbitmq_clustername_spec.rb b/spec/unit/facter/util/fact_rabbitmq_clustername_spec.rb index abd3228d1..0ec69b2f3 100644 --- a/spec/unit/facter/util/fact_rabbitmq_clustername_spec.rb +++ b/spec/unit/facter/util/fact_rabbitmq_clustername_spec.rb @@ -10,32 +10,32 @@ describe 'rabbitmq_clusternam' do context 'with value' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqctl -q cluster_status 2>&1').returns(' {cluster_name,<<"monty">>},') + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqctl -q cluster_status 2>&1').and_return(' {cluster_name,<<"monty">>},') expect(Facter.fact(:rabbitmq_clustername).value).to eq('monty') end end context 'with dashes in hostname' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqctl -q cluster_status 2>&1').returns('Cluster name: rabbit-1') + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqctl -q cluster_status 2>&1').and_return('Cluster name: rabbit-1') expect(Facter.fact(:rabbitmq_clustername).value).to eq('rabbit-1') end end context 'with dashes in clustername/hostname' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqctl -q cluster_status 2>&1').returns(' {cluster_name,<<"monty-python@rabbit-1">>},') + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqctl -q cluster_status 2>&1').and_return(' {cluster_name,<<"monty-python@rabbit-1">>},') expect(Facter.fact(:rabbitmq_clustername).value).to eq('monty-python@rabbit-1') end end context 'with quotes around node name' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqctl -q cluster_status 2>&1').returns("monty\npython\nCluster name: 'monty@rabbit-1'\nend\nof\nfile") + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqctl -q cluster_status 2>&1').and_return("monty\npython\nCluster name: 'monty@rabbit-1'\nend\nof\nfile") expect(Facter.fact(:rabbitmq_clustername).value).to eq("'monty@rabbit-1'") end end @@ -63,15 +63,15 @@ - cookie hash: 6WdP0nl6d3HYqA5vTKMkIg== EOS - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqctl -q cluster_status 2>&1').returns(error_string) + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqctl -q cluster_status 2>&1').and_return(error_string) expect(Facter.fact(:rabbitmq_clustername).value).to be_nil end end context 'rabbitmqctl is not in path' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(false) + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(false) expect(Facter.fact(:rabbitmq_clustername).value).to be_nil end end diff --git a/spec/unit/facter/util/fact_rabbitmq_nodename_spec.rb b/spec/unit/facter/util/fact_rabbitmq_nodename_spec.rb index 344581965..51ccacee3 100644 --- a/spec/unit/facter/util/fact_rabbitmq_nodename_spec.rb +++ b/spec/unit/facter/util/fact_rabbitmq_nodename_spec.rb @@ -8,40 +8,40 @@ describe 'rabbitmq_nodename' do context 'with value' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqctl status 2>&1').returns('Status of node monty@rabbit1 ...') + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqctl status 2>&1').and_return('Status of node monty@rabbit1 ...') expect(Facter.fact(:rabbitmq_nodename).value).to eq('monty@rabbit1') end end context 'with dashes in hostname' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqctl status 2>&1').returns('Status of node monty@rabbit-1 ...') + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqctl status 2>&1').and_return('Status of node monty@rabbit-1 ...') expect(Facter.fact(:rabbitmq_nodename).value).to eq('monty@rabbit-1') end end context 'with dashes in nodename/hostname' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqctl status 2>&1').returns('Status of node monty-python@rabbit-1 ...') + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqctl status 2>&1').and_return('Status of node monty-python@rabbit-1 ...') expect(Facter.fact(:rabbitmq_nodename).value).to eq('monty-python@rabbit-1') end end context 'with quotes around node name' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqctl status 2>&1').returns('Status of node \'monty@rabbit-1\' ...') + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqctl status 2>&1').and_return('Status of node \'monty@rabbit-1\' ...') expect(Facter.fact(:rabbitmq_nodename).value).to eq('monty@rabbit-1') end end context 'without trailing points' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqctl status 2>&1').returns('Status of node monty@rabbit-1') + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqctl status 2>&1').and_return('Status of node monty@rabbit-1') expect(Facter.fact(:rabbitmq_nodename).value).to eq('monty@rabbit-1') end end @@ -69,15 +69,15 @@ - cookie hash: 6WdP0nl6d3HYqA5vTKMkIg== EOS - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqctl status 2>&1').returns(error_string) + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqctl status 2>&1').and_return(error_string) expect(Facter.fact(:rabbitmq_nodename).value).to eq('monty@rabbit-1') end end context 'rabbitmqctl is not in path' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(false) + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(false) expect(Facter.fact(:rabbitmq_nodename).value).to be_nil end end diff --git a/spec/unit/facter/util/fact_rabbitmq_plugins_dirs_spec.rb b/spec/unit/facter/util/fact_rabbitmq_plugins_dirs_spec.rb index 04a10e358..beb04f792 100644 --- a/spec/unit/facter/util/fact_rabbitmq_plugins_dirs_spec.rb +++ b/spec/unit/facter/util/fact_rabbitmq_plugins_dirs_spec.rb @@ -8,32 +8,23 @@ describe 'rabbitmq_plugins_dirs' do context 'with multiple plugins dirs' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with("rabbitmqctl eval 'application:get_env(rabbit, plugins_dir).'").returns('{ok,"/usr/lib/rabbitmq/plugins:/usr/lib/rabbitmq/lib/rabbitmq_server-3.7.10/plugins"}') - expect(Facter.fact(:rabbitmq_plugins_dirs).value).to match_array( - [ - '/usr/lib/rabbitmq/plugins', - '/usr/lib/rabbitmq/lib/rabbitmq_server-3.7.10/plugins' - ] - ) + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with("rabbitmqctl eval 'application:get_env(rabbit, plugins_dir).'").and_return('{ok,"/usr/lib/rabbitmq/plugins:/usr/lib/rabbitmq/lib/rabbitmq_server-3.7.10/plugins"}') + expect(Facter.fact(:rabbitmq_plugins_dirs).value).to contain_exactly('/usr/lib/rabbitmq/plugins', '/usr/lib/rabbitmq/lib/rabbitmq_server-3.7.10/plugins') end end context 'with only 1 plugins dir' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(true) - Facter::Core::Execution.expects(:execute).with("rabbitmqctl eval 'application:get_env(rabbit, plugins_dir).'").returns('{ok,"/usr/lib/rabbitmq/lib/rabbitmq_server-0.0.0/plugins"}') - expect(Facter.fact(:rabbitmq_plugins_dirs).value).to match_array( - [ - '/usr/lib/rabbitmq/lib/rabbitmq_server-0.0.0/plugins' - ] - ) + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with("rabbitmqctl eval 'application:get_env(rabbit, plugins_dir).'").and_return('{ok,"/usr/lib/rabbitmq/lib/rabbitmq_server-0.0.0/plugins"}') + expect(Facter.fact(:rabbitmq_plugins_dirs).value).to contain_exactly('/usr/lib/rabbitmq/lib/rabbitmq_server-0.0.0/plugins') end end context 'rabbitmqctl is not in path' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqctl').returns(false) + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqctl').and_return(false) expect(Facter.fact(:rabbitmq_plugins_dirs).value).to be_nil end end diff --git a/spec/unit/facter/util/fact_rabbitmq_version_spec.rb b/spec/unit/facter/util/fact_rabbitmq_version_spec.rb index 68c6b6b7c..f2ce60994 100644 --- a/spec/unit/facter/util/fact_rabbitmq_version_spec.rb +++ b/spec/unit/facter/util/fact_rabbitmq_version_spec.rb @@ -10,23 +10,23 @@ describe 'rabbitmq_version' do context 'with value' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqadmin').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqadmin --version 2>&1').returns('rabbitmqadmin 3.6.0') + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqadmin').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqadmin --version 2>&1').and_return('rabbitmqadmin 3.6.0') expect(Facter.fact(:rabbitmq_version).value).to eq('3.6.0') end end context 'with invalid value' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqadmin').returns(true) - Facter::Core::Execution.expects(:execute).with('rabbitmqadmin --version 2>&1').returns('rabbitmqadmin %%VSN%%') + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqadmin').and_return(true) + allow(Facter::Core::Execution).to receive(:execute).with('rabbitmqadmin --version 2>&1').and_return('rabbitmqadmin %%VSN%%') expect(Facter.fact(:rabbitmq_version).value).to be_nil end end context 'rabbitmqadmin is not in path' do it do - Facter::Util::Resolution.expects(:which).with('rabbitmqadmin').returns(false) + allow(Facter::Util::Resolution).to receive(:which).with('rabbitmqadmin').and_return(false) expect(Facter.fact(:rabbitmq_version).value).to be_nil end end diff --git a/spec/unit/puppet/provider/rabbitmq_binding/rabbitmqadmin_spec.rb b/spec/unit/puppet/provider/rabbitmq_binding/rabbitmqadmin_spec.rb index c92384e93..bf7cf9f6a 100644 --- a/spec/unit/puppet/provider/rabbitmq_binding/rabbitmqadmin_spec.rb +++ b/spec/unit/puppet/provider/rabbitmq_binding/rabbitmqadmin_spec.rb @@ -2,29 +2,30 @@ require 'spec_helper' -provider_class = Puppet::Type.type(:rabbitmq_binding).provider(:rabbitmqadmin) -describe provider_class do - let(:resource) do - Puppet::Type::Rabbitmq_binding.new( +describe Puppet::Type.type(:rabbitmq_binding).provider(:rabbitmqadmin) do + let(:params) do + { name: 'source@target@/', destination_type: :queue, routing_key: 'blablub', arguments: {} - ) + } end - let(:provider) { provider_class.new(resource) } + let(:type_class) { Puppet::Type.type(:rabbitmq_binding).provider(:rabbitmqadmin) } + let(:resource) { Puppet::Type.type(:rabbitmq_binding).new(params) } + let(:provider) { resource.provider } + let(:instances) { type_class.instances } describe '#instances' do it 'returns instances' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with( + allow(type_class).to receive(:rabbitmqctl_list).with( 'bindings', '-p', '/', 'source_name', 'destination_name', 'destination_kind', 'routing_key', 'arguments' - ).returns <<~EOT + ).and_return <<~EOT exchange\tdst_queue\tqueue\t*\t[] EOT - instances = provider_class.instances expect(instances.size).to eq(1) expect(instances.map do |prov| { @@ -44,16 +45,15 @@ end it 'returns multiple instances' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with( + allow(type_class).to receive(:rabbitmqctl_list).with( 'bindings', '-p', '/', 'source_name', 'destination_name', 'destination_kind', 'routing_key', 'arguments' - ).returns <<~EOT + ).and_return <<~EOT exchange\tdst_queue\tqueue\trouting_one\t[] exchange\tdst_queue\tqueue\trouting_two\t[] EOT - instances = provider_class.instances expect(instances.size).to eq(2) expect(instances.map do |prov| { @@ -80,48 +80,48 @@ end describe 'Test for prefetch error' do - let(:resource) do - Puppet::Type::Rabbitmq_binding.new( + let(:params) do + { name: 'binding1', source: 'exchange1', destination: 'destqueue', destination_type: :queue, routing_key: 'blablubd', arguments: {} - ) + } end it 'exists' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with( + allow(type_class).to receive(:rabbitmqctl_list).with( 'bindings', '-p', '/', 'source_name', 'destination_name', 'destination_kind', 'routing_key', 'arguments' - ).returns <<~EOT + ).and_return <<~EOT exchange\tdst_queue\tqueue\t*\t[] EOT - provider_class.prefetch({}) + type_class.prefetch({}) end it 'matches' do # Test resource to match against - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with( + allow(type_class).to receive(:rabbitmqctl_list).with( 'bindings', '-p', '/', 'source_name', 'destination_name', 'destination_kind', 'routing_key', 'arguments' - ).returns <<~EOT + ).and_return <<~EOT exchange\tdst_queue\tqueue\t*\t[] EOT - provider_class.prefetch('binding1' => resource) + type_class.prefetch('binding1' => resource) end end describe '#create' do it 'calls rabbitmqadmin to create' do - provider.expects(:rabbitmqadmin).with( + allow(type_class).to receive(:rabbitmqadmin).with( 'declare', 'binding', '--vhost=/', '--user=guest', '--password=guest', '-c', '/etc/rabbitmq/rabbitmqadmin.conf', 'source=source', 'destination=target', 'arguments={}', 'routing_key=blablub', 'destination_type=queue' ) @@ -129,20 +129,19 @@ end context 'specifying credentials' do - let(:resource) do - Puppet::Type::Rabbitmq_binding.new( + let(:params) do + { name: 'source@test2@/', destination_type: :queue, routing_key: 'blablubd', arguments: {}, user: 'colin', password: 'secret' - ) + } end - let(:provider) { provider_class.new(resource) } it 'calls rabbitmqadmin to create' do - provider.expects(:rabbitmqadmin).with( + allow(type_class).to receive(:rabbitmqadmin).with( 'declare', 'binding', '--vhost=/', '--user=colin', '--password=secret', '-c', '/etc/rabbitmq/rabbitmqadmin.conf', 'source=source', 'destination=test2', 'arguments={}', 'routing_key=blablubd', 'destination_type=queue' ) @@ -151,20 +150,19 @@ end context 'new queue_bindings' do - let(:resource) do - Puppet::Type::Rabbitmq_binding.new( + let(:params) do + { name: 'binding1', source: 'exchange1', destination: 'destqueue', destination_type: :queue, routing_key: 'blablubd', arguments: {} - ) + } end - let(:provider) { provider_class.new(resource) } it 'calls rabbitmqadmin to create' do - provider.expects(:rabbitmqadmin).with( + allow(type_class).to receive(:rabbitmqadmin).with( 'declare', 'binding', '--vhost=/', '--user=guest', '--password=guest', '-c', '/etc/rabbitmq/rabbitmqadmin.conf', 'source=exchange1', 'destination=destqueue', 'arguments={}', 'routing_key=blablubd', 'destination_type=queue' ) @@ -175,7 +173,7 @@ describe '#destroy' do it 'calls rabbitmqadmin to destroy' do - provider.expects(:rabbitmqadmin).with( + allow(type_class).to receive(:rabbitmqadmin).with( 'delete', 'binding', '--vhost=/', '--user=guest', '--password=guest', '-c', '/etc/rabbitmq/rabbitmqadmin.conf', 'source=source', 'destination_type=queue', 'destination=target', 'properties_key=blablub' ) diff --git a/spec/unit/puppet/provider/rabbitmq_cli_spec.rb b/spec/unit/puppet/provider/rabbitmq_cli_spec.rb index c4bfa13dc..63f920ac1 100644 --- a/spec/unit/puppet/provider/rabbitmq_cli_spec.rb +++ b/spec/unit/puppet/provider/rabbitmq_cli_spec.rb @@ -4,41 +4,40 @@ require 'puppet/provider/rabbitmq_cli' -provider_class = Puppet::Provider::RabbitmqCli -describe provider_class do +describe Puppet::Provider::RabbitmqCli do before do # Clear the cached version before each test - provider_class.remove_instance_variable(:@rabbitmq_version) \ - if provider_class.instance_variable_defined?(:@rabbitmq_version) + described_class.remove_instance_variable(:@rabbitmq_version) \ + if described_class.instance_variable_defined?(:@rabbitmq_version) end it 'gets the RabbitMQ version' do - provider_class.expects(:rabbitmqctl).with('-q', 'status').returns ' [{rabbit,"RabbitMQ","3.7.28"},' - expect(provider_class.rabbitmq_version).to eq('3.7.28') + allow(described_class).to receive(:rabbitmqctl).with('-q', 'status').and_return ' [{rabbit,"RabbitMQ","3.7.28"},' + expect(described_class.rabbitmq_version).to eq('3.7.28') end it 'caches the RabbitMQ version' do - provider_class.expects(:rabbitmqctl).with('-q', 'status').returns ' [{rabbit,"RabbitMQ","3.7.28"},' - v1 = provider_class.rabbitmq_version + allow(described_class).to receive(:rabbitmqctl).with('-q', 'status').and_return ' [{rabbit,"RabbitMQ","3.7.28"},' + v1 = described_class.rabbitmq_version # No second expects for rabbitmqctl as it shouldn't be called again - expect(provider_class.rabbitmq_version).to eq(v1) + expect(described_class.rabbitmq_version).to eq(v1) end it 'gets the RabbitMQ version with version >= 3.8' do - provider_class.expects(:rabbitmqctl).with('-q', 'status').returns 'RabbitMQ version: 3.10.6' - expect(provider_class.rabbitmq_version).to eq('3.10.6') + allow(described_class).to receive(:rabbitmqctl).with('-q', 'status').and_return 'RabbitMQ version: 3.10.6' + expect(described_class.rabbitmq_version).to eq('3.10.6') end it 'uses correct list options with RabbitMQ < 3.7.9' do - provider_class.expects(:rabbitmq_version).returns '3.7.8' - provider_class.expects(:rabbitmqctl).with('list_vhost', '-q').returns '' - expect(provider_class.rabbitmqctl_list('vhost')).to eq('') + allow(described_class).to receive(:rabbitmq_version).and_return '3.7.8' + allow(described_class).to receive(:rabbitmqctl).with('list_vhost', '-q').and_return '' + expect(described_class.rabbitmqctl_list('vhost')).to eq('') end it 'uses correct list options with RabbitMQ >= 3.7.9' do - provider_class.expects(:rabbitmq_version).returns '3.7.10' - provider_class.expects(:rabbitmqctl).with('list_vhost', '-q', '--no-table-headers').returns '' - expect(provider_class.rabbitmqctl_list('vhost')).to eq('') + allow(described_class).to receive(:rabbitmq_version).and_return '3.7.10' + allow(described_class).to receive(:rabbitmqctl).with('list_vhost', '-q', '--no-table-headers').and_return '' + expect(described_class.rabbitmqctl_list('vhost')).to eq('') end end diff --git a/spec/unit/puppet/provider/rabbitmq_cluster/rabbitmqctl_spec.rb b/spec/unit/puppet/provider/rabbitmq_cluster/rabbitmqctl_spec.rb index 0e5a19e35..cf3206516 100644 --- a/spec/unit/puppet/provider/rabbitmq_cluster/rabbitmqctl_spec.rb +++ b/spec/unit/puppet/provider/rabbitmq_cluster/rabbitmqctl_spec.rb @@ -2,19 +2,21 @@ require 'spec_helper' -provider_class = Puppet::Type.type(:rabbitmq_cluster).provider(:rabbitmqctl) -describe provider_class do - let(:resource) do - Puppet::Type::Rabbitmq_cluster.new( +describe Puppet::Type.type(:rabbitmq_cluster).provider(:rabbitmqctl) do + let(:params) do + { name: 'test_cluster', - init_node: 'host1' - ) + init_node: 'host1', + provider: described_class.name, + } end - let(:provider) { provider_class.new(resource) } + let(:type_class) { Puppet::Type.type(:rabbitmq_cluster).provider(:rabbitmqctl) } + let(:resource) { Puppet::Type.type(:rabbitmq_cluster).new(params) } + let(:provider) { resource.provider } describe '#exists?' do it { - provider.expects(:rabbitmqctl).with('-q', 'cluster_status').returns( + allow(type_class).to receive(:rabbitmqctl).with('-q', 'cluster_status').and_return( 'Cluster name: test_cluster' ) expect(provider.exists?).to be true @@ -23,18 +25,18 @@ describe '#create on every other node' do it 'joins a cluster or changes the cluster name' do - provider.expects(:rabbitmqctl).with('stop_app') - provider.expects(:rabbitmqctl).with('join_cluster', 'rabbit@host1', '--disc') - provider.expects(:rabbitmqctl).with('start_app') + allow(type_class).to receive(:rabbitmqctl).with('stop_app') + allow(type_class).to receive(:rabbitmqctl).with('join_cluster', 'rabbit@host1', '--disc') + allow(type_class).to receive(:rabbitmqctl).with('start_app') provider.create end end describe '#destroy' do it 'remove cluster setup' do - provider.expects(:rabbitmqctl).with('stop_app') - provider.expects(:rabbitmqctl).with('reset') - provider.expects(:rabbitmqctl).with('start_app') + allow(type_class).to receive(:rabbitmqctl).with('stop_app') + allow(type_class).to receive(:rabbitmqctl).with('reset') + allow(type_class).to receive(:rabbitmqctl).with('start_app') provider.destroy end end diff --git a/spec/unit/puppet/provider/rabbitmq_exchange/rabbitmqadmin_spec.rb b/spec/unit/puppet/provider/rabbitmq_exchange/rabbitmqadmin_spec.rb index ad993f142..89512b6c3 100644 --- a/spec/unit/puppet/provider/rabbitmq_exchange/rabbitmqadmin_spec.rb +++ b/spec/unit/puppet/provider/rabbitmq_exchange/rabbitmqadmin_spec.rb @@ -2,10 +2,9 @@ require 'spec_helper' -provider_class = Puppet::Type.type(:rabbitmq_exchange).provider(:rabbitmqadmin) -describe provider_class do - let(:resource) do - Puppet::Type::Rabbitmq_exchange.new( +describe Puppet::Type.type(:rabbitmq_exchange).provider(:rabbitmqadmin) do + let(:params) do + { name: 'test.headers@/', type: :headers, internal: :false, @@ -14,15 +13,18 @@ arguments: { 'hash-headers' => 'message-distribution-hash' } - ) + } end - let(:provider) { provider_class.new(resource) } + let(:type_class) { Puppet::Type.type(:rabbitmq_exchange).provider(:rabbitmqadmin) } + let(:resource) { Puppet::Type.type(:rabbitmq_exchange).new(params) } + let(:provider) { resource.provider } + let(:instances) { type_class.instances } it 'returns instances' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with('exchanges', '-p', '/', 'name', 'type', 'internal', 'durable', 'auto_delete', 'arguments').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('exchanges', '-p', '/', 'name', 'type', 'internal', 'durable', 'auto_delete', 'arguments').and_return <<~EOT direct false true false [] amq.direct direct false true false [] amq.fanout fanout false true false [] @@ -33,23 +35,22 @@ amq.topic topic false true false [] test.headers x-consistent-hash false true false [{"hash-header","message-distribution-hash"}] EOT - instances = provider_class.instances expect(instances.size).to eq(9) end it 'calls rabbitmqadmin to create as guest' do - provider.expects(:rabbitmqadmin).with('declare', 'exchange', '--vhost=/', '--user=guest', '--password=guest', 'name=test.headers', 'type=headers', 'internal=false', 'durable=true', 'auto_delete=false', 'arguments={"hash-headers":"message-distribution-hash"}', '-c', '/etc/rabbitmq/rabbitmqadmin.conf') + allow(type_class).to receive(:rabbitmqadmin).with('declare', 'exchange', '--vhost=/', '--user=guest', '--password=guest', 'name=test.headers', 'type=headers', 'internal=false', 'durable=true', 'auto_delete=false', 'arguments={"hash-headers":"message-distribution-hash"}', '-c', '/etc/rabbitmq/rabbitmqadmin.conf') provider.create end it 'calls rabbitmqadmin to destroy' do - provider.expects(:rabbitmqadmin).with('delete', 'exchange', '--vhost=/', '--user=guest', '--password=guest', 'name=test.headers', '-c', '/etc/rabbitmq/rabbitmqadmin.conf') + allow(type_class).to receive(:rabbitmqadmin).with('delete', 'exchange', '--vhost=/', '--user=guest', '--password=guest', 'name=test.headers', '-c', '/etc/rabbitmq/rabbitmqadmin.conf') provider.destroy end context 'specifying credentials' do - let(:resource) do - Puppet::Type::Rabbitmq_exchange.new( + let(:params) do + { name: 'test.headers@/', type: :headers, internal: 'false', @@ -60,12 +61,11 @@ arguments: { 'hash-header' => 'message-distribution-hash' } - ) + } end - let(:provider) { provider_class.new(resource) } it 'calls rabbitmqadmin to create with credentials' do - provider.expects(:rabbitmqadmin).with('declare', 'exchange', '--vhost=/', '--user=colin', '--password=secret', 'name=test.headers', 'type=headers', 'internal=false', 'durable=true', 'auto_delete=false', 'arguments={"hash-header":"message-distribution-hash"}', '-c', '/etc/rabbitmq/rabbitmqadmin.conf') + allow(type_class).to receive(:rabbitmqadmin).with('declare', 'exchange', '--vhost=/', '--user=colin', '--password=secret', 'name=test.headers', 'type=headers', 'internal=false', 'durable=true', 'auto_delete=false', 'arguments={"hash-header":"message-distribution-hash"}', '-c', '/etc/rabbitmq/rabbitmqadmin.conf') provider.create end end diff --git a/spec/unit/puppet/provider/rabbitmq_parameter/rabbitmqctl_federation_spec.rb b/spec/unit/puppet/provider/rabbitmq_parameter/rabbitmqctl_federation_spec.rb index 1aac95c4f..4572f8f3a 100644 --- a/spec/unit/puppet/provider/rabbitmq_parameter/rabbitmqctl_federation_spec.rb +++ b/spec/unit/puppet/provider/rabbitmq_parameter/rabbitmqctl_federation_spec.rb @@ -2,74 +2,75 @@ require 'spec_helper' -provider_class = Puppet::Type.type(:rabbitmq_parameter).provider(:rabbitmqctl) -describe provider_class do - let(:resource) do - Puppet::Type.type(:rabbitmq_parameter).new( +describe Puppet::Type.type(:rabbitmq_parameter).provider(:rabbitmqctl) do + let(:params) do + { name: 'documentumFederation@/', component_name: 'federation', value: { 'uri' => 'amqp://', 'expires' => '360000' } - ) + } end - let(:provider) { provider_class.new(resource) } + let(:type_class) { Puppet::Type.type(:rabbitmq_parameter).provider(:rabbitmqctl) } + let(:resource) { Puppet::Type.type(:rabbitmq_parameter).new(params) } + let(:provider) { resource.provider } + let(:instances) { Puppet::Type.type(:rabbitmq_parameter).instances } after do - described_class.instance_variable_set(:@parameters, nil) + type_class.instance_variable_set(:@parameters, nil) end describe '#prefetch' do it 'exists' do - expect(described_class).to respond_to :prefetch + expect(type_class).to respond_to :prefetch end it 'matches' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with('parameters', '-p', '/').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('parameters', '-p', '/').and_return <<~EOT federation documentumFederation {"uri":"amqp://","expires":360000} EOT - provider_class.prefetch('documentumFederation@/' => resource) + type_class.prefetch('documentumFederation@/' => resource) end end describe '#instances' do it 'exists' do - expect(described_class).to respond_to :instances + expect(type_class).to respond_to :instances end it 'fail with invalid output from list' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider.class.expects(:rabbitmqctl_list).with('parameters', '-p', '/').returns 'foobar' - expect { provider_class.instances }.to raise_error Puppet::Error, %r{cannot parse line from list_parameter} + allow(type_class).to receive(:rabbitmqctl_list).with('parameters', '-p', '/').and_return 'foobar' + expect { instances }.to raise_error Puppet::Error, %r{cannot parse line from list_parameter} end it 'return no instance' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with('parameters', '-p', '/').returns '' - instances = provider_class.instances + allow(type_class).to receive(:rabbitmqctl_list).with('parameters', '-p', '/').and_return '' expect(instances.size).to eq(0) end end describe '#create' do it 'create parameter' do - provider.expects(:rabbitmqctl).with('set_parameter', '-p', '/', 'federation', 'documentumFederation', - '{"uri":"amqp://","expires":360000}') + allow(type_class).to receive(:rabbitmqctl).with('set_parameter', '-p', '/', 'federation', 'documentumFederation', + '{"uri":"amqp://","expires":360000}') provider.create end end describe '#destroy' do it 'destroy parameter' do - provider.expects(:rabbitmqctl).with('clear_parameter', '-p', '/', 'federation', 'documentumFederation') + allow(type_class).to receive(:rabbitmqctl).with('clear_parameter', '-p', '/', 'federation', 'documentumFederation') provider.destroy end end diff --git a/spec/unit/puppet/provider/rabbitmq_parameter/rabbitmqctl_spec.rb b/spec/unit/puppet/provider/rabbitmq_parameter/rabbitmqctl_spec.rb index 5fd3306f4..831e8bfaf 100644 --- a/spec/unit/puppet/provider/rabbitmq_parameter/rabbitmqctl_spec.rb +++ b/spec/unit/puppet/provider/rabbitmq_parameter/rabbitmqctl_spec.rb @@ -2,10 +2,9 @@ require 'spec_helper' -provider_class = Puppet::Type.type(:rabbitmq_parameter).provider(:rabbitmqctl) -describe provider_class do - let(:resource) do - Puppet::Type.type(:rabbitmq_parameter).new( +describe Puppet::Type.type(:rabbitmq_parameter).provider(:rabbitmqctl) do + let(:params) do + { name: 'documentumShovel@/', component_name: 'shovel', value: { @@ -14,60 +13,61 @@ 'dest-uri' => 'amqp://remote-server', 'dest-queue' => 'another-queue' } - ) + } end - let(:provider) { provider_class.new(resource) } + let(:type_class) { Puppet::Type.type(:rabbitmq_parameter).provider(:rabbitmqctl) } + let(:resource) { Puppet::Type.type(:rabbitmq_parameter).new(params) } + let(:provider) { resource.provider } + let(:instances) { type_class.instances } after do - described_class.instance_variable_set(:@parameters, nil) + type_class.instance_variable_set(:@parameters, nil) end describe '#prefetch' do it 'exists' do - expect(described_class).to respond_to :prefetch + expect(type_class).to respond_to :prefetch end it 'matches' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with('parameters', '-p', '/').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('parameters', '-p', '/').and_return <<~EOT shovel documentumShovel {"src-uri":"amqp://","src-queue":"my-queue","dest-uri":"amqp://remote-server","dest-queue":"another-queue"} EOT - provider_class.prefetch('documentumShovel@/' => resource) + type_class.prefetch('documentumShovel@/' => resource) end end describe '#instances' do it 'exists' do - expect(described_class).to respond_to :instances + expect(type_class).to respond_to :instances end it 'fail with invalid output from list' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider.class.expects(:rabbitmqctl_list).with('parameters', '-p', '/').returns 'foobar' - expect { provider_class.instances }.to raise_error Puppet::Error, %r{cannot parse line from list_parameter} + allow(type_class).to receive(:rabbitmqctl_list).with('parameters', '-p', '/').and_return 'foobar' + expect { instances }.to raise_error Puppet::Error, %r{cannot parse line from list_parameter} end it 'return no instance' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with('parameters', '-p', '/').returns '' - instances = provider_class.instances + allow(type_class).to receive(:rabbitmqctl_list).with('parameters', '-p', '/').and_return '' expect(instances.size).to eq(0) end it 'return one instance' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with('parameters', '-p', '/').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('parameters', '-p', '/').and_return <<~EOT shovel documentumShovel {"src-uri":"amqp://","src-queue":"my-queue","dest-uri":"amqp://remote-server","dest-queue":"another-queue"} EOT - instances = provider_class.instances expect(instances.size).to eq(1) expect(instances.map do |prov| { @@ -92,14 +92,13 @@ end it 'return multiple instances' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with('parameters', '-p', '/').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('parameters', '-p', '/').and_return <<~EOT shovel documentumShovel1 {"src-uri":"amqp://","src-queue":"my-queue","dest-uri":"amqp://remote-server","dest-queue":"another-queue"} shovel documentumShovel2 {"src-uri":["amqp://cl1","amqp://cl2"],"src-queue":"my-queue","dest-uri":"amqp://remote-server","dest-queue":"another-queue"} EOT - instances = provider_class.instances expect(instances.size).to eq(2) expect(instances.map do |prov| { @@ -134,14 +133,13 @@ end it 'return different instances' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with('parameters', '-p', '/').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('parameters', '-p', '/').and_return <<~EOT shovel documentumShovel1 {"src-uri":"amqp://","src-queue":"my-queue","dest-uri":"amqp://remote-server","dest-queue":"another-queue"} federation documentumFederation2 {"uri":"amqp://","expires":"360000"} EOT - instances = provider_class.instances expect(instances.size).to eq(2) expect(instances.map do |prov| { @@ -176,15 +174,15 @@ describe '#create' do it 'create parameter' do - provider.expects(:rabbitmqctl).with('set_parameter', '-p', '/', 'shovel', 'documentumShovel', - '{"src-uri":"amqp://","src-queue":"my-queue","dest-uri":"amqp://remote-server","dest-queue":"another-queue"}') + allow(type_class).to receive(:rabbitmqctl).with('set_parameter', '-p', '/', 'shovel', 'documentumShovel', + '{"src-uri":"amqp://","src-queue":"my-queue","dest-uri":"amqp://remote-server","dest-queue":"another-queue"}') provider.create end end describe '#destroy' do it 'destroy parameter' do - provider.expects(:rabbitmqctl).with('clear_parameter', '-p', '/', 'shovel', 'documentumShovel') + allow(type_class).to receive(:rabbitmqctl).with('clear_parameter', '-p', '/', 'shovel', 'documentumShovel') provider.destroy end end diff --git a/spec/unit/puppet/provider/rabbitmq_plugin/rabbitmqctl_spec.rb b/spec/unit/puppet/provider/rabbitmq_plugin/rabbitmqctl_spec.rb index bd06e2564..0fb1eca30 100644 --- a/spec/unit/puppet/provider/rabbitmq_plugin/rabbitmqctl_spec.rb +++ b/spec/unit/puppet/provider/rabbitmq_plugin/rabbitmqctl_spec.rb @@ -2,31 +2,35 @@ require 'spec_helper' -provider_class = Puppet::Type.type(:rabbitmq_plugin).provider(:rabbitmqplugins) -describe provider_class do - let(:resource) do - Puppet::Type::Rabbitmq_plugin.new( - name: 'foo' - ) +describe Puppet::Type.type(:rabbitmq_plugin).provider(:rabbitmqplugins) do + let(:params) do + { + name: 'foo', + } end - let(:provider) { provider_class.new(resource) } + let(:type_class) { Puppet::Type.type(:rabbitmq_plugin).provider(:rabbitmqplugins) } + let(:resource) { Puppet::Type.type(:rabbitmq_plugin).new(params) } + let(:provider) { resource.provider } + let(:instances) { type_class.instances } it 'calls rabbitmqplugins to enable when node not running' do - provider.class.expects(:rabbitmq_running).returns false - provider.expects(:rabbitmqplugins).with('enable', 'foo') + allow(type_class).to receive(:rabbitmq_running).and_return false + allow(type_class).to receive(:rabbitmqplugins).with('enable', 'foo') provider.create end describe '#instances' do it 'exists' do - expect(provider_class).to respond_to :instances + expect(type_class).to respond_to :instances end it 'retrieves instances' do - provider.class.expects(:plugin_list).returns(%w[foo bar]) - instances = provider_class.instances - instances_cmp = instances.map { |prov| { name: prov.get(:name) } } - expect(instances_cmp).to eq( + allow(type_class).to receive(:plugin_list).and_return(%w[foo bar]) + expect(instances.map do |prov| + { + name: prov.get(:name) + } + end).to eq( [ { name: 'foo' }, { name: 'bar' } @@ -35,112 +39,112 @@ end it 'raises error on invalid line' do - provider_class.expects(:plugin_list).returns([' ']) - expect { provider_class.instances }.to raise_error Puppet::Error, %r{Cannot parse invalid plugins line} + allow(type_class).to receive(:plugin_list).and_return([' ']) + expect { instances }.to raise_error Puppet::Error, %r{Cannot parse invalid plugins line} end end describe '#plugin_list' do it 'exists' do - expect(provider_class).to respond_to :instances + expect(type_class).to respond_to :instances end it 'returns a list of plugins' do - provider.class.expects(:rabbitmqplugins).with('list', '-e', '-m').returns("foo\nbar\nbaz\n") - expect(provider.class.plugin_list).to eq(%w[foo bar baz]) + allow(type_class).to receive(:rabbitmqplugins).with('list', '-e', '-m').and_return("foo\nbar\nbaz\n") + expect(type_class.plugin_list).to eq(%w[foo bar baz]) end it 'handles no training newline properly' do - provider.class.expects(:rabbitmqplugins).with('list', '-e', '-m').returns("foo\nbar") - expect(provider.class.plugin_list).to eq(%w[foo bar]) + allow(type_class).to receive(:rabbitmqplugins).with('list', '-e', '-m').and_return("foo\nbar") + expect(type_class.plugin_list).to eq(%w[foo bar]) end it 'handles lines that are not plugins' do - provider.class.expects(:rabbitmqplugins).with('list', '-e', '-m').returns("Listing plugins with pattern \".*\" ...\nfoo\nbar") - expect(provider.class.plugin_list).to eq(%w[foo bar]) + allow(type_class).to receive(:rabbitmqplugins).with('list', '-e', '-m').and_return("Listing plugins with pattern \".*\" ...\nfoo\nbar") + expect(type_class.plugin_list).to eq(%w[foo bar]) end end describe '#exists?' do it 'matches existing plugins' do - provider_class.expects(:plugin_list).returns(%w[foo]) - expect(provider.exists?).to eq(true) + allow(type_class).to receive(:plugin_list).and_return(%w[foo]) + expect(provider.exists?).to be(true) end it 'returns false for missing plugins' do - provider_class.expects(:plugin_list).returns(%w[bar]) - expect(provider.exists?).to eq(false) + allow(type_class).to receive(:plugin_list).and_return(%w[bar]) + expect(provider.exists?).to be(false) end end context 'with RabbitMQ version >=3.4.0' do it 'calls rabbitmqplugins to enable' do - provider.class.expects(:rabbitmq_version).returns '3.4.0' - provider.class.expects(:rabbitmq_running).returns true - provider.expects(:rabbitmqplugins).with('enable', 'foo') + allow(type_class).to receive(:rabbitmq_version).and_return '3.4.0' + allow(type_class).to receive(:rabbitmq_running).and_return true + allow(type_class).to receive(:rabbitmqplugins).with('enable', 'foo') provider.create end it 'calls rabbitmqplugins to enable with offline' do provider.resource[:mode] = :offline - provider.class.expects(:rabbitmq_version).returns '3.4.0' - provider.class.expects(:rabbitmq_running).returns true - provider.expects(:rabbitmqplugins).with('enable', 'foo', '--offline') + allow(type_class).to receive(:rabbitmq_version).and_return '3.4.0' + allow(type_class).to receive(:rabbitmq_running).and_return true + allow(type_class).to receive(:rabbitmqplugins).with('enable', 'foo', '--offline') provider.create end it 'calls rabbitmqplugins to enable with online' do provider.resource[:mode] = :online - provider.class.expects(:rabbitmq_version).returns '3.4.0' - provider.class.expects(:rabbitmq_running).returns true - provider.expects(:rabbitmqplugins).with('enable', 'foo', '--online') + allow(type_class).to receive(:rabbitmq_version).and_return '3.4.0' + allow(type_class).to receive(:rabbitmq_running).and_return true + allow(type_class).to receive(:rabbitmqplugins).with('enable', 'foo', '--online') provider.create end it 'calls rabbitmqplugins to enable with best' do provider.resource[:mode] = :best - provider.class.expects(:rabbitmq_version).returns '3.4.0' - provider.class.expects(:rabbitmq_running).returns true - provider.expects(:rabbitmqplugins).with('enable', 'foo') + allow(type_class).to receive(:rabbitmq_version).and_return '3.4.0' + allow(type_class).to receive(:rabbitmq_running).and_return true + allow(type_class).to receive(:rabbitmqplugins).with('enable', 'foo') provider.create end end context 'with RabbitMQ version < 3.4.0' do it 'calls rabbitmqplugins to enable' do - provider.class.expects(:rabbitmq_version).returns '3.3.9' - provider.class.expects(:rabbitmq_running).returns true - provider.expects(:rabbitmqplugins).with('enable', 'foo') + allow(type_class).to receive(:rabbitmq_version).and_return '3.3.9' + allow(type_class).to receive(:rabbitmq_running).and_return true + allow(type_class).to receive(:rabbitmqplugins).with('enable', 'foo') provider.create end it 'calls rabbitmqplugins to enable with offline' do provider.resource[:mode] = :offline - provider.class.expects(:rabbitmq_version).returns '3.3.9' - provider.class.expects(:rabbitmq_running).returns true - provider.expects(:rabbitmqplugins).with('enable', 'foo') + allow(type_class).to receive(:rabbitmq_version).and_return '3.3.9' + allow(type_class).to receive(:rabbitmq_running).and_return true + allow(type_class).to receive(:rabbitmqplugins).with('enable', 'foo') provider.create end it 'calls rabbitmqplugins to enable with online' do provider.resource[:mode] = :online - provider.class.expects(:rabbitmq_version).returns '3.3.9' - provider.class.expects(:rabbitmq_running).returns true - provider.expects(:rabbitmqplugins).with('enable', 'foo') + allow(type_class).to receive(:rabbitmq_version).and_return '3.3.9' + allow(type_class).to receive(:rabbitmq_running).and_return true + allow(type_class).to receive(:rabbitmqplugins).with('enable', 'foo') provider.create end it 'calls rabbitmqplugins to enable with best' do provider.resource[:mode] = :best - provider.class.expects(:rabbitmq_version).returns '3.3.9' - provider.class.expects(:rabbitmq_running).returns true - provider.expects(:rabbitmqplugins).with('enable', 'foo') + allow(type_class).to receive(:rabbitmq_version).and_return '3.3.9' + allow(type_class).to receive(:rabbitmq_running).and_return true + allow(type_class).to receive(:rabbitmqplugins).with('enable', 'foo') provider.create end end it 'calls rabbitmqplugins to disable' do - provider.expects(:rabbitmqplugins).with('disable', 'foo') + allow(type_class).to receive(:rabbitmqplugins).with('disable', 'foo') provider.destroy end end diff --git a/spec/unit/puppet/provider/rabbitmq_policy/rabbitmqctl_spec.rb b/spec/unit/puppet/provider/rabbitmq_policy/rabbitmqctl_spec.rb index ec1d96fed..cc4593ed3 100644 --- a/spec/unit/puppet/provider/rabbitmq_policy/rabbitmqctl_spec.rb +++ b/spec/unit/puppet/provider/rabbitmq_policy/rabbitmqctl_spec.rb @@ -3,33 +3,33 @@ require 'spec_helper' describe Puppet::Type.type(:rabbitmq_policy).provider(:rabbitmqctl) do - let(:resource) do - Puppet::Type.type(:rabbitmq_policy).new( + let(:params) do + { name: 'ha-all@/', pattern: '.*', definition: { 'ha-mode' => 'all' } - ) + } end - let(:provider) { described_class.new(resource) } + let(:type_class) { Puppet::Type.type(:rabbitmq_policy).provider(:rabbitmqctl) } + let(:resource) { Puppet::Type.type(:rabbitmq_policy).new(params) } + let(:provider) { resource.provider } after do - described_class.instance_variable_set(:@policies, nil) + type_class.instance_variable_set(:@policies, nil) end context 'has "@" in policy name' do - let(:resource) do - Puppet::Type.type(:rabbitmq_policy).new( + let(:params) do + { name: 'ha@home@/', pattern: '.*', definition: { 'ha-mode' => 'all' - }, - provider: described_class.name - ) + } + } end - let(:provider) { described_class.new(resource) } it do expect(provider.should_policy).to eq('ha@home') @@ -41,15 +41,15 @@ end it 'fails with invalid output from list' do - provider.class.expects(:rabbitmqctl_list).with('policies', '-p', '/').returns 'foobar' - provider.class.expects(:rabbitmq_version).returns '3.1.5' + allow(type_class).to receive(:rabbitmqctl_list).with('policies', '-p', '/').and_return 'foobar' + allow(type_class).to receive(:rabbitmq_version).and_return '3.1.5' expect { provider.exists? }.to raise_error(Puppet::Error, %r{cannot parse line from list_policies}) end context 'with RabbitMQ version >=3.7.0' do it 'matches policies from list' do - provider.class.expects(:rabbitmq_version).returns '3.7.0' - provider.class.expects(:rabbitmqctl_list).with('policies', '-p', '/').returns <<~EOT + allow(type_class).to receive(:rabbitmq_version).and_return '3.7.0' + allow(type_class).to receive(:rabbitmqctl_list).with('policies', '-p', '/').and_return <<~EOT / ha-all .* all {"ha-mode":"all","ha-sync-mode":"automatic"} 0 / test .* exchanges {"ha-mode":"all"} 0 EOT @@ -63,8 +63,8 @@ end it 'matches policies from list targeting quorum queues' do - provider.class.expects(:rabbitmq_version).returns '3.7.0' - provider.class.expects(:rabbitmqctl_list).with('policies', '-p', '/').returns <<~EOT + allow(type_class).to receive(:rabbitmq_version).and_return '3.7.0' + allow(type_class).to receive(:rabbitmqctl_list).with('policies', '-p', '/').and_return <<~EOT / ha-all ^.*$ quorum_queues {"delivery-limit":10,"initial-cluster-size":3,"max-length":100000000,"overflow":"reject-publish-dlx"} 0 / test .* exchanges {"ha-mode":"all"} 0 EOT @@ -82,8 +82,8 @@ context 'with RabbitMQ version >=3.2.0 and < 3.7.0' do it 'matches policies from list' do - provider.class.expects(:rabbitmq_version).returns '3.6.9' - provider.class.expects(:rabbitmqctl_list).with('policies', '-p', '/').returns <<~EOT + allow(type_class).to receive(:rabbitmq_version).and_return '3.6.9' + allow(type_class).to receive(:rabbitmqctl_list).with('policies', '-p', '/').and_return <<~EOT / ha-all all .* {"ha-mode":"all","ha-sync-mode":"automatic"} 0 / test exchanges .* {"ha-mode":"all"} 0 EOT @@ -99,8 +99,8 @@ context 'with RabbitMQ version <3.2.0' do it 'matches policies from list (<3.2.0)' do - provider.class.expects(:rabbitmq_version).returns '3.1.5' - provider.class.expects(:rabbitmqctl_list).with('policies', '-p', '/').returns <<~EOT + allow(type_class).to receive(:rabbitmq_version).and_return '3.1.5' + allow(type_class).to receive(:rabbitmqctl_list).with('policies', '-p', '/').and_return <<~EOT / ha-all .* {"ha-mode":"all","ha-sync-mode":"automatic"} 0 / test .* {"ha-mode":"all"} 0 EOT @@ -115,41 +115,41 @@ end it 'does not match an empty list' do - provider.class.expects(:rabbitmqctl_list).with('policies', '-p', '/').returns '' - provider.class.expects(:rabbitmq_version).returns '3.1.5' - expect(provider.exists?).to eq(nil) + allow(type_class).to receive(:rabbitmqctl_list).with('policies', '-p', '/').and_return '' + allow(type_class).to receive(:rabbitmq_version).and_return '3.1.5' + expect(provider.exists?).to be_nil end it 'destroys policy' do - provider.expects(:rabbitmqctl).with('clear_policy', '-p', '/', 'ha-all') + allow(type_class).to receive(:rabbitmqctl).with('clear_policy', '-p', '/', 'ha-all') provider.destroy end it 'onlies call set_policy once (<3.2.0)' do - provider.class.expects(:rabbitmq_version).returns '3.1.0' + allow(type_class).to receive(:rabbitmq_version).and_return '3.1.0' provider.resource[:priority] = '10' provider.resource[:applyto] = 'exchanges' - provider.expects(:rabbitmqctl).with('set_policy', - '-p', '/', - 'ha-all', - '.*', - '{"ha-mode":"all"}', - '10').once + allow(provider).to receive(:rabbitmqctl).with('set_policy', + '-p', '/', + 'ha-all', + '.*', + '{"ha-mode":"all"}', + '10').once provider.priority = '10' provider.applyto = 'exchanges' end it 'onlies call set_policy once (>=3.2.0)' do - provider.class.expects(:rabbitmq_version).returns '3.2.0' + allow(type_class).to receive(:rabbitmq_version).and_return '3.2.0' provider.resource[:priority] = '10' provider.resource[:applyto] = 'exchanges' - provider.expects(:rabbitmqctl).with('set_policy', - '-p', '/', - '--priority', '10', - '--apply-to', 'exchanges', - 'ha-all', - '.*', - '{"ha-mode":"all"}').once + allow(provider).to receive(:rabbitmqctl).with('set_policy', + '-p', '/', + '--priority', '10', + '--apply-to', 'exchanges', + 'ha-all', + '.*', + '{"ha-mode":"all"}').once provider.priority = '10' provider.applyto = 'exchanges' end diff --git a/spec/unit/puppet/provider/rabbitmq_queue/rabbitmqadmin_spec.rb b/spec/unit/puppet/provider/rabbitmq_queue/rabbitmqadmin_spec.rb index 6cfd69bbb..7a89d938c 100644 --- a/spec/unit/puppet/provider/rabbitmq_queue/rabbitmqadmin_spec.rb +++ b/spec/unit/puppet/provider/rabbitmq_queue/rabbitmqadmin_spec.rb @@ -2,55 +2,55 @@ require 'spec_helper' -provider_class = Puppet::Type.type(:rabbitmq_queue).provider(:rabbitmqadmin) -describe provider_class do - let(:resource) do - Puppet::Type::Rabbitmq_queue.new( +describe Puppet::Type.type(:rabbitmq_queue).provider(:rabbitmqadmin) do + let(:params) do + { name: 'test@/', durable: :true, auto_delete: :false, arguments: {} - ) + } end - let(:provider) { provider_class.new(resource) } + let(:type_class) { Puppet::Type.type(:rabbitmq_queue).provider(:rabbitmqadmin) } + let(:resource) { Puppet::Type.type(:rabbitmq_queue).new(params) } + let(:provider) { resource.provider } + let(:instances) { type_class.instances } it 'returns instances' do - provider_class.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT / EOT - provider_class.expects(:rabbitmqctl_list).with('queues', '-p', '/', 'name', 'durable', 'auto_delete', 'arguments').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('queues', '-p', '/', 'name', 'durable', 'auto_delete', 'arguments').and_return <<~EOT test true false [] test2 true false [{"x-message-ttl",342423},{"x-expires",53253232},{"x-max-length",2332},{"x-max-length-bytes",32563324242},{"x-dead-letter-exchange","amq.direct"},{"x-dead-letter-routing-key","test.routing"}] EOT - instances = provider_class.instances expect(instances.size).to eq(2) end it 'calls rabbitmqadmin to create' do - provider.expects(:rabbitmqadmin).with('declare', 'queue', '--vhost=/', '--user=guest', '--password=guest', '-c', '/etc/rabbitmq/rabbitmqadmin.conf', 'name=test', 'durable=true', 'auto_delete=false', 'arguments={}') + allow(type_class).to receive(:rabbitmqadmin).with('declare', 'queue', '--vhost=/', '--user=guest', '--password=guest', '-c', '/etc/rabbitmq/rabbitmqadmin.conf', 'name=test', 'durable=true', 'auto_delete=false', 'arguments={}') provider.create end it 'calls rabbitmqadmin to destroy' do - provider.expects(:rabbitmqadmin).with('delete', 'queue', '--vhost=/', '--user=guest', '--password=guest', '-c', '/etc/rabbitmq/rabbitmqadmin.conf', 'name=test') + allow(type_class).to receive(:rabbitmqadmin).with('delete', 'queue', '--vhost=/', '--user=guest', '--password=guest', '-c', '/etc/rabbitmq/rabbitmqadmin.conf', 'name=test') provider.destroy end context 'specifying credentials' do - let(:resource) do - Puppet::Type::Rabbitmq_queue.new( + let(:params) do + { name: 'test@/', durable: 'true', auto_delete: 'false', arguments: {}, user: 'colin', password: 'secret' - ) + } end - let(:provider) { provider_class.new(resource) } it 'calls rabbitmqadmin to create' do - provider.expects(:rabbitmqadmin).with('declare', 'queue', '--vhost=/', '--user=colin', '--password=secret', '-c', '/etc/rabbitmq/rabbitmqadmin.conf', 'name=test', 'durable=true', 'auto_delete=false', 'arguments={}') + allow(type_class).to receive(:rabbitmqadmin).with('declare', 'queue', '--vhost=/', '--user=colin', '--password=secret', '-c', '/etc/rabbitmq/rabbitmqadmin.conf', 'name=test', 'durable=true', 'auto_delete=false', 'arguments={}') provider.create end end diff --git a/spec/unit/puppet/provider/rabbitmq_user/rabbitmqctl_spec.rb b/spec/unit/puppet/provider/rabbitmq_user/rabbitmqctl_spec.rb index ec8e04877..5f19cf6e4 100644 --- a/spec/unit/puppet/provider/rabbitmq_user/rabbitmqctl_spec.rb +++ b/spec/unit/puppet/provider/rabbitmq_user/rabbitmqctl_spec.rb @@ -2,55 +2,55 @@ require 'spec_helper' -provider_class = Puppet::Type.type(:rabbitmq_user).provider(:rabbitmqctl) -describe provider_class do - let(:resource) do - Puppet::Type.type(:rabbitmq_user).new( +describe Puppet::Type.type(:rabbitmq_user).provider(:rabbitmqctl) do + let(:params) do + { ensure: :present, name: 'rmq_x', password: 'secret', - provider: described_class.name - ) + } end - let(:provider) { provider_class.new(resource) } - let(:instance) { provider.class.instances.first } + let(:type_class) { Puppet::Type.type(:rabbitmq_user).provider(:rabbitmqctl) } + let(:resource) { Puppet::Type.type(:rabbitmq_user).new(params) } + let(:provider) { resource.provider } + let(:instances) { type_class.instances } before do - provider.class.stubs(:rabbitmqctl_list).with('users').returns( - "rmq_x [disk, storage]\nrmq_y [network, cpu, administrator]\nrmq_z []\n" - ) + allow(type_class).to receive(:rabbitmqctl_list).with('users').and_return <<~EOT + rmq_x [disk, storage] + rmq_y [network, cpu, administrator] + rmq_z [] + EOT end describe '#self.instances' do - it { expect(provider.class.instances.size).to eq(3) } + it { expect(instances.size).to eq(3) } it 'returns an array of users' do - users = provider.class.instances.map(&:name) - expect(users).to match_array(%w[rmq_x rmq_y rmq_z]) + expect(instances.map(&:name)).to match_array(%w[rmq_x rmq_y rmq_z]) end it 'returns the expected tags' do - tags = provider.class.instances.first.get(:tags) - expect(tags).to match_array(%w[disk storage]) + expect(instances.first.get(:tags)).to match_array(%w[disk storage]) end end describe '#exists?' do - it { expect(instance.exists?).to be true } + it { expect(instances.first.exists?).to be true } end describe '#create' do it 'adds a user' do - provider.expects(:rabbitmqctl).with('add_user', 'rmq_x', 'secret') + allow(type_class).to receive(:rabbitmqctl).with('add_user', 'rmq_x', 'secret') provider.create end context 'no password supplied' do - let(:resource) do - Puppet::Type.type(:rabbitmq_user).new( + let(:params) do + { ensure: :present, name: 'rmq_x' - ) + } end it 'raises an error' do @@ -63,59 +63,49 @@ describe '#destroy' do it 'removes a user' do - provider.expects(:rabbitmqctl).with('delete_user', 'rmq_x') + allow(type_class).to receive(:rabbitmqctl).with('delete_user', 'rmq_x') provider.destroy end end describe '#check_password' do - context 'correct password' do - before do - provider.class.stubs(:rabbitmqctl).with( - 'eval', - 'rabbit_access_control:check_user_pass_login(list_to_binary("rmq_x"), list_to_binary("secret")).' - ).returns <<~EOT - {ok,{user,<<"rmq_x">>,[],rabbit_auth_backend_internal, - {internal_user,<<"rmq_x">>, - <<193,81,62,182,129,135,196,89,148,87,227,48,86,2,154, - 192,52,119,214,177>>, - []}}} - EOT - end - - it do - provider.check_password('secret') - end - end - - context 'incorrect password' do - before do - provider.class.stubs(:rabbitmqctl).with( - 'eval', - 'rabbit_access_control:check_user_pass_login(list_to_binary("rmq_x"), list_to_binary("nottherightone")).' - ).returns <<~EOT - {refused,"user '~s' - invalid credentials",[<<"rmq_x">>]} - ...done. - EOT - end - - it do - provider.check_password('nottherightone') - end + it 'correct password' do + allow(type_class).to receive(:rabbitmqctl).with( + 'eval', + 'rabbit_access_control:check_user_pass_login(list_to_binary("rmq_x"), list_to_binary("secret")).' + ).and_return <<~EOT + {ok,{user,<<"rmq_x">>,[],rabbit_auth_backend_internal, + {internal_user,<<"rmq_x">>, + <<193,81,62,182,129,135,196,89,148,87,227,48,86,2,154, + 192,52,119,214,177>>, + []}}} + EOT + provider.check_password('secret') + end + + it 'incorrect password' do + allow(type_class).to receive(:rabbitmqctl).with( + 'eval', + 'rabbit_access_control:check_user_pass_login(list_to_binary("rmq_x"), list_to_binary("nottherightone")).' + ).and_return <<~EOT + {refused,"user '~s' - invalid credentials",[<<"rmq_x">>]} + ...done. + EOT + provider.check_password('nottherightone') end end describe '#tags=' do it 'clears all tags on existing user' do provider.set(tags: %w[tag1 tag2 tag3]) - provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', []) + allow(type_class).to receive(:rabbitmqctl).with('set_user_tags', 'rmq_x', []) provider.tags = [] provider.flush end it 'sets multiple tags' do provider.set(tags: []) - provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', %w[tag1 tag2]) + allow(type_class).to receive(:rabbitmqctl).with('set_user_tags', 'rmq_x', %w[tag1 tag2]) provider.tags = %w[tag1 tag2] provider.flush end @@ -123,7 +113,7 @@ it 'clears tags while keeping admin tag' do provider.set(tags: %w[administrator tag1 tag2]) resource[:admin] = true - provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', ['administrator']) + allow(type_class).to receive(:rabbitmqctl).with('set_user_tags', 'rmq_x', ['administrator']) provider.tags = [] provider.flush end @@ -131,7 +121,7 @@ it 'changes tags while keeping admin tag' do provider.set(tags: %w[administrator tag1 tag2]) resource[:admin] = true - provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', %w[tag1 tag7 tag3 administrator]) + allow(type_class).to receive(:rabbitmqctl).with('set_user_tags', 'rmq_x', %w[tag1 tag7 tag3 administrator]) provider.tags = %w[tag1 tag7 tag3] provider.flush end @@ -149,7 +139,7 @@ end it 'sets admin value' do - provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', ['administrator']) + allow(type_class).to receive(:rabbitmqctl).with('set_user_tags', 'rmq_x', ['administrator']) resource[:admin] = true provider.admin = resource[:admin] provider.flush @@ -157,7 +147,7 @@ it 'adds admin value to existing tags of the user' do resource[:tags] = %w[tag1 tag2] - provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', %w[tag1 tag2 administrator]) + allow(type_class).to receive(:rabbitmqctl).with('set_user_tags', 'rmq_x', %w[tag1 tag2 administrator]) resource[:admin] = true provider.admin = resource[:admin] provider.flush @@ -165,7 +155,7 @@ it 'unsets admin value' do provider.set(tags: ['administrator']) - provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', []) + allow(type_class).to receive(:rabbitmqctl).with('set_user_tags', 'rmq_x', []) provider.admin = :false provider.flush end @@ -173,7 +163,7 @@ it 'does not interfere with existing tags on the user when unsetting admin value' do provider.set(tags: %w[administrator tag1 tag2]) resource[:tags] = %w[tag1 tag2] - provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', %w[tag1 tag2]) + allow(type_class).to receive(:rabbitmqctl).with('set_user_tags', 'rmq_x', %w[tag1 tag2]) provider.admin = :false provider.flush end diff --git a/spec/unit/puppet/provider/rabbitmq_user_permissions/rabbitmqctl_spec.rb b/spec/unit/puppet/provider/rabbitmq_user_permissions/rabbitmqctl_spec.rb index 77fcc2789..516d6ee48 100644 --- a/spec/unit/puppet/provider/rabbitmq_user_permissions/rabbitmqctl_spec.rb +++ b/spec/unit/puppet/provider/rabbitmq_user_permissions/rabbitmqctl_spec.rb @@ -2,70 +2,71 @@ require 'spec_helper' -describe 'Puppet::Type.type(:rabbitmq_user_permissions).provider(:rabbitmqctl)' do - let(:resource) do - Puppet::Type::Rabbitmq_user_permissions.new( +describe Puppet::Type.type(:rabbitmq_user_permissions).provider(:rabbitmqctl) do + let(:params) do + { name: 'foo@bar' - ) + } end - let(:provider_class) { Puppet::Type.type(:rabbitmq_user_permissions).provider(:rabbitmqctl) } - let(:provider) { provider_class.new(resource) } + let(:type_class) { Puppet::Type.type(:rabbitmq_user_permissions).provider(:rabbitmqctl) } + let(:resource) { Puppet::Type.type(:rabbitmq_user_permissions).new(params) } + let(:provider) { resource.provider } + let(:instances) { type_class.instances } after do - provider_class.instance_variable_set(:@users, nil) + type_class.instance_variable_set(:@users, nil) end it 'matches user permissions from list' do - provider.class.expects(:rabbitmqctl_list).with('user_permissions', 'foo').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('user_permissions', 'foo').and_return <<~EOT bar 1 2 3 EOT expect(provider.exists?).to eq(configure: '1', write: '2', read: '3') end it 'matches user permissions with empty columns' do - provider.class.expects(:rabbitmqctl_list).with('user_permissions', 'foo').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('user_permissions', 'foo').and_return <<~EOT bar 3 EOT expect(provider.exists?).to eq(configure: '', write: '', read: '3') end it 'does not match user permissions with more than 3 columns' do - provider.class.expects(:rabbitmqctl_list).with('user_permissions', 'foo').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('user_permissions', 'foo').and_return <<~EOT bar 1 2 3 4 EOT expect { provider.exists? }.to raise_error(Puppet::Error, %r{cannot parse line from list_user_permissions}) end it 'does not match an empty list' do - provider.class.expects(:rabbitmqctl_list).with('user_permissions', 'foo').returns <<-EOT - EOT - expect(provider.exists?).to eq(nil) + allow(type_class).to receive(:rabbitmqctl_list).with('user_permissions', 'foo').and_return '' + expect(provider.exists?).to be_nil end it 'creates default permissions' do provider.instance_variable_set(:@should_vhost, 'bar') provider.instance_variable_set(:@should_user, 'foo') - provider.expects(:rabbitmqctl).with('set_permissions', '-p', 'bar', 'foo', "''", "''", "''") + allow(type_class).to receive(:rabbitmqctl).with('set_permissions', '-p', 'bar', 'foo', "''", "''", "''") provider.create end it 'destroys permissions' do provider.instance_variable_set(:@should_vhost, 'bar') provider.instance_variable_set(:@should_user, 'foo') - provider.expects(:rabbitmqctl).with('clear_permissions', '-p', 'bar', 'foo') + allow(type_class).to receive(:rabbitmqctl).with('clear_permissions', '-p', 'bar', 'foo') provider.destroy end { configure_permission: '1', write_permission: '2', read_permission: '3' }.each do |k, v| it "is able to retrieve #{k}" do - provider.class.expects(:rabbitmqctl_list).with('user_permissions', 'foo').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('user_permissions', 'foo').and_return <<~EOT bar 1 2 3 EOT expect(provider.send(k)).to eq(v) end it "is able to retrieve #{k} after exists has been called" do - provider.class.expects(:rabbitmqctl_list).with('user_permissions', 'foo').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('user_permissions', 'foo').and_return <<~EOT bar 1 2 3 EOT provider.exists? @@ -76,21 +77,21 @@ read_permission: %w[1 2 foo], write_permission: %w[1 foo 3] }.each do |perm, columns| it "is able to sync #{perm}" do - provider.class.expects(:rabbitmqctl_list).with('user_permissions', 'foo').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('user_permissions', 'foo').and_return <<~EOT bar 1 2 3 EOT provider.resource[perm] = 'foo' - provider.expects(:rabbitmqctl).with('set_permissions', '-p', 'bar', 'foo', *columns) + allow(type_class).to receive(:rabbitmqctl).with('set_permissions', '-p', 'bar', 'foo', *columns) provider.send("#{perm}=".to_sym, 'foo') end end it 'onlies call set_permissions once' do - provider.class.expects(:rabbitmqctl_list).with('user_permissions', 'foo').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('user_permissions', 'foo').and_return <<~EOT bar 1 2 3 EOT provider.resource[:configure_permission] = 'foo' provider.resource[:read_permission] = 'foo' - provider.expects(:rabbitmqctl).with('set_permissions', '-p', 'bar', 'foo', 'foo', '2', 'foo').once + allow(type_class).to receive(:rabbitmqctl).with('set_permissions', '-p', 'bar', 'foo', 'foo', '2', 'foo').once provider.configure_permission = 'foo' provider.read_permission = 'foo' end diff --git a/spec/unit/puppet/provider/rabbitmq_vhost/rabbitmqctl_spec.rb b/spec/unit/puppet/provider/rabbitmq_vhost/rabbitmqctl_spec.rb index f0fb6e0f2..08f382d47 100644 --- a/spec/unit/puppet/provider/rabbitmq_vhost/rabbitmqctl_spec.rb +++ b/spec/unit/puppet/provider/rabbitmq_vhost/rabbitmqctl_spec.rb @@ -1,61 +1,64 @@ # frozen_string_literal: true require 'spec_helper' + describe Puppet::Type.type(:rabbitmq_vhost).provider(:rabbitmqctl) do - let(:resource) do - Puppet::Type::Rabbitmq_vhost.new( + let(:params) do + { name: 'foo', description: 'foo description', default_queue_type: 'quorum', tags: %w[foo bar] - ) + } end - let(:provider) { described_class.new(resource) } + let(:type_class) { Puppet::Type.type(:rabbitmq_vhost).provider(:rabbitmqctl) } + let(:resource) { Puppet::Type.type(:rabbitmq_vhost).new(params) } + let(:provider) { resource.provider } + let(:instances) { type_class.instances } it 'matches vhost names' do - provider.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT Listing vhosts ... foo ...done. EOT - expect(provider.exists?).to eq(true) + expect(provider.exists?).to be(true) end it 'does not match if no vhosts on system' do - provider.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT Listing vhosts ... ...done. EOT - expect(provider.exists?).to eq(false) + expect(provider.exists?).to be(false) end it 'does not match if no matching vhosts on system' do - provider.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT + allow(type_class).to receive(:rabbitmqctl_list).with('vhosts').and_return <<~EOT Listing vhosts ... fooey ...done. EOT - expect(provider.exists?).to eq(false) + expect(provider.exists?).to be(false) end context 'with RabbitMQ version <3.11.0 (no metadata support)' do it 'calls rabbitmqctl to create' do - provider.expects(:supports_metadata?).at_least_once.returns false - provider.expects(:rabbitmqctl).with('add_vhost', 'foo') + allow(type_class).to receive(:supports_metadata?).at_least(1).and_return false + allow(type_class).to receive(:rabbitmqctl).with('add_vhost', 'foo') provider.create end end context 'with RabbitMQ version >=3.11.0 (metadata support)' do it 'parses vhost list with valid metadata' do - provider.class.expects(:supports_metadata?).at_least_once.returns true - provider.class.expects(:vhost_list).returns <<~EOT + allow(type_class).to receive(:supports_metadata?).at_least(1).and_return true + allow(type_class).to receive(:vhost_list).and_return <<~EOT inventory classic [] / Default virtual host undefined [] search quorum [] testing My cool vhost undefined [tag1, tag2] EOT - instances = provider.class.instances expect(instances.size).to eq(4) expect(instances.map do |prov| { @@ -95,40 +98,40 @@ end it 'throws error when parsing invalid vhost metadata' do - provider.class.expects(:supports_metadata?).at_least_once.returns true - provider.class.expects(:vhost_list).returns <<~EOT + allow(type_class).to receive(:supports_metadata?).at_least(1).and_return true + allow(type_class).to receive(:vhost_list).and_return <<~EOT inventory undefined [] / Default virtual host undefined EOT - expect { print provider.class.instances }.to raise_error(Puppet::Error, %r{Cannot parse invalid vhost line: / Default virtual host undefined}) + expect { print instances }.to raise_error(Puppet::Error, %r{Cannot parse invalid vhost line: / Default virtual host undefined}) end it 'calls rabbitmqctl to create with metadata' do - provider.expects(:supports_metadata?).at_least_once.returns true - provider.expects(:rabbitmqctl).with('add_vhost', 'foo', ['--description', 'foo description'], \ - ['--default-queue-type', 'quorum'], ['--tags', 'foo,bar']) + allow(type_class).to receive(:supports_metadata?).at_least(1).and_return true + allow(type_class).to receive(:rabbitmqctl).with('add_vhost', 'foo', ['--description', 'foo description'], \ + ['--default-queue-type', 'quorum'], ['--tags', 'foo,bar']) provider.create end it 'updates tags' do provider.set(tags: %w[tag1 tag2]) - provider.expects(:exists?).at_least_once.returns true - provider.expects(:supports_metadata?).at_least_once.returns true - provider.expects(:rabbitmqctl).with('update_vhost_metadata', 'foo', ['--tags', 'tag1,tag2']) + allow(provider).to receive(:exists?).at_least(1).and_return true + allow(provider).to receive(:supports_metadata?).at_least(1).and_return true + allow(provider).to receive(:rabbitmqctl).with('update_vhost_metadata', 'foo', ['--tags', 'tag1,tag2']) provider.flush end it 'updates description' do provider.set(description: 'this is the new description') - provider.expects(:exists?).at_least_once.returns true - provider.expects(:supports_metadata?).at_least_once.returns true - provider.expects(:rabbitmqctl).with('update_vhost_metadata', 'foo', ['--description', 'this is the new description']) + allow(provider).to receive(:exists?).at_least(1).and_return true + allow(provider).to receive(:supports_metadata?).at_least(1).and_return true + allow(provider).to receive(:rabbitmqctl).with('update_vhost_metadata', 'foo', ['--description', 'this is the new description']) provider.flush end end it 'calls rabbitmqctl to delete' do - provider.expects(:rabbitmqctl).with('delete_vhost', 'foo') + allow(type_class).to receive(:rabbitmqctl).with('delete_vhost', 'foo') provider.destroy end end diff --git a/spec/unit/puppet/type/rabbitmq_parameter_spec.rb b/spec/unit/puppet/type/rabbitmq_parameter_spec.rb index 8fc81c226..5b9586db8 100644 --- a/spec/unit/puppet/type/rabbitmq_parameter_spec.rb +++ b/spec/unit/puppet/type/rabbitmq_parameter_spec.rb @@ -96,7 +96,7 @@ it 'does not convert numeric string to integer' do expect(parameter[:value]['myparameter']).to eq('1800000') - expect(parameter[:value]['myparameter']).to be_kind_of(String) + expect(parameter[:value]['myparameter']).to be_a(String) end end end diff --git a/spec/unit/puppet/type/rabbitmq_user_permissions_spec.rb b/spec/unit/puppet/type/rabbitmq_user_permissions_spec.rb index 52cbccd78..90dea288f 100644 --- a/spec/unit/puppet/type/rabbitmq_user_permissions_spec.rb +++ b/spec/unit/puppet/type/rabbitmq_user_permissions_spec.rb @@ -25,7 +25,7 @@ %i[configure_permission read_permission write_permission].each do |param| it 'does not default to anything' do - expect(perms[param]).to eq(nil) + expect(perms[param]).to be_nil end it "accepts a valid regex for #{param}" do