beaker 1.21.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +8 -8
  2. data/.gitignore +1 -0
  3. data/.rspec +1 -0
  4. data/CONTRIBUTING.md +1 -0
  5. data/HISTORY.md +17288 -2
  6. data/Rakefile +6 -2
  7. data/beaker.gemspec +15 -19
  8. data/lib/beaker.rb +2 -5
  9. data/lib/beaker/answers.rb +2 -0
  10. data/lib/beaker/answers/version34.rb +37 -1
  11. data/lib/beaker/cli.rb +4 -0
  12. data/lib/beaker/command.rb +16 -84
  13. data/lib/beaker/command_factory.rb +13 -2
  14. data/lib/beaker/dsl/assertions.rb +25 -2
  15. data/lib/beaker/dsl/ezbake_utils.rb +2 -2
  16. data/lib/beaker/dsl/helpers.rb +66 -12
  17. data/lib/beaker/dsl/install_utils.rb +128 -66
  18. data/lib/beaker/dsl/wrappers.rb +41 -3
  19. data/lib/beaker/host.rb +42 -6
  20. data/lib/beaker/host/mac.rb +62 -0
  21. data/lib/beaker/host/mac/group.rb +96 -0
  22. data/lib/beaker/host/mac/user.rb +93 -0
  23. data/lib/beaker/host/unix/exec.rb +1 -1
  24. data/lib/beaker/host/unix/pkg.rb +11 -11
  25. data/lib/beaker/host/windows.rb +4 -4
  26. data/lib/beaker/host_prebuilt_steps.rb +194 -58
  27. data/lib/beaker/hypervisor.rb +16 -9
  28. data/lib/beaker/hypervisor/aws_sdk.rb +61 -17
  29. data/lib/beaker/hypervisor/docker.rb +14 -2
  30. data/lib/beaker/hypervisor/ec2_helper.rb +15 -3
  31. data/lib/beaker/hypervisor/vagrant.rb +22 -10
  32. data/lib/beaker/hypervisor/vagrant_libvirt.rb +11 -0
  33. data/lib/beaker/hypervisor/vagrant_virtualbox.rb +1 -1
  34. data/lib/beaker/hypervisor/vcloud_pooled.rb +8 -39
  35. data/lib/beaker/logger.rb +15 -9
  36. data/lib/beaker/network_manager.rb +2 -2
  37. data/lib/beaker/options/command_line_parser.rb +1 -1
  38. data/lib/beaker/options/parser.rb +1 -8
  39. data/lib/beaker/options/presets.rb +70 -45
  40. data/lib/beaker/perf.rb +3 -4
  41. data/lib/beaker/platform.rb +2 -1
  42. data/lib/beaker/result.rb +3 -9
  43. data/lib/beaker/ssh_connection.rb +2 -0
  44. data/lib/beaker/test_case.rb +2 -21
  45. data/lib/beaker/test_suite.rb +21 -25
  46. data/lib/beaker/version.rb +1 -1
  47. data/spec/beaker/answers_spec.rb +36 -0
  48. data/spec/beaker/cli_spec.rb +45 -45
  49. data/spec/beaker/command_spec.rb +25 -36
  50. data/spec/beaker/dsl/assertions_spec.rb +20 -27
  51. data/spec/beaker/dsl/ezbake_utils_spec.rb +5 -5
  52. data/spec/beaker/dsl/helpers_spec.rb +293 -208
  53. data/spec/beaker/dsl/install_utils_spec.rb +310 -189
  54. data/spec/beaker/dsl/outcomes_spec.rb +6 -6
  55. data/spec/beaker/dsl/roles_spec.rb +27 -18
  56. data/spec/beaker/dsl/structure_spec.rb +11 -11
  57. data/spec/beaker/dsl/wrappers_spec.rb +35 -11
  58. data/spec/beaker/host/mac/group_spec.rb +124 -0
  59. data/spec/beaker/host/mac/user_spec.rb +134 -0
  60. data/spec/beaker/host/unix/pkg_spec.rb +40 -24
  61. data/spec/beaker/host/windows/group_spec.rb +1 -1
  62. data/spec/beaker/host_prebuilt_steps_spec.rb +194 -68
  63. data/spec/beaker/host_spec.rb +145 -67
  64. data/spec/beaker/hypervisor/aixer_spec.rb +6 -6
  65. data/spec/beaker/hypervisor/aws_sdk_spec.rb +22 -7
  66. data/spec/beaker/hypervisor/docker_spec.rb +71 -50
  67. data/spec/beaker/hypervisor/ec2_helper_spec.rb +25 -4
  68. data/spec/beaker/hypervisor/fusion_spec.rb +2 -2
  69. data/spec/beaker/hypervisor/hypervisor_spec.rb +20 -27
  70. data/spec/beaker/hypervisor/hypervisor_spec.rb.orig +80 -0
  71. data/spec/beaker/hypervisor/solaris_spec.rb +8 -8
  72. data/spec/beaker/hypervisor/vagrant_fusion_spec.rb +6 -8
  73. data/spec/beaker/hypervisor/vagrant_libvirt_spec.rb +34 -0
  74. data/spec/beaker/hypervisor/vagrant_spec.rb +34 -33
  75. data/spec/beaker/hypervisor/vagrant_virtualbox_spec.rb +18 -8
  76. data/spec/beaker/hypervisor/vagrant_workstation_spec.rb +6 -8
  77. data/spec/beaker/hypervisor/vcloud_pooled_spec.rb +8 -8
  78. data/spec/beaker/hypervisor/vcloud_spec.rb +10 -10
  79. data/spec/beaker/hypervisor/vsphere_helper_spec.rb +8 -8
  80. data/spec/beaker/hypervisor/vsphere_spec.rb +1 -1
  81. data/spec/beaker/logger_spec.rb +45 -31
  82. data/spec/beaker/options/command_line_parser_spec.rb +10 -2
  83. data/spec/beaker/options/hosts_file_parser_spec.rb +9 -2
  84. data/spec/beaker/options/options_hash_spec.rb +2 -2
  85. data/spec/beaker/options/parser_spec.rb +2 -2
  86. data/spec/beaker/options/pe_version_scaper_spec.rb +6 -1
  87. data/spec/beaker/options/presets_spec.rb +11 -1
  88. data/spec/beaker/shared/error_handler_spec.rb +5 -5
  89. data/spec/beaker/shared/host_manager_spec.rb +3 -2
  90. data/spec/beaker/shared/repetition_spec.rb +18 -18
  91. data/spec/beaker/ssh_connection_spec.rb +33 -4
  92. data/spec/beaker/test_case_spec.rb +9 -9
  93. data/spec/beaker/test_suite_spec.rb +14 -14
  94. data/spec/helpers.rb +4 -4
  95. data/spec/matchers.rb +4 -4
  96. data/spec/mocks.rb +5 -1
  97. data/spec/spec_helper.rb +2 -8
  98. metadata +114 -80
  99. data/lib/beaker/hypervisor/blimper.rb +0 -108
  100. data/spec/beaker/hypervisor/blimper_spec.rb +0 -42
  101. data/spec/beaker/options/data/LATEST +0 -1
  102. data/spec/beaker/puppet_command_spec.rb +0 -161
  103. data/spec/mock_blimpy.rb +0 -48
@@ -6,11 +6,11 @@ end
6
6
 
7
7
  describe ClassMixedWithDSLOutcomes do
8
8
  let(:logger) { double }
9
- before { subject.stub( :logger ).and_return( logger ) }
9
+ before { allow( subject ).to receive( :logger ).and_return( logger ) }
10
10
 
11
11
  describe '#pass_test' do
12
12
  it "logs the notification passed to it and raises PassTest" do
13
- logger.should_receive( :notify ).with( /blah/ )
13
+ expect( logger ).to receive( :notify ).with( /blah/ )
14
14
  expect { subject.pass_test('blah') }.
15
15
  to raise_error Beaker::DSL::Outcomes::PassTest
16
16
  end
@@ -18,7 +18,7 @@ describe ClassMixedWithDSLOutcomes do
18
18
 
19
19
  describe '#skip_test' do
20
20
  it "logs the notification passed to it and raises SkipTest" do
21
- logger.should_receive( :notify ).with( /blah/ )
21
+ expect( logger ).to receive( :notify ).with( /blah/ )
22
22
  expect { subject.skip_test('blah') }.
23
23
  to raise_error Beaker::DSL::Outcomes::SkipTest
24
24
  end
@@ -26,7 +26,7 @@ describe ClassMixedWithDSLOutcomes do
26
26
 
27
27
  describe '#pending_test' do
28
28
  it "logs the notification passed to it and raises PendingTest" do
29
- logger.should_receive( :warn ).with( /blah/ )
29
+ expect( logger ).to receive( :warn ).with( /blah/ )
30
30
  expect { subject.pending_test('blah') }.
31
31
  to raise_error Beaker::DSL::Outcomes::PendingTest
32
32
  end
@@ -34,8 +34,8 @@ describe ClassMixedWithDSLOutcomes do
34
34
 
35
35
  describe '#fail_test' do
36
36
  it "logs the notification passed to it and raises FailTest" do
37
- logger.should_receive( :warn )
38
- logger.should_receive( :pretty_backtrace )
37
+ expect( logger ).to receive( :warn )
38
+ expect( logger ).to receive( :pretty_backtrace )
39
39
  expect { subject.fail_test('blah') }.
40
40
  to raise_error Beaker::DSL::Outcomes::FailTest
41
41
  end
@@ -21,76 +21,76 @@ describe ClassMixedWithDSLRoles do
21
21
  describe '#agents' do
22
22
  it 'returns an array of hosts that are agents' do
23
23
  @hosts = [ agent1, agent2, master ]
24
- subject.should_receive( :hosts ).and_return( hosts )
24
+ expect( subject ).to receive( :hosts ).and_return( hosts )
25
25
  expect( subject.agents ).to be == [ agent1, agent2, master ]
26
26
  end
27
27
 
28
28
  it 'and an empty array when none match' do
29
29
  @hosts = [ db, custom ]
30
- subject.should_receive( :hosts ).and_return( hosts )
30
+ expect( subject ).to receive( :hosts ).and_return( hosts )
31
31
  expect( subject.agents ).to be == []
32
32
  end
33
33
  end
34
34
  describe '#master' do
35
35
  it 'returns the master if there is one' do
36
36
  @hosts = [ master, agent1 ]
37
- subject.should_receive( :hosts ).and_return( hosts )
37
+ expect( subject ).to receive( :hosts ).and_return( hosts )
38
38
  expect( subject.master ).to be == master
39
39
  end
40
40
  it 'raises an error if there is more than one master' do
41
41
  @hosts = [ master, monolith ]
42
- subject.should_receive( :hosts ).exactly( 1 ).times.and_return( hosts )
42
+ expect( subject ).to receive( :hosts ).exactly( 1 ).times.and_return( hosts )
43
43
  expect { subject.master }.to raise_error Beaker::DSL::FailTest
44
44
  end
45
45
  end
46
46
  describe '#dashboard' do
47
47
  it 'returns the dashboard if there is one' do
48
48
  @hosts = [ a_and_dash, agent1 ]
49
- subject.should_receive( :hosts ).and_return( hosts )
49
+ expect( subject ).to receive( :hosts ).and_return( hosts )
50
50
  expect( subject.dashboard ).to be == a_and_dash
51
51
  end
52
52
  it 'raises an error if there is more than one dashboard' do
53
53
  @hosts = [ a_and_dash, monolith ]
54
- subject.should_receive( :hosts ).and_return( hosts )
54
+ expect( subject ).to receive( :hosts ).and_return( hosts )
55
55
  expect { subject.dashboard }.to raise_error Beaker::DSL::FailTest
56
56
  end
57
57
  it 'and raises an error if there is no dashboard' do
58
58
  @hosts = [ agent1, agent2, custom ]
59
- subject.should_receive( :hosts ).and_return( hosts )
59
+ expect( subject ).to receive( :hosts ).and_return( hosts )
60
60
  expect { subject.dashboard }.to raise_error Beaker::DSL::FailTest
61
61
  end
62
62
  end
63
63
  describe '#database' do
64
64
  it 'returns the database if there is one' do
65
65
  @hosts = [ db, agent1 ]
66
- subject.should_receive( :hosts ).and_return( hosts )
66
+ expect( subject ).to receive( :hosts ).and_return( hosts )
67
67
  expect( subject.database ).to be == db
68
68
  end
69
69
  it 'raises an error if there is more than one database' do
70
70
  @hosts = [ db, monolith ]
71
- subject.should_receive( :hosts ).and_return( hosts )
71
+ expect( subject ).to receive( :hosts ).and_return( hosts )
72
72
  expect { subject.database }.to raise_error Beaker::DSL::FailTest
73
73
  end
74
74
  it 'and raises an error if there is no database' do
75
75
  @hosts = [ agent1, agent2, custom ]
76
- subject.should_receive( :hosts ).and_return( hosts )
76
+ expect( subject ).to receive( :hosts ).and_return( hosts )
77
77
  expect { subject.database }.to raise_error Beaker::DSL::FailTest
78
78
  end
79
79
  end
80
80
  describe '#default' do
81
81
  it 'returns the default host when one is specified' do
82
82
  @hosts = [ db, agent1, agent2, default, master]
83
- subject.should_receive( :hosts ).exactly( 1 ).times.and_return( hosts )
83
+ expect( subject ).to receive( :hosts ).exactly( 1 ).times.and_return( hosts )
84
84
  expect( subject.default ).to be == default
85
85
  end
86
86
  it 'raises an error if there is more than one default' do
87
87
  @hosts = [ db, monolith, default, default ]
88
- subject.should_receive( :hosts ).and_return( hosts )
88
+ expect( subject ).to receive( :hosts ).and_return( hosts )
89
89
  expect { subject.database }.to raise_error Beaker::DSL::FailTest
90
90
  end
91
91
  it 'and raises an error if there is no default' do
92
92
  @hosts = [ agent1, agent2, custom ]
93
- subject.should_receive( :hosts ).and_return( hosts )
93
+ expect( subject ).to receive( :hosts ).and_return( hosts )
94
94
  expect { subject.database }.to raise_error Beaker::DSL::FailTest
95
95
  end
96
96
  end
@@ -107,26 +107,35 @@ describe ClassMixedWithDSLRoles do
107
107
  it 'creates new method for role "role_correct!"' do
108
108
  test_role = "role_correct!"
109
109
  subject.add_role_def( test_role )
110
- subject.should respond_to test_role
110
+ expect( subject ).to respond_to test_role
111
111
  subject.class.send( :undef_method, test_role )
112
112
  end
113
113
  it 'returns a single node for a new method for a role defined in a single node' do
114
114
  @hosts = [ agent1, agent2, monolith ]
115
- subject.should_receive( :hosts ).and_return( hosts )
115
+ expect( subject ).to receive( :hosts ).and_return( hosts )
116
116
  test_role = "custom_role"
117
117
  subject.add_role_def( test_role )
118
- subject.should respond_to test_role
118
+ expect( subject ).to respond_to test_role
119
119
  expect( subject.send( test_role )).to be == @hosts[2]
120
120
  subject.class.send( :undef_method, test_role )
121
121
  end
122
122
  it 'returns an array of nodes for a new method for a role defined in multiple nodes' do
123
123
  @hosts = [ agent1, agent2, monolith, custom ]
124
- subject.should_receive( :hosts ).and_return( hosts )
124
+ expect( subject ).to receive( :hosts ).and_return( hosts )
125
125
  test_role = "custom_role"
126
126
  subject.add_role_def( test_role )
127
- subject.should respond_to test_role
127
+ expect( subject ).to respond_to test_role
128
128
  expect( subject.send( test_role )).to be == [@hosts[2], @hosts[3]]
129
129
  subject.class.send( :undef_method, test_role )
130
130
  end
131
131
  end
132
+ describe '#any_hosts_as?' do
133
+ it 'returns true if a host exists, false otherwise' do
134
+ @hosts = [ agent1, agent2 ]
135
+ # expect( subject ).to receive( :hosts ).and_return( hosts )
136
+ expect( subject ).to receive( :hosts ).exactly( 2 ).times.and_return( hosts )
137
+ expect( subject.any_hosts_as?( "agent" )).to be == true
138
+ expect( subject.any_hosts_as?( "custom_role" )).to be == false
139
+ end
140
+ end
132
141
  end
@@ -12,15 +12,15 @@ describe ClassMixedWithDSLStructure do
12
12
  end
13
13
 
14
14
  it 'notifies the logger' do
15
- subject.should_receive( :logger ).and_return( logger )
16
- logger.should_receive( :notify )
15
+ expect( subject ).to receive( :logger ).and_return( logger )
16
+ expect( logger ).to receive( :notify )
17
17
  subject.step 'blah'
18
18
  end
19
19
 
20
20
  it 'yields if a block is given' do
21
- subject.should_receive( :logger ).and_return( logger )
22
- logger.should_receive( :notify )
23
- subject.should_receive( :foo )
21
+ expect( subject ).to receive( :logger ).and_return( logger )
22
+ expect( logger ).to receive( :notify )
23
+ expect( subject ).to receive( :foo )
24
24
  subject.step 'blah' do
25
25
  subject.foo
26
26
  end
@@ -33,15 +33,15 @@ describe ClassMixedWithDSLStructure do
33
33
  end
34
34
 
35
35
  it 'notifies the logger' do
36
- subject.should_receive( :logger ).and_return( logger )
37
- logger.should_receive( :notify )
36
+ expect( subject ).to receive( :logger ).and_return( logger )
37
+ expect( logger ).to receive( :notify )
38
38
  subject.test_name 'blah'
39
39
  end
40
40
 
41
41
  it 'yields if a block is given' do
42
- subject.should_receive( :logger ).and_return( logger )
43
- logger.should_receive( :notify )
44
- subject.should_receive( :foo )
42
+ expect( subject ).to receive( :logger ).and_return( logger )
43
+ expect( logger ).to receive( :notify )
44
+ expect( subject ).to receive( :foo )
45
45
  subject.test_name 'blah' do
46
46
  subject.foo
47
47
  end
@@ -53,7 +53,7 @@ describe ClassMixedWithDSLStructure do
53
53
  teardown_array = double
54
54
  subject.instance_variable_set :@teardown_procs, teardown_array
55
55
  block = lambda { 'blah' }
56
- teardown_array.should_receive( :<< ).with( block )
56
+ expect( teardown_array ).to receive( :<< ).with( block )
57
57
  subject.teardown &block
58
58
  end
59
59
  end
@@ -5,30 +5,38 @@ class ClassMixedWithDSLWrappers
5
5
  end
6
6
 
7
7
  describe ClassMixedWithDSLWrappers do
8
- let(:opts) { {'ENV' => default_opts} }
9
- let(:default_opts) { Beaker::Command::DEFAULT_GIT_ENV }
8
+ let(:opts) { {'ENV' => { :HOME => "/"}, :cmdexe => true } }
9
+ let(:empty_opts) { {'ENV' => {}, :cmdexe => true } }
10
+
10
11
  describe '#facter' do
11
12
  it 'should split out the options and pass "facter" as first arg to Command' do
12
- Beaker::Command.should_receive( :new ).
13
- with('facter', [ '-p' ], opts)
13
+ expect( Beaker::Command ).to receive( :new ).
14
+ with('facter', [ '-p' ], empty_opts)
14
15
  subject.facter( '-p' )
15
16
  end
16
17
  end
17
18
 
19
+ describe '#cfacter' do
20
+ it 'should split out the options and pass "cfacter" as first arg to Command' do
21
+ expect( Beaker::Command ).to receive( :new ).
22
+ with('cfacter', [ '-p' ], empty_opts)
23
+ subject.cfacter( '-p' )
24
+ end
25
+ end
26
+
18
27
  describe '#hiera' do
19
28
  it 'should split out the options and pass "hiera" as first arg to Command' do
20
- Beaker::Command.should_receive( :new ).
21
- with('hiera', [ '-p' ], opts)
29
+ expect( Beaker::Command ).to receive( :new ).
30
+ with('hiera', [ '-p' ], empty_opts)
22
31
  subject.hiera( '-p' )
23
32
  end
24
33
  end
25
34
 
26
35
  describe '#puppet' do
27
36
  it 'should split out the options and pass "puppet <blank>" to Command' do
28
- merged_opts = {}
29
- merged_opts['ENV'] = {:HOME => '/'}.merge( default_opts )
37
+ merged_opts = opts
30
38
  merged_opts[:server] = 'master'
31
- Beaker::Command.should_receive( :new ).
39
+ expect( Beaker::Command ).to receive( :new ).
32
40
  with('puppet agent', [ '-tv' ], merged_opts)
33
41
  subject.puppet( 'agent', '-tv', :server => 'master', 'ENV' => {:HOME => '/'})
34
42
  end
@@ -36,7 +44,7 @@ describe ClassMixedWithDSLWrappers do
36
44
 
37
45
  describe '#host_command' do
38
46
  it 'delegates to HostCommand.new' do
39
- Beaker::HostCommand.should_receive( :new ).with( 'blah' )
47
+ expect( Beaker::HostCommand ).to receive( :new ).with( 'blah' )
40
48
  subject.host_command( 'blah' )
41
49
  end
42
50
  end
@@ -44,9 +52,25 @@ describe ClassMixedWithDSLWrappers do
44
52
  describe 'deprecated puppet wrappers' do
45
53
  %w( resource doc kick cert apply master agent filebucket ).each do |sub|
46
54
  it "#{sub} delegates the proper info to #puppet" do
47
- subject.should_receive( :puppet ).with( sub, 'blah' )
55
+ expect( subject ).to receive( :puppet ).with( sub, 'blah' )
48
56
  subject.send( "puppet_#{sub}", 'blah')
49
57
  end
50
58
  end
51
59
  end
60
+
61
+ describe '#powershell' do
62
+ it 'should pass "powershell.exe <args> -Command <command>" to Command' do
63
+ command = subject.powershell("Set-Content -path 'fu.txt' -value 'fu'")
64
+ expect(command.command ).to be === 'powershell.exe'
65
+ expect( command.args).to be === ' -ExecutionPolicy Bypass -InputFormat None -NoLogo -NoProfile -NonInteractive -Command "Set-Content -path \'fu.txt\' -value \'fu\'"'
66
+ expect( command.options ).to be === {}
67
+ end
68
+
69
+ it 'should merge the arguments provided with the defaults' do
70
+ command = subject.powershell("Set-Content -path 'fu.txt' -value 'fu'", {'ExecutionPolicy' => 'Unrestricted'})
71
+ expect( command.command).to be === 'powershell.exe'
72
+ expect( command.args ).to be === ' -ExecutionPolicy Unrestricted -InputFormat None -NoLogo -NoProfile -NonInteractive -Command "Set-Content -path \'fu.txt\' -value \'fu\'"'
73
+ expect( command.options ).to be === {}
74
+ end
75
+ end
52
76
  end
@@ -0,0 +1,124 @@
1
+ require 'spec_helper'
2
+
3
+ class MacGroupTest
4
+ include Mac::Group
5
+ end
6
+
7
+ describe MacGroupTest do
8
+ let( :puppet1 ) do <<-EOS
9
+ name: puppet1
10
+ password: *
11
+ gid: 55
12
+
13
+ EOS
14
+ end
15
+ let( :puppet2 ) do <<-EOS
16
+ name: puppet2
17
+ password: *
18
+ gid: 56
19
+
20
+ EOS
21
+ end
22
+ let( :dscacheutil_list ) do <<-EOS
23
+ #{puppet1}
24
+ #{puppet2}
25
+ EOS
26
+ end
27
+ let( :command ) { 'ls' }
28
+ let( :host ) { double.as_null_object }
29
+ let( :result ) { Beaker::Result.new( host, command ) }
30
+
31
+ describe '#group_list' do
32
+
33
+ it 'returns group names list correctly' do
34
+ result.stdout = dscacheutil_list
35
+ expect( subject ).to receive( :execute ).and_yield(result)
36
+ expect( subject.group_list ).to be === ['puppet1', 'puppet2']
37
+ end
38
+
39
+ it 'yields correctly with the result object' do
40
+ result.stdout = dscacheutil_list
41
+ expect( subject ).to receive( :execute ).and_yield(result)
42
+ subject.group_list { |result|
43
+ expect( result.stdout ).to be === dscacheutil_list
44
+ }
45
+ end
46
+
47
+ end
48
+
49
+ describe '#group_get' do
50
+
51
+ it 'fails if a name line isn\'t included' do
52
+ result.stdout = ''
53
+ group_name = 'any_name'
54
+ expect( subject ).to receive( :execute ).and_yield(result)
55
+ expect { subject.group_get(group_name) }.to raise_error(MiniTest::Assertion, "failed to get group #{group_name}")
56
+ end
57
+
58
+ it 'parses mac dscacheutil output into /etc/group format correctly' do
59
+ result.stdout = puppet1
60
+ expect( subject ).to receive( :execute ).and_yield(result)
61
+ subject.group_get('puppet1') do |answer|
62
+ expect(answer).to be === 'puppet1:*:55'
63
+ end
64
+ end
65
+
66
+ end
67
+
68
+ describe '#group_gid' do
69
+
70
+ it 'parses mac dscacheutil output into the gid correctly' do
71
+ result.stdout = puppet1
72
+ expect( subject ).to receive( :execute ).and_yield(result)
73
+ expect( subject.group_gid(puppet1) ).to be === '55'
74
+ end
75
+
76
+ it 'returns -1 if gid not found' do
77
+ result.stdout = ''
78
+ expect( subject ).to receive( :execute ).and_yield(result)
79
+ expect( subject.group_gid(puppet1) ).to be === -1
80
+ end
81
+
82
+ end
83
+
84
+ describe '#group_present' do
85
+
86
+ it 'returns group existence without running create command if it already exists' do
87
+ result.stdout = puppet1
88
+ expect( subject ).to receive( :execute ).once.and_yield(result)
89
+ subject.group_present( 'puppet1' )
90
+ end
91
+
92
+ it 'runs correct create command if group does not exist' do
93
+ result.stdout = ''
94
+ gid = 512
95
+ name = "madeup_group"
96
+
97
+ expect( subject ).to receive( :gid_next ).and_return(gid)
98
+ expect( subject ).to receive( :execute ).once.ordered.and_yield(result)
99
+ expect( subject ).to receive( :execute ).with("dscl . create /Groups/#{name} && dscl . create /Groups/#{name} PrimaryGroupID #{gid}").once.ordered
100
+ subject.group_present( name )
101
+ end
102
+
103
+ end
104
+
105
+ describe '#group_absent' do
106
+
107
+ it 'calls execute to run logic' do
108
+ name = "main_one"
109
+ expect( subject ).to receive( :execute ).once.with("if dscl . -list /Groups/#{name}; then dscl . -delete /Groups/#{name}; fi", {})
110
+ subject.group_absent( name )
111
+ end
112
+
113
+ end
114
+
115
+ describe '#gid_next' do
116
+
117
+ it 'returns the next ID given' do
118
+ n = 10
119
+ expect( subject ).to receive( :execute ).and_return("#{n}")
120
+ expect( subject.gid_next ).to be === n + 1
121
+ end
122
+
123
+ end
124
+ end
@@ -0,0 +1,134 @@
1
+ require 'spec_helper'
2
+
3
+ class MacUserTest
4
+ include Mac::User
5
+ end
6
+
7
+ describe MacUserTest do
8
+ let( :puppet1 ) do <<-EOS
9
+ name: puppet1
10
+ password: *
11
+ uid: 67
12
+ gid: 234
13
+ dir: /Users/puppet1
14
+ shell: /bin/bash
15
+ gecos: Unprivileged User
16
+
17
+ EOS
18
+ end
19
+ let( :puppet2 ) do <<-EOS
20
+ name: puppet2
21
+ password: *
22
+ uid: 68
23
+ gid: 235
24
+ dir: /Users/puppet2
25
+ shell: /bin/sh
26
+ gecos: puppet
27
+
28
+ EOS
29
+ end
30
+ let( :dscacheutil_list ) do <<-EOS
31
+ #{puppet1}
32
+ #{puppet2}
33
+ EOS
34
+ end
35
+ let( :command ) { 'ls' }
36
+ let( :host ) { double.as_null_object }
37
+ let( :result ) { Beaker::Result.new( host, command ) }
38
+
39
+ describe '#user_list' do
40
+
41
+ it 'returns user names list correctly' do
42
+ result.stdout = dscacheutil_list
43
+ expect( subject ).to receive( :execute ).and_yield(result)
44
+ expect( subject.user_list ).to be === ['puppet1', 'puppet2']
45
+ end
46
+
47
+ it 'yields correctly with the result object' do
48
+ result.stdout = dscacheutil_list
49
+ expect( subject ).to receive( :execute ).and_yield(result)
50
+ subject.user_list { |result|
51
+ expect( result.stdout ).to be === dscacheutil_list
52
+ }
53
+ end
54
+
55
+ end
56
+
57
+ describe '#user_get' do
58
+
59
+ it 'fails if a name line isn\'t included' do
60
+ result.stdout = ''
61
+ user_name = 'any_name'
62
+ expect( subject ).to receive( :execute ).and_yield(result)
63
+ expect { subject.user_get(user_name) }.to raise_error(MiniTest::Assertion, "failed to get user #{user_name}")
64
+ end
65
+
66
+ it 'parses mac dscacheutil output into /etc/passwd format correctly' do
67
+ result.stdout = puppet1
68
+ expect( subject ).to receive( :execute ).and_yield(result)
69
+ expect( subject.user_get('puppet1') ).to be === "puppet1:*:67:234:puppet1:/Users/puppet1:/bin/bash"
70
+ end
71
+
72
+ it 'yields correctly with the result object' do
73
+ result.stdout = puppet1
74
+ expect( subject ).to receive( :execute ).and_yield(result)
75
+ subject.user_get('puppet1') do |result|
76
+ expect( result.stdout ).to be === puppet1
77
+ end
78
+ end
79
+
80
+ end
81
+
82
+ describe '#user_present' do
83
+
84
+ it 'returns user existence without running create command if it already exists' do
85
+ result.stdout = puppet1
86
+ expect( subject ).to receive( :execute ).once.and_yield(result)
87
+ subject.user_present( 'puppet1' )
88
+ end
89
+
90
+ it 'runs correct create command if group does not exist' do
91
+ result.stdout = ''
92
+ uid = 512
93
+ gid = 1007
94
+ name = "madeup_user"
95
+
96
+ expect( subject ).to receive( :uid_next ).and_return(uid)
97
+ expect( subject ).to receive( :gid_next ).and_return(gid)
98
+ expect( subject ).to receive( :execute ).once.ordered.and_yield(result)
99
+ expect( subject ).to receive( :execute ).once.ordered
100
+ subject.user_present( name )
101
+ end
102
+
103
+ end
104
+
105
+ describe '#user_absent' do
106
+
107
+ it 'calls execute to run logic' do
108
+ name = "main_one"
109
+ expect( subject ).to receive( :execute ).once.with("if dscl . -list /Users/#{name}; then dscl . -delete /Users/#{name}; fi", {})
110
+ subject.user_absent( name )
111
+ end
112
+
113
+ end
114
+
115
+ describe '#uid_next' do
116
+
117
+ it 'returns the next ID given' do
118
+ n = 117
119
+ expect( subject ).to receive( :execute ).and_return("#{n}")
120
+ expect( subject.uid_next ).to be === n + 1
121
+ end
122
+
123
+ end
124
+
125
+ describe '#gid_next' do
126
+
127
+ it 'returns the next ID given' do
128
+ n = 843
129
+ expect( subject ).to receive( :execute ).and_return("#{n}")
130
+ expect( subject.gid_next ).to be === n + 1
131
+ end
132
+
133
+ end
134
+ end