Skip to content

Commit

Permalink
Fix Array re-building
Browse files Browse the repository at this point in the history
  • Loading branch information
ahoshaiyan committed Feb 20, 2024
1 parent 0f64896 commit 6885411
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 5 deletions.
19 changes: 16 additions & 3 deletions lib/mini_defender/rules_expander.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion lib/mini_defender/version.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# frozen_string_literal: true

module MiniDefender
VERSION = "0.5.7"
VERSION = "0.5.8"
end
35 changes: 35 additions & 0 deletions test/rules/array_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion test/rules/date_eq_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit 6885411

Please sign in to comment.