Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Faker::IDNumber.croatian_id method #2301

Merged
merged 2 commits into from May 3, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions doc/default/id_number.md
Expand Up @@ -34,4 +34,9 @@ Faker::IDNumber.brazilian_id(formatted: true) #=> "49.305.402-9"
# Generate a Chilean ID (Rut with 8 digits)
# For more advanced cases, please refer to Faker::ChileRut
Faker::IDNumber.chilean_id #=> "15620613-K"

# Generate a Croatian ID number (OIB)
# Keyword arguments: international
Faker::IDNumber.croatian_id #=> "88467617508"
Faker::IDNumber.croatian_id(international: true) #=> "HR88467617508"
```
34 changes: 34 additions & 0 deletions lib/faker/default/id_number.rb
Expand Up @@ -200,8 +200,42 @@ def chilean_id
"#{digits}-#{verification_code}"
end

##
# Produces a random Croatian ID number (OIB).
#
# @param international [Boolean] Specifies whether to add international prefix.
# @return [String]
#
# @example
# Faker::IDNumber.croatian_id #=> "88467617508"
# Faker::IDNumber.croatian_id(international: true) #=> "HR88467617508"
#
# @faker.version next
def croatian_id(international: false)
prefix = international ? 'HR' : ''
digits = Faker::Number.number(digits: 10).to_s
checksum_digit = croatian_id_checksum_digit(digits)

"#{prefix}#{digits}#{checksum_digit}"
end

private

def croatian_id_checksum_digit(digits)
control_sum = 10

digits.chars.map(&:to_i).each do |digit|
control_sum += digit
control_sum %= 10
control_sum = 10 if control_sum.zero?
control_sum *= 2
control_sum %= 11
end

control_sum = 11 - control_sum
control_sum % 10
end

def chilean_verification_code(digits)
# First digit is multiplied by 3, second by 2, and so on
multiplication_rule = [3, 2, 7, 6, 5, 4, 3, 2]
Expand Down
16 changes: 16 additions & 0 deletions test/faker/default/test_faker_id_number.rb
Expand Up @@ -160,6 +160,22 @@ def test_chilean_verification_code_0
assert_equal verification_code, 0
end

def test_croatian_id
sample = @tester.croatian_id
assert_match(/^\d{11}$/, sample)
end

def test_croatian_id_international
sample = @tester.croatian_id(international: true)
assert_match(/^HR\d{11}$/, sample)
end

def test_croatian_id_checksum_digit
digits = '8764670153'
checksum_digit = Faker::IDNumber.send(:croatian_id_checksum_digit, digits)
assert_equal checksum_digit, 5
end

private

def south_african_id_number_to_date_of_birth_string(sample)
Expand Down