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,327 @@
1
+ require_relative '../spec_helper'
2
+
3
+ require 'fakeetc'
4
+ require 'wright/provider'
5
+ require 'wright/provider/group'
6
+
7
+ describe Wright::Provider::User do
8
+ before(:each) do
9
+ username = 'johndoe'
10
+ @resource = OpenStruct.new(name: username)
11
+ @create_message = "INFO: create user: '#{username}'\n"
12
+ @create_message_dry = "INFO: (would) create user: '#{username}'\n"
13
+ @create_message_debug = "DEBUG: user already created: '#{username}'\n"
14
+ @remove_message = "INFO: remove user: '#{username}'\n"
15
+ @remove_message_dry = "INFO: (would) remove user: '#{username}'\n"
16
+ @remove_message_debug = "DEBUG: user already removed: '#{username}'\n"
17
+ end
18
+
19
+ after(:each) do
20
+ FakeEtc.clear_users
21
+ FakeEtc.clear_groups
22
+ end
23
+
24
+ describe '#uptodate?' do
25
+ before(:each) { Wright::Provider::User.send(:public, :uptodate?) }
26
+ after(:each) { Wright::Provider::User.send(:private, :uptodate?) }
27
+
28
+ it 'should return the correct status' do
29
+ provider = Wright::Provider::User.new(@resource)
30
+
31
+ FakeEtc.add_users('johndoe' => {})
32
+ FakeEtc do
33
+ provider.uptodate?(:create).must_equal true
34
+ provider.uptodate?(:remove).must_equal false
35
+ end
36
+
37
+ FakeEtc.clear_users
38
+ FakeEtc do
39
+ provider.uptodate?(:create).must_equal false
40
+ provider.uptodate?(:remove).must_equal true
41
+ end
42
+ end
43
+
44
+ it 'should return the correct status when given a specific uid' do
45
+ uid = 52
46
+ @resource.uid = uid
47
+ provider = Wright::Provider::User.new(@resource)
48
+
49
+ FakeEtc.add_users('johndoe' => { uid: uid + 1 })
50
+ FakeEtc do
51
+ provider.uptodate?(:create).must_equal false
52
+ provider.uptodate?(:remove).must_equal false
53
+ end
54
+
55
+ FakeEtc.clear_users
56
+ FakeEtc.add_users('johndoe' => { uid: uid })
57
+ FakeEtc do
58
+ provider.uptodate?(:create).must_equal true
59
+ provider.uptodate?(:remove).must_equal false
60
+ end
61
+ end
62
+
63
+ it 'should return the correct status when given a specific group list' do
64
+ groups = %w(group1 group2)
65
+ @resource.groups = groups
66
+ provider = Wright::Provider::User.new(@resource)
67
+
68
+ FakeEtc.add_groups('group1' => { mem: [] },
69
+ 'group2' => { mem: [] })
70
+ FakeEtc.add_users('johndoe' => {})
71
+ FakeEtc do
72
+ provider.uptodate?(:create).must_equal false
73
+ provider.uptodate?(:remove).must_equal false
74
+ end
75
+
76
+ FakeEtc.clear_groups
77
+ FakeEtc.add_groups('group1' => { mem: %w(johndoe) },
78
+ 'group2' => { mem: %w(johndoe) })
79
+ FakeEtc do
80
+ provider.uptodate?(:create).must_equal true
81
+ provider.uptodate?(:remove).must_equal false
82
+ end
83
+ end
84
+
85
+ it 'should return the correct status when given a full name' do
86
+ full_name = 'John Doe'
87
+ @resource.full_name = full_name
88
+ provider = Wright::Provider::User.new(@resource)
89
+
90
+ FakeEtc.add_users('johndoe' => { gecos: '' })
91
+ FakeEtc do
92
+ provider.uptodate?(:create).must_equal false
93
+ provider.uptodate?(:remove).must_equal false
94
+ end
95
+
96
+ FakeEtc.clear_users
97
+ FakeEtc.add_users('johndoe' => { gecos: "#{full_name},,," })
98
+ FakeEtc do
99
+ provider.uptodate?(:create).must_equal true
100
+ provider.uptodate?(:remove).must_equal false
101
+ end
102
+ end
103
+
104
+ it 'should return the correct status when given a shell' do
105
+ shell = '/bin/zsh'
106
+ @resource.shell = shell
107
+ provider = Wright::Provider::User.new(@resource)
108
+
109
+ FakeEtc.add_users('johndoe' => { shell: '' })
110
+ FakeEtc do
111
+ provider.uptodate?(:create).must_equal false
112
+ provider.uptodate?(:remove).must_equal false
113
+ end
114
+
115
+ FakeEtc.clear_users
116
+ FakeEtc.add_users('johndoe' => { shell: shell })
117
+ FakeEtc do
118
+ provider.uptodate?(:create).must_equal true
119
+ provider.uptodate?(:remove).must_equal false
120
+ end
121
+ end
122
+
123
+ it 'should return the correct status when given a home directory' do
124
+ home = '/home/johndoe'
125
+ @resource.home = home
126
+ provider = Wright::Provider::User.new(@resource)
127
+
128
+ FakeEtc.add_users('johndoe' => { dir: '' })
129
+ FakeEtc do
130
+ provider.uptodate?(:create).must_equal false
131
+ provider.uptodate?(:remove).must_equal false
132
+ end
133
+
134
+ FakeEtc.clear_users
135
+ FakeEtc.add_users('johndoe' => { dir: home })
136
+ FakeEtc do
137
+ provider.uptodate?(:create).must_equal true
138
+ provider.uptodate?(:remove).must_equal false
139
+ end
140
+ end
141
+
142
+ it 'should return the correct status when given a primary group' do
143
+ group = { name: 'anonymous', gid: 42 }
144
+ @resource.primary_group = group[:name]
145
+ provider = Wright::Provider::User.new(@resource)
146
+
147
+ FakeEtc.add_groups(group[:name] => { gid: group[:gid] })
148
+ FakeEtc.add_users('johndoe' => { gid: group[:gid] + 1 })
149
+ FakeEtc do
150
+ provider.uptodate?(:create).must_equal false
151
+ provider.uptodate?(:remove).must_equal false
152
+ end
153
+
154
+ FakeEtc.clear_users
155
+ FakeEtc.add_users('johndoe' => { gid: group[:gid] })
156
+ FakeEtc do
157
+ provider.uptodate?(:create).must_equal true
158
+ provider.uptodate?(:remove).must_equal false
159
+ end
160
+ end
161
+
162
+ it 'should return the correct status when given a primary group gid' do
163
+ group = { name: 'anonymous', gid: 42 }
164
+ @resource.primary_group = group[:gid]
165
+ provider = Wright::Provider::User.new(@resource)
166
+
167
+ FakeEtc.add_groups(group[:name] => { gid: group[:gid] })
168
+ FakeEtc.add_users('johndoe' => { gid: group[:gid] + 1 })
169
+ FakeEtc do
170
+ provider.uptodate?(:create).must_equal false
171
+ provider.uptodate?(:remove).must_equal false
172
+ end
173
+
174
+ FakeEtc.clear_users
175
+ FakeEtc.add_users('johndoe' => { gid: group[:gid] })
176
+ FakeEtc do
177
+ provider.uptodate?(:create).must_equal true
178
+ provider.uptodate?(:remove).must_equal false
179
+ end
180
+ end
181
+
182
+ it 'should raise exceptions for invalid actions' do
183
+ provider = Wright::Provider::User.new(@resource)
184
+ e = -> { provider.uptodate?(:foobarbaz) }.must_raise ArgumentError
185
+ e.message.must_equal "invalid action 'foobarbaz'"
186
+ end
187
+ end
188
+
189
+ describe '#add_user' do
190
+ it 'should raise an exception' do
191
+ provider = Wright::Provider::User.new(@resource)
192
+ lambda do
193
+ provider.send(:add_user)
194
+ end.must_raise NotImplementedError
195
+ end
196
+ end
197
+
198
+ describe '#update_user' do
199
+ it 'should raise an exception' do
200
+ provider = Wright::Provider::User.new(@resource)
201
+ lambda do
202
+ provider.send(:update_user)
203
+ end.must_raise NotImplementedError
204
+ end
205
+ end
206
+
207
+ describe '#delete_user' do
208
+ it 'should raise an exception' do
209
+ provider = Wright::Provider::User.new(@resource)
210
+ lambda do
211
+ provider.send(:delete_user)
212
+ end.must_raise NotImplementedError
213
+ end
214
+ end
215
+
216
+ describe '#create' do
217
+ it 'should set the update status when the user is up-to-date' do
218
+ provider = Wright::Provider::User.new(@resource)
219
+
220
+ FakeEtc.add_users('johndoe' => {})
221
+ FakeEtc do
222
+ lambda do
223
+ reset_logger
224
+ provider.create
225
+ provider.updated?.must_equal false
226
+ end.must_output @create_message_debug
227
+ end
228
+ end
229
+
230
+ it 'should set the update status when the user has to be created' do
231
+ provider = Wright::Provider::User.new(@resource)
232
+ mock_provider = Minitest::Mock.new
233
+
234
+ mock_provider.expect(:add_user, nil)
235
+ provider.stub :add_user, -> { mock_provider.add_user } do
236
+ FakeEtc do
237
+ lambda do
238
+ reset_logger
239
+ provider.create
240
+ provider.updated?.must_equal true
241
+ end.must_output @create_message
242
+ end
243
+ end
244
+ mock_provider.verify
245
+ end
246
+
247
+ it 'should set the update status when the user has to be updated' do
248
+ @resource.shell = '/bin/csh'
249
+ provider = Wright::Provider::User.new(@resource)
250
+ mock_provider = Minitest::Mock.new
251
+
252
+ mock_provider.expect(:update_user, nil)
253
+ provider.stub :update_user, -> { mock_provider.update_user } do
254
+ FakeEtc.add_users('johndoe' => { shell: '/bin/bash' })
255
+ FakeEtc do
256
+ lambda do
257
+ reset_logger
258
+ provider.create
259
+ provider.updated?.must_equal true
260
+ end.must_output @create_message
261
+ end
262
+ end
263
+ mock_provider.verify
264
+ end
265
+
266
+ it 'should set the update status in dry-run mode' do
267
+ provider = Wright::Provider::User.new(@resource)
268
+
269
+ Wright.dry_run do
270
+ FakeEtc do
271
+ lambda do
272
+ reset_logger
273
+ provider.create
274
+ provider.updated?.must_equal true
275
+ end.must_output @create_message_dry
276
+ end
277
+ end
278
+ end
279
+ end
280
+
281
+ describe '#remove' do
282
+ it 'should set the update status when the user is already removed' do
283
+ provider = Wright::Provider::User.new(@resource)
284
+
285
+ FakeEtc do
286
+ lambda do
287
+ reset_logger
288
+ provider.remove
289
+ provider.updated?.must_equal false
290
+ end.must_output @remove_message_debug
291
+ end
292
+ end
293
+
294
+ it 'should set the update status when the user has to be removed' do
295
+ provider = Wright::Provider::User.new(@resource)
296
+ mock_provider = Minitest::Mock.new
297
+
298
+ mock_provider.expect(:delete_user, nil)
299
+ provider.stub :delete_user, -> { mock_provider.delete_user } do
300
+ FakeEtc.add_users('johndoe' => {})
301
+ FakeEtc do
302
+ lambda do
303
+ reset_logger
304
+ provider.remove
305
+ provider.updated?.must_equal true
306
+ end.must_output @remove_message
307
+ end
308
+ end
309
+ mock_provider.verify
310
+ end
311
+
312
+ it 'should set the update status in dry-run mode' do
313
+ provider = Wright::Provider::User.new(@resource)
314
+
315
+ Wright.dry_run do
316
+ FakeEtc.add_users('johndoe' => {})
317
+ FakeEtc do
318
+ lambda do
319
+ reset_logger
320
+ provider.remove
321
+ provider.updated?.must_equal true
322
+ end.must_output @remove_message_dry
323
+ end
324
+ end
325
+ end
326
+ end
327
+ end
@@ -0,0 +1,29 @@
1
+ require_relative '../spec_helper'
2
+
3
+ require 'wright/resource/group'
4
+
5
+ describe Wright::Resource::Group do
6
+ before(:each) do
7
+ @group = Wright::Resource::Group.new('foo')
8
+ @provider = Minitest::Mock.new
9
+ @group.instance_variable_set(:@provider, @provider)
10
+ end
11
+
12
+ describe '#create' do
13
+ it 'should ask the provider to create the group' do
14
+ @provider.expect(:create, nil)
15
+ @provider.expect(:updated?, true)
16
+ @group.create
17
+ @provider.verify
18
+ end
19
+ end
20
+
21
+ describe '#remove' do
22
+ it 'should ask the provider to remove the group' do
23
+ @provider.expect(:remove, nil)
24
+ @provider.expect(:updated?, true)
25
+ @group.remove
26
+ @provider.verify
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '../spec_helper'
2
+
3
+ require 'wright/resource/package'
4
+
5
+ describe Wright::Resource::Package do
6
+ before(:each) do
7
+ @package = Wright::Resource::Package.new('foo')
8
+ @provider = Minitest::Mock.new
9
+ @package.instance_variable_set(:@provider, @provider)
10
+ end
11
+
12
+ describe '#installed_versions' do
13
+ it 'should ask the provider for installed versions' do
14
+ @provider.expect(:installed_versions, nil)
15
+ @package.installed_versions
16
+ @provider.verify
17
+ end
18
+ end
19
+
20
+ describe '#install' do
21
+ it 'should ask the provider to install the package' do
22
+ @provider.expect(:install, nil)
23
+ @provider.expect(:updated?, true)
24
+ @package.install
25
+ @provider.verify
26
+ end
27
+ end
28
+
29
+ describe '#remove' do
30
+ it 'should ask the provider to remove the package' do
31
+ @provider.expect(:remove, nil)
32
+ @provider.expect(:updated?, true)
33
+ @package.remove
34
+ @provider.verify
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,29 @@
1
+ require_relative '../spec_helper'
2
+
3
+ require 'wright/resource/user'
4
+
5
+ describe Wright::Resource::User do
6
+ before(:each) do
7
+ @user = Wright::Resource::User.new('johndoe')
8
+ @provider = Minitest::Mock.new
9
+ @user.instance_variable_set(:@provider, @provider)
10
+ end
11
+
12
+ describe '#create' do
13
+ it 'should ask the provider to create the user' do
14
+ @provider.expect(:create, nil)
15
+ @provider.expect(:updated?, true)
16
+ @user.create
17
+ @provider.verify
18
+ end
19
+ end
20
+
21
+ describe '#remove' do
22
+ it 'should ask the provider to remove the user' do
23
+ @provider.expect(:remove, nil)
24
+ @provider.expect(:updated?, true)
25
+ @user.remove
26
+ @provider.verify
27
+ end
28
+ end
29
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,19 +1,12 @@
1
1
  require_relative 'spec_helpers/fake_capture3'
2
+ require_relative 'spec_helpers/test_coverage'
2
3
 
3
4
  require 'ostruct'
4
5
  require 'fakefs/safe'
5
- require 'wright/logger'
6
6
 
7
- begin
8
- require 'simplecov'
9
- if ENV['COVERAGE']
10
- SimpleCov.start do
11
- add_filter '/spec/'
12
- add_filter '/vendor/'
13
- add_filter '/.bundle/'
14
- end
15
- end
16
- end
7
+ measure_coverage if coverage?
8
+
9
+ require 'wright/logger'
17
10
 
18
11
  module Wright
19
12
  # extend Wright::Config to pass on clear for tests
@@ -25,6 +18,7 @@ module Wright
25
18
  end
26
19
 
27
20
  def reset_logger(log_level = Wright::Logger::DEBUG)
21
+ Wright::Config[:log] = { colorize: false }
28
22
  Wright.log = Wright::Logger.new
29
23
  Wright.log.formatter = Wright::Logger::Formatter.new
30
24
  Wright.log.level = log_level
@@ -4,17 +4,20 @@ require 'open3'
4
4
  # Open3::capture3 replacement that reads stdout, stderr and return
5
5
  # values from the filesystem
6
6
  class FakeCapture3
7
- def initialize(basedir, env)
7
+ def initialize(basedir, env = {})
8
8
  @basedir = basedir
9
9
  @env = env
10
10
  @mock_open3 = Minitest::Mock.new
11
- @capture3_stub = lambda do |stub_env, stub_command|
12
- @mock_open3.capture3(stub_env, stub_command)
11
+ @capture3_stub = lambda do |stub_env, stub_command, *stub_args|
12
+ @mock_open3.capture3(stub_env, stub_command, *stub_args)
13
13
  end
14
14
  end
15
15
 
16
- def expect(command)
17
- @mock_open3.expect(:capture3, return_values(command), [@env, command])
16
+ def expect(command_and_args, base_filename = nil)
17
+ command, *args = *command_and_args
18
+ @mock_open3.expect(:capture3,
19
+ return_values(command_and_args, base_filename),
20
+ [@env, command, *args])
18
21
  end
19
22
 
20
23
  def stub
@@ -26,8 +29,9 @@ class FakeCapture3
26
29
 
27
30
  private
28
31
 
29
- def return_values(command)
30
- filename = command.gsub(' ', '_')
32
+ def return_values(command_and_args, base_filename)
33
+ filename = base_filename ||
34
+ command_and_args.join(' ').gsub(' ', '_').gsub('/', 'SLASH')
31
35
  command_stdout = File.read("#{@basedir}/#{filename}.stdout")
32
36
  command_stderr = File.read("#{@basedir}/#{filename}.stderr")
33
37
  command_status = File.read("#{@basedir}/#{filename}.return").chomp == '0'
@@ -0,0 +1,26 @@
1
+ def codeclimate?
2
+ ENV['CODECLIMATE_REPO_TOKEN']
3
+ end
4
+
5
+ def simplecov?
6
+ ENV['COVERAGE']
7
+ end
8
+
9
+ def coverage?
10
+ simplecov? || codeclimate?
11
+ end
12
+
13
+ def measure_coverage
14
+ require 'simplecov'
15
+ formatters = []
16
+ formatters << SimpleCov::Formatter::HTMLFormatter if simplecov?
17
+
18
+ if codeclimate?
19
+ require 'codeclimate-test-reporter'
20
+ formatters << CodeClimate::TestReporter::Formatter
21
+ end
22
+
23
+ ignored_directories = ['/spec/', '/vendor/', '/.bundle/']
24
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[*formatters]
25
+ SimpleCov.start { ignored_directories.each { |dir| add_filter(dir) } }
26
+ end
@@ -20,5 +20,6 @@ describe Util::ActiveSupport do
20
20
  Util::ActiveSupport.constantize('Wright::Util').must_equal Wright::Util
21
21
  -> { Util::ActiveSupport.constantize(nonexistent) }.must_raise(NameError)
22
22
  Util::ActiveSupport.safe_constantize(nonexistent).must_be_nil
23
+ Util::ActiveSupport.safe_constantize(nil).must_be_nil
23
24
  end
24
25
  end
@@ -77,8 +77,8 @@ describe FilePermissions do
77
77
  end
78
78
 
79
79
  it 'should update file owners' do
80
- user1 = Etc.getpwent
81
- user2 = Etc.getpwent
80
+ user1 = Etc.getpwuid(0)
81
+ user2 = Etc.getpwuid(1)
82
82
  FakeFS do
83
83
  FileUtils.touch(@file_permissions.filename)
84
84
  FileUtils.chown(user1.name, nil, @file_permissions.filename)
@@ -8,6 +8,7 @@ describe Util::File do
8
8
  before(:each) do
9
9
  @file = 'somefile'
10
10
  @dir = 'somedir'
11
+ Etc.setpwent
11
12
  end
12
13
 
13
14
  after(:each) { FakeFS::FileSystem.clear }
@@ -5,6 +5,8 @@ require 'wright/util/user'
5
5
  include Wright
6
6
 
7
7
  describe Util::User do
8
+ before(:each) { Etc.setpwent }
9
+
8
10
  describe 'user_to_uid' do
9
11
  it 'should leave integer uids alone' do
10
12
  Util::User.user_to_uid(42).must_equal 42