diff --git a/features/tests/env.feature b/features/tests/env.feature index ffab167..e706931 100644 --- a/features/tests/env.feature +++ b/features/tests/env.feature @@ -21,7 +21,35 @@ Feature: `env?' condition keyword target 'some_host.test' task :testing_env_var_definition do - condition { env? :inexistent_var } + condition { env? :non_existent_var } + + echo 'evaluated' + end + """ + When I successfully execute the recipe + Then the output must not contain "evaluated" + + Scenario: succeeds when remote environment variable value match + Given a recipe with: + """ + target 'some_host.test' + + task :testing_env_var_value do + condition { env? :shell, '/bin/sh' } + + echo 'evaluated' + end + """ + When I successfully execute the recipe + Then the output must contain "evaluated" + + Scenario: fails when remote environment variable value does not match + Given a recipe with: + """ + target 'some_host.test' + + task :testing_env_var_value do + condition { env? :shell, 'non_existent_shell' } echo 'evaluated' end diff --git a/lib/producer/core/tests/has_env.rb b/lib/producer/core/tests/has_env.rb index 0195520..161750d 100644 --- a/lib/producer/core/tests/has_env.rb +++ b/lib/producer/core/tests/has_env.rb @@ -3,7 +3,18 @@ module Producer module Tests class HasEnv < Test def verify - remote.environment.key? arguments.first.to_s.upcase + case arguments.size + when 1 + remote.environment.key? key + when 2 + remote.environment[key] == arguments.last + end + end + + private + + def key + arguments.first.to_s.upcase end end end diff --git a/spec/producer/core/tests/has_env_spec.rb b/spec/producer/core/tests/has_env_spec.rb index e82456f..af5a980 100644 --- a/spec/producer/core/tests/has_env_spec.rb +++ b/spec/producer/core/tests/has_env_spec.rb @@ -3,10 +3,11 @@ require 'spec_helper' module Producer::Core module Tests describe HasEnv do - let(:env) { Env.new } - let(:variable_name) { 'SOME_VAR' } - let(:remote_env) { { 'SOME_VAR' => 'SOME_VALUE' } } - subject(:has_env) { HasEnv.new(env, variable_name) } + let(:env) { Env.new } + let(:var_name) { 'SOME_VAR' } + let(:var_value) { 'SOME_VALUE' } + let(:remote_env) { { 'SOME_VAR' => 'SOME_VALUE' } } + subject(:has_env) { HasEnv.new(env, var_name) } it_behaves_like 'test' @@ -14,26 +15,58 @@ module Producer::Core allow(env.remote).to receive(:environment) { remote_env } end - describe '#verify' do - context 'remote environment var is defined' do - it 'returns true' do - expect(has_env.verify).to be true - end - - context 'when var name is given as a lowercase symbol' do - let(:variable_name) { :some_var } - + context 'when only var name is provided' do + describe '#verify' do + context 'when remote environment var is defined' do it 'returns true' do expect(has_env.verify).to be true end + + context 'when var name is given as a lowercase symbol' do + let(:var_name) { :some_var } + + it 'returns true' do + expect(has_env.verify).to be true + end + end + end + + context 'when remote environment var is not defined' do + let(:var_name) { 'SOME_NON_EXISTENT_VAR' } + + it 'returns false' do + expect(has_env.verify).to be false + end end end + end - context 'remote environment var is not defined' do - let(:variable_name) { 'SOME_NON_EXISTENT_VAR' } + context 'when var name and value are provided' do + subject(:has_env) { HasEnv.new(env, var_name, var_value) } - it 'returns false' do - expect(has_env.verify).to be false + describe '#verify' do + context 'when remote environment var is defined' do + context 'when value is the same' do + it 'returns true' do + expect(has_env.verify).to be true + end + end + + context 'when value differs' do + let(:remote_env) { { 'SOME_VAR' => 'SOME_OTHER_VALUE' } } + + it 'return false' do + expect(has_env.verify).to be false + end + end + end + + context 'when remote environment var is not defined' do + let(:var_name) { 'SOME_NON_EXISTENT_VAR' } + + it 'return false' do + expect(has_env.verify).to be false + end end end end