poise 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.kitchen.travis.yml +9 -0
- data/.kitchen.yml +18 -0
- data/.rubocop.yml +2 -0
- data/.travis.yml +25 -0
- data/.yardopts +5 -0
- data/Berksfile +26 -0
- data/Berksfile.lock +10 -0
- data/CHANGELOG.md +58 -0
- data/Gemfile +32 -0
- data/LICENSE +202 -0
- data/README.md +198 -0
- data/Rakefile +17 -0
- data/lib/poise.rb +71 -0
- data/lib/poise/error.rb +24 -0
- data/lib/poise/helpers.rb +33 -0
- data/lib/poise/helpers/chefspec_matchers.rb +92 -0
- data/lib/poise/helpers/defined_in.rb +111 -0
- data/lib/poise/helpers/fused.rb +127 -0
- data/lib/poise/helpers/include_recipe.rb +62 -0
- data/lib/poise/helpers/inversion.rb +374 -0
- data/lib/poise/helpers/inversion/options_provider.rb +41 -0
- data/lib/poise/helpers/inversion/options_resource.rb +101 -0
- data/lib/poise/helpers/lazy_default.rb +62 -0
- data/lib/poise/helpers/lwrp_polyfill.rb +96 -0
- data/lib/poise/helpers/notifying_block.rb +78 -0
- data/lib/poise/helpers/option_collector.rb +117 -0
- data/lib/poise/helpers/resource_name.rb +99 -0
- data/lib/poise/helpers/subcontext_block.rb +58 -0
- data/lib/poise/helpers/subresources.rb +29 -0
- data/lib/poise/helpers/subresources/child.rb +217 -0
- data/lib/poise/helpers/subresources/container.rb +165 -0
- data/lib/poise/helpers/subresources/default_containers.rb +73 -0
- data/lib/poise/helpers/template_content.rb +165 -0
- data/lib/poise/provider.rb +55 -0
- data/lib/poise/resource.rb +75 -0
- data/lib/poise/subcontext.rb +27 -0
- data/lib/poise/subcontext/resource_collection.rb +56 -0
- data/lib/poise/subcontext/runner.rb +50 -0
- data/lib/poise/utils.rb +60 -0
- data/lib/poise/utils/resource_provider_mixin.rb +53 -0
- data/lib/poise/version.rb +20 -0
- data/poise.gemspec +38 -0
- data/test/cookbooks/poise_test/attributes/default.rb +17 -0
- data/test/cookbooks/poise_test/libraries/app.rb +43 -0
- data/test/cookbooks/poise_test/libraries/app_config.rb +46 -0
- data/test/cookbooks/poise_test/libraries/inversion.rb +67 -0
- data/test/cookbooks/poise_test/metadata.rb +18 -0
- data/test/cookbooks/poise_test/recipes/default.rb +25 -0
- data/test/cookbooks/poise_test/recipes/inversion.rb +42 -0
- data/test/gemfiles/chef-12.0.gemfile +18 -0
- data/test/gemfiles/chef-12.1.gemfile +18 -0
- data/test/gemfiles/chef-12.2.gemfile +18 -0
- data/test/gemfiles/chef-12.gemfile +18 -0
- data/test/gemfiles/master.gemfile +20 -0
- data/test/integration/default/serverspec/default_spec.rb +35 -0
- data/test/integration/default/serverspec/inversion_spec.rb +43 -0
- data/test/spec/helpers/chefspec_matchers_spec.rb +45 -0
- data/test/spec/helpers/defined_in_spec.rb +62 -0
- data/test/spec/helpers/fused_spec.rb +92 -0
- data/test/spec/helpers/include_recipe_spec.rb +34 -0
- data/test/spec/helpers/inversion/options_resource_spec.rb +212 -0
- data/test/spec/helpers/inversion_spec.rb +273 -0
- data/test/spec/helpers/lazy_default_spec.rb +74 -0
- data/test/spec/helpers/lwrp_polyfill_spec.rb +128 -0
- data/test/spec/helpers/notifying_block_spec.rb +87 -0
- data/test/spec/helpers/option_collector_spec.rb +82 -0
- data/test/spec/helpers/resource_name_spec.rb +39 -0
- data/test/spec/helpers/subcontext_block_spec.rb +94 -0
- data/test/spec/helpers/subresources/child_spec.rb +339 -0
- data/test/spec/helpers/subresources/container_spec.rb +175 -0
- data/test/spec/helpers/template_context_spec.rb +147 -0
- data/test/spec/poise_spec.rb +185 -0
- data/test/spec/provider_spec.rb +28 -0
- data/test/spec/resource_spec.rb +85 -0
- data/test/spec/spec_helper.rb +18 -0
- data/test/spec/utils/resource_provider_mixin_spec.rb +52 -0
- data/test/spec/utils_spec.rb +110 -0
- metadata +190 -0
@@ -0,0 +1,212 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'spec_helper'
|
18
|
+
|
19
|
+
describe Poise::Helpers::Inversion::OptionsResource do
|
20
|
+
let(:default_attributes) do
|
21
|
+
{'poise-test' => {}}
|
22
|
+
end
|
23
|
+
resource(:poise_test_options) do
|
24
|
+
include described_class
|
25
|
+
inversion_resource(:poise_test_inversion)
|
26
|
+
end
|
27
|
+
provider(:poise_test_options)
|
28
|
+
|
29
|
+
describe '#_options' do
|
30
|
+
context 'with simple options' do
|
31
|
+
recipe do
|
32
|
+
poise_test_options 'test' do
|
33
|
+
foo 'bar'
|
34
|
+
baz 42
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it { is_expected.to run_poise_test_options('test').with(_options: {'foo' => 'bar', 'baz' => 42}) }
|
39
|
+
end # /context with simple options
|
40
|
+
|
41
|
+
context 'with node options' do
|
42
|
+
recipe do
|
43
|
+
poise_test_options 'test' do
|
44
|
+
foo 'bar'
|
45
|
+
baz node.name
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it { is_expected.to run_poise_test_options('test').with(_options: {'foo' => 'bar', 'baz' => 'chefspec.local'}) }
|
50
|
+
end # /context with node options
|
51
|
+
|
52
|
+
context 'with new_resource-based options' do
|
53
|
+
resource(:poise_test) do
|
54
|
+
def foo(val=nil)
|
55
|
+
set_or_return(:foo, val, {})
|
56
|
+
end
|
57
|
+
end
|
58
|
+
provider(:poise_test) do
|
59
|
+
include Chef::DSL::Recipe
|
60
|
+
def action_run
|
61
|
+
poise_test_options new_resource.name do
|
62
|
+
foo new_resource.foo
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
recipe do
|
67
|
+
poise_test 'test' do
|
68
|
+
foo 'bar'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it { is_expected.to run_poise_test_options('test').with(_options: {'foo' => 'bar'}) }
|
73
|
+
end # /context with new_resource-based options
|
74
|
+
|
75
|
+
context 'with a bad method' do
|
76
|
+
recipe do
|
77
|
+
poise_test_options 'test' do
|
78
|
+
foo noode.name
|
79
|
+
baz 42
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it { expect { subject }.to raise_error NoMethodError }
|
84
|
+
end # /context with a bad method
|
85
|
+
|
86
|
+
context 'with derived options' do
|
87
|
+
recipe do
|
88
|
+
poise_test_options 'test' do
|
89
|
+
foo node.name
|
90
|
+
baz foo + 'a'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
it { is_expected.to run_poise_test_options('test').with(_options: {'foo' => 'chefspec.local', 'baz' => 'chefspec.locala'}) }
|
95
|
+
end # /context with derived options
|
96
|
+
end # /describe #_options
|
97
|
+
|
98
|
+
describe 'provider options' do
|
99
|
+
resource(:poise_test_inversion) do
|
100
|
+
include Poise::Helpers::Inversion::Resource
|
101
|
+
end
|
102
|
+
provider(:poise_test_inversion_one) do
|
103
|
+
include Poise::Helpers::Inversion::Provider
|
104
|
+
inversion_resource(:poise_test_inversion)
|
105
|
+
inversion_attribute('poise-test')
|
106
|
+
provides(:poise_test_inversion)
|
107
|
+
def self.provides_auto?(node, resource)
|
108
|
+
true
|
109
|
+
end
|
110
|
+
end
|
111
|
+
subject do
|
112
|
+
chef_run.poise_test_inversion('test').provider_for_action(:nothing).options
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'before service resource' do
|
116
|
+
recipe(subject: false) do
|
117
|
+
poise_test_options 'test' do
|
118
|
+
position 'before'
|
119
|
+
end
|
120
|
+
|
121
|
+
poise_test_inversion 'test'
|
122
|
+
end
|
123
|
+
|
124
|
+
it { is_expected.to eq({'position' => 'before'}) }
|
125
|
+
end # /context before service resource
|
126
|
+
|
127
|
+
context 'after service resource' do
|
128
|
+
recipe(subject: false) do
|
129
|
+
poise_test_inversion 'test'
|
130
|
+
|
131
|
+
poise_test_options 'test' do
|
132
|
+
position 'after'
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it { is_expected.to eq({'position' => 'after'}) }
|
137
|
+
end # /context after service resource
|
138
|
+
|
139
|
+
# This is a regression test because the poise-service version couldn't
|
140
|
+
# do this combination.
|
141
|
+
context 'before service resource for a provider' do
|
142
|
+
recipe(subject: false) do
|
143
|
+
poise_test_options 'test' do
|
144
|
+
for_provider :poise_test_inversion
|
145
|
+
position 'before'
|
146
|
+
end
|
147
|
+
|
148
|
+
poise_test_inversion 'test'
|
149
|
+
end
|
150
|
+
|
151
|
+
it { is_expected.to eq({'position' => 'before'}) }
|
152
|
+
end # /context before service resource for a provider
|
153
|
+
|
154
|
+
context 'after service resource for a provider' do
|
155
|
+
recipe(subject: false) do
|
156
|
+
poise_test_inversion 'test'
|
157
|
+
|
158
|
+
poise_test_options 'test' do
|
159
|
+
for_provider :poise_test_inversion
|
160
|
+
position 'after'
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
it { is_expected.to eq({'position' => 'after'}) }
|
165
|
+
end # /context after service resource for a provider
|
166
|
+
|
167
|
+
context 'after service resource for a non-matching provider' do
|
168
|
+
recipe(subject: false) do
|
169
|
+
poise_test_inversion 'test'
|
170
|
+
|
171
|
+
poise_test_options 'test' do
|
172
|
+
for_provider :other
|
173
|
+
position 'after'
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
it { is_expected.to eq({}) }
|
178
|
+
end # /context after service resource for a non-matching provider
|
179
|
+
|
180
|
+
context 'mutiple options' do
|
181
|
+
recipe(subject: false) do
|
182
|
+
poise_test_options 'test1' do
|
183
|
+
resource 'test'
|
184
|
+
position 'before'
|
185
|
+
one 1
|
186
|
+
end
|
187
|
+
|
188
|
+
poise_test_inversion 'test'
|
189
|
+
|
190
|
+
poise_test_options 'test2' do
|
191
|
+
resource 'test'
|
192
|
+
for_provider :poise_test_inversion
|
193
|
+
two 2
|
194
|
+
end
|
195
|
+
|
196
|
+
poise_test_options 'test3' do
|
197
|
+
resource 'test'
|
198
|
+
position 'after'
|
199
|
+
three 3
|
200
|
+
end
|
201
|
+
|
202
|
+
poise_test_options 'test4' do
|
203
|
+
resource 'test'
|
204
|
+
for_provider :other
|
205
|
+
four 4
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
it { is_expected.to eq({'position' => 'after', 'one' => 1, 'two' => 2, 'three' => 3}) }
|
210
|
+
end # /context mutiple options
|
211
|
+
end # /describe provider options
|
212
|
+
end
|
@@ -0,0 +1,273 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'spec_helper'
|
18
|
+
|
19
|
+
describe Poise::Helpers::Inversion do
|
20
|
+
describe Poise::Helpers::Inversion::Resource do
|
21
|
+
subject { resource(:poise_test_inversion).new('test', nil) }
|
22
|
+
resource(:poise_test_inversion) do
|
23
|
+
include described_class
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#options' do
|
27
|
+
context 'with no options' do
|
28
|
+
it { expect(subject.options).to be_a Mash }
|
29
|
+
it { expect(subject.options).to eq({}) }
|
30
|
+
it { expect(subject.options(:name)).to be_a Mash }
|
31
|
+
it { expect(subject.options(:name)).to eq({}) }
|
32
|
+
end # /context with no options
|
33
|
+
|
34
|
+
context 'with all-provider options' do
|
35
|
+
before { subject.options(key: 'global') }
|
36
|
+
it { expect(subject.options).to be_a Mash }
|
37
|
+
it { expect(subject.options).to eq({'key' => 'global'}) }
|
38
|
+
end # /context with all-provider options
|
39
|
+
|
40
|
+
context 'with single provider options' do
|
41
|
+
before { subject.options(:name, key: 'single') }
|
42
|
+
it { expect(subject.options(:name)).to be_a Mash }
|
43
|
+
it { expect(subject.options(:name)).to eq({'key' => 'single'}) }
|
44
|
+
end # /context with single provider options
|
45
|
+
|
46
|
+
context 'with both options' do
|
47
|
+
before do
|
48
|
+
subject.options(key: 'global')
|
49
|
+
subject.options(:name, key: 'single')
|
50
|
+
end
|
51
|
+
it { expect(subject.options).to eq({'key' => 'global'}) }
|
52
|
+
it { expect(subject.options(:name)).to eq({'key' => 'single'}) }
|
53
|
+
end # /context with both options
|
54
|
+
end # /describe #options
|
55
|
+
|
56
|
+
describe '#provider' do
|
57
|
+
context 'with no provider' do
|
58
|
+
its(:provider) { is_expected.to eq nil }
|
59
|
+
end # /context with no provider
|
60
|
+
|
61
|
+
context 'with a class provider' do
|
62
|
+
before { subject.provider(Object) }
|
63
|
+
its(:provider) { is_expected.to eq Object }
|
64
|
+
end # /context with a class provider
|
65
|
+
|
66
|
+
context 'with a symbol provider' do
|
67
|
+
let(:sentinel) do
|
68
|
+
double('provider sentinel', name: '').tap do |s|
|
69
|
+
allow(s).to receive(:kind_of?) {|klass| klass == Class }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
before do
|
73
|
+
expect(Poise::Helpers::Inversion).to receive(:provider_for).with(:poise_test_inversion, nil, :invert).and_return(sentinel)
|
74
|
+
subject.provider(:invert)
|
75
|
+
end
|
76
|
+
its(:provider) { is_expected.to eq sentinel }
|
77
|
+
end # /context with a symbol provider
|
78
|
+
|
79
|
+
context 'with a symbol that is not a provider' do
|
80
|
+
before do
|
81
|
+
expect(Poise::Helpers::Inversion).to receive(:provider_for).and_return(nil)
|
82
|
+
subject.provider(:ruby_block)
|
83
|
+
end
|
84
|
+
its(:provider) { is_expected.to eq Chef::Provider::RubyBlock }
|
85
|
+
end # /context with a symbol that is not a provider
|
86
|
+
end # /describe #provider
|
87
|
+
end # /decribe Poise::Helpers::Inversion::Resource
|
88
|
+
|
89
|
+
describe Poise::Helpers::Inversion::Provider do
|
90
|
+
# Due to internals of the Halite helpers, make sure this is on its own name.
|
91
|
+
# Otherwise it can try to run provides? for resources matching the name but
|
92
|
+
# in another example.
|
93
|
+
subject(:subject_provider) { provider(:poise_test_inversion) }
|
94
|
+
provider(:poise_test_inversion) do
|
95
|
+
include described_class
|
96
|
+
inversion_resource(:poise_test_inversion)
|
97
|
+
provides(:inverted)
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '.inversion_resource' do
|
101
|
+
context 'with a symbol' do
|
102
|
+
its(:inversion_resource) { is_expected.to eq :poise_test_inversion }
|
103
|
+
end # /context with a symbol
|
104
|
+
|
105
|
+
context 'with a class' do
|
106
|
+
provider(:poise_test_inversion) do
|
107
|
+
include described_class
|
108
|
+
fake_class = Class.new
|
109
|
+
def fake_class.resource_name
|
110
|
+
:poise_test_inversion
|
111
|
+
end
|
112
|
+
inversion_resource(fake_class)
|
113
|
+
end
|
114
|
+
its(:inversion_resource) { is_expected.to eq :poise_test_inversion }
|
115
|
+
end # /context with a class
|
116
|
+
end # /describe .inversion_resource
|
117
|
+
|
118
|
+
describe '.inversion_attribute' do
|
119
|
+
context 'with a string' do
|
120
|
+
provider(:poise_test_inversion) do
|
121
|
+
include described_class
|
122
|
+
inversion_resource(:poise_test_inversion)
|
123
|
+
inversion_attribute('string')
|
124
|
+
end
|
125
|
+
its(:inversion_attribute) { is_expected.to eq %w{string} }
|
126
|
+
end # /context with a string
|
127
|
+
|
128
|
+
context 'with an array' do
|
129
|
+
provider(:poise_test_inversion) do
|
130
|
+
include described_class
|
131
|
+
inversion_resource(:poise_test_inversion)
|
132
|
+
inversion_attribute([:sym1, :sym2])
|
133
|
+
end
|
134
|
+
its(:inversion_attribute) { is_expected.to eq %w{sym1 sym2} }
|
135
|
+
end # /context with an array
|
136
|
+
end # /describe .inversion_attribute
|
137
|
+
|
138
|
+
describe '.resolve_inversion_attribute' do
|
139
|
+
context 'with attributes' do
|
140
|
+
it do
|
141
|
+
expect(subject).to receive(:inversion_attribute).and_return(%w{key1 key2})
|
142
|
+
fake_node = {'key1' => {'key2' => 'value'}}
|
143
|
+
expect(subject.resolve_inversion_attribute(fake_node)).to eq 'value'
|
144
|
+
end
|
145
|
+
end # /context with attributes
|
146
|
+
|
147
|
+
context 'with non-existent attributes' do
|
148
|
+
it do
|
149
|
+
expect(subject).to receive(:inversion_attribute).and_return(%w{key1 key3})
|
150
|
+
fake_node = {'key1' => {'key2' => 'value'}}
|
151
|
+
expect { subject.resolve_inversion_attribute(fake_node) }.to raise_error(Poise::Error)
|
152
|
+
end
|
153
|
+
end # /context with non-existent attributes
|
154
|
+
|
155
|
+
context 'with fallback' do
|
156
|
+
it do
|
157
|
+
expect(subject).to receive(:inversion_attribute).and_return(nil)
|
158
|
+
fake_run_context = double('run context')
|
159
|
+
fake_node = double('node', run_context: fake_run_context)
|
160
|
+
allow(fake_node).to receive(:'[]') {|key| {'key1' => 'value'}[key] }
|
161
|
+
expect(subject).to receive(:poise_defined_in_cookbook).with(fake_run_context).and_return('key1')
|
162
|
+
expect(subject.resolve_inversion_attribute(fake_node)).to eq 'value'
|
163
|
+
end
|
164
|
+
end # /context with fallback
|
165
|
+
end # /describe .resolve_inversion_attribute
|
166
|
+
|
167
|
+
describe '.inversion_options' do
|
168
|
+
let(:attributes) { Hash.new }
|
169
|
+
let(:run_state) { Hash.new }
|
170
|
+
let(:node) { double('node', run_state: {'poise_inversion' => {poise_test_inversion: run_state}}) }
|
171
|
+
let(:new_resource) { double('new_resource', name: 'test', options: {}) }
|
172
|
+
subject { subject_provider.inversion_options(node, new_resource) }
|
173
|
+
before do
|
174
|
+
allow(subject_provider).to receive(:resolve_inversion_attribute).with(node).and_return(attributes)
|
175
|
+
end
|
176
|
+
|
177
|
+
context 'defaults' do
|
178
|
+
it { is_expected.to eq({}) }
|
179
|
+
end # /context defaults
|
180
|
+
|
181
|
+
context 'with global attributes' do
|
182
|
+
before do
|
183
|
+
attributes['provider'] = 'global'
|
184
|
+
attributes['options'] = {key: 'globalval'}
|
185
|
+
end
|
186
|
+
it { is_expected.to eq({'provider' => 'global', 'key' => 'globalval'}) }
|
187
|
+
end # /context with global attributes
|
188
|
+
|
189
|
+
context 'with global run state' do
|
190
|
+
before do
|
191
|
+
run_state['test'] = {
|
192
|
+
'*' => {provider: 'runstate', key: 'runstateval'},
|
193
|
+
}
|
194
|
+
end
|
195
|
+
it { is_expected.to eq({'provider' => 'runstate', 'key' => 'runstateval'}) }
|
196
|
+
end # /context with global run state
|
197
|
+
|
198
|
+
context 'with global resource options' do
|
199
|
+
before do
|
200
|
+
allow(new_resource).to receive(:options).with(no_args).and_return({
|
201
|
+
key: 'optionsval',
|
202
|
+
})
|
203
|
+
end
|
204
|
+
it { is_expected.to eq({'key' => 'optionsval'}) }
|
205
|
+
end # /context with global resource options
|
206
|
+
|
207
|
+
context 'with specific attributes' do
|
208
|
+
before do
|
209
|
+
attributes['test'] = {provider: 'specific', key: 'specificval'}
|
210
|
+
end
|
211
|
+
it { is_expected.to eq({'provider' => 'specific', 'key' => 'specificval'}) }
|
212
|
+
end # /context with specific attributes
|
213
|
+
|
214
|
+
context 'with specific run state' do
|
215
|
+
before do
|
216
|
+
run_state['test'] = {
|
217
|
+
'inverted' => {provider: 'runstate', key: 'specficival'},
|
218
|
+
}
|
219
|
+
end
|
220
|
+
it { is_expected.to eq({'provider' => 'runstate', 'key' => 'specficival'}) }
|
221
|
+
end # /context with specific run state
|
222
|
+
|
223
|
+
context 'with specific resource options' do
|
224
|
+
before do
|
225
|
+
allow(new_resource).to receive(:options).with(:inverted).and_return({
|
226
|
+
key: 'optionsval',
|
227
|
+
})
|
228
|
+
end
|
229
|
+
it { is_expected.to eq({'key' => 'optionsval'}) }
|
230
|
+
end # /context with specific resource options
|
231
|
+
|
232
|
+
context 'with overlapping options' do
|
233
|
+
before do
|
234
|
+
attributes['provider'] = 'global'
|
235
|
+
attributes['options'] = {attrs: 'globalval'}
|
236
|
+
attributes['test'] = {attrs: 'specificval'}
|
237
|
+
run_state['test'] = {
|
238
|
+
'*' => {provider: 'runstate', runstate: 'runstateval'},
|
239
|
+
'inverted' => {runstate: 'runstatespecific'},
|
240
|
+
}
|
241
|
+
allow(new_resource).to receive(:options).with(no_args).and_return({
|
242
|
+
resource: 'resourceval',
|
243
|
+
})
|
244
|
+
allow(new_resource).to receive(:options).with(:inverted).and_return({
|
245
|
+
resource: 'resourcespecific',
|
246
|
+
})
|
247
|
+
end
|
248
|
+
it { is_expected.to eq({
|
249
|
+
'attrs'=> 'specificval',
|
250
|
+
'resource'=> 'resourcespecific',
|
251
|
+
'runstate'=> 'runstatespecific',
|
252
|
+
'provider'=> 'runstate',
|
253
|
+
}) }
|
254
|
+
end # /context with overlapping options
|
255
|
+
end # /describe .inversion_options
|
256
|
+
|
257
|
+
describe '.resolve_inversion_provider' do
|
258
|
+
context 'with no options' do
|
259
|
+
it do
|
260
|
+
expect(subject).to receive(:inversion_options).and_return({})
|
261
|
+
expect(subject.resolve_inversion_provider(nil, nil)).to eq 'auto'
|
262
|
+
end
|
263
|
+
end # /context with no options
|
264
|
+
|
265
|
+
context 'with a provider' do
|
266
|
+
it do
|
267
|
+
expect(subject).to receive(:inversion_options).and_return({'provider' => 'invert'})
|
268
|
+
expect(subject.resolve_inversion_provider(nil, nil)).to eq 'invert'
|
269
|
+
end
|
270
|
+
end # /context with a provider
|
271
|
+
end # /describe .resolve_inversion_provider
|
272
|
+
end # /describe Poise::Helpers::Inversion::Provider
|
273
|
+
end
|