summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2015-02-19 16:03:43 -0800
committerLamont Granquist <lamont@scriptkiddie.org>2015-02-19 16:03:43 -0800
commit384ebf910ef607c3520534d0b3e51c2088bdb5b0 (patch)
tree4a3fdb1b63eaf90f662552dfc6dad1f52ce58c06
parentfc35c88351d1ba5175911323c81475cfae471f26 (diff)
downloadchef-384ebf910ef607c3520534d0b3e51c2088bdb5b0.tar.gz
add nillable_set_or_return tests to the mixin
-rw-r--r--spec/unit/mixin/params_validate_spec.rb133
1 files changed, 70 insertions, 63 deletions
diff --git a/spec/unit/mixin/params_validate_spec.rb b/spec/unit/mixin/params_validate_spec.rb
index 85e1c1abab..59e5aa6416 100644
--- a/spec/unit/mixin/params_validate_spec.rb
+++ b/spec/unit/mixin/params_validate_spec.rb
@@ -339,69 +339,76 @@ describe Chef::Mixin::ParamsValidate do
end.to raise_error(Chef::Exceptions::ValidationFailed)
end
- it "should set and return a value, then return the same value" do
- value = "meow"
- expect(@vo.set_or_return(:test, value, {}).object_id).to eq(value.object_id)
- expect(@vo.set_or_return(:test, nil, {}).object_id).to eq(value.object_id)
- end
-
- it "should set and return a default value when the argument is nil, then return the same value" do
- value = "meow"
- expect(@vo.set_or_return(:test, nil, { :default => value }).object_id).to eq(value.object_id)
- expect(@vo.set_or_return(:test, nil, {}).object_id).to eq(value.object_id)
- end
-
- it "should raise an ArgumentError when argument is nil and required is true" do
- expect {
- @vo.set_or_return(:test, nil, { :required => true })
- }.to raise_error(ArgumentError)
- end
-
- it "should not raise an error when argument is nil and required is false" do
- expect {
- @vo.set_or_return(:test, nil, { :required => false })
- }.not_to raise_error
- end
-
- it "should set and return @name, then return @name for foo when argument is nil" do
- value = "meow"
- expect(@vo.set_or_return(:name, value, { }).object_id).to eq(value.object_id)
- expect(@vo.set_or_return(:foo, nil, { :name_attribute => true }).object_id).to eq(value.object_id)
- end
-
- it "should allow DelayedEvaluator instance to be set for value regardless of restriction" do
- value = Chef::DelayedEvaluator.new{ 'test' }
- @vo.set_or_return(:test, value, {:kind_of => Numeric})
- end
-
- it "should raise an error when delayed evaluated attribute is not valid" do
- value = Chef::DelayedEvaluator.new{ 'test' }
- @vo.set_or_return(:test, value, {:kind_of => Numeric})
- expect do
- @vo.set_or_return(:test, nil, {:kind_of => Numeric})
- end.to raise_error(Chef::Exceptions::ValidationFailed)
- end
-
- it "should create DelayedEvaluator instance when #lazy is used" do
- @vo.set_or_return(:delayed, @vo.lazy{ 'test' }, {})
- expect(@vo.instance_variable_get(:@delayed)).to be_a(Chef::DelayedEvaluator)
- end
-
- it "should execute block on each call when DelayedEvaluator" do
- value = 'fubar'
- @vo.set_or_return(:test, @vo.lazy{ value }, {})
- expect(@vo.set_or_return(:test, nil, {})).to eq('fubar')
- value = 'foobar'
- expect(@vo.set_or_return(:test, nil, {})).to eq('foobar')
- value = 'fauxbar'
- expect(@vo.set_or_return(:test, nil, {})).to eq('fauxbar')
- end
-
- it "should not evaluate non DelayedEvaluator instances" do
- value = lambda{ 'test' }
- @vo.set_or_return(:test, value, {})
- expect(@vo.set_or_return(:test, nil, {}).object_id).to eq(value.object_id)
- expect(@vo.set_or_return(:test, nil, {})).to be_a(Proc)
+ def self.test_set_or_return_method(method)
+ # caller is responsible for passing in the right arg to get 'return' behavior
+ return_arg = method == :nillable_set_or_return ? TinyClass::NULL_ARG : nil
+
+ it "#{method} should set and return a value, then return the same value" do
+ value = "meow"
+ expect(@vo.send(method,:test, value, {}).object_id).to eq(value.object_id)
+ expect(@vo.send(method,:test, return_arg, {}).object_id).to eq(value.object_id)
+ end
+
+ it "#{method} should set and return a default value when the argument is nil, then return the same value" do
+ value = "meow"
+ expect(@vo.send(method,:test, return_arg, { :default => value }).object_id).to eq(value.object_id)
+ expect(@vo.send(method,:test, return_arg, {}).object_id).to eq(value.object_id)
+ end
+
+ it "#{method} should raise an ArgumentError when argument is nil and required is true" do
+ expect {
+ @vo.send(method,:test, return_arg, { :required => true })
+ }.to raise_error(ArgumentError)
+ end
+
+ it "#{method} should not raise an error when argument is nil and required is false" do
+ expect {
+ @vo.send(method,:test, return_arg, { :required => false })
+ }.not_to raise_error
+ end
+
+ it "#{method} should set and return @name, then return @name for foo when argument is nil" do
+ value = "meow"
+ expect(@vo.send(method,:name, value, { }).object_id).to eq(value.object_id)
+ expect(@vo.send(method,:foo, return_arg, { :name_attribute => true }).object_id).to eq(value.object_id)
+ end
+
+ it "#{method} should allow DelayedEvaluator instance to be set for value regardless of restriction" do
+ value = Chef::DelayedEvaluator.new{ 'test' }
+ @vo.send(method,:test, value, {:kind_of => Numeric})
+ end
+
+ it "#{method} should raise an error when delayed evaluated attribute is not valid" do
+ value = Chef::DelayedEvaluator.new{ 'test' }
+ @vo.send(method,:test, value, {:kind_of => Numeric})
+ expect do
+ @vo.send(method,:test, return_arg, {:kind_of => Numeric})
+ end.to raise_error(Chef::Exceptions::ValidationFailed)
+ end
+
+ it "#{method} should create DelayedEvaluator instance when #lazy is used" do
+ @vo.send(method,:delayed, @vo.lazy{ 'test' }, {})
+ expect(@vo.instance_variable_get(:@delayed)).to be_a(Chef::DelayedEvaluator)
+ end
+
+ it "#{method} should execute block on each call when DelayedEvaluator" do
+ value = 'fubar'
+ @vo.send(method,:test, @vo.lazy{ value }, {})
+ expect(@vo.send(method,:test, return_arg, {})).to eq('fubar')
+ value = 'foobar'
+ expect(@vo.send(method,:test, return_arg, {})).to eq('foobar')
+ value = 'fauxbar'
+ expect(@vo.send(method,:test, return_arg, {})).to eq('fauxbar')
+ end
+
+ it "#{method} should not evaluate non DelayedEvaluator instances" do
+ value = lambda{ 'test' }
+ @vo.send(method,:test, value, {})
+ expect(@vo.send(method,:test, return_arg, {}).object_id).to eq(value.object_id)
+ expect(@vo.send(method,:test, return_arg, {})).to be_a(Proc)
+ end
end
+ test_set_or_return_method(:set_or_return)
+ test_set_or_return_method(:nillable_set_or_return)
end