wright 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +34 -0
- data/NEWS.md +22 -0
- data/README.md +56 -40
- data/lib/wright/dsl.rb +1 -2
- data/lib/wright/provider/directory.rb +2 -9
- data/lib/wright/provider/file.rb +6 -13
- data/lib/wright/provider/group/darwin_directory_service.rb +61 -0
- data/lib/wright/provider/group/gnu_passwd.rb +42 -0
- data/lib/wright/provider/group.rb +111 -0
- data/lib/wright/provider/package/apt.rb +9 -43
- data/lib/wright/provider/package/homebrew.rb +68 -0
- data/lib/wright/provider/package.rb +26 -0
- data/lib/wright/provider/symlink.rb +4 -9
- data/lib/wright/provider/user/gnu_passwd.rb +55 -0
- data/lib/wright/provider/user.rb +137 -0
- data/lib/wright/provider.rb +40 -0
- data/lib/wright/resource/file.rb +1 -1
- data/lib/wright/resource/group.rb +64 -0
- data/lib/wright/resource/package.rb +6 -6
- data/lib/wright/resource/user.rb +76 -0
- data/lib/wright/util/recursive_autoloader.rb +1 -1
- data/lib/wright/util/stolen_from_activesupport.rb +2 -0
- data/lib/wright/util.rb +17 -2
- data/lib/wright/version.rb +1 -1
- data/lib/wright.rb +3 -2
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership.return +1 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_permission-denied-user.return +1 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_permission-denied-user.stderr +2 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_permission-denied-user.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_user1_user2.return +1 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_user1_user2.stderr +0 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_user1_user2.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_1234_newgroup.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_1234_newgroup.stderr +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_1234_newgroup.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_499_newgroup.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_499_newgroup.stderr +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_499_newgroup.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_ERROR_newgroup.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_ERROR_newgroup.stderr +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_ERROR_newgroup.stdout +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_bazqux.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_bazqux.stderr +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_bazqux.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_foobar.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_foobar.stderr +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_foobar.stdout +10 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_52_foobar.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_52_foobar.stderr +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_52_foobar.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_ERROR_foobar.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_ERROR_foobar.stderr +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_ERROR_foobar.stdout +1 -0
- data/spec/provider/group/darwin_directory_service_spec.rb +381 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_''_foobar.return +1 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_''_foobar.stderr +0 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_''_foobar.stdout +0 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_'not-a-user'_foobar.return +1 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_'not-a-user'_foobar.stderr +1 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_'not-a-user'_foobar.stdout +0 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_'user1,user2'_foobar.return +1 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_'user1,user2'_foobar.stderr +0 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_'user1,user2'_foobar.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupadd_--system_newgroup.return +1 -0
- data/spec/provider/group/gnu_passwd/groupadd_--system_newgroup.stderr +0 -0
- data/spec/provider/group/gnu_passwd/groupadd_--system_newgroup.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupadd_-g_1234_newgroup.return +1 -0
- data/spec/provider/group/gnu_passwd/groupadd_-g_1234_newgroup.stderr +0 -0
- data/spec/provider/group/gnu_passwd/groupadd_-g_1234_newgroup.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupadd_-g_ERROR_newgroup.return +1 -0
- data/spec/provider/group/gnu_passwd/groupadd_-g_ERROR_newgroup.stderr +1 -0
- data/spec/provider/group/gnu_passwd/groupadd_-g_ERROR_newgroup.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupdel_bazqux.return +1 -0
- data/spec/provider/group/gnu_passwd/groupdel_bazqux.stderr +1 -0
- data/spec/provider/group/gnu_passwd/groupdel_bazqux.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupdel_foobar.return +1 -0
- data/spec/provider/group/gnu_passwd/groupdel_foobar.stderr +0 -0
- data/spec/provider/group/gnu_passwd/groupdel_foobar.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupmod_-g_52_foobar.return +1 -0
- data/spec/provider/group/gnu_passwd/groupmod_-g_52_foobar.stderr +0 -0
- data/spec/provider/group/gnu_passwd/groupmod_-g_52_foobar.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupmod_-g_ERROR_foobar.return +1 -0
- data/spec/provider/group/gnu_passwd/groupmod_-g_ERROR_foobar.stderr +1 -0
- data/spec/provider/group/gnu_passwd/groupmod_-g_ERROR_foobar.stdout +0 -0
- data/spec/provider/group/gnu_passwd_spec.rb +382 -0
- data/spec/provider/group_spec.rb +132 -0
- data/spec/provider/package/apt/apt-get_install_-qy_not-a-real-package.stderr +1 -0
- data/spec/provider/package/apt/{dpkg-query_-s_unknown-package.stderr → dpkg-query_-s_not-a-real-package.stderr} +1 -1
- data/spec/provider/package/apt/dpkg-query_-s_not-a-real-package.stdout +0 -0
- data/spec/provider/package/apt_spec.rb +27 -15
- data/spec/provider/package/homebrew/brew_info_--json=v1_cd-discid.return +1 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_cd-discid.stderr +0 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_cd-discid.stdout +1 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_lame.return +1 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_lame.stderr +0 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_lame.stdout +1 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_not-a-real-package.return +1 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_not-a-real-package.stderr +1 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_not-a-real-package.stdout +0 -0
- data/spec/provider/package/homebrew/brew_install_cd-discid.return +1 -0
- data/spec/provider/package/homebrew/brew_install_cd-discid.stderr +0 -0
- data/spec/provider/package/homebrew/brew_install_cd-discid.stdout +9 -0
- data/spec/provider/package/homebrew/brew_install_not-a-real-package.return +1 -0
- data/spec/provider/package/homebrew/brew_install_not-a-real-package.stderr +1 -0
- data/spec/provider/package/homebrew/brew_install_not-a-real-package.stdout +2 -0
- data/spec/provider/package/homebrew/brew_uninstall_lame.return +1 -0
- data/spec/provider/package/homebrew/brew_uninstall_lame.stderr +0 -0
- data/spec/provider/package/homebrew/brew_uninstall_lame.stdout +1 -0
- data/spec/provider/package/homebrew_spec.rb +268 -0
- data/spec/provider/user/gnu_passwd/useradd_johndoe.return +1 -0
- data/spec/provider/user/gnu_passwd/useradd_johndoe.stderr +0 -0
- data/spec/provider/user/gnu_passwd/useradd_johndoe.stdout +0 -0
- data/spec/provider/user/gnu_passwd/useradd_with_options.return +1 -0
- data/spec/provider/user/gnu_passwd/useradd_with_options.stderr +0 -0
- data/spec/provider/user/gnu_passwd/useradd_with_options.stdout +0 -0
- data/spec/provider/user/gnu_passwd/userdel_johndoe.return +1 -0
- data/spec/provider/user/gnu_passwd/userdel_johndoe.stderr +0 -0
- data/spec/provider/user/gnu_passwd/userdel_johndoe.stdout +0 -0
- data/spec/provider/user/gnu_passwd/usermod_-u_42_johndoe.return +1 -0
- data/spec/provider/user/gnu_passwd/usermod_-u_42_johndoe.stderr +0 -0
- data/spec/provider/user/gnu_passwd/usermod_-u_42_johndoe.stdout +0 -0
- data/spec/provider/user/gnu_passwd_spec.rb +107 -0
- data/spec/provider/user_spec.rb +327 -0
- data/spec/resource/group_spec.rb +29 -0
- data/spec/resource/package_spec.rb +37 -0
- data/spec/resource/user_spec.rb +29 -0
- data/spec/spec_helper.rb +5 -11
- data/spec/spec_helpers/fake_capture3.rb +11 -7
- data/spec/spec_helpers/test_coverage.rb +26 -0
- data/spec/util/activesupport_spec.rb +1 -0
- data/spec/util/file_permissions_spec.rb +2 -2
- data/spec/util/file_spec.rb +1 -0
- data/spec/util/user_spec.rb +2 -0
- metadata +246 -23
- data/NEWS +0 -18
- data/spec/provider/package/apt/apt-get_install_-qy_unknown-package.stderr +0 -1
- /data/spec/provider/{package/apt/dpkg-query_-s_unknown-package.stdout → group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership.stderr} +0 -0
- /data/spec/provider/package/apt/{apt-get_install_-qy_unknown-package.return → apt-get_install_-qy_not-a-real-package.return} +0 -0
- /data/spec/provider/package/apt/{apt-get_install_-qy_unknown-package.stdout → apt-get_install_-qy_not-a-real-package.stdout} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_unknown-package.return → dpkg-query_-s_not-a-real-package.return} +0 -0
@@ -0,0 +1,382 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
|
3
|
+
require 'wright/provider/group/gnu_passwd'
|
4
|
+
require 'fakeetc'
|
5
|
+
|
6
|
+
describe Wright::Provider::Group::GnuPasswd do
|
7
|
+
def groupadd(group_name, gid = nil, system = false)
|
8
|
+
options = []
|
9
|
+
options << '--system' if system
|
10
|
+
options += ['-g', gid.to_s] if gid
|
11
|
+
['groupadd', *options, group_name]
|
12
|
+
end
|
13
|
+
|
14
|
+
def gpasswd(group_name, members)
|
15
|
+
['gpasswd', '-M', "'#{members.join(',')}'", group_name]
|
16
|
+
end
|
17
|
+
|
18
|
+
def groupmod(group_name, gid)
|
19
|
+
['groupmod', '-g', gid.to_s, group_name]
|
20
|
+
end
|
21
|
+
|
22
|
+
def groupdel(group_name)
|
23
|
+
['groupdel', group_name]
|
24
|
+
end
|
25
|
+
|
26
|
+
def group_provider(group_name, gid = nil, members = nil, system = false)
|
27
|
+
group_resource = OpenStruct.new(name: group_name,
|
28
|
+
gid: gid,
|
29
|
+
members: members,
|
30
|
+
system: system)
|
31
|
+
Wright::Provider::Group::GnuPasswd.new(group_resource)
|
32
|
+
end
|
33
|
+
|
34
|
+
before :each do
|
35
|
+
gnu_passwd_dir = File.join(File.dirname(__FILE__), 'gnu_passwd')
|
36
|
+
@fake_capture3 = FakeCapture3.new(gnu_passwd_dir)
|
37
|
+
@create_message = ->(group) { "INFO: create group: '#{group}'\n" }
|
38
|
+
@create_message_dry = lambda do |group|
|
39
|
+
"INFO: (would) create group: '#{group}'\n"
|
40
|
+
end
|
41
|
+
@create_message_debug = lambda do |group|
|
42
|
+
"DEBUG: group already created: '#{group}'\n"
|
43
|
+
end
|
44
|
+
@remove_message = ->(group) { "INFO: remove group: '#{group}'\n" }
|
45
|
+
@remove_message_dry = lambda do |group|
|
46
|
+
"INFO: (would) remove group: '#{group}'\n"
|
47
|
+
end
|
48
|
+
@remove_message_debug = lambda do |group|
|
49
|
+
"DEBUG: group already removed: '#{group}'\n"
|
50
|
+
end
|
51
|
+
@groups = { 'foobar' => { gid: 42, mem: %w(foo bar) },
|
52
|
+
'bazqux' => { gid: 43, mem: %w(baz qux) } }
|
53
|
+
FakeEtc.add_groups(@groups)
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#create' do
|
57
|
+
it 'should create new groups' do
|
58
|
+
gid = 1234
|
59
|
+
group_name = 'newgroup'
|
60
|
+
group_provider = group_provider(group_name, gid)
|
61
|
+
groupadd_cmd = groupadd(group_name, gid)
|
62
|
+
|
63
|
+
@fake_capture3.expect(groupadd_cmd)
|
64
|
+
@fake_capture3.stub do
|
65
|
+
FakeEtc do
|
66
|
+
lambda do
|
67
|
+
reset_logger
|
68
|
+
group_provider.create
|
69
|
+
group_provider.updated?.must_equal true
|
70
|
+
end.must_output @create_message.call(group_name)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should create new system groups' do
|
76
|
+
group_name = 'newgroup'
|
77
|
+
gid = nil
|
78
|
+
members = nil
|
79
|
+
system = true
|
80
|
+
group_provider = group_provider(group_name, gid, members, system)
|
81
|
+
groupadd_cmd = groupadd(group_name, gid, system)
|
82
|
+
|
83
|
+
@fake_capture3.expect(groupadd_cmd)
|
84
|
+
@fake_capture3.stub do
|
85
|
+
FakeEtc do
|
86
|
+
lambda do
|
87
|
+
reset_logger
|
88
|
+
group_provider.create
|
89
|
+
group_provider.updated?.must_equal true
|
90
|
+
end.must_output @create_message.call(group_name)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should not try to create existing groups' do
|
96
|
+
group_name = 'foobar'
|
97
|
+
gid = @groups[group_name][:gid]
|
98
|
+
members = @groups[group_name][:mem]
|
99
|
+
group_provider = group_provider(group_name, gid, members)
|
100
|
+
|
101
|
+
@fake_capture3.stub do
|
102
|
+
FakeEtc do
|
103
|
+
lambda do
|
104
|
+
reset_logger
|
105
|
+
group_provider.create
|
106
|
+
group_provider.updated?.must_equal false
|
107
|
+
end.must_output @create_message_debug.call(group_name)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'should clear member lists for existing groups' do
|
113
|
+
group_name = 'foobar'
|
114
|
+
gid = @groups[group_name][:gid]
|
115
|
+
members = []
|
116
|
+
group_provider = group_provider(group_name, gid, members)
|
117
|
+
gpasswd_cmd = gpasswd(group_name, members)
|
118
|
+
|
119
|
+
@fake_capture3.expect(gpasswd_cmd)
|
120
|
+
@fake_capture3.stub do
|
121
|
+
FakeEtc do
|
122
|
+
lambda do
|
123
|
+
reset_logger
|
124
|
+
group_provider.create
|
125
|
+
group_provider.updated?.must_equal true
|
126
|
+
end.must_output @create_message.call(group_name)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should update member lists for existing groups' do
|
132
|
+
group_name = 'foobar'
|
133
|
+
gid = @groups[group_name][:gid]
|
134
|
+
members = %w(user1 user2)
|
135
|
+
group_provider = group_provider(group_name, gid, members)
|
136
|
+
gpasswd_cmd = gpasswd(group_name, members)
|
137
|
+
|
138
|
+
@fake_capture3.expect(gpasswd_cmd)
|
139
|
+
@fake_capture3.stub do
|
140
|
+
FakeEtc do
|
141
|
+
lambda do
|
142
|
+
reset_logger
|
143
|
+
group_provider.create
|
144
|
+
group_provider.updated?.must_equal true
|
145
|
+
end.must_output @create_message.call(group_name)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'should update the gid for existing groups' do
|
151
|
+
group_name = 'foobar'
|
152
|
+
gid = @groups[group_name][:gid] + 10
|
153
|
+
group_provider = group_provider(group_name, gid)
|
154
|
+
groupmod_cmd = groupmod(group_name, gid)
|
155
|
+
|
156
|
+
@fake_capture3.expect(groupmod_cmd)
|
157
|
+
@fake_capture3.stub do
|
158
|
+
FakeEtc do
|
159
|
+
lambda do
|
160
|
+
reset_logger
|
161
|
+
group_provider.create
|
162
|
+
group_provider.updated?.must_equal true
|
163
|
+
end.must_output @create_message.call(group_name)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'should report errors by groupadd' do
|
169
|
+
gid = 'ERROR'
|
170
|
+
group_name = 'newgroup'
|
171
|
+
group_provider = group_provider(group_name, gid)
|
172
|
+
groupadd_cmd = groupadd(group_name, gid)
|
173
|
+
|
174
|
+
@fake_capture3.expect(groupadd_cmd)
|
175
|
+
@fake_capture3.stub do
|
176
|
+
FakeEtc do
|
177
|
+
e = -> { group_provider.create }.must_raise RuntimeError
|
178
|
+
wright_error = "cannot create group '#{group_name}'"
|
179
|
+
groupadd_error = "groupadd: invalid group ID '#{gid}'"
|
180
|
+
e.message.must_equal %(#{wright_error}: "#{groupadd_error}")
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'should report errors by groupmod' do
|
186
|
+
gid = 'ERROR'
|
187
|
+
group_name = 'foobar'
|
188
|
+
group_provider = group_provider(group_name, gid)
|
189
|
+
groupmod_cmd = groupmod(group_name, gid)
|
190
|
+
|
191
|
+
@fake_capture3.expect(groupmod_cmd)
|
192
|
+
@fake_capture3.stub do
|
193
|
+
FakeEtc do
|
194
|
+
e = -> { group_provider.create }.must_raise RuntimeError
|
195
|
+
wright_error = "cannot create group '#{group_name}'"
|
196
|
+
groupmod_error = "groupmod: invalid group ID '#{gid}'"
|
197
|
+
e.message.must_equal %(#{wright_error}: "#{groupmod_error}")
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'should report errors by gpasswd' do
|
203
|
+
user = 'not-a-user'
|
204
|
+
members = [user]
|
205
|
+
group_name = 'foobar'
|
206
|
+
group_provider = group_provider(group_name, nil, members)
|
207
|
+
gpasswd_cmd = gpasswd(group_name, members)
|
208
|
+
|
209
|
+
@fake_capture3.expect(gpasswd_cmd)
|
210
|
+
@fake_capture3.stub do
|
211
|
+
FakeEtc do
|
212
|
+
e = -> { group_provider.create }.must_raise RuntimeError
|
213
|
+
wright_error = "cannot create group '#{group_name}'"
|
214
|
+
gpasswd_error = "gpasswd: user '#{user}' does not exist"
|
215
|
+
e.message.must_equal %(#{wright_error}: "#{gpasswd_error}")
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
describe '#remove' do
|
222
|
+
it 'should remove existing groups' do
|
223
|
+
group_name = 'foobar'
|
224
|
+
group_provider = group_provider(group_name)
|
225
|
+
groupdel_cmd = groupdel(group_name)
|
226
|
+
|
227
|
+
@fake_capture3.expect(groupdel_cmd)
|
228
|
+
@fake_capture3.stub do
|
229
|
+
FakeEtc do
|
230
|
+
lambda do
|
231
|
+
reset_logger
|
232
|
+
group_provider.remove
|
233
|
+
group_provider.updated?.must_equal true
|
234
|
+
end.must_output @remove_message.call(group_name)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'should not try to remove groups that are already removed' do
|
240
|
+
group_name = 'not-a-group'
|
241
|
+
group_provider = group_provider(group_name)
|
242
|
+
|
243
|
+
@fake_capture3.stub do
|
244
|
+
FakeEtc do
|
245
|
+
lambda do
|
246
|
+
reset_logger
|
247
|
+
group_provider.remove
|
248
|
+
group_provider.updated?.must_equal false
|
249
|
+
end.must_output @remove_message_debug.call(group_name)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
it 'should report errors by gpasswd' do
|
255
|
+
group_name = 'bazqux'
|
256
|
+
group_provider = group_provider(group_name)
|
257
|
+
groupdel_cmd = groupdel(group_name)
|
258
|
+
|
259
|
+
@fake_capture3.expect(groupdel_cmd)
|
260
|
+
@fake_capture3.stub do
|
261
|
+
FakeEtc do
|
262
|
+
e = -> { group_provider.remove }.must_raise RuntimeError
|
263
|
+
wright_error = "cannot remove group '#{group_name}'"
|
264
|
+
groupdel_error =
|
265
|
+
"groupdel: cannot remove the primary group of user 'quux'"
|
266
|
+
e.message.must_equal %(#{wright_error}: "#{groupdel_error}")
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
describe 'dry_run' do
|
273
|
+
it 'should not actually create new groups' do
|
274
|
+
gid = 1234
|
275
|
+
group_name = 'newgroup'
|
276
|
+
group_provider = group_provider(group_name, gid)
|
277
|
+
|
278
|
+
@fake_capture3.stub do
|
279
|
+
Wright.dry_run do
|
280
|
+
FakeEtc do
|
281
|
+
lambda do
|
282
|
+
reset_logger
|
283
|
+
group_provider.create
|
284
|
+
group_provider.updated?.must_equal true
|
285
|
+
end.must_output @create_message_dry.call(group_name)
|
286
|
+
end
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
it 'should not actually update existing groups' do
|
292
|
+
gid = 1234
|
293
|
+
group_name = 'foobar'
|
294
|
+
members = %w(user1 user2)
|
295
|
+
group_provider = group_provider(group_name, gid, members)
|
296
|
+
|
297
|
+
@fake_capture3.stub do
|
298
|
+
Wright.dry_run do
|
299
|
+
FakeEtc do
|
300
|
+
lambda do
|
301
|
+
reset_logger
|
302
|
+
group_provider.create
|
303
|
+
group_provider.updated?.must_equal true
|
304
|
+
end.must_output @create_message_dry.call(group_name)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
it 'should not try to create existing groups' do
|
311
|
+
group_name = 'foobar'
|
312
|
+
gid = @groups[group_name][:gid]
|
313
|
+
members = @groups[group_name][:mem]
|
314
|
+
group_provider = group_provider(group_name, gid, members)
|
315
|
+
|
316
|
+
@fake_capture3.stub do
|
317
|
+
Wright.dry_run do
|
318
|
+
FakeEtc do
|
319
|
+
lambda do
|
320
|
+
reset_logger
|
321
|
+
group_provider.create
|
322
|
+
group_provider.updated?.must_equal false
|
323
|
+
end.must_output @create_message_debug.call(group_name)
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
it 'should not actually update existing groups' do
|
330
|
+
group_name = 'foobar'
|
331
|
+
gid = @groups[group_name][:gid] + 10
|
332
|
+
members = %w(user1 user2)
|
333
|
+
group_provider = group_provider(group_name, gid, members)
|
334
|
+
|
335
|
+
@fake_capture3.stub do
|
336
|
+
Wright.dry_run do
|
337
|
+
FakeEtc do
|
338
|
+
lambda do
|
339
|
+
reset_logger
|
340
|
+
group_provider.create
|
341
|
+
group_provider.updated?.must_equal true
|
342
|
+
end.must_output @create_message_dry.call(group_name)
|
343
|
+
end
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
it 'should not actually remove groups' do
|
349
|
+
group_name = 'foobar'
|
350
|
+
group_provider = group_provider(group_name)
|
351
|
+
|
352
|
+
@fake_capture3.stub do
|
353
|
+
Wright.dry_run do
|
354
|
+
FakeEtc do
|
355
|
+
lambda do
|
356
|
+
reset_logger
|
357
|
+
group_provider.remove
|
358
|
+
group_provider.updated?.must_equal true
|
359
|
+
end.must_output @remove_message_dry.call(group_name)
|
360
|
+
end
|
361
|
+
end
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
it 'should not try to remove groups that are already removed' do
|
366
|
+
group_name = 'not-a-group'
|
367
|
+
group_provider = group_provider(group_name)
|
368
|
+
|
369
|
+
@fake_capture3.stub do
|
370
|
+
Wright.dry_run do
|
371
|
+
FakeEtc do
|
372
|
+
lambda do
|
373
|
+
reset_logger
|
374
|
+
group_provider.remove
|
375
|
+
group_provider.updated?.must_equal false
|
376
|
+
end.must_output @remove_message_debug.call(group_name)
|
377
|
+
end
|
378
|
+
end
|
379
|
+
end
|
380
|
+
end
|
381
|
+
end
|
382
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
require 'fakeetc'
|
4
|
+
|
5
|
+
require 'wright/provider'
|
6
|
+
require 'wright/provider/group'
|
7
|
+
|
8
|
+
describe Wright::Provider::Group do
|
9
|
+
before(:each) do
|
10
|
+
Wright::Provider::Group.send(:public, :uptodate?)
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:each) do
|
14
|
+
Wright::Provider::Group.send(:private, :uptodate?)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#uptodate?' do
|
18
|
+
it 'should return the correct status' do
|
19
|
+
resource = OpenStruct.new(name: 'foo')
|
20
|
+
provider = Wright::Provider::Group.new(resource)
|
21
|
+
|
22
|
+
FakeEtc.add_groups('foo' => { gid: 42, mem: %w(user1 user2) })
|
23
|
+
FakeEtc do
|
24
|
+
provider.uptodate?(:create).must_equal true
|
25
|
+
provider.uptodate?(:remove).must_equal false
|
26
|
+
end
|
27
|
+
|
28
|
+
FakeEtc.clear_groups
|
29
|
+
FakeEtc do
|
30
|
+
provider.uptodate?(:create).must_equal false
|
31
|
+
provider.uptodate?(:remove).must_equal true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should return the correct status when given a specific gid' do
|
36
|
+
gid = 52
|
37
|
+
resource = OpenStruct.new(name: 'foo', gid: gid, members: nil)
|
38
|
+
provider = Wright::Provider::Group.new(resource)
|
39
|
+
|
40
|
+
FakeEtc.add_groups('foo' => { gid: 42, mem: [] })
|
41
|
+
FakeEtc do
|
42
|
+
provider.uptodate?(:create).must_equal false
|
43
|
+
provider.uptodate?(:remove).must_equal false
|
44
|
+
end
|
45
|
+
|
46
|
+
FakeEtc.clear_groups
|
47
|
+
FakeEtc.add_groups('foo' => { gid: gid, mem: [] })
|
48
|
+
FakeEtc do
|
49
|
+
provider.uptodate?(:create).must_equal true
|
50
|
+
provider.uptodate?(:remove).must_equal false
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should return the correct status when given a specific member list' do
|
55
|
+
members = %w(user1 user2)
|
56
|
+
resource = OpenStruct.new(name: 'foo', gid: nil, members: members)
|
57
|
+
provider = Wright::Provider::Group.new(resource)
|
58
|
+
|
59
|
+
FakeEtc.add_groups('foo' => { gid: 42, mem: [] })
|
60
|
+
FakeEtc do
|
61
|
+
provider.uptodate?(:create).must_equal false
|
62
|
+
provider.uptodate?(:remove).must_equal false
|
63
|
+
end
|
64
|
+
|
65
|
+
FakeEtc.clear_groups
|
66
|
+
FakeEtc.add_groups('foo' => { gid: 42, mem: members })
|
67
|
+
FakeEtc do
|
68
|
+
provider.uptodate?(:create).must_equal true
|
69
|
+
provider.uptodate?(:remove).must_equal false
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should raise exceptions for invalid actions' do
|
74
|
+
resource = OpenStruct.new(name: 'foo')
|
75
|
+
provider = Wright::Provider::Group.new(resource)
|
76
|
+
e = -> { provider.uptodate?(:foobarbaz) }.must_raise ArgumentError
|
77
|
+
e.message.must_equal "invalid action 'foobarbaz'"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#add_member' do
|
82
|
+
it 'should raise an exception' do
|
83
|
+
resource = OpenStruct.new(name: 'foo')
|
84
|
+
provider = Wright::Provider::Group.new(resource)
|
85
|
+
lambda do
|
86
|
+
provider.send(:add_member, 'member', 'group')
|
87
|
+
end.must_raise NotImplementedError
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#remove_member' do
|
92
|
+
it 'should raise an exception' do
|
93
|
+
resource = OpenStruct.new(name: 'foo')
|
94
|
+
provider = Wright::Provider::Group.new(resource)
|
95
|
+
lambda do
|
96
|
+
provider.send(:remove_member, 'member', 'group')
|
97
|
+
end.must_raise NotImplementedError
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe '#set_members' do
|
102
|
+
it 'should use add_member and remove_member to update the member list' do
|
103
|
+
group_name = 'foo'
|
104
|
+
current_members = %w(user1 user2 user3)
|
105
|
+
target_members = %w(user3 user4 user5)
|
106
|
+
resource = OpenStruct.new(name: group_name,
|
107
|
+
members: target_members)
|
108
|
+
provider = Wright::Provider::Group.new(resource)
|
109
|
+
Wright::Provider::Group.send(:public, :set_members)
|
110
|
+
|
111
|
+
mock_provider = Minitest::Mock.new
|
112
|
+
add_member_stub = ->(m, g) { mock_provider.add_member(m, g) }
|
113
|
+
remove_member_stub = ->(m, g) { mock_provider.remove_member(m, g) }
|
114
|
+
|
115
|
+
mock_provider.expect(:add_member, true, %W(user4 #{group_name}))
|
116
|
+
mock_provider.expect(:add_member, true, %W(user5 #{group_name}))
|
117
|
+
mock_provider.expect(:remove_member, true, %W(user1 #{group_name}))
|
118
|
+
mock_provider.expect(:remove_member, true, %W(user2 #{group_name}))
|
119
|
+
|
120
|
+
FakeEtc.add_groups('foo' => { gid: 42, mem: current_members })
|
121
|
+
FakeEtc do
|
122
|
+
provider.stub(:add_member, add_member_stub) do
|
123
|
+
provider.stub(:remove_member, remove_member_stub) do
|
124
|
+
provider.set_members
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
mock_provider.verify
|
129
|
+
Wright::Provider::Group.send(:private, :set_members)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
E: Unable to locate package not-a-real-package
|
@@ -1,3 +1,3 @@
|
|
1
|
-
dpkg-query: package '
|
1
|
+
dpkg-query: package 'not-a-real-package' is not installed and no information is available
|
2
2
|
Use dpkg --info (= dpkg-deb --info) to examine archive files,
|
3
3
|
and dpkg --contents (= dpkg-deb --contents) to list their contents.
|
File without changes
|
@@ -2,21 +2,21 @@ require_relative '../../spec_helper'
|
|
2
2
|
|
3
3
|
require 'wright/provider/package/apt'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
describe Wright::Provider::Package::Apt do
|
6
|
+
def dpkg_query(pkg_name)
|
7
|
+
['dpkg-query', '-s', pkg_name]
|
8
|
+
end
|
8
9
|
|
9
|
-
def apt_get(action, pkg_name, pkg_version = nil)
|
10
|
-
|
11
|
-
|
12
|
-
end
|
10
|
+
def apt_get(action, pkg_name, pkg_version = nil)
|
11
|
+
version = pkg_version.nil? ? '' : "=#{pkg_version}"
|
12
|
+
['apt-get', action.to_s, '-qy', pkg_name + version]
|
13
|
+
end
|
13
14
|
|
14
|
-
def package_provider(pkg_name, pkg_version = nil)
|
15
|
-
|
16
|
-
|
17
|
-
end
|
15
|
+
def package_provider(pkg_name, pkg_version = nil)
|
16
|
+
pkg_resource = OpenStruct.new(name: pkg_name, version: pkg_version)
|
17
|
+
Wright::Provider::Package::Apt.new(pkg_resource)
|
18
|
+
end
|
18
19
|
|
19
|
-
describe Wright::Provider::Package::Apt do
|
20
20
|
before :each do
|
21
21
|
apt_dir = File.join(File.dirname(__FILE__), 'apt')
|
22
22
|
env = { 'DEBIAN_FRONTEND' => 'noninteractive' }
|
@@ -50,7 +50,7 @@ describe Wright::Provider::Package::Apt do
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
it 'should return empty array for missing packages' do
|
53
|
+
it 'should return an empty array for missing packages' do
|
54
54
|
pkg_name = 'vlc'
|
55
55
|
pkg_versions = []
|
56
56
|
pkg_provider = package_provider(pkg_name)
|
@@ -62,7 +62,7 @@ describe Wright::Provider::Package::Apt do
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
it 'should return
|
65
|
+
it 'should return an empty array for removed packages' do
|
66
66
|
pkg_name = 'htop'
|
67
67
|
pkg_versions = []
|
68
68
|
pkg_provider = package_provider(pkg_name)
|
@@ -73,6 +73,18 @@ describe Wright::Provider::Package::Apt do
|
|
73
73
|
pkg_provider.installed_versions.must_equal pkg_versions
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
77
|
+
it 'should return an empty array for unavailable packages' do
|
78
|
+
pkg_name = 'not-a-real-package'
|
79
|
+
pkg_versions = []
|
80
|
+
pkg_provider = package_provider(pkg_name)
|
81
|
+
dpkg_cmd = dpkg_query(pkg_name)
|
82
|
+
|
83
|
+
@fake_capture3.expect(dpkg_cmd)
|
84
|
+
@fake_capture3.stub do
|
85
|
+
pkg_provider.installed_versions.must_equal pkg_versions
|
86
|
+
end
|
87
|
+
end
|
76
88
|
end
|
77
89
|
|
78
90
|
describe '#install' do
|
@@ -143,7 +155,7 @@ describe Wright::Provider::Package::Apt do
|
|
143
155
|
end
|
144
156
|
|
145
157
|
it 'should raise exceptions for unknown packages' do
|
146
|
-
pkg_name = '
|
158
|
+
pkg_name = 'not-a-real-package'
|
147
159
|
pkg_provider = package_provider(pkg_name)
|
148
160
|
dpkg_cmd = dpkg_query(pkg_name)
|
149
161
|
apt_cmd = apt_get(:install, pkg_name)
|
@@ -0,0 +1 @@
|
|
1
|
+
0
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
[{"name":"cd-discid","homepage":"http://linukz.org/cd-discid.shtml","versions":{"stable":"1.1","bottle":false,"devel":null,"head":null},"revision":0,"installed":[],"linked_keg":null,"keg_only":null,"dependencies":[],"conflicts_with":[],"caveats":null,"options":[]}]
|
@@ -0,0 +1 @@
|
|
1
|
+
0
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
[{"name":"lame","homepage":"http://lame.sourceforge.net/","versions":{"stable":"3.99.5","bottle":true,"devel":null,"head":null},"revision":0,"installed":[{"version":"3.99.5","used_options":[],"built_as_bottle":null,"poured_from_bottle":false}],"linked_keg":"3.99.5","keg_only":null,"dependencies":[],"conflicts_with":[],"caveats":null,"options":[{"option":"--universal","description":"Build a universal binary"}]}]
|
@@ -0,0 +1 @@
|
|
1
|
+
1
|
@@ -0,0 +1 @@
|
|
1
|
+
[4;31mError[0m: No available formula for not-a-real-package
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
0
|
File without changes
|
@@ -0,0 +1,9 @@
|
|
1
|
+
==> Downloading http://linukz.org/download/cd-discid-1.1.tar.gz
|
2
|
+
==> Downloading https://trac.macports.org/export/70630/trunk/dports/audio/cd-discid/files/patch-cd-discid.c.diff
|
3
|
+
==> Patching
|
4
|
+
patching file cd-discid.c
|
5
|
+
Hunk #1 succeeded at 94 with fuzz 2 (offset 8 lines).
|
6
|
+
Hunk #2 succeeded at 212 (offset 11 lines).
|
7
|
+
Hunk #3 succeeded at 232 (offset 11 lines).
|
8
|
+
==> make prefix=/usr/local/Cellar/cd-discid/1.1 CC=clang CFLAGS= install
|
9
|
+
🍺 /usr/local/Cellar/cd-discid/1.1: 6 files, 48K, built in 4 seconds
|
@@ -0,0 +1 @@
|
|
1
|
+
1
|
@@ -0,0 +1 @@
|
|
1
|
+
Error: No available formula for not-a-real-package
|
@@ -0,0 +1 @@
|
|
1
|
+
0
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
Uninstalling /usr/local/Cellar/lame/3.99.5...
|