puppet_litmus 0.7.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,16 +1,16 @@
1
- ---
2
- groups:
3
- - name: ssh_nodes
4
- nodes:
5
- - name: test.delivery.puppetlabs.net
6
- config:
7
- transport: ssh
8
- ssh:
9
- user: root
10
- password: Qu@lity!
11
- host-key-check: false
12
- facts:
13
- provisioner: vmpooler
14
- platform: centos-5-x86_64
15
- - name: winrm_nodes
16
- nodes: []
1
+ ---
2
+ groups:
3
+ - name: ssh_nodes
4
+ nodes:
5
+ - name: test.delivery.puppetlabs.net
6
+ config:
7
+ transport: ssh
8
+ ssh:
9
+ user: root
10
+ password: Qu@lity!
11
+ host-key-check: false
12
+ facts:
13
+ provisioner: vmpooler
14
+ platform: centos-5-x86_64
15
+ - name: winrm_nodes
16
+ nodes: []
@@ -1,102 +1,138 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe PuppetLitmus::InventoryManipulation do
6
- class DummyClass
7
- end
8
- let(:dummy_class) do
9
- dummy_class = DummyClass.new
10
- dummy_class.extend(described_class)
11
- dummy_class
12
- end
13
-
14
- context 'with config_from_node' do
15
- let(:no_config_hash) do
16
- { 'groups' =>
17
- [{ 'name' => 'ssh_nodes',
18
- 'nodes' =>
19
- [{ 'name' => 'test.delivery.puppetlabs.net',
20
- 'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
21
- { 'name' => 'winrm_nodes', 'nodes' => [] }] }
22
- end
23
-
24
- let(:config_hash) do
25
- { 'groups' =>
26
- [{ 'name' => 'ssh_nodes',
27
- 'nodes' =>
28
- [{ 'name' => 'test.delivery.puppetlabs.net',
29
- 'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
30
- 'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
31
- { 'name' => 'winrm_nodes', 'nodes' => [] }] }
32
- end
33
-
34
- let(:inventory_full_path) { 'spec/data/inventory.yaml' }
35
-
36
- let(:no_feature_hash) do
37
- { 'groups' =>
38
- [{ 'name' => 'ssh_nodes',
39
- 'nodes' =>
40
- [{ 'name' => 'test.delivery.puppetlabs.net',
41
- 'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
42
- 'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
43
- { 'name' => 'winrm_nodes', 'nodes' => [] }] }
44
- end
45
-
46
- let(:feature_hash) do
47
- { 'groups' =>
48
- [{ 'name' => 'ssh_nodes',
49
- 'nodes' =>
50
- [{ 'name' => 'test.delivery.puppetlabs.net',
51
- 'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
52
- 'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }],
53
- 'features' => ['puppet-agent'] },
54
- { 'name' => 'winrm_nodes', 'nodes' => [] }] }
55
- end
56
-
57
- let(:empty_feature_hash) do
58
- { 'groups' =>
59
- [{ 'name' => 'ssh_nodes',
60
- 'nodes' =>
61
- [{ 'name' => 'test.delivery.puppetlabs.net',
62
- 'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
63
- 'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }],
64
- 'features' => [] },
65
- { 'name' => 'winrm_nodes', 'nodes' => [] }] }
66
- end
67
-
68
- it 'no matching node, raises' do
69
- expect { dummy_class.config_from_node(config_hash, 'not.here') }.to raise_error('No config was found for not.here')
70
- end
71
-
72
- it 'no config section, returns nil' do
73
- expect(dummy_class.config_from_node(no_config_hash, 'test.delivery.puppetlabs.net')).to eq(nil)
74
- end
75
-
76
- it 'config exists, and returns' do
77
- expect(dummy_class.config_from_node(config_hash, 'test.delivery.puppetlabs.net')).to eq('transport' => 'ssh', 'ssh' =>
78
- { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false })
79
- end
80
-
81
- it 'no feature exists, and returns hash with feature added' do
82
- expect(dummy_class.add_feature_to_group(no_feature_hash, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => ['puppet-agent'], 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
83
- end
84
-
85
- it 'feature exists, and returns hash with feature removed' do
86
- expect(dummy_class.remove_feature_from_group(feature_hash, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => [], 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
87
- end
88
-
89
- it 'write from inventory_hash to inventory_yaml file feature_hash' do
90
- expect { dummy_class.write_to_inventory_file(feature_hash, inventory_full_path) }.not_to raise_error
91
- end
92
-
93
- it 'empty feature exists, and returns hash with feature added' do
94
- expect(dummy_class.add_feature_to_group(empty_feature_hash, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => ['puppet-agent'], 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
95
- end
96
-
97
- it 'write from inventory_hash to inventory_yaml file no feature_hash' do
98
- expect(File).to exist(inventory_full_path)
99
- expect { dummy_class.write_to_inventory_file(no_feature_hash, inventory_full_path) }.not_to raise_error
100
- end
101
- end
102
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe PuppetLitmus::InventoryManipulation do
6
+ let(:dummy_class) do
7
+ dummy = Class.new
8
+ dummy.extend(described_class)
9
+ dummy
10
+ end
11
+
12
+ context 'with config_from_node' do
13
+ let(:no_config_hash) do
14
+ { 'groups' =>
15
+ [{ 'name' => 'ssh_nodes',
16
+ 'nodes' =>
17
+ [{ 'name' => 'test.delivery.puppetlabs.net',
18
+ 'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
19
+ { 'name' => 'winrm_nodes', 'nodes' => [] }] }
20
+ end
21
+
22
+ let(:config_hash) do
23
+ { 'groups' =>
24
+ [{ 'name' => 'ssh_nodes',
25
+ 'nodes' =>
26
+ [{ 'name' => 'test.delivery.puppetlabs.net',
27
+ 'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
28
+ 'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
29
+ { 'name' => 'winrm_nodes', 'nodes' => [] }] }
30
+ end
31
+
32
+ let(:inventory_full_path) { 'spec/data/inventory.yaml' }
33
+
34
+ let(:no_feature_hash) do
35
+ { 'groups' =>
36
+ [{ 'name' => 'ssh_nodes',
37
+ 'nodes' =>
38
+ [{ 'name' => 'test.delivery.puppetlabs.net',
39
+ 'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
40
+ 'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
41
+ { 'name' => 'winrm_nodes', 'nodes' => [] }] }
42
+ end
43
+
44
+ let(:feature_hash_group) do
45
+ { 'groups' =>
46
+ [{ 'name' => 'ssh_nodes',
47
+ 'nodes' =>
48
+ [{ 'name' => 'test.delivery.puppetlabs.net',
49
+ 'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
50
+ 'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }],
51
+ 'features' => ['puppet-agent'] },
52
+ { 'name' => 'winrm_nodes', 'nodes' => [] }] }
53
+ end
54
+
55
+ let(:empty_feature_hash_group) do
56
+ { 'groups' =>
57
+ [{ 'name' => 'ssh_nodes',
58
+ 'nodes' =>
59
+ [{ 'name' => 'test.delivery.puppetlabs.net',
60
+ 'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
61
+ 'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }],
62
+ 'features' => [] },
63
+ { 'name' => 'winrm_nodes', 'nodes' => [] }] }
64
+ end
65
+
66
+ let(:feature_hash_node) do
67
+ { 'groups' =>
68
+ [{ 'name' => 'ssh_nodes',
69
+ 'nodes' =>
70
+ [{ 'name' => 'test.delivery.puppetlabs.net',
71
+ 'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
72
+ 'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' },
73
+ 'features' => ['puppet-agent'] }] },
74
+ { 'name' => 'winrm_nodes', 'nodes' => [] }] }
75
+ end
76
+
77
+ let(:empty_feature_hash_node) do
78
+ { 'groups' =>
79
+ [{ 'name' => 'ssh_nodes',
80
+ 'nodes' =>
81
+ [{ 'name' => 'test.delivery.puppetlabs.net',
82
+ 'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
83
+ 'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' },
84
+ 'features' => [] }] },
85
+ { 'name' => 'winrm_nodes', 'nodes' => [] }] }
86
+ end
87
+
88
+ it 'no matching node, raises' do
89
+ expect { dummy_class.config_from_node(config_hash, 'not.here') }.to raise_error('No config was found for not.here')
90
+ end
91
+
92
+ it 'no config section, returns nil' do
93
+ expect(dummy_class.config_from_node(no_config_hash, 'test.delivery.puppetlabs.net')).to eq(nil)
94
+ end
95
+
96
+ it 'config exists, and returns' do
97
+ expect(dummy_class.config_from_node(config_hash, 'test.delivery.puppetlabs.net')).to eq('transport' => 'ssh', 'ssh' =>
98
+ { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false })
99
+ end
100
+
101
+ it 'no feature exists for the group, and returns hash with feature added' do
102
+ expect(dummy_class.add_feature_to_group(no_feature_hash, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => ['puppet-agent'], 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
103
+ end
104
+
105
+ it 'feature exists for the group, and returns hash with feature removed' do
106
+ expect(dummy_class.remove_feature_from_group(feature_hash_group, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => [], 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
107
+ end
108
+
109
+ it 'write from inventory_hash to inventory_yaml file feature_hash_group' do
110
+ expect { dummy_class.write_to_inventory_file(feature_hash_group, inventory_full_path) }.not_to raise_error
111
+ end
112
+
113
+ it 'empty feature exists for the group, and returns hash with feature added' do
114
+ expect(dummy_class.add_feature_to_group(empty_feature_hash_group, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => ['puppet-agent'], 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
115
+ end
116
+
117
+ it 'no feature exists for the node, and returns hash with feature added' do
118
+ expect(dummy_class.add_feature_to_node(no_feature_hash, 'puppet-agent', 'test.delivery.puppetlabs.net')).to eq('groups' => [{ 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net', 'features' => ['puppet-agent'] }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
119
+ end
120
+
121
+ it 'feature exists for the node, and returns hash with feature removed' do
122
+ expect(dummy_class.remove_feature_from_node(feature_hash_node, 'puppet-agent', 'test.delivery.puppetlabs.net')).to eq('groups' => [{ 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net', 'features' => [] }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
123
+ end
124
+
125
+ it 'write from inventory_hash to inventory_yaml file feature_hash_node' do
126
+ expect { dummy_class.write_to_inventory_file(feature_hash_node, inventory_full_path) }.not_to raise_error
127
+ end
128
+
129
+ it 'empty feature exists for the node, and returns hash with feature added' do
130
+ expect(dummy_class.add_feature_to_node(empty_feature_hash_node, 'puppet-agent', 'test.delivery.puppetlabs.net')).to eq('groups' => [{ 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net', 'features' => ['puppet-agent'] }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
131
+ end
132
+
133
+ it 'write from inventory_hash to inventory_yaml file no feature_hash' do
134
+ expect(File).to exist(inventory_full_path)
135
+ expect { dummy_class.write_to_inventory_file(no_feature_hash, inventory_full_path) }.not_to raise_error
136
+ end
137
+ end
138
+ end
@@ -1,55 +1,55 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'rake'
5
-
6
- describe 'litmus rake tasks' do
7
- before(:all) do # rubocop:disable RSpec/BeforeAfterAll
8
- load File.expand_path('../../../lib/puppet_litmus/rake_tasks.rb', __dir__)
9
- # the spec_prep task is stubbed, rather than load from another gem.
10
- Rake::Task.define_task(:spec_prep)
11
- end
12
-
13
- context 'with litmus:metadata task' do
14
- it 'happy path' do
15
- metadata = { 'name' => 'puppetlabs-postgresql',
16
- 'version' => '6.0.0',
17
- 'operatingsystem_support' =>
18
- [{ 'operatingsystem' => 'RedHat', 'operatingsystemrelease' => ['5'] },
19
- { 'operatingsystem' => 'Ubuntu', 'operatingsystemrelease' => ['14.04', '18.04'] }],
20
- 'template-ref' => 'heads/master-0-g7827fc2' }
21
- expect(File).to receive(:read).with(any_args).once
22
- expect(JSON).to receive(:parse).with(any_args).and_return(metadata)
23
- expect(STDOUT).to receive(:puts).with('redhat-5-x86_64')
24
- expect(STDOUT).to receive(:puts).with('ubuntu-1404-x86_64')
25
- expect(STDOUT).to receive(:puts).with('ubuntu-1804-x86_64')
26
- Rake::Task['litmus:metadata'].invoke
27
- end
28
- end
29
-
30
- context 'with litmus:provision_install task' do
31
- it 'happy path' do
32
- expect(Rake::Task['spec_prep']).to receive(:invoke).and_return('').once
33
- expect(Rake::Task['litmus:provision_list']).to receive(:invoke).with('default').once
34
- expect(Rake::Task['litmus:install_agent']).to receive(:invoke).with('puppet6').once
35
- expect(Rake::Task['litmus:install_module']).to receive(:invoke).once
36
- Rake::Task['litmus:provision_install'].invoke('default', 'puppet6')
37
- end
38
- end
39
-
40
- context 'with litmus:provision task' do
41
- it 'provisions' do
42
- results = [{ 'node' => 'localhost',
43
- 'target' => 'localhost',
44
- 'action' => 'task',
45
- 'object' => 'provision::docker',
46
- 'status' => 'success',
47
- 'result' => { 'status' => 'ok', 'node_name' => 'localhost:2222' } }]
48
-
49
- allow(File).to receive(:directory?).with(any_args).and_return(true)
50
- allow_any_instance_of(BoltSpec::Run).to receive(:run_task).with(any_args).and_return(results) # rubocop:disable RSpec/AnyInstance
51
- expect(STDOUT).to receive(:puts).with('localhost:2222, centos:7')
52
- Rake::Task['litmus:provision'].invoke('docker', 'centos:7')
53
- end
54
- end
55
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'rake'
5
+
6
+ describe 'litmus rake tasks' do
7
+ before(:all) do # rubocop:disable RSpec/BeforeAfterAll
8
+ load File.expand_path('../../../lib/puppet_litmus/rake_tasks.rb', __dir__)
9
+ # the spec_prep task is stubbed, rather than load from another gem.
10
+ Rake::Task.define_task(:spec_prep)
11
+ end
12
+
13
+ context 'with litmus:metadata task' do
14
+ it 'happy path' do
15
+ metadata = { 'name' => 'puppetlabs-postgresql',
16
+ 'version' => '6.0.0',
17
+ 'operatingsystem_support' =>
18
+ [{ 'operatingsystem' => 'RedHat', 'operatingsystemrelease' => ['5'] },
19
+ { 'operatingsystem' => 'Ubuntu', 'operatingsystemrelease' => ['14.04', '18.04'] }],
20
+ 'template-ref' => 'heads/master-0-g7827fc2' }
21
+ expect(File).to receive(:read).with(any_args).once
22
+ expect(JSON).to receive(:parse).with(any_args).and_return(metadata)
23
+ expect(STDOUT).to receive(:puts).with('redhat-5-x86_64')
24
+ expect(STDOUT).to receive(:puts).with('ubuntu-1404-x86_64')
25
+ expect(STDOUT).to receive(:puts).with('ubuntu-1804-x86_64')
26
+ Rake::Task['litmus:metadata'].invoke
27
+ end
28
+ end
29
+
30
+ context 'with litmus:provision_install task' do
31
+ it 'happy path' do
32
+ expect(Rake::Task['spec_prep']).to receive(:invoke).and_return('').once
33
+ expect(Rake::Task['litmus:provision_list']).to receive(:invoke).with('default').once
34
+ expect(Rake::Task['litmus:install_agent']).to receive(:invoke).with('puppet6').once
35
+ expect(Rake::Task['litmus:install_module']).to receive(:invoke).once
36
+ Rake::Task['litmus:provision_install'].invoke('default', 'puppet6')
37
+ end
38
+ end
39
+
40
+ context 'with litmus:provision task' do
41
+ it 'provisions' do
42
+ results = [{ 'node' => 'localhost',
43
+ 'target' => 'localhost',
44
+ 'action' => 'task',
45
+ 'object' => 'provision::docker',
46
+ 'status' => 'success',
47
+ 'result' => { 'status' => 'ok', 'node_name' => 'localhost:2222' } }]
48
+
49
+ allow(File).to receive(:directory?).with(any_args).and_return(true)
50
+ allow_any_instance_of(BoltSpec::Run).to receive(:run_task).with(any_args).and_return(results) # rubocop:disable RSpec/AnyInstance
51
+ expect(STDOUT).to receive(:puts).with('localhost:2222, centos:7')
52
+ Rake::Task['litmus:provision'].invoke('docker', 'centos:7')
53
+ end
54
+ end
55
+ end
@@ -1,196 +1,194 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe PuppetLitmus::Serverspec do
6
- class DummyClass
7
- end
8
- let(:dummy_class) do
9
- dummy_class = DummyClass.new
10
- dummy_class.extend(described_class)
11
- dummy_class
12
- end
13
-
14
- context 'with idempotent_apply' do
15
- let(:manifest) do
16
- "include '::doot'"
17
- end
18
-
19
- it 'calls all functions' do
20
- expect(dummy_class).to receive(:create_manifest_file).with(manifest).and_return('/bla.pp')
21
- expect(dummy_class).to receive(:apply_manifest).with(nil, catch_failures: true, manifest_file_location: '/bla.pp')
22
- expect(dummy_class).to receive(:apply_manifest).with(nil, catch_changes: true, manifest_file_location: '/bla.pp')
23
- dummy_class.idempotent_apply(manifest)
24
- end
25
- end
26
-
27
- describe '.run_shell' do
28
- let(:command_to_run) { "puts 'doot'" }
29
- let(:result) { ['result' => { 'exit_code' => 0, 'stdout' => nil, 'stderr' => nil }] }
30
- let(:inventory_hash) { Hash.new(0) }
31
-
32
- it 'responds to run_shell' do
33
- expect(dummy_class).to respond_to(:run_shell).with(1..2).arguments
34
- end
35
-
36
- context 'when running against localhost and no inventory.yaml file' do
37
- it 'does run_shell against localhost without error' do
38
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'localhost'))
39
- expect(dummy_class).to receive(:run_command).with(command_to_run, 'localhost', config: nil, inventory: nil).and_return(result)
40
- expect { dummy_class.run_shell(command_to_run) }.not_to raise_error
41
- end
42
- end
43
-
44
- context 'when running against remote host' do
45
- it 'does run_shell against remote host without error' do
46
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
47
- expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
48
- expect(dummy_class).to receive(:run_command).with(command_to_run, 'some.host', config: nil, inventory: inventory_hash).and_return(result)
49
- expect { dummy_class.run_shell(command_to_run) }.not_to raise_error
50
- end
51
- end
52
- end
53
-
54
- describe '.bolt_upload_file' do
55
- let(:local) { '/tmp' }
56
- let(:remote) { '/remote_tmp' }
57
- # Ignore rubocop because these hashes are representative of output from an external method and editing them leads to test failures.
58
- # rubocop:disable SpaceInsideHashLiteralBraces, SpaceInsideBlockBraces, SpaceAroundOperators, LineLength, SpaceAfterComma
59
- let(:result_success) {[{'node'=>'some.host','target'=>'some.host','action'=>'upload','object'=>'C:\foo\bar.ps1','status'=>'success','result'=>{'_output'=>'Uploaded \'C:\foo\bar.ps1\' to \'some.host:C:\bar\''}}]}
60
- let(:result_failure) {[{'node'=>'some.host','target'=>'some.host','action'=>nil,'object'=>nil,'status'=>'failure','result'=>{'_error'=>{'kind'=>'puppetlabs.tasks/task_file_error','msg'=>'No such file or directory @ rb_sysopen - /nonexistant/file/path','details'=>{},'issue_code'=>'WRITE_ERROR'}}}]}
61
- # rubocop:enable SpaceInsideHashLiteralBraces, SpaceInsideBlockBraces, SpaceAroundOperators, LineLength, SpaceAfterComma
62
- let(:inventory_hash) { Hash.new(0) }
63
-
64
- it 'responds to run_shell' do
65
- expect(dummy_class).to respond_to(:bolt_upload_file).with(2..3).arguments
66
- end
67
-
68
- context 'when upload returns success' do
69
- it 'does upload_file against remote host without error' do
70
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
71
- expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
72
- expect(dummy_class).to receive(:upload_file).with(local, remote, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(result_success)
73
- expect { dummy_class.bolt_upload_file(local, remote) }.not_to raise_error
74
- end
75
- it 'does upload_file against localhost without error' do
76
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'localhost'))
77
- expect(dummy_class).not_to receive(:inventory_hash_from_inventory_file)
78
- expect(dummy_class).to receive(:upload_file).with(local, remote, 'localhost', options: {}, config: nil, inventory: nil).and_return(result_success)
79
- expect { dummy_class.bolt_upload_file(local, remote) }.not_to raise_error
80
- end
81
- end
82
-
83
- context 'when upload returns failure' do
84
- it 'does upload_file gives runtime error for failure' do
85
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
86
- expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
87
- expect(dummy_class).to receive(:upload_file).with(local, remote, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(result_failure)
88
- expect { dummy_class.bolt_upload_file(local, remote) }.to raise_error(RuntimeError, %r{upload file failed})
89
- end
90
- it 'returns the exit code and error message when expecting failure' do
91
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
92
- expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
93
- expect(dummy_class).to receive(:upload_file).with(local, remote, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(result_failure)
94
- method_result = dummy_class.bolt_upload_file(local, remote, expect_failures: true)
95
- expect(method_result.exit_code).to be(255)
96
- expect(method_result.stderr).to be('No such file or directory @ rb_sysopen - /nonexistant/file/path')
97
- end
98
- end
99
- end
100
-
101
- describe '.bolt_run_script' do
102
- let(:script) { '/tmp/script.sh' }
103
- let(:result) { ['result' => { 'exit_code' => 0, 'stdout' => nil, 'stderr' => nil }] }
104
- let(:inventory_hash) { Hash.new(0) }
105
-
106
- it 'responds to bolt_run_script' do
107
- expect(dummy_class).to respond_to(:bolt_run_script).with(1..2).arguments
108
- end
109
-
110
- context 'when running against localhost and no inventory.yaml file' do
111
- it 'does bolt_run_script against localhost without error' do
112
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'localhost'))
113
- expect(dummy_class).not_to receive(:inventory_hash_from_inventory_file)
114
- expect(dummy_class).to receive(:run_script).with(script, 'localhost', [], options: {}, config: nil, inventory: nil).and_return(result)
115
- expect { dummy_class.bolt_run_script(script) }.not_to raise_error
116
- end
117
- end
118
-
119
- context 'when running against remote host' do
120
- it 'does bolt_run_script against remote host without error' do
121
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
122
- expect(dummy_class).to receive(:inventory_hash_from_inventory_file)
123
- expect(dummy_class).to receive(:run_script).with(script, 'some.host', [], options: {}, config: nil, inventory: nil).and_return(result)
124
- expect { dummy_class.bolt_run_script(script) }.not_to raise_error
125
- end
126
- end
127
-
128
- context 'when running with arguments' do
129
- it 'does bolt_run_script with arguments without error' do
130
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'localhost'))
131
- expect(dummy_class).not_to receive(:inventory_hash_from_inventory_file)
132
- expect(dummy_class).to receive(:run_script).with(script, 'localhost', ['doot'], options: {}, config: nil, inventory: nil).and_return(result)
133
- expect { dummy_class.bolt_run_script(script, arguments: ['doot']) }.not_to raise_error
134
- end
135
- end
136
- end
137
-
138
- describe '.run_bolt_task' do
139
- let(:task_name) { 'testtask' }
140
- let(:params) { { 'action' => 'install', 'name' => 'foo' } }
141
- let(:config_data) { { 'modulepath' => File.join(Dir.pwd, 'spec', 'fixtures', 'modules') } }
142
- # Ignore rubocop because these hashes are representative of output from an external method and editing them leads to test failures.
143
- # rubocop:disable SpaceInsideHashLiteralBraces, SpaceBeforeBlockBraces, SpaceInsideBlockBraces, SpaceAroundOperators, LineLength, SpaceAfterComma
144
- let(:result_unstructured_task_success){ [{'node'=>'some.host','target'=>'some.host','action'=>'task','object'=>'testtask::unstructured','status'=>'success','result'=>{'_output'=>'SUCCESS!'}}]}
145
- let(:result_structured_task_success){ [{'node'=>'some.host','target'=>'some.host','action'=>'task','object'=>'testtask::structured','status'=>'success','result'=>{'key1'=>'foo','key2'=>'bar'}}]}
146
- let(:result_failure) {[{'node'=>'some.host','target'=>'some.host','action'=>'task','object'=>'testtask::unstructured','status'=>'failure','result'=>{'_error'=>{'msg'=>'FAILURE!','kind'=>'puppetlabs.tasks/task-error','details'=>{'exitcode'=>123}}}}]}
147
- # rubocop:enable SpaceInsideHashLiteralBraces, SpaceBeforeBlockBraces, SpaceInsideBlockBraces, SpaceAroundOperators, LineLength, SpaceAfterComma
148
- let(:inventory_hash) { Hash.new(0) }
149
-
150
- it 'responds to bolt_run_task' do
151
- expect(dummy_class).to respond_to(:run_bolt_task).with(2..3).arguments
152
- end
153
-
154
- context 'when bolt returns success' do
155
- it 'does bolt_task_run gives no runtime error for success' do
156
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
157
- expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
158
- expect(dummy_class).to receive(:run_task).with(task_name, 'some.host', params, config: config_data, inventory: inventory_hash).and_return(result_unstructured_task_success)
159
- expect { dummy_class.run_bolt_task(task_name, params, opts: {}) }.not_to raise_error
160
- end
161
- it 'returns stdout for unstructured-data tasks' do
162
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
163
- expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
164
- expect(dummy_class).to receive(:run_task).with(task_name, 'some.host', params, config: config_data, inventory: inventory_hash).and_return(result_unstructured_task_success)
165
- method_result = dummy_class.run_bolt_task(task_name, params, opts: {})
166
- expect(method_result.stdout).to eq('SUCCESS!')
167
- end
168
- it 'returns structured output for structured-data tasks' do
169
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
170
- expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
171
- expect(dummy_class).to receive(:run_task).with(task_name, 'some.host', params, config: config_data, inventory: inventory_hash).and_return(result_structured_task_success)
172
- method_result = dummy_class.run_bolt_task(task_name, params, opts: {})
173
- expect(method_result.stdout).to eq('{"key1"=>"foo", "key2"=>"bar"}')
174
- expect(method_result.result['key1']).to eq('foo')
175
- expect(method_result.result['key2']).to eq('bar')
176
- end
177
- end
178
-
179
- context 'when bolt returns failure' do
180
- it 'does bolt_task_run gives runtime error for failure' do
181
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
182
- expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
183
- expect(dummy_class).to receive(:run_task).with(task_name, 'some.host', params, config: config_data, inventory: inventory_hash).and_return(result_failure)
184
- expect { dummy_class.run_bolt_task(task_name, params, opts: {}) }.to raise_error(RuntimeError, %r{task failed})
185
- end
186
- it 'returns the exit code and error message when expecting failure' do
187
- stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
188
- expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
189
- expect(dummy_class).to receive(:run_task).with(task_name, 'some.host', params, config: config_data, inventory: inventory_hash).and_return(result_failure)
190
- method_result = dummy_class.run_bolt_task(task_name, params, expect_failures: true)
191
- expect(method_result.exit_code).to be(123)
192
- expect(method_result.stderr).to be('FAILURE!')
193
- end
194
- end
195
- end
196
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe PuppetLitmus::Serverspec do
6
+ let(:dummy_class) do
7
+ dummy = Class.new
8
+ dummy.extend(described_class)
9
+ dummy
10
+ end
11
+
12
+ context 'with idempotent_apply' do
13
+ let(:manifest) do
14
+ "include '::doot'"
15
+ end
16
+
17
+ it 'calls all functions' do
18
+ expect(dummy_class).to receive(:create_manifest_file).with(manifest).and_return('/bla.pp')
19
+ expect(dummy_class).to receive(:apply_manifest).with(nil, catch_failures: true, manifest_file_location: '/bla.pp')
20
+ expect(dummy_class).to receive(:apply_manifest).with(nil, catch_changes: true, manifest_file_location: '/bla.pp')
21
+ dummy_class.idempotent_apply(manifest)
22
+ end
23
+ end
24
+
25
+ describe '.run_shell' do
26
+ let(:command_to_run) { "puts 'doot'" }
27
+ let(:result) { ['result' => { 'exit_code' => 0, 'stdout' => nil, 'stderr' => nil }] }
28
+ let(:inventory_hash) { Hash.new(0) }
29
+
30
+ it 'responds to run_shell' do
31
+ expect(dummy_class).to respond_to(:run_shell).with(1..2).arguments
32
+ end
33
+
34
+ context 'when running against localhost and no inventory.yaml file' do
35
+ it 'does run_shell against localhost without error' do
36
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'localhost'))
37
+ expect(dummy_class).to receive(:run_command).with(command_to_run, 'localhost', config: nil, inventory: nil).and_return(result)
38
+ expect { dummy_class.run_shell(command_to_run) }.not_to raise_error
39
+ end
40
+ end
41
+
42
+ context 'when running against remote host' do
43
+ it 'does run_shell against remote host without error' do
44
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
45
+ expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
46
+ expect(dummy_class).to receive(:run_command).with(command_to_run, 'some.host', config: nil, inventory: inventory_hash).and_return(result)
47
+ expect { dummy_class.run_shell(command_to_run) }.not_to raise_error
48
+ end
49
+ end
50
+ end
51
+
52
+ describe '.bolt_upload_file' do
53
+ let(:local) { '/tmp' }
54
+ let(:remote) { '/remote_tmp' }
55
+ # Ignore rubocop because these hashes are representative of output from an external method and editing them leads to test failures.
56
+ # rubocop:disable SpaceInsideHashLiteralBraces, SpaceInsideBlockBraces, SpaceAroundOperators, LineLength, SpaceAfterComma
57
+ let(:result_success) {[{'node'=>'some.host','target'=>'some.host','action'=>'upload','object'=>'C:\foo\bar.ps1','status'=>'success','result'=>{'_output'=>'Uploaded \'C:\foo\bar.ps1\' to \'some.host:C:\bar\''}}]}
58
+ let(:result_failure) {[{'node'=>'some.host','target'=>'some.host','action'=>nil,'object'=>nil,'status'=>'failure','result'=>{'_error'=>{'kind'=>'puppetlabs.tasks/task_file_error','msg'=>'No such file or directory @ rb_sysopen - /nonexistant/file/path','details'=>{},'issue_code'=>'WRITE_ERROR'}}}]}
59
+ # rubocop:enable SpaceInsideHashLiteralBraces, SpaceInsideBlockBraces, SpaceAroundOperators, LineLength, SpaceAfterComma
60
+ let(:inventory_hash) { Hash.new(0) }
61
+
62
+ it 'responds to run_shell' do
63
+ expect(dummy_class).to respond_to(:bolt_upload_file).with(2..3).arguments
64
+ end
65
+
66
+ context 'when upload returns success' do
67
+ it 'does upload_file against remote host without error' do
68
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
69
+ expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
70
+ expect(dummy_class).to receive(:upload_file).with(local, remote, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(result_success)
71
+ expect { dummy_class.bolt_upload_file(local, remote) }.not_to raise_error
72
+ end
73
+ it 'does upload_file against localhost without error' do
74
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'localhost'))
75
+ expect(dummy_class).not_to receive(:inventory_hash_from_inventory_file)
76
+ expect(dummy_class).to receive(:upload_file).with(local, remote, 'localhost', options: {}, config: nil, inventory: nil).and_return(result_success)
77
+ expect { dummy_class.bolt_upload_file(local, remote) }.not_to raise_error
78
+ end
79
+ end
80
+
81
+ context 'when upload returns failure' do
82
+ it 'does upload_file gives runtime error for failure' do
83
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
84
+ expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
85
+ expect(dummy_class).to receive(:upload_file).with(local, remote, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(result_failure)
86
+ expect { dummy_class.bolt_upload_file(local, remote) }.to raise_error(RuntimeError, %r{upload file failed})
87
+ end
88
+ it 'returns the exit code and error message when expecting failure' do
89
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
90
+ expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
91
+ expect(dummy_class).to receive(:upload_file).with(local, remote, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(result_failure)
92
+ method_result = dummy_class.bolt_upload_file(local, remote, expect_failures: true)
93
+ expect(method_result.exit_code).to be(255)
94
+ expect(method_result.stderr).to be('No such file or directory @ rb_sysopen - /nonexistant/file/path')
95
+ end
96
+ end
97
+ end
98
+
99
+ describe '.bolt_run_script' do
100
+ let(:script) { '/tmp/script.sh' }
101
+ let(:result) { ['result' => { 'exit_code' => 0, 'stdout' => nil, 'stderr' => nil }] }
102
+ let(:inventory_hash) { Hash.new(0) }
103
+
104
+ it 'responds to bolt_run_script' do
105
+ expect(dummy_class).to respond_to(:bolt_run_script).with(1..2).arguments
106
+ end
107
+
108
+ context 'when running against localhost and no inventory.yaml file' do
109
+ it 'does bolt_run_script against localhost without error' do
110
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'localhost'))
111
+ expect(dummy_class).not_to receive(:inventory_hash_from_inventory_file)
112
+ expect(dummy_class).to receive(:run_script).with(script, 'localhost', [], options: {}, config: nil, inventory: nil).and_return(result)
113
+ expect { dummy_class.bolt_run_script(script) }.not_to raise_error
114
+ end
115
+ end
116
+
117
+ context 'when running against remote host' do
118
+ it 'does bolt_run_script against remote host without error' do
119
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
120
+ expect(dummy_class).to receive(:inventory_hash_from_inventory_file)
121
+ expect(dummy_class).to receive(:run_script).with(script, 'some.host', [], options: {}, config: nil, inventory: nil).and_return(result)
122
+ expect { dummy_class.bolt_run_script(script) }.not_to raise_error
123
+ end
124
+ end
125
+
126
+ context 'when running with arguments' do
127
+ it 'does bolt_run_script with arguments without error' do
128
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'localhost'))
129
+ expect(dummy_class).not_to receive(:inventory_hash_from_inventory_file)
130
+ expect(dummy_class).to receive(:run_script).with(script, 'localhost', ['doot'], options: {}, config: nil, inventory: nil).and_return(result)
131
+ expect { dummy_class.bolt_run_script(script, arguments: ['doot']) }.not_to raise_error
132
+ end
133
+ end
134
+ end
135
+
136
+ describe '.run_bolt_task' do
137
+ let(:task_name) { 'testtask' }
138
+ let(:params) { { 'action' => 'install', 'name' => 'foo' } }
139
+ let(:config_data) { { 'modulepath' => File.join(Dir.pwd, 'spec', 'fixtures', 'modules') } }
140
+ # Ignore rubocop because these hashes are representative of output from an external method and editing them leads to test failures.
141
+ # rubocop:disable SpaceInsideHashLiteralBraces, SpaceBeforeBlockBraces, SpaceInsideBlockBraces, SpaceAroundOperators, LineLength, SpaceAfterComma
142
+ let(:result_unstructured_task_success){ [{'node'=>'some.host','target'=>'some.host','action'=>'task','object'=>'testtask::unstructured','status'=>'success','result'=>{'_output'=>'SUCCESS!'}}]}
143
+ let(:result_structured_task_success){ [{'node'=>'some.host','target'=>'some.host','action'=>'task','object'=>'testtask::structured','status'=>'success','result'=>{'key1'=>'foo','key2'=>'bar'}}]}
144
+ let(:result_failure) {[{'node'=>'some.host','target'=>'some.host','action'=>'task','object'=>'testtask::unstructured','status'=>'failure','result'=>{'_error'=>{'msg'=>'FAILURE!','kind'=>'puppetlabs.tasks/task-error','details'=>{'exitcode'=>123}}}}]}
145
+ # rubocop:enable SpaceInsideHashLiteralBraces, SpaceBeforeBlockBraces, SpaceInsideBlockBraces, SpaceAroundOperators, LineLength, SpaceAfterComma
146
+ let(:inventory_hash) { Hash.new(0) }
147
+
148
+ it 'responds to bolt_run_task' do
149
+ expect(dummy_class).to respond_to(:run_bolt_task).with(2..3).arguments
150
+ end
151
+
152
+ context 'when bolt returns success' do
153
+ it 'does bolt_task_run gives no runtime error for success' do
154
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
155
+ expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
156
+ expect(dummy_class).to receive(:run_task).with(task_name, 'some.host', params, config: config_data, inventory: inventory_hash).and_return(result_unstructured_task_success)
157
+ expect { dummy_class.run_bolt_task(task_name, params, opts: {}) }.not_to raise_error
158
+ end
159
+ it 'returns stdout for unstructured-data tasks' do
160
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
161
+ expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
162
+ expect(dummy_class).to receive(:run_task).with(task_name, 'some.host', params, config: config_data, inventory: inventory_hash).and_return(result_unstructured_task_success)
163
+ method_result = dummy_class.run_bolt_task(task_name, params, opts: {})
164
+ expect(method_result.stdout).to eq('SUCCESS!')
165
+ end
166
+ it 'returns structured output for structured-data tasks' do
167
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
168
+ expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
169
+ expect(dummy_class).to receive(:run_task).with(task_name, 'some.host', params, config: config_data, inventory: inventory_hash).and_return(result_structured_task_success)
170
+ method_result = dummy_class.run_bolt_task(task_name, params, opts: {})
171
+ expect(method_result.stdout).to eq('{"key1"=>"foo", "key2"=>"bar"}')
172
+ expect(method_result.result['key1']).to eq('foo')
173
+ expect(method_result.result['key2']).to eq('bar')
174
+ end
175
+ end
176
+
177
+ context 'when bolt returns failure' do
178
+ it 'does bolt_task_run gives runtime error for failure' do
179
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
180
+ expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
181
+ expect(dummy_class).to receive(:run_task).with(task_name, 'some.host', params, config: config_data, inventory: inventory_hash).and_return(result_failure)
182
+ expect { dummy_class.run_bolt_task(task_name, params, opts: {}) }.to raise_error(RuntimeError, %r{task failed})
183
+ end
184
+ it 'returns the exit code and error message when expecting failure' do
185
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
186
+ expect(dummy_class).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
187
+ expect(dummy_class).to receive(:run_task).with(task_name, 'some.host', params, config: config_data, inventory: inventory_hash).and_return(result_failure)
188
+ method_result = dummy_class.run_bolt_task(task_name, params, expect_failures: true)
189
+ expect(method_result.exit_code).to be(123)
190
+ expect(method_result.stderr).to be('FAILURE!')
191
+ end
192
+ end
193
+ end
194
+ end