Implement `yaml_eq' condition keyword
This commit is contained in:
		
							
								
								
									
										26
									
								
								features/test_yaml_eq.feature
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								features/test_yaml_eq.feature
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | @sshd | ||||||
|  | Feature: `yaml_eq' condition keyword | ||||||
|  |  | ||||||
|  |   Background: | ||||||
|  |     Given a recipe with: | ||||||
|  |       """ | ||||||
|  |       task :yaml_eq_test do | ||||||
|  |         condition { yaml_eq 'some_file', { foo: 'bar' } } | ||||||
|  |  | ||||||
|  |         echo 'evaluated' | ||||||
|  |       end | ||||||
|  |       """ | ||||||
|  |  | ||||||
|  |   Scenario: succeeds when YAML data is equivalent | ||||||
|  |     Given a remote file named "some_file" with ":foo: bar" | ||||||
|  |     When I successfully execute the recipe on remote target | ||||||
|  |     Then the output must contain "evaluated" | ||||||
|  |  | ||||||
|  |   Scenario: fails when YAML data differs | ||||||
|  |     Given a remote file named "some_file" with ":foo: baz" | ||||||
|  |     When I successfully execute the recipe on remote target | ||||||
|  |     Then the output must not contain "evaluated" | ||||||
|  |  | ||||||
|  |   Scenario: fails when YAML file does not exist | ||||||
|  |     When I successfully execute the recipe on remote target | ||||||
|  |     Then the output must not contain "evaluated" | ||||||
| @@ -30,6 +30,7 @@ require 'producer/core/tests/has_env' | |||||||
| require 'producer/core/tests/has_executable' | require 'producer/core/tests/has_executable' | ||||||
| require 'producer/core/tests/has_file' | require 'producer/core/tests/has_file' | ||||||
| require 'producer/core/tests/shell_command_status' | require 'producer/core/tests/shell_command_status' | ||||||
|  | require 'producer/core/tests/yaml_eq' | ||||||
|  |  | ||||||
| require 'producer/core/cli' | require 'producer/core/cli' | ||||||
| require 'producer/core/condition' | require 'producer/core/condition' | ||||||
|   | |||||||
| @@ -41,6 +41,7 @@ module Producer | |||||||
|       define_test :executable?,     Tests::HasExecutable |       define_test :executable?,     Tests::HasExecutable | ||||||
|       define_test :dir?,            Tests::HasDir |       define_test :dir?,            Tests::HasDir | ||||||
|       define_test :file?,           Tests::HasFile |       define_test :file?,           Tests::HasFile | ||||||
|  |       define_test :yaml_eq,         Tests::YAMLEq | ||||||
|  |  | ||||||
|       attr_reader :tests, :return_value |       attr_reader :tests, :return_value | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								lib/producer/core/tests/yaml_eq.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								lib/producer/core/tests/yaml_eq.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | module Producer | ||||||
|  |   module Core | ||||||
|  |     module Tests | ||||||
|  |       class YAMLEq < Test | ||||||
|  |         def verify | ||||||
|  |           return false unless file_content = fs.file_read(arguments.first) | ||||||
|  |           YAML.load(file_content) == arguments[1] | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
							
								
								
									
										47
									
								
								spec/producer/core/tests/yaml_eq_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								spec/producer/core/tests/yaml_eq_spec.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | |||||||
|  | require 'spec_helper' | ||||||
|  |  | ||||||
|  | module Producer::Core | ||||||
|  |   module Tests | ||||||
|  |     describe YAMLEq, :env do | ||||||
|  |       let(:filepath)  { 'some_file' } | ||||||
|  |       let(:data)      { { foo: 'bar' } } | ||||||
|  |       subject(:test)  { described_class.new(env, filepath, data, {}) } | ||||||
|  |  | ||||||
|  |       it_behaves_like 'test' | ||||||
|  |  | ||||||
|  |       describe '#verify' do | ||||||
|  |         context 'when file content matches' do | ||||||
|  |           before do | ||||||
|  |             allow(remote_fs) | ||||||
|  |               .to receive(:file_read).with(filepath) { ':foo: bar' } | ||||||
|  |           end | ||||||
|  |  | ||||||
|  |           it 'returns true' do | ||||||
|  |             expect(test.verify).to be true | ||||||
|  |           end | ||||||
|  |         end | ||||||
|  |  | ||||||
|  |         context 'when file content does not match' do | ||||||
|  |           before do | ||||||
|  |             allow(remote_fs) | ||||||
|  |               .to receive(:file_read).with(filepath) { ':foo: baz' } | ||||||
|  |           end | ||||||
|  |  | ||||||
|  |           it 'returns false' do | ||||||
|  |             expect(test.verify).to be false | ||||||
|  |           end | ||||||
|  |         end | ||||||
|  |  | ||||||
|  |         context 'when file does not exist' do | ||||||
|  |           before do | ||||||
|  |             allow(remote_fs).to receive(:file_read).with(filepath) { nil } | ||||||
|  |           end | ||||||
|  |  | ||||||
|  |           it 'returns false' do | ||||||
|  |             expect(test.verify).to be false | ||||||
|  |           end | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
		Reference in New Issue
	
	Block a user