From 68854114e9426e5a373de0d76729e2123b4d15f0 Mon Sep 17 00:00:00 2001 From: Ali Alhoshaiyan Date: Tue, 20 Feb 2024 10:45:39 +0300 Subject: [PATCH] Fix Array re-building --- lib/mini_defender/rules_expander.rb | 19 +++++++++++++--- lib/mini_defender/version.rb | 2 +- test/rules/array_test.rb | 35 +++++++++++++++++++++++++++++ test/rules/date_eq_test.rb | 2 +- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/lib/mini_defender/rules_expander.rb b/lib/mini_defender/rules_expander.rb index 205a9c2..f331467 100644 --- a/lib/mini_defender/rules_expander.rb +++ b/lib/mini_defender/rules_expander.rb @@ -33,9 +33,22 @@ def expand(rules, flat_data) end def array_patterns(rules) - rules - .filter { |key, _| key.include?('*') } - .map { |key, _| Regexp.compile('\A' + key.gsub(/\*/, '\d+') + '\Z') } + unless rules.is_a?(Hash) + raise ArgumentError, 'Rules must be a Hash' + end + + result = rules.keys.filter { |key| key.include?('*') } + + # If the user hasn't add a rule for each of the array elements, add it manually + rules.keys.each do |key| + current = [] + key.split('.').each do |section| + current << section + result << current.join('.') if section == '*' + end + end + + result.sort.uniq.map { |key| Regexp.compile('\A' + key.gsub(/\*/, '\d+') + '\Z') } end end end diff --git a/lib/mini_defender/version.rb b/lib/mini_defender/version.rb index 411e624..8666415 100644 --- a/lib/mini_defender/version.rb +++ b/lib/mini_defender/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module MiniDefender - VERSION = "0.5.7" + VERSION = "0.5.8" end diff --git a/test/rules/array_test.rb b/test/rules/array_test.rb index 736e41d..0a5798b 100644 --- a/test/rules/array_test.rb +++ b/test/rules/array_test.rb @@ -3,5 +3,40 @@ require 'test_helper' class ArrayTest < Minitest::Test + def test_array_must_be_reconstructed + data = { + "events" => [ + { + "id" => "5b1b6125-1cb9-48fb-952f-8b9f28d78d1e", + "date" => "2024-02-20", + "time" => "00:00", + "timezone" => "Asia/Riyadh" + }, + { + "id" => "8f7bbcec-554b-4e2e-87b0-d5cd2fb2676e", + "date" => "2024-02-20", + "time" => "00:00", + "timezone" => "Asia/Riyadh" + }, + { + "id" => "49d44280-ef2b-44ac-82dc-3fca4f64ed25", + "date" => "2024-02-20", + "time" => "00:00", + "timezone" => "Asia/Riyadh" + } + ] + } + v = MiniDefender::Validator.new({ + 'events' => 'required|array|min:1', + 'events.*.id' => 'required|string', + 'events.*.date' => 'required|date', + 'events.*.time' => 'required|date', + 'events.*.timezone' => 'required|timezone', + }, data) + + assert v.passes? + assert v.coerced['events'].is_a?(Array) + assert_equal 3, v.coerced['events'].length + end end diff --git a/test/rules/date_eq_test.rb b/test/rules/date_eq_test.rb index 643a953..9861899 100644 --- a/test/rules/date_eq_test.rb +++ b/test/rules/date_eq_test.rb @@ -4,7 +4,7 @@ class DateEqTest < Minitest::Test def setup - @validator = MiniDefender::Validator.new([], []) + @validator = MiniDefender::Validator.new({}, {}) @rule = MiniDefender::Rules::DateEq.new('2022-09-10') end