wright 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +7 -0
  3. data/README.md +60 -54
  4. data/lib/wright/cli.rb +44 -18
  5. data/lib/wright/dry_run.rb +7 -0
  6. data/lib/wright/provider/directory.rb +26 -30
  7. data/lib/wright/provider/file.rb +34 -34
  8. data/lib/wright/provider/group/darwin_directory_service.rb +8 -7
  9. data/lib/wright/provider/group/gnu_passwd.rb +5 -5
  10. data/lib/wright/provider/group.rb +53 -36
  11. data/lib/wright/provider/package/apt.rb +32 -8
  12. data/lib/wright/provider/package/homebrew.rb +6 -5
  13. data/lib/wright/provider/package/yum.rb +39 -0
  14. data/lib/wright/provider/package.rb +30 -16
  15. data/lib/wright/provider/symlink.rb +32 -33
  16. data/lib/wright/provider/user/darwin_directory_service.rb +14 -17
  17. data/lib/wright/provider/user/gnu_passwd.rb +20 -21
  18. data/lib/wright/provider/user.rb +58 -41
  19. data/lib/wright/resource/group.rb +1 -0
  20. data/lib/wright/resource/package.rb +16 -3
  21. data/lib/wright/resource/user.rb +1 -0
  22. data/lib/wright/resource.rb +4 -2
  23. data/lib/wright/util/user.rb +34 -2
  24. data/lib/wright/version.rb +1 -1
  25. data/man/wright.1 +15 -11
  26. data/spec/cli_spec.rb +18 -0
  27. data/spec/provider/group/darwin_directory_service_spec.rb +76 -220
  28. data/spec/provider/group/gnu_passwd_spec.rb +36 -189
  29. data/spec/provider/group_spec.rb +180 -27
  30. data/spec/provider/package/apt/apt-cache_policy_dmenu.return +1 -0
  31. data/spec/provider/package/apt/apt-cache_policy_dmenu.stderr +0 -0
  32. data/spec/provider/package/apt/apt-cache_policy_dmenu.stdout +4 -0
  33. data/spec/provider/package/apt/apt-cache_policy_htop.stdout +3 -3
  34. data/spec/provider/package/apt/apt-cache_policy_linux-image-3.2.0-4-amd64.return +1 -0
  35. data/spec/provider/package/apt/apt-cache_policy_linux-image-3.2.0-4-amd64.stderr +0 -0
  36. data/spec/provider/package/apt/apt-cache_policy_linux-image-3.2.0-4-amd64.stdout +6 -0
  37. data/spec/provider/package/apt/apt-cache_policy_linux-image.return +1 -0
  38. data/spec/provider/package/apt/apt-cache_policy_linux-image.stderr +0 -0
  39. data/spec/provider/package/apt/apt-cache_policy_linux-image.stdout +4 -0
  40. data/spec/provider/package/apt/apt-cache_policy_suckless-tools.return +1 -0
  41. data/spec/provider/package/apt/apt-cache_policy_suckless-tools.stderr +0 -0
  42. data/spec/provider/package/apt/apt-cache_policy_suckless-tools.stdout +6 -0
  43. data/spec/provider/package/apt/apt-cache_showpkg_dmenu.return +1 -0
  44. data/spec/provider/package/apt/apt-cache_showpkg_dmenu.stderr +0 -0
  45. data/spec/provider/package/apt/apt-cache_showpkg_dmenu.stdout +9 -0
  46. data/spec/provider/package/apt/apt-cache_showpkg_htop.return +1 -0
  47. data/spec/provider/package/apt/apt-cache_showpkg_htop.stderr +0 -0
  48. data/spec/provider/package/apt/apt-cache_showpkg_htop.stdout +20 -0
  49. data/spec/provider/package/apt/apt-cache_showpkg_linux-image.return +1 -0
  50. data/spec/provider/package/apt/apt-cache_showpkg_linux-image.stderr +0 -0
  51. data/spec/provider/package/apt/apt-cache_showpkg_linux-image.stdout +11 -0
  52. data/spec/provider/package/apt/apt-cache_showpkg_not-a-real-package.return +1 -0
  53. data/spec/provider/package/apt/apt-cache_showpkg_not-a-real-package.stderr +0 -0
  54. data/spec/provider/package/apt/apt-cache_showpkg_not-a-real-package.stdout +1 -0
  55. data/spec/provider/package/apt/apt-cache_showpkg_suckless-tools.return +1 -0
  56. data/spec/provider/package/apt/apt-cache_showpkg_suckless-tools.stderr +0 -0
  57. data/spec/provider/package/apt/apt-cache_showpkg_suckless-tools.stdout +26 -0
  58. data/spec/provider/package/apt/apt-get_--purge_remove_-qy_abcde.return +1 -0
  59. data/spec/provider/package/apt/apt-get_--purge_remove_-qy_abcde.stderr +0 -0
  60. data/spec/provider/package/apt/apt-get_--purge_remove_-qy_abcde.stdout +15 -0
  61. data/spec/provider/package/apt_spec.rb +82 -14
  62. data/spec/provider/package/homebrew/brew_install_--with-default-names_gnu-units.return +1 -0
  63. data/spec/provider/package/homebrew/brew_install_--with-default-names_gnu-units.stderr +0 -0
  64. data/spec/provider/package/homebrew/brew_install_--with-default-names_gnu-units.stdout +7 -0
  65. data/spec/provider/package/homebrew/brew_uninstall_--force_lame.return +1 -0
  66. data/spec/provider/package/homebrew/brew_uninstall_--force_lame.stderr +0 -0
  67. data/spec/provider/package/homebrew/brew_uninstall_--force_lame.stdout +1 -0
  68. data/spec/provider/package/homebrew_spec.rb +33 -6
  69. data/spec/provider/package/yum/rpm_-q_httpd.return +1 -0
  70. data/spec/provider/package/yum/rpm_-q_httpd.stderr +0 -0
  71. data/spec/provider/package/yum/rpm_-q_httpd.stdout +1 -0
  72. data/spec/provider/package/yum/rpm_-q_zsh.return +1 -0
  73. data/spec/provider/package/yum/rpm_-q_zsh.stderr +0 -0
  74. data/spec/provider/package/yum/rpm_-q_zsh.stdout +1 -0
  75. data/spec/provider/package/yum/yum_install_-y_mc-4.8.7-8.el7.return +1 -0
  76. data/spec/provider/package/yum/yum_install_-y_mc-4.8.7-8.el7.stderr +0 -0
  77. data/spec/provider/package/yum/yum_install_-y_mc-4.8.7-8.el7.stdout +37 -0
  78. data/spec/provider/package/yum/yum_install_-y_nano.return +1 -0
  79. data/spec/provider/package/yum/yum_install_-y_nano.stderr +0 -0
  80. data/spec/provider/package/yum/yum_install_-y_nano.stdout +36 -0
  81. data/spec/provider/package/yum/yum_install_-y_not-a-real-package.return +1 -0
  82. data/spec/provider/package/yum/yum_install_-y_not-a-real-package.stderr +1 -0
  83. data/spec/provider/package/yum/yum_install_-y_not-a-real-package.stdout +6 -0
  84. data/spec/provider/package/yum/yum_install_with_options.return +1 -0
  85. data/spec/provider/package/yum/yum_install_with_options.stderr +0 -0
  86. data/spec/provider/package/yum/yum_install_with_options.stdout +53 -0
  87. data/spec/provider/package/yum/yum_remove_-y_screen.return +1 -0
  88. data/spec/provider/package/yum/yum_remove_-y_screen.stderr +0 -0
  89. data/spec/provider/package/yum/yum_remove_-y_screen.stdout +31 -0
  90. data/spec/provider/package/yum/yum_remove_with_options.return +1 -0
  91. data/spec/provider/package/yum/yum_remove_with_options.stderr +0 -0
  92. data/spec/provider/package/yum/yum_remove_with_options.stdout +30 -0
  93. data/spec/provider/package/yum_spec.rb +130 -0
  94. data/spec/provider/user/darwin_directory_service_spec.rb +12 -10
  95. data/spec/provider/user/gnu_passwd_spec.rb +9 -9
  96. data/spec/provider/user_spec.rb +26 -18
  97. data/spec/resource/package_spec.rb +8 -0
  98. data/spec/resource_spec.rb +17 -9
  99. metadata +153 -16
@@ -6,18 +6,20 @@ require 'wright/provider'
6
6
  require 'wright/provider/group'
7
7
 
8
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
9
+ before(:each) { @resource = OpenStruct.new(name: 'foo') }
10
+ after(:each) { FakeEtc.clear_groups }
16
11
 
17
12
  describe '#uptodate?' do
13
+ before(:each) do
14
+ Wright::Provider::Group.send(:public, :uptodate?)
15
+ end
16
+
17
+ after(:each) do
18
+ Wright::Provider::Group.send(:private, :uptodate?)
19
+ end
20
+
18
21
  it 'should return the correct status' do
19
- resource = OpenStruct.new(name: 'foo')
20
- provider = Wright::Provider::Group.new(resource)
22
+ provider = Wright::Provider::Group.new(@resource)
21
23
 
22
24
  FakeEtc.add_groups('foo' => { gid: 42, mem: %w(user1 user2) })
23
25
  FakeEtc do
@@ -33,9 +35,8 @@ describe Wright::Provider::Group do
33
35
  end
34
36
 
35
37
  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)
38
+ @resource.gid = 52
39
+ provider = Wright::Provider::Group.new(@resource)
39
40
 
40
41
  FakeEtc.add_groups('foo' => { gid: 42, mem: [] })
41
42
  FakeEtc do
@@ -44,7 +45,7 @@ describe Wright::Provider::Group do
44
45
  end
45
46
 
46
47
  FakeEtc.clear_groups
47
- FakeEtc.add_groups('foo' => { gid: gid, mem: [] })
48
+ FakeEtc.add_groups('foo' => { gid: @resource.gid, mem: [] })
48
49
  FakeEtc do
49
50
  provider.uptodate?(:create).must_equal true
50
51
  provider.uptodate?(:remove).must_equal false
@@ -52,9 +53,8 @@ describe Wright::Provider::Group do
52
53
  end
53
54
 
54
55
  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)
56
+ @resource.members = %w(user1 user2)
57
+ provider = Wright::Provider::Group.new(@resource)
58
58
 
59
59
  FakeEtc.add_groups('foo' => { gid: 42, mem: [] })
60
60
  FakeEtc do
@@ -63,7 +63,7 @@ describe Wright::Provider::Group do
63
63
  end
64
64
 
65
65
  FakeEtc.clear_groups
66
- FakeEtc.add_groups('foo' => { gid: 42, mem: members })
66
+ FakeEtc.add_groups('foo' => { gid: 42, mem: @resource.members })
67
67
  FakeEtc do
68
68
  provider.uptodate?(:create).must_equal true
69
69
  provider.uptodate?(:remove).must_equal false
@@ -71,17 +71,145 @@ describe Wright::Provider::Group do
71
71
  end
72
72
 
73
73
  it 'should raise exceptions for invalid actions' do
74
- resource = OpenStruct.new(name: 'foo')
75
- provider = Wright::Provider::Group.new(resource)
74
+ provider = Wright::Provider::Group.new(@resource)
76
75
  e = -> { provider.uptodate?(:foobarbaz) }.must_raise ArgumentError
77
76
  e.message.must_equal "invalid action 'foobarbaz'"
78
77
  end
79
78
  end
80
79
 
80
+ describe '#create' do
81
+ before(:each) do
82
+ group = @resource.name
83
+ @create_message = "INFO: create group: '#{group}'\n"
84
+ @create_message_dry = "INFO: (would) create group: '#{group}'\n"
85
+ @create_message_debug = "DEBUG: group already created: '#{group}'\n"
86
+ end
87
+
88
+ it 'should set the update status when the group is up-to-date' do
89
+ provider = Wright::Provider::Group.new(@resource)
90
+
91
+ FakeEtc.add_groups('foo' => {})
92
+ FakeEtc do
93
+ lambda do
94
+ reset_logger
95
+ provider.create
96
+ provider.updated?.must_equal false
97
+ end.must_output @create_message_debug
98
+ end
99
+ end
100
+
101
+ it 'should set the update status when the group has to be created' do
102
+ provider = Wright::Provider::Group.new(@resource)
103
+ mock_provider = Minitest::Mock.new
104
+
105
+ mock_provider.expect(:create_group, nil)
106
+ provider.stub :create_group, -> { mock_provider.create_group } do
107
+ FakeEtc do
108
+ lambda do
109
+ reset_logger
110
+ provider.create
111
+ provider.updated?.must_equal true
112
+ end.must_output @create_message
113
+ end
114
+ mock_provider.verify
115
+ end
116
+ end
117
+
118
+ it 'should set the update status when the group has to be updated' do
119
+ @resource.gid = 123
120
+ @resource.members = %w(johndoe janedoe)
121
+ provider = Wright::Provider::Group.new(@resource)
122
+ mock_provider = Minitest::Mock.new
123
+
124
+ mock_provider.expect(:set_gid, nil)
125
+ mock_provider.expect(:set_members, nil)
126
+ provider.stub :set_gid, -> { mock_provider.set_gid } do
127
+ provider.stub :set_members, -> { mock_provider.set_members } do
128
+ FakeEtc.add_groups(@resource.name => { mem: [] })
129
+ FakeEtc do
130
+ lambda do
131
+ reset_logger
132
+ provider.create
133
+ provider.updated?.must_equal true
134
+ end.must_output @create_message
135
+ end
136
+ end
137
+ end
138
+ mock_provider.verify
139
+ end
140
+
141
+ it 'should set the update status in dry-run mode' do
142
+ provider = Wright::Provider::Group.new(@resource)
143
+
144
+ Wright.dry_run do
145
+ FakeEtc do
146
+ lambda do
147
+ reset_logger
148
+ provider.create
149
+ provider.updated?.must_equal true
150
+ end.must_output @create_message_dry
151
+ end
152
+ end
153
+ end
154
+ end
155
+
156
+ describe '#remove' do
157
+ before(:each) do
158
+ group = @resource.name
159
+ @remove_message = "INFO: remove group: '#{group}'\n"
160
+ @remove_message_dry = "INFO: (would) remove group: '#{group}'\n"
161
+ @remove_message_debug = "DEBUG: group already removed: '#{group}'\n"
162
+ end
163
+
164
+ it 'should set the update status when the group is already removed' do
165
+ provider = Wright::Provider::Group.new(@resource)
166
+
167
+ FakeEtc do
168
+ lambda do
169
+ reset_logger
170
+ provider.remove
171
+ provider.updated?.must_equal false
172
+ end.must_output @remove_message_debug
173
+ end
174
+ end
175
+
176
+ it 'should set the update status when the group has to be removed' do
177
+ provider = Wright::Provider::Group.new(@resource)
178
+ mock_provider = Minitest::Mock.new
179
+
180
+ mock_provider.expect(:remove_group, nil)
181
+ provider.stub :remove_group, -> { mock_provider.remove_group } do
182
+ FakeEtc.add_groups(@resource.name => {})
183
+ FakeEtc do
184
+ lambda do
185
+ reset_logger
186
+ provider.remove
187
+ provider.updated?.must_equal true
188
+ end.must_output @remove_message
189
+ end
190
+ end
191
+ mock_provider.verify
192
+ end
193
+
194
+ it 'should set the update status in dry-run mode' do
195
+ provider = Wright::Provider::Group.new(@resource)
196
+
197
+ Wright.dry_run do
198
+ FakeEtc.add_groups(@resource.name => {})
199
+ FakeEtc do
200
+ lambda do
201
+ reset_logger
202
+ provider.remove
203
+ provider.updated?.must_equal true
204
+ end.must_output @remove_message_dry
205
+ end
206
+ end
207
+ end
208
+ end
209
+
81
210
  describe '#add_member' do
82
211
  it 'should raise an exception' do
83
- resource = OpenStruct.new(name: 'foo')
84
- provider = Wright::Provider::Group.new(resource)
212
+ provider = Wright::Provider::Group.new(@resource)
85
213
  lambda do
86
214
  provider.send(:add_member, 'member', 'group')
87
215
  end.must_raise NotImplementedError
@@ -90,8 +218,7 @@ describe Wright::Provider::Group do
90
218
 
91
219
  describe '#remove_member' do
92
220
  it 'should raise an exception' do
93
- resource = OpenStruct.new(name: 'foo')
94
- provider = Wright::Provider::Group.new(resource)
221
+ provider = Wright::Provider::Group.new(@resource)
95
222
  lambda do
96
223
  provider.send(:remove_member, 'member', 'group')
97
224
  end.must_raise NotImplementedError
@@ -100,12 +227,11 @@ describe Wright::Provider::Group do
100
227
 
101
228
  describe '#set_members' do
102
229
  it 'should use add_member and remove_member to update the member list' do
103
- group_name = 'foo'
230
+ group_name = @resource.name
104
231
  current_members = %w(user1 user2 user3)
105
232
  target_members = %w(user3 user4 user5)
106
- resource = OpenStruct.new(name: group_name,
107
- members: target_members)
108
- provider = Wright::Provider::Group.new(resource)
233
+ @resource.members = target_members
234
+ provider = Wright::Provider::Group.new(@resource)
109
235
  Wright::Provider::Group.send(:public, :set_members)
110
236
 
111
237
  mock_provider = Minitest::Mock.new
@@ -129,4 +255,31 @@ describe Wright::Provider::Group do
129
255
  Wright::Provider::Group.send(:private, :set_members)
130
256
  end
131
257
  end
258
+
259
+ describe '#create_group' do
260
+ it 'should raise an exception' do
261
+ provider = Wright::Provider::Group.new(@resource)
262
+ lambda do
263
+ provider.send(:create_group)
264
+ end.must_raise NotImplementedError
265
+ end
266
+ end
267
+
268
+ describe '#remove_group' do
269
+ it 'should raise an exception' do
270
+ provider = Wright::Provider::Group.new(@resource)
271
+ lambda do
272
+ provider.send(:remove_group)
273
+ end.must_raise NotImplementedError
274
+ end
275
+ end
276
+
277
+ describe '#set_gid' do
278
+ it 'should raise an exception' do
279
+ provider = Wright::Provider::Group.new(@resource)
280
+ lambda do
281
+ provider.send(:set_gid)
282
+ end.must_raise NotImplementedError
283
+ end
284
+ end
132
285
  end
@@ -0,0 +1,4 @@
1
+ dmenu:
2
+ Installed: (none)
3
+ Candidate: (none)
4
+ Version table:
@@ -1,6 +1,6 @@
1
1
  htop:
2
2
  Installed: (none)
3
- Candidate: 1.0.1-1
3
+ Candidate: 1.0.3-1
4
4
  Version table:
5
- 1.0.1-1 0
6
- 500 http://debian.inode.at/debian/ wheezy/main amd64 Packages
5
+ 1.0.3-1 0
6
+ 500 http://debian.inode.at/debian/ jessie/main amd64 Packages
@@ -0,0 +1,6 @@
1
+ linux-image-3.2.0-4-amd64:
2
+ Installed: 3.2.65-1+deb7u2
3
+ Candidate: 3.2.65-1+deb7u2
4
+ Version table:
5
+ *** 3.2.65-1+deb7u2 0
6
+ 100 /var/lib/dpkg/status
@@ -0,0 +1,4 @@
1
+ linux-image:
2
+ Installed: (none)
3
+ Candidate: (none)
4
+ Version table:
@@ -0,0 +1,6 @@
1
+ suckless-tools:
2
+ Installed: (none)
3
+ Candidate: 40-1
4
+ Version table:
5
+ 40-1 0
6
+ 500 http://debian.inode.at/debian/ jessie/main amd64 Packages
@@ -0,0 +1,9 @@
1
+ Package: dmenu
2
+ Versions:
3
+
4
+ Reverse Depends:
5
+ xmonad,dmenu
6
+ Dependencies:
7
+ Provides:
8
+ Reverse Provides:
9
+ suckless-tools 40-1
@@ -0,0 +1,20 @@
1
+ Package: htop
2
+ Versions:
3
+ 1.0.3-1 (/var/lib/apt/lists/debian.inode.at_debian_dists_jessie_main_binary-amd64_Packages) (/var/lib/dpkg/status)
4
+ Description Language:
5
+ File: /var/lib/apt/lists/debian.inode.at_debian_dists_jessie_main_binary-amd64_Packages
6
+ MD5: 8eb5aa19b3c92a975dc78e2165f6688d
7
+ Description Language: en
8
+ File: /var/lib/apt/lists/debian.inode.at_debian_dists_jessie_main_i18n_Translation-en
9
+ MD5: 8eb5aa19b3c92a975dc78e2165f6688d
10
+
11
+
12
+ Reverse Depends:
13
+ util-vserver,htop
14
+ lava-dispatcher,htop
15
+ education-common,htop
16
+ Dependencies:
17
+ 1.0.3-1 - libc6 (2 2.15) libncursesw5 (2 5.6+20070908) libtinfo5 (0 (null)) strace (0 (null)) ltrace (0 (null))
18
+ Provides:
19
+ 1.0.3-1 -
20
+ Reverse Provides:
@@ -0,0 +1,11 @@
1
+ Package: linux-image
2
+ Versions:
3
+
4
+ Reverse Depends:
5
+ firmware-crystalhd,linux-image
6
+ kernel-common,linux-image
7
+ dkms,linux-image
8
+ Dependencies:
9
+ Provides:
10
+ Reverse Provides:
11
+ linux-image-3.2.0-4-amd64 3.2.65-1+deb7u2
@@ -0,0 +1 @@
1
+ N: Unable to locate package not-a-real-package
@@ -0,0 +1,26 @@
1
+ Package: suckless-tools
2
+ Versions:
3
+ 40-1 (/var/lib/apt/lists/debian.inode.at_debian_dists_jessie_main_binary-amd64_Packages)
4
+ Description Language:
5
+ File: /var/lib/apt/lists/debian.inode.at_debian_dists_jessie_main_binary-amd64_Packages
6
+ MD5: d19175bb7582a6f06fe2a6daa5910d10
7
+ Description Language: en
8
+ File: /var/lib/apt/lists/debian.inode.at_debian_dists_jessie_main_i18n_Translation-en
9
+ MD5: d19175bb7582a6f06fe2a6daa5910d10
10
+
11
+
12
+ Reverse Depends:
13
+ wmii,suckless-tools
14
+ uzbl,suckless-tools
15
+ surf,suckless-tools
16
+ spectrwm,suckless-tools
17
+ ncurses-term,suckless-tools 39
18
+ ncurses-term,suckless-tools 39
19
+ i3,suckless-tools
20
+ herbstluftwm,suckless-tools
21
+ dwm,suckless-tools
22
+ Dependencies:
23
+ 40-1 - libc6 (2 2.14) libfontconfig1 (2 2.11) libfreetype6 (2 2.2.1) libx11-6 (0 (null)) libxext6 (0 (null)) libxft2 (4 2.1.1) libxinerama1 (0 (null)) libxrender1 (0 (null)) libxss1 (0 (null)) zlib1g (2 1:1.1.4) dwm (0 (null)) stterm (0 (null)) surf (0 (null))
24
+ Provides:
25
+ 40-1 - xssstate wmname tabbed swarp ssid sselp sprop slock lsx lsw dmenu
26
+ Reverse Provides:
@@ -0,0 +1,15 @@
1
+ Reading package lists...
2
+ Building dependency tree...
3
+ Reading state information...
4
+ The following packages were automatically installed and are no longer required:
5
+ cd-discid cdparanoia libmusicbrainz-discid-perl
6
+ libwebservice-musicbrainz-perl vorbis-tools
7
+ Use 'apt-get autoremove' to remove them.
8
+ The following packages will be REMOVED:
9
+ abcde*
10
+ 0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
11
+ After this operation, 295 kB disk space will be freed.
12
+ (Reading database ...
13
+ Removing abcde (2.6-2) ...
14
+ Purging configuration files for abcde (2.6-2) ...
15
+ Processing triggers for man-db (2.7.0.2-5) ...
@@ -3,17 +3,21 @@ require_relative '../../spec_helper'
3
3
  require 'wright/provider/package/apt'
4
4
 
5
5
  describe Wright::Provider::Package::Apt do
6
- def apt_cache(pkg_name)
7
- ['apt-cache', 'policy', pkg_name]
6
+ def apt_cache(cmd, pkg_name)
7
+ ['apt-cache', cmd.to_s, pkg_name]
8
8
  end
9
9
 
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]
10
+ def apt_get(action, pkg_name, args = {})
11
+ version = args[:version].nil? ? '' : "=#{args[:version]}"
12
+ options = args[:options]
13
+ ['apt-get', *options, action.to_s, '-qy', pkg_name + version]
13
14
  end
14
15
 
15
- def package_provider(pkg_name, pkg_version = nil)
16
- pkg_resource = OpenStruct.new(name: pkg_name, version: pkg_version)
16
+ def package_provider(pkg_name, args = {})
17
+ properties = { name: pkg_name,
18
+ version: args[:version],
19
+ options: args[:options] }
20
+ pkg_resource = OpenStruct.new(properties)
17
21
  Wright::Provider::Package::Apt.new(pkg_resource)
18
22
  end
19
23
 
@@ -28,7 +32,7 @@ describe Wright::Provider::Package::Apt do
28
32
  pkg_name = 'abcde'
29
33
  pkg_versions = ['2.5.3-1']
30
34
  pkg_provider = package_provider(pkg_name)
31
- apt_cache_cmd = apt_cache(pkg_name)
35
+ apt_cache_cmd = apt_cache(:policy, pkg_name)
32
36
 
33
37
  @fake_capture3.expect(apt_cache_cmd)
34
38
  @fake_capture3.stub do
@@ -40,9 +44,47 @@ describe Wright::Provider::Package::Apt do
40
44
  pkg_name = 'htop'
41
45
  pkg_versions = []
42
46
  pkg_provider = package_provider(pkg_name)
43
- apt_cache_cmd = apt_cache(pkg_name)
47
+ apt_cache_policy_cmd = apt_cache(:policy, pkg_name)
48
+ apt_cache_showpkg_cmd = apt_cache(:showpkg, pkg_name)
44
49
 
45
- @fake_capture3.expect(apt_cache_cmd)
50
+ @fake_capture3.expect(apt_cache_policy_cmd)
51
+ @fake_capture3.expect(apt_cache_showpkg_cmd)
52
+ @fake_capture3.stub do
53
+ pkg_provider.installed_versions.must_equal pkg_versions
54
+ end
55
+ end
56
+
57
+ it 'should handle virtual packages for which providers are installed' do
58
+ pkg_name = 'linux-image'
59
+ provider_name = 'linux-image-3.2.0-4-amd64'
60
+ pkg_versions = ['virtual']
61
+ pkg_provider = package_provider(pkg_name)
62
+ apt_cache_policy_cmd = apt_cache(:policy, pkg_name)
63
+ apt_cache_showpkg_cmd = apt_cache(:showpkg, pkg_name)
64
+ apt_cache_policy_provider_cmd = apt_cache(:policy, provider_name)
65
+
66
+ @fake_capture3.expect(apt_cache_policy_cmd)
67
+ @fake_capture3.expect(apt_cache_showpkg_cmd)
68
+ @fake_capture3.expect(apt_cache_policy_provider_cmd)
69
+ @fake_capture3.stub do
70
+ pkg_provider.installed_versions.must_equal pkg_versions
71
+ end
72
+ end
73
+
74
+ it 'should handle virtual packages for which no providers are installed' do
75
+ pkg_name = 'dmenu'
76
+ provider_name = 'suckless-tools'
77
+ pkg_versions = []
78
+ pkg_provider = package_provider(pkg_name)
79
+ apt_cache_policy_cmd = apt_cache(:policy, pkg_name)
80
+ apt_cache_showpkg_cmd = apt_cache(:showpkg, pkg_name)
81
+ apt_cache_policy_provider_cmd = apt_cache(:policy, provider_name)
82
+ apt_cache_showpkg_provider_cmd = apt_cache(:showpkg, provider_name)
83
+
84
+ @fake_capture3.expect(apt_cache_policy_cmd)
85
+ @fake_capture3.expect(apt_cache_showpkg_cmd)
86
+ @fake_capture3.expect(apt_cache_policy_provider_cmd)
87
+ @fake_capture3.expect(apt_cache_showpkg_provider_cmd)
46
88
  @fake_capture3.stub do
47
89
  pkg_provider.installed_versions.must_equal pkg_versions
48
90
  end
@@ -52,9 +94,11 @@ describe Wright::Provider::Package::Apt do
52
94
  pkg_name = 'not-a-real-package'
53
95
  pkg_versions = []
54
96
  pkg_provider = package_provider(pkg_name)
55
- apt_cache_cmd = apt_cache(pkg_name)
97
+ apt_cache_policy_cmd = apt_cache(:policy, pkg_name)
98
+ apt_cache_showpkg_cmd = apt_cache(:showpkg, pkg_name)
56
99
 
57
- @fake_capture3.expect(apt_cache_cmd)
100
+ @fake_capture3.expect(apt_cache_policy_cmd)
101
+ @fake_capture3.expect(apt_cache_showpkg_cmd)
58
102
  @fake_capture3.stub do
59
103
  pkg_provider.installed_versions.must_equal pkg_versions
60
104
  end
@@ -76,8 +120,8 @@ describe Wright::Provider::Package::Apt do
76
120
  it 'should install specific package versions' do
77
121
  pkg_name = 'abcde'
78
122
  pkg_version = '2.5.4-1'
79
- pkg_provider = package_provider(pkg_name, pkg_version)
80
- apt_cmd = apt_get(:install, pkg_name, pkg_version)
123
+ pkg_provider = package_provider(pkg_name, version: pkg_version)
124
+ apt_cmd = apt_get(:install, pkg_name, version: pkg_version)
81
125
 
82
126
  @fake_capture3.expect(apt_cmd)
83
127
  @fake_capture3.stub do
@@ -85,6 +129,18 @@ describe Wright::Provider::Package::Apt do
85
129
  end
86
130
  end
87
131
 
132
+ it 'should pass options to the package manager' do
133
+ pkg_name = 'htop'
134
+ pkg_options = ['--no-install-recommends']
135
+ pkg_provider = package_provider(pkg_name, options: pkg_options)
136
+ apt_cmd = apt_get(:install, pkg_name, options: pkg_options)
137
+
138
+ @fake_capture3.expect(apt_cmd, 'apt-get_install_-qy_htop')
139
+ @fake_capture3.stub do
140
+ pkg_provider.send(:install_package)
141
+ end
142
+ end
143
+
88
144
  it 'should raise exceptions for unknown packages' do
89
145
  pkg_name = 'not-a-real-package'
90
146
  pkg_provider = package_provider(pkg_name)
@@ -111,5 +167,17 @@ describe Wright::Provider::Package::Apt do
111
167
  pkg_provider.send(:remove_package)
112
168
  end
113
169
  end
170
+
171
+ it 'should pass options to the package manager' do
172
+ pkg_name = 'abcde'
173
+ pkg_options = ['--purge']
174
+ pkg_provider = package_provider(pkg_name, options: pkg_options)
175
+ apt_cmd = apt_get(:remove, pkg_name, options: pkg_options)
176
+
177
+ @fake_capture3.expect(apt_cmd)
178
+ @fake_capture3.stub do
179
+ pkg_provider.send(:remove_package)
180
+ end
181
+ end
114
182
  end
115
183
  end
@@ -0,0 +1,7 @@
1
+ ==> Downloading http://ftpmirror.gnu.org/units/units-2.02.tar.gz
2
+ Already downloaded: /Library/Caches/Homebrew/gnu-units-2.02.tar.gz
3
+ ==> Patching
4
+ patching file definitions.units
5
+ ==> ./configure --prefix=/usr/local/Cellar/gnu-units/2.02
6
+ ==> make install
7
+ 🍺 /usr/local/Cellar/gnu-units/2.02: 12 files, 624K, built in 11 seconds
@@ -0,0 +1 @@
1
+ Uninstalling lame... (25 files, 2.1M)