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_file' | ||||
| require 'producer/core/tests/shell_command_status' | ||||
| require 'producer/core/tests/yaml_eq' | ||||
|  | ||||
| require 'producer/core/cli' | ||||
| require 'producer/core/condition' | ||||
|   | ||||
| @@ -41,6 +41,7 @@ module Producer | ||||
|       define_test :executable?,     Tests::HasExecutable | ||||
|       define_test :dir?,            Tests::HasDir | ||||
|       define_test :file?,           Tests::HasFile | ||||
|       define_test :yaml_eq,         Tests::YAMLEq | ||||
|  | ||||
|       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