spec/spec_helper.rb in libis-services-0.1.11 vs spec/spec_helper.rb in libis-services-0.1.12

- old
+ new

@@ -6,23 +6,87 @@ require 'bundler/setup' Bundler.setup require 'rspec' +require 'rspec/matchers' require 'libis-services' +# adapted from https://gist.github.com/mltsy/21fd5e15ae12a004c8b13d6ec4534458 +RSpec::Matchers.define :deep_include do + + match {|actual| deep_include?(actual, expected)} + + def deep_include?(actual, expected, path = []) + return true if actual == expected + + @failing_actual = actual + @failing_expected = expected + @failing_path = path + + case expected + when Array + return false unless actual.is_a? Array + expected.each_with_index do |expected_item, index| + match_found = actual.any? do |actual_item| + deep_include? actual_item, expected_item, path + [index] + end + unless match_found + @failing_array = actual + @failing_array_path = path + [index] + @failing_expected_array_item = expected_item + return false + end + end + when Hash + return false unless actual.is_a? Hash + expected.all? do |key, expected_value| + return false unless actual.has_key? key + deep_include? actual[key], expected_value, path + [key] + end + else + false + end + end + + failure_message do |_actual| + if @failing_array_path + path = @failing_array_path.map {|p| "[#{p.inspect}]"}.join + path = "root" if path.blank? + message = "Actual array did not include value at #{path}: \n" + + " expected #{@failing_expected_array_item.inspect}\n" + + " but matching value not found in array: #{@failing_array}\n" + else + path = @failing_path.map {|p| "[#{p.inspect}]"}.join + path = "root" if path.blank? + message = "Actual hash did not include expected value at #{path}: \n" + + " expected #{@failing_expected.inspect}\n" + + " got #{@failing_actual.inspect}\n" + end + + message + end +end + def check_container(expected, result) + # puts "Checking expected: #{expected} vs result: #{result}" case expected when Array + # puts "Checking if result is an array" expect(result).to be_a Array - expected.each_with_index { |value, i| check_container(value, result[i]) } + expected.each do |value| + # puts "Checking if expected value: #{value} included in result" + expect(result).to include(value) + end when Hash + # puts "Checking if result is a hash" expect(result).to be_a Hash expected.each_key do |key| - expect(result[key]).not_to be_nil + # puts "Checking if expected key: #{key} included in result" + expect(result).to include(key) check_container(expected[key], result[key]) end else + # puts "Checking if expected equals result" expect(result).to eq expected end end -