require 'support/shared/integration/integration_helper' require 'chef/mixin/properties' module ChefMixinPropertiesSpec describe "Chef::Resource.property" do include IntegrationSupport context "with a base class A with properties a, ab, and ac" do class A include Chef::Mixin::Properties property :a, 'a', default: 'a' property :ab, ['a', 'b'], default: 'a' property :ac, ['a', 'c'], default: 'a' end context "and a module B with properties b, ab and bc" do module B include Chef::Mixin::Properties property :b, 'b', default: 'b' property :ab, default: 'b' property :bc, ['b', 'c'], default: 'c' end context "and a derived class C < A with properties c, ac and bc" do class C < A include B property :c, 'c', default: 'c' property :ac, default: 'c' property :bc, default: 'c' end it "A.properties has a, ab, and ac with types 'a', ['a', 'b'], and ['b', 'c']" do expect(A.properties.keys).to eq [ :a, :ab, :ac ] expect(A.properties[:a].validation_options[:is]).to eq 'a' expect(A.properties[:ab].validation_options[:is]).to eq [ 'a', 'b' ] expect(A.properties[:ac].validation_options[:is]).to eq [ 'a', 'c' ] end it "B.properties has b, ab, and bc with types 'b', nil and ['b', 'c']" do expect(B.properties.keys).to eq [ :b, :ab, :bc ] expect(B.properties[:b].validation_options[:is]).to eq 'b' expect(B.properties[:ab].validation_options[:is]).to be_nil expect(B.properties[:bc].validation_options[:is]).to eq [ 'b', 'c' ] end it "C.properties has a, b, c, ac and bc with merged types" do expect(C.properties.keys).to eq [ :a, :ab, :ac, :b, :bc, :c ] expect(C.properties[:a].validation_options[:is]).to eq 'a' expect(C.properties[:b].validation_options[:is]).to eq 'b' expect(C.properties[:c].validation_options[:is]).to eq 'c' expect(C.properties[:ac].validation_options[:is]).to eq [ 'a', 'c' ] expect(C.properties[:bc].validation_options[:is]).to eq [ 'b', 'c' ] end it "C.properties has ab with a non-merged type (from B)" do expect(C.properties[:ab].validation_options[:is]).to be_nil end context "and an instance of C" do let(:c) { C.new } it "all properties can be retrieved and merged properties default to ab->b, ac->c, bc->c" do expect(c.a).to eq('a') expect(c.b).to eq('b') expect(c.c).to eq('c') expect(c.ab).to eq('b') expect(c.ac).to eq('c') expect(c.bc).to eq('c') end end end end end end context "with an Inner module" do module Inner include Chef::Mixin::Properties property :inner end context "and an Outer module including it" do module Outer include Inner property :outer end context "and an Outerest class including that" do class Outerest include Outer property :outerest end it "Outerest.properties.validation_options[:is] inner, outer, outerest" do expect(Outerest.properties.keys).to eq [:inner, :outer, :outerest] end end end end end