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.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +34 -0
  3. data/NEWS.md +22 -0
  4. data/README.md +56 -40
  5. data/lib/wright/dsl.rb +1 -2
  6. data/lib/wright/provider/directory.rb +2 -9
  7. data/lib/wright/provider/file.rb +6 -13
  8. data/lib/wright/provider/group/darwin_directory_service.rb +61 -0
  9. data/lib/wright/provider/group/gnu_passwd.rb +42 -0
  10. data/lib/wright/provider/group.rb +111 -0
  11. data/lib/wright/provider/package/apt.rb +9 -43
  12. data/lib/wright/provider/package/homebrew.rb +68 -0
  13. data/lib/wright/provider/package.rb +26 -0
  14. data/lib/wright/provider/symlink.rb +4 -9
  15. data/lib/wright/provider/user/gnu_passwd.rb +55 -0
  16. data/lib/wright/provider/user.rb +137 -0
  17. data/lib/wright/provider.rb +40 -0
  18. data/lib/wright/resource/file.rb +1 -1
  19. data/lib/wright/resource/group.rb +64 -0
  20. data/lib/wright/resource/package.rb +6 -6
  21. data/lib/wright/resource/user.rb +76 -0
  22. data/lib/wright/util/recursive_autoloader.rb +1 -1
  23. data/lib/wright/util/stolen_from_activesupport.rb +2 -0
  24. data/lib/wright/util.rb +17 -2
  25. data/lib/wright/version.rb +1 -1
  26. data/lib/wright.rb +3 -2
  27. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership.return +1 -0
  28. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership.stdout +0 -0
  29. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_permission-denied-user.return +1 -0
  30. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_permission-denied-user.stderr +2 -0
  31. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_permission-denied-user.stdout +0 -0
  32. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_user1_user2.return +1 -0
  33. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_user1_user2.stderr +0 -0
  34. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_user1_user2.stdout +0 -0
  35. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_1234_newgroup.return +1 -0
  36. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_1234_newgroup.stderr +0 -0
  37. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_1234_newgroup.stdout +0 -0
  38. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_499_newgroup.return +1 -0
  39. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_499_newgroup.stderr +0 -0
  40. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_499_newgroup.stdout +0 -0
  41. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_ERROR_newgroup.return +1 -0
  42. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_ERROR_newgroup.stderr +0 -0
  43. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_ERROR_newgroup.stdout +1 -0
  44. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_bazqux.return +1 -0
  45. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_bazqux.stderr +1 -0
  46. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_bazqux.stdout +0 -0
  47. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_foobar.return +1 -0
  48. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_foobar.stderr +1 -0
  49. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_foobar.stdout +10 -0
  50. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_52_foobar.return +1 -0
  51. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_52_foobar.stderr +0 -0
  52. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_52_foobar.stdout +0 -0
  53. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_ERROR_foobar.return +1 -0
  54. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_ERROR_foobar.stderr +0 -0
  55. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_ERROR_foobar.stdout +1 -0
  56. data/spec/provider/group/darwin_directory_service_spec.rb +381 -0
  57. data/spec/provider/group/gnu_passwd/gpasswd_-M_''_foobar.return +1 -0
  58. data/spec/provider/group/gnu_passwd/gpasswd_-M_''_foobar.stderr +0 -0
  59. data/spec/provider/group/gnu_passwd/gpasswd_-M_''_foobar.stdout +0 -0
  60. data/spec/provider/group/gnu_passwd/gpasswd_-M_'not-a-user'_foobar.return +1 -0
  61. data/spec/provider/group/gnu_passwd/gpasswd_-M_'not-a-user'_foobar.stderr +1 -0
  62. data/spec/provider/group/gnu_passwd/gpasswd_-M_'not-a-user'_foobar.stdout +0 -0
  63. data/spec/provider/group/gnu_passwd/gpasswd_-M_'user1,user2'_foobar.return +1 -0
  64. data/spec/provider/group/gnu_passwd/gpasswd_-M_'user1,user2'_foobar.stderr +0 -0
  65. data/spec/provider/group/gnu_passwd/gpasswd_-M_'user1,user2'_foobar.stdout +0 -0
  66. data/spec/provider/group/gnu_passwd/groupadd_--system_newgroup.return +1 -0
  67. data/spec/provider/group/gnu_passwd/groupadd_--system_newgroup.stderr +0 -0
  68. data/spec/provider/group/gnu_passwd/groupadd_--system_newgroup.stdout +0 -0
  69. data/spec/provider/group/gnu_passwd/groupadd_-g_1234_newgroup.return +1 -0
  70. data/spec/provider/group/gnu_passwd/groupadd_-g_1234_newgroup.stderr +0 -0
  71. data/spec/provider/group/gnu_passwd/groupadd_-g_1234_newgroup.stdout +0 -0
  72. data/spec/provider/group/gnu_passwd/groupadd_-g_ERROR_newgroup.return +1 -0
  73. data/spec/provider/group/gnu_passwd/groupadd_-g_ERROR_newgroup.stderr +1 -0
  74. data/spec/provider/group/gnu_passwd/groupadd_-g_ERROR_newgroup.stdout +0 -0
  75. data/spec/provider/group/gnu_passwd/groupdel_bazqux.return +1 -0
  76. data/spec/provider/group/gnu_passwd/groupdel_bazqux.stderr +1 -0
  77. data/spec/provider/group/gnu_passwd/groupdel_bazqux.stdout +0 -0
  78. data/spec/provider/group/gnu_passwd/groupdel_foobar.return +1 -0
  79. data/spec/provider/group/gnu_passwd/groupdel_foobar.stderr +0 -0
  80. data/spec/provider/group/gnu_passwd/groupdel_foobar.stdout +0 -0
  81. data/spec/provider/group/gnu_passwd/groupmod_-g_52_foobar.return +1 -0
  82. data/spec/provider/group/gnu_passwd/groupmod_-g_52_foobar.stderr +0 -0
  83. data/spec/provider/group/gnu_passwd/groupmod_-g_52_foobar.stdout +0 -0
  84. data/spec/provider/group/gnu_passwd/groupmod_-g_ERROR_foobar.return +1 -0
  85. data/spec/provider/group/gnu_passwd/groupmod_-g_ERROR_foobar.stderr +1 -0
  86. data/spec/provider/group/gnu_passwd/groupmod_-g_ERROR_foobar.stdout +0 -0
  87. data/spec/provider/group/gnu_passwd_spec.rb +382 -0
  88. data/spec/provider/group_spec.rb +132 -0
  89. data/spec/provider/package/apt/apt-get_install_-qy_not-a-real-package.stderr +1 -0
  90. data/spec/provider/package/apt/{dpkg-query_-s_unknown-package.stderr → dpkg-query_-s_not-a-real-package.stderr} +1 -1
  91. data/spec/provider/package/apt/dpkg-query_-s_not-a-real-package.stdout +0 -0
  92. data/spec/provider/package/apt_spec.rb +27 -15
  93. data/spec/provider/package/homebrew/brew_info_--json=v1_cd-discid.return +1 -0
  94. data/spec/provider/package/homebrew/brew_info_--json=v1_cd-discid.stderr +0 -0
  95. data/spec/provider/package/homebrew/brew_info_--json=v1_cd-discid.stdout +1 -0
  96. data/spec/provider/package/homebrew/brew_info_--json=v1_lame.return +1 -0
  97. data/spec/provider/package/homebrew/brew_info_--json=v1_lame.stderr +0 -0
  98. data/spec/provider/package/homebrew/brew_info_--json=v1_lame.stdout +1 -0
  99. data/spec/provider/package/homebrew/brew_info_--json=v1_not-a-real-package.return +1 -0
  100. data/spec/provider/package/homebrew/brew_info_--json=v1_not-a-real-package.stderr +1 -0
  101. data/spec/provider/package/homebrew/brew_info_--json=v1_not-a-real-package.stdout +0 -0
  102. data/spec/provider/package/homebrew/brew_install_cd-discid.return +1 -0
  103. data/spec/provider/package/homebrew/brew_install_cd-discid.stderr +0 -0
  104. data/spec/provider/package/homebrew/brew_install_cd-discid.stdout +9 -0
  105. data/spec/provider/package/homebrew/brew_install_not-a-real-package.return +1 -0
  106. data/spec/provider/package/homebrew/brew_install_not-a-real-package.stderr +1 -0
  107. data/spec/provider/package/homebrew/brew_install_not-a-real-package.stdout +2 -0
  108. data/spec/provider/package/homebrew/brew_uninstall_lame.return +1 -0
  109. data/spec/provider/package/homebrew/brew_uninstall_lame.stderr +0 -0
  110. data/spec/provider/package/homebrew/brew_uninstall_lame.stdout +1 -0
  111. data/spec/provider/package/homebrew_spec.rb +268 -0
  112. data/spec/provider/user/gnu_passwd/useradd_johndoe.return +1 -0
  113. data/spec/provider/user/gnu_passwd/useradd_johndoe.stderr +0 -0
  114. data/spec/provider/user/gnu_passwd/useradd_johndoe.stdout +0 -0
  115. data/spec/provider/user/gnu_passwd/useradd_with_options.return +1 -0
  116. data/spec/provider/user/gnu_passwd/useradd_with_options.stderr +0 -0
  117. data/spec/provider/user/gnu_passwd/useradd_with_options.stdout +0 -0
  118. data/spec/provider/user/gnu_passwd/userdel_johndoe.return +1 -0
  119. data/spec/provider/user/gnu_passwd/userdel_johndoe.stderr +0 -0
  120. data/spec/provider/user/gnu_passwd/userdel_johndoe.stdout +0 -0
  121. data/spec/provider/user/gnu_passwd/usermod_-u_42_johndoe.return +1 -0
  122. data/spec/provider/user/gnu_passwd/usermod_-u_42_johndoe.stderr +0 -0
  123. data/spec/provider/user/gnu_passwd/usermod_-u_42_johndoe.stdout +0 -0
  124. data/spec/provider/user/gnu_passwd_spec.rb +107 -0
  125. data/spec/provider/user_spec.rb +327 -0
  126. data/spec/resource/group_spec.rb +29 -0
  127. data/spec/resource/package_spec.rb +37 -0
  128. data/spec/resource/user_spec.rb +29 -0
  129. data/spec/spec_helper.rb +5 -11
  130. data/spec/spec_helpers/fake_capture3.rb +11 -7
  131. data/spec/spec_helpers/test_coverage.rb +26 -0
  132. data/spec/util/activesupport_spec.rb +1 -0
  133. data/spec/util/file_permissions_spec.rb +2 -2
  134. data/spec/util/file_spec.rb +1 -0
  135. data/spec/util/user_spec.rb +2 -0
  136. metadata +246 -23
  137. data/NEWS +0 -18
  138. data/spec/provider/package/apt/apt-get_install_-qy_unknown-package.stderr +0 -1
  139. /data/spec/provider/{package/apt/dpkg-query_-s_unknown-package.stdout → group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership.stderr} +0 -0
  140. /data/spec/provider/package/apt/{apt-get_install_-qy_unknown-package.return → apt-get_install_-qy_not-a-real-package.return} +0 -0
  141. /data/spec/provider/package/apt/{apt-get_install_-qy_unknown-package.stdout → apt-get_install_-qy_not-a-real-package.stdout} +0 -0
  142. /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 'vlc' is not installed and no information is available
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.
@@ -2,21 +2,21 @@ require_relative '../../spec_helper'
2
2
 
3
3
  require 'wright/provider/package/apt'
4
4
 
5
- def dpkg_query(pkg_name)
6
- "dpkg-query -s #{pkg_name}"
7
- end
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
- version = pkg_version.nil? ? '' : "=#{pkg_version}"
11
- "apt-get #{action} -qy #{pkg_name}#{version}"
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
- pkg_resource = OpenStruct.new(name: pkg_name, version: pkg_version)
16
- Wright::Provider::Package::Apt.new(pkg_resource)
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 nil for removed packages' do
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 = 'unknown-package'
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
+ [{"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
+ [{"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
+ Error: No available formula for not-a-real-package
@@ -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
+ Error: No available formula for not-a-real-package
@@ -0,0 +1,2 @@
1
+ Searching formulae...
2
+ Searching taps...
@@ -0,0 +1 @@
1
+ Uninstalling /usr/local/Cellar/lame/3.99.5...