Update 3rdparty rabbitmq module
[mirror/dsa-puppet.git] / 3rdparty / modules / rabbitmq / spec / unit / puppet / provider / rabbitmq_user / rabbitmqctl_spec.rb
1 require 'spec_helper'
2
3 provider_class = Puppet::Type.type(:rabbitmq_user).provider(:rabbitmqctl)
4 describe provider_class do
5   let(:resource) do
6     Puppet::Type.type(:rabbitmq_user).new(
7       ensure: :present,
8       name: 'rmq_x',
9       password: 'secret',
10       provider: described_class.name
11     )
12   end
13   let(:provider) { provider_class.new(resource) }
14   let(:instance) { provider.class.instances.first }
15
16   before do
17     provider.class.stubs(:rabbitmqctl).with('-q', 'list_users').returns(
18       "rmq_x [disk, storage]\nrmq_y [network, cpu, administrator]\nrmq_z []\n"
19     )
20   end
21
22   describe '#self.instances' do
23     it { expect(provider.class.instances.size).to eq(3) }
24     it 'returns an array of users' do
25       users = provider.class.instances.map(&:name)
26       expect(users).to match_array(%w[rmq_x rmq_y rmq_z])
27     end
28     it 'returns the expected tags' do
29       tags = provider.class.instances.first.get(:tags)
30       expect(tags).to match_array(%w[disk storage])
31     end
32   end
33
34   describe '#exists?' do
35     it { expect(instance.exists?).to be true }
36   end
37
38   describe '#create' do
39     it 'adds a user' do
40       provider.expects(:rabbitmqctl).with('add_user', 'rmq_x', 'secret')
41       provider.create
42     end
43     context 'no password supplied' do
44       let(:resource) do
45         Puppet::Type.type(:rabbitmq_user).new(
46           ensure: :present,
47           name: 'rmq_x'
48         )
49       end
50
51       it 'raises an error' do
52         expect do
53           provider.create
54         end.to raise_error(Puppet::Error, 'Password is a required parameter for rabbitmq_user (user: rmq_x)')
55       end
56     end
57   end
58
59   describe '#destroy' do
60     it 'removes a user' do
61       provider.expects(:rabbitmqctl).with('delete_user', 'rmq_x')
62       provider.destroy
63     end
64   end
65
66   describe '#check_password' do
67     context 'correct password' do
68       before do
69         provider.class.stubs(:rabbitmqctl).with(
70           'eval',
71           'rabbit_access_control:check_user_pass_login(list_to_binary("rmq_x"), list_to_binary("secret")).'
72         ).returns <<-EOT
73 {ok,{user,<<"rmq_x">>,[],rabbit_auth_backend_internal,
74           {internal_user,<<"rmq_x">>,
75                          <<193,81,62,182,129,135,196,89,148,87,227,48,86,2,154,
76                            192,52,119,214,177>>,
77                          []}}}
78 EOT
79       end
80
81       it do
82         provider.check_password('secret')
83       end
84     end
85
86     context 'incorrect password' do
87       before do
88         provider.class.stubs(:rabbitmqctl).with(
89           'eval',
90           'rabbit_access_control:check_user_pass_login(list_to_binary("rmq_x"), list_to_binary("nottherightone")).'
91         ).returns <<-EOT
92 {refused,"user '~s' - invalid credentials",[<<"rmq_x">>]}
93 ...done.
94 EOT
95       end
96
97       it do
98         provider.check_password('nottherightone')
99       end
100     end
101   end
102
103   describe '#tags=' do
104     it 'clears all tags on existing user' do
105       provider.set(tags: %w[tag1 tag2 tag3])
106       provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', [])
107       provider.tags = []
108       provider.flush
109     end
110
111     it 'sets multiple tags' do
112       provider.set(tags: [])
113       provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', %w[tag1 tag2])
114       provider.tags = %w[tag1 tag2]
115       provider.flush
116     end
117
118     it 'clears tags while keeping admin tag' do
119       provider.set(tags: %w[administrator tag1 tag2])
120       resource[:admin] = true
121       provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', ['administrator'])
122       provider.tags = []
123       provider.flush
124     end
125
126     it 'changes tags while keeping admin tag' do
127       provider.set(tags: %w[administrator tag1 tag2])
128       resource[:admin] = true
129       provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', %w[tag1 tag7 tag3 administrator])
130       provider.tags = %w[tag1 tag7 tag3]
131       provider.flush
132     end
133   end
134
135   describe '#admin=' do
136     it 'gets admin value properly' do
137       provider.set(tags: %w[administrator tag1 tag2])
138       expect(provider.admin).to be :true
139     end
140
141     it 'gets false admin value' do
142       provider.set(tags: %w[tag1 tag2])
143       expect(provider.admin).to be :false
144     end
145
146     it 'sets admin value' do
147       provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', ['administrator'])
148       resource[:admin] = true
149       provider.admin = resource[:admin]
150       provider.flush
151     end
152
153     it 'adds admin value to existing tags of the user' do
154       resource[:tags] = %w[tag1 tag2]
155       provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', %w[tag1 tag2 administrator])
156       resource[:admin] = true
157       provider.admin = resource[:admin]
158       provider.flush
159     end
160
161     it 'unsets admin value' do
162       provider.set(tags: ['administrator'])
163       provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', [])
164       provider.admin = :false
165       provider.flush
166     end
167
168     it 'does not interfere with existing tags on the user when unsetting admin value' do
169       provider.set(tags: %w[administrator tag1 tag2])
170       resource[:tags] = %w[tag1 tag2]
171       provider.expects(:rabbitmqctl).with('set_user_tags', 'rmq_x', %w[tag1 tag2])
172       provider.admin = :false
173       provider.flush
174     end
175   end
176 end