diff --git a/features/test_yaml_eq.feature b/features/test_yaml_eq.feature new file mode 100644 index 0000000..375c5f3 --- /dev/null +++ b/features/test_yaml_eq.feature @@ -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" diff --git a/lib/producer/core.rb b/lib/producer/core.rb index aab0839..75735de 100644 --- a/lib/producer/core.rb +++ b/lib/producer/core.rb @@ -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' diff --git a/lib/producer/core/condition.rb b/lib/producer/core/condition.rb index 2e8e143..fc40404 100644 --- a/lib/producer/core/condition.rb +++ b/lib/producer/core/condition.rb @@ -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 diff --git a/lib/producer/core/tests/yaml_eq.rb b/lib/producer/core/tests/yaml_eq.rb new file mode 100644 index 0000000..a3d5c74 --- /dev/null +++ b/lib/producer/core/tests/yaml_eq.rb @@ -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 diff --git a/spec/producer/core/tests/yaml_eq_spec.rb b/spec/producer/core/tests/yaml_eq_spec.rb new file mode 100644 index 0000000..224e59a --- /dev/null +++ b/spec/producer/core/tests/yaml_eq_spec.rb @@ -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