diff --git a/lib/active_interaction/concerns/runnable.rb b/lib/active_interaction/concerns/runnable.rb index a85c4a07..d65469f0 100644 --- a/lib/active_interaction/concerns/runnable.rb +++ b/lib/active_interaction/concerns/runnable.rb @@ -59,6 +59,28 @@ def valid?(*) super end + # @yield [outcome] + # + # @yieldparam outcome [Runnable] + # + # @return [Runnable] + def when_invalid + yield(self) if block_given? && invalid? + + self + end + + # @yield [result] + # + # @yieldparam result [Object] + # + # @return [Runnable] + def when_valid + yield(result) if block_given? && valid? + + self + end + private # @param other [Class] The other interaction. diff --git a/spec/active_interaction/concerns/runnable_spec.rb b/spec/active_interaction/concerns/runnable_spec.rb index 5dff01df..46c3b11a 100644 --- a/spec/active_interaction/concerns/runnable_spec.rb +++ b/spec/active_interaction/concerns/runnable_spec.rb @@ -146,6 +146,54 @@ end end + describe '#when_invalid' do + include_context 'with #execute defined' + + let(:outcome) { klass.run } + + it 'returns self' do + expect(outcome.when_invalid).to equal outcome + end + + context 'valid' do + it 'does not yield' do + expect { |b| outcome.when_invalid(&b) }.to_not yield_control + end + end + + context 'invalid' do + include_context 'with a validator' + + it 'yields' do + expect { |b| outcome.when_invalid(&b) }.to yield_with_args outcome + end + end + end + + describe '#when_valid' do + include_context 'with #execute defined' + + let(:outcome) { klass.run } + + it 'returns self' do + expect(outcome.when_valid).to equal outcome + end + + context 'invalid' do + include_context 'with a validator' + + it 'does not yield' do + expect { |b| outcome.when_valid(&b) }.to_not yield_control + end + end + + context 'valid' do + it 'yields' do + expect { |b| outcome.when_valid(&b) }.to yield_with_args outcome.result + end + end + end + describe '.run' do let(:outcome) { klass.run }