075602c89363dcbd37edd8f315bbb0f01febce3a
[mirror/dsa-puppet.git] / 3rdparty / modules / rabbitmq / spec / unit / puppet / provider / rabbitmq_policy / rabbitmqctl_spec.rb
1 require 'spec_helper'
2
3 describe Puppet::Type.type(:rabbitmq_policy).provider(:rabbitmqctl) do
4   let(:resource) do
5     Puppet::Type.type(:rabbitmq_policy).new(
6       name: 'ha-all@/',
7       pattern: '.*',
8       definition: {
9         'ha-mode' => 'all'
10       }
11     )
12   end
13   let(:provider) { described_class.new(resource) }
14
15   after do
16     described_class.instance_variable_set(:@policies, nil)
17   end
18
19   context 'has "@" in policy name' do
20     let(:resource) do
21       Puppet::Type.type(:rabbitmq_policy).new(
22         name: 'ha@home@/',
23         pattern: '.*',
24         definition: {
25           'ha-mode' => 'all'
26         },
27         provider: described_class.name
28       )
29     end
30     let(:provider) { described_class.new(resource) }
31
32     it do
33       expect(provider.should_policy).to eq('ha@home')
34     end
35
36     it do
37       expect(provider.should_vhost).to eq('/')
38     end
39   end
40
41   it 'fails with invalid output from list' do
42     provider.class.expects(:rabbitmqctl).with('-q', 'status').returns '{rabbit,"RabbitMQ","3.1.5"}'
43     provider.class.expects(:rabbitmqctl).with('list_policies', '-q', '-p', '/').returns 'foobar'
44     expect { provider.exists? }.to raise_error(Puppet::Error, %r{cannot parse line from list_policies})
45   end
46
47   context 'with RabbitMQ version >=3.7.0' do
48     it 'matches policies from list' do
49       provider.class.expects(:rabbitmq_version).returns '3.7.0'
50       provider.class.expects(:rabbitmqctl).with('list_policies', '-q', '-p', '/').returns <<-EOT
51 / ha-all .* all {"ha-mode":"all","ha-sync-mode":"automatic"} 0
52 / test .* exchanges {"ha-mode":"all"} 0
53 EOT
54       expect(provider.exists?).to eq(applyto: 'all',
55                                      pattern: '.*',
56                                      priority: '0',
57                                      definition: {
58                                        'ha-mode'      => 'all',
59                                        'ha-sync-mode' => 'automatic'
60                                      })
61     end
62   end
63
64   context 'with RabbitMQ version >=3.2.0 and < 3.7.0' do
65     it 'matches policies from list' do
66       provider.class.expects(:rabbitmq_version).returns '3.6.9'
67       provider.class.expects(:rabbitmqctl).with('list_policies', '-q', '-p', '/').returns <<-EOT
68 / ha-all all .* {"ha-mode":"all","ha-sync-mode":"automatic"} 0
69 / test exchanges .* {"ha-mode":"all"} 0
70 EOT
71       expect(provider.exists?).to eq(applyto: 'all',
72                                      pattern: '.*',
73                                      priority: '0',
74                                      definition: {
75                                        'ha-mode'      => 'all',
76                                        'ha-sync-mode' => 'automatic'
77                                      })
78     end
79   end
80
81   context 'with RabbitMQ version <3.2.0' do
82     it 'matches policies from list (<3.2.0)' do
83       provider.class.expects(:rabbitmq_version).returns '3.1.5'
84       provider.class.expects(:rabbitmqctl).with('list_policies', '-q', '-p', '/').returns <<-EOT
85 / ha-all .* {"ha-mode":"all","ha-sync-mode":"automatic"} 0
86 / test .* {"ha-mode":"all"} 0
87 EOT
88       expect(provider.exists?).to eq(applyto: 'all',
89                                      pattern: '.*',
90                                      priority: '0',
91                                      definition: {
92                                        'ha-mode'      => 'all',
93                                        'ha-sync-mode' => 'automatic'
94                                      })
95     end
96   end
97
98   it 'does not match an empty list' do
99     provider.class.expects(:rabbitmqctl).with('-q', 'status').returns '{rabbit,"RabbitMQ","3.1.5"}'
100     provider.class.expects(:rabbitmqctl).with('list_policies', '-q', '-p', '/').returns ''
101     expect(provider.exists?).to eq(nil)
102   end
103
104   it 'destroys policy' do
105     provider.expects(:rabbitmqctl).with('clear_policy', '-p', '/', 'ha-all')
106     provider.destroy
107   end
108
109   it 'onlies call set_policy once (<3.2.0)' do
110     provider.class.expects(:rabbitmq_version).returns '3.1.0'
111     provider.resource[:priority] = '10'
112     provider.resource[:applyto] = 'exchanges'
113     provider.expects(:rabbitmqctl).with('set_policy',
114                                         '-p', '/',
115                                         'ha-all',
116                                         '.*',
117                                         '{"ha-mode":"all"}',
118                                         '10').once
119     provider.priority = '10'
120     provider.applyto = 'exchanges'
121   end
122
123   it 'onlies call set_policy once (>=3.2.0)' do
124     provider.class.expects(:rabbitmq_version).returns '3.2.0'
125     provider.resource[:priority] = '10'
126     provider.resource[:applyto] = 'exchanges'
127     provider.expects(:rabbitmqctl).with('set_policy',
128                                         '-p', '/',
129                                         '--priority', '10',
130                                         '--apply-to', 'exchanges',
131                                         'ha-all',
132                                         '.*',
133                                         '{"ha-mode":"all"}').once
134     provider.priority = '10'
135     provider.applyto = 'exchanges'
136   end
137 end