I never meta spec I didn't like.

Rein Henrichs
http://puppetlabs.com


On Wed, Jun 23, 2010 at 5:27 PM, Matt Robinson <[email protected]> wrote:

> +1.  I was okay with the spec_specs directory name, but if anyone has a
> better suggestion I'd be glad to hear it.  At some point if this goes
> through we'll want to get something like this in master, and there we should
> remember that the Rakefile there runs the specs differently and we'd need to
> include the new directory there.
>
>
> On Wed, Jun 23, 2010 at 5:12 PM, Rein Henrichs <[email protected]>wrote:
>
>> This way the test can be evaluated lazily when needed. Adds tests and
>> documentation.
>>
>> Signed-off-by: Rein Henrichs <[email protected]>
>> ---
>>  spec/spec_specs/runnable_spec.rb     |   95
>> ++++++++++++++++++++++++++++++++++
>>  test/lib/puppettest/runnable_test.rb |   54 +++++++++++--------
>>  2 files changed, 127 insertions(+), 22 deletions(-)
>>  create mode 100644 spec/spec_specs/runnable_spec.rb
>>
>> diff --git a/spec/spec_specs/runnable_spec.rb
>> b/spec/spec_specs/runnable_spec.rb
>> new file mode 100644
>> index 0000000..fd2e488
>> --- /dev/null
>> +++ b/spec/spec_specs/runnable_spec.rb
>> @@ -0,0 +1,95 @@
>> +require File.dirname(__FILE__) + '/../spec_helper'
>> +
>> +describe PuppetTest::RunnableTest do
>> +    before do
>> +        @runnable_test = Class.new.extend(PuppetTest::RunnableTest)
>> +    end
>> +
>> +    describe "#confine" do
>> +        subject { @runnable_test }
>> +
>> +        it "should accept a hash" do
>> +            subject.confine({}).should_not raise_error(ArgumentError)
>> +        end
>> +
>> +        it "should accept a message and a block" do
>> +            subject.confine(""){}.should_not raise_error(ArgumentError)
>> +        end
>> +
>> +    end
>> +
>> +    describe "#runnable?" do
>> +        describe "when the superclass is not runnable" do
>> +            before {
>> @runnable_test.stubs(:superclass).returns(stub("unrunnable superclass",
>> :runnable? => false)) }
>> +            subject { @runnable_test.runnable? }
>> +
>> +            it { should be_false }
>> +        end
>> +
>> +        describe "when a confine is false" do
>> +            before { @runnable_test.confine(:message => false) }
>> +            subject { @runnable_test.runnable? }
>> +
>> +            it { should be_false }
>> +        end
>> +
>> +        describe "when a confine has a block that returns false" do
>> +            before { @runnable_test.confine(:message){ false } }
>> +            subject { @runnable_test.runnable? }
>> +
>> +            it { should be_false }
>> +        end
>> +
>> +        describe "when a confine is true and no false confines" do
>> +            before { @runnable_test.confine(:message => true) }
>> +            subject { @runnable_test.runnable? }
>> +
>> +            it { should be_true }
>> +        end
>> +
>> +        describe "when a confine has block that returns true and no false
>> confines" do
>> +            before { @runnable_test.confine(:message){ true } }
>> +            subject { @runnable_test.runnable? }
>> +
>> +            it { should be_true }
>> +        end
>> +
>> +    end
>> +
>> +    describe "#messages" do
>> +        describe "before runnable? is called" do
>> +            subject { @runnable_test.messages }
>> +
>> +            it { should == [] }
>> +        end
>> +
>> +        describe "when runnable? is called and returns false" do
>> +            before do
>> +                @runnable_test.confine(:message => false)
>> +                @runnable_test.runnable?
>> +            end
>> +
>> +            subject { @runnable_test.messages }
>> +
>> +            it "should include the failed confine's message" do
>> +                should include(:message)
>> +            end
>> +
>> +        end
>> +
>> +        describe "when runnable? is called whose block returns false" do
>> +            before do
>> +                @runnable_test.confine(:message){ false }
>> +                @runnable_test.runnable?
>> +            end
>> +
>> +            subject { @runnable_test.messages }
>> +
>> +            it "should include the failed confine's message" do
>> +                should include(:message)
>> +            end
>> +
>> +        end
>> +
>> +    end
>> +end
>> diff --git a/test/lib/puppettest/runnable_test.rb
>> b/test/lib/puppettest/runnable_test.rb
>> index 977dba4..6fcd9c6 100644
>> --- a/test/lib/puppettest/runnable_test.rb
>> +++ b/test/lib/puppettest/runnable_test.rb
>> @@ -1,35 +1,45 @@
>>  # Manage whether a test is runnable.
>>  module PuppetTest
>>     module RunnableTest
>> -        # Confine this test based on specified criteria.  The keys of the
>> -        # hash should be the message to use if the test is not suitable,
>> -        # and the values should be either 'true' or 'false'; true values
>> -        # mean the test is suitable.
>> -        def confine(hash)
>> -            @confines ||= {}
>> -            hash.each do |message, result|
>> -                @confines[message] = result
>> -            end
>> +        # Confine this example group based on specified criteria.  This
>> can be
>> +        # a message and its related test either as a hash or as a single
>> +        # message argument and a block to be evaluated at the time the
>> confine
>> +        # is checked.
>> +        #
>> +        # Examples:
>> +        #
>> +        # confine "Rails is not available" => Puppet.features.rails?
>> +        #
>> +        # confine("ActiveRecord 2.1.x") { ::ActiveRecord::VERSION::MAJOR
>> == 2 and ::ActiveRecord::VERSION::MINOR <= 1 }
>> +        #
>> +        def confine(hash_or_message, &block)
>> +            hash = block_given? ? {hash_or_message => block} :
>> hash_or_message
>> +            confines.update hash
>>         end
>>
>> -        attr_reader :messages
>> -
>> -        # Evaluate all of our tests to see if any of them are false
>> -        # and thus whether this test is considered not runnable.
>> +        # Check all confines for a given example group, starting with any
>> +        # specified in the parent example group. If any confine test is
>> false,
>> +        # the example group is not runnable (and will be skipped). Note:
>> This
>> +        # is used directly by Rspec and is not intended for develper use.
>> +        #
>>         def runnable?
>> -            @messages ||= []
>> -            if superclass.respond_to?(:runnable?) and !
>> superclass.runnable?
>> +            if superclass.respond_to?(:runnable?) and not
>> superclass.runnable?
>>                 return false
>>             end
>> -            return false unless @messages.empty?
>> -            return true unless defined? @confines
>> -            @confines.find_all do |message, result|
>> -                ! result
>> -            end.each do |message, result|
>> -                @messages << message
>> +
>> +            confines.each do |message, is_runnable|
>> +                is_runnable = is_runnable.call if
>> is_runnable.respond_to?(:call)
>> +                messages << message unless is_runnable
>>             end
>>
>> -            return @messages.empty?
>> +            messages.empty?
>>         end
>> +
>> +        def messages; @messages ||= [] end
>> +
>> +        private
>> +
>> +        def confines; @confines ||= {} end
>>     end
>> +
>>  end
>> --
>> 1.7.0.4
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Puppet Developers" group.
>> To post to this group, send email to [email protected].
>> To unsubscribe from this group, send email to
>> [email protected]<puppet-dev%[email protected]>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/puppet-dev?hl=en.
>>
>>
>  --
> You received this message because you are subscribed to the Google Groups
> "Puppet Developers" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<puppet-dev%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/puppet-dev?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to