Skip to content

Commit

Permalink
Add IDNumber.french_insee_number (#2455)
Browse files Browse the repository at this point in the history
* Add IDNumber.french_insee_number
  • Loading branch information
Spone committed Aug 9, 2022
1 parent 15a8bc3 commit 65e5bb9
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 0 deletions.
3 changes: 3 additions & 0 deletions doc/default/id_number.md
Expand Up @@ -46,4 +46,7 @@ Faker::IDNumber.danish_id_number #=> "050390-9980"
Faker::IDNumber.danish_id_number(formatted: true) #=> "050390-9980"
Faker::IDNumber.danish_id_number(birthday: Date.new(1990, 3, 5)) #=> "050390-9980"
Faker::IDNumber.danish_id_number(gender: :female) #=> "050390-9980"

# Generate a valid French Social Security number (INSEE number)
Faker::IDNumber.french_insee_number #=> "22510589696868"
```
22 changes: 22 additions & 0 deletions lib/faker/default/id_number.rb
Expand Up @@ -263,6 +263,28 @@ def danish_id_number(formatted: false, birthday: Faker::Date.birthday, gender: n
].join
end

##
# Produces a random French social security number (INSEE number).
#
# @return [String]
#
# @example
# Faker::IDNumber.french_insee_number #=> "53290236-H"
#
# @faker.version next
def french_insee_number
num = [
[1, 2].sample(random: Faker::Config.random), # gender
Faker::Number.between(from: 0, to: 99).to_s.rjust(2, '0'), # year of birth
Faker::Number.between(from: 1, to: 12).to_s.rjust(2, '0'), # month of birth
Faker::Number.number(digits: 5), # place of birth
Faker::Number.number(digits: 3) # order number
].join
mod = num.to_i % 97
check = (97 - mod).to_s.rjust(2, '0')
"#{num}#{check}"
end

private

def croatian_id_checksum_digit(digits)
Expand Down
5 changes: 5 additions & 0 deletions test/faker/default/test_faker_id_number.rb
Expand Up @@ -181,6 +181,11 @@ def test_danish_id_number
assert_match(/^\d{10}$/, sample)
end

def test_french_insee_number
sample = @tester.french_insee_number
assert_match(/^(?<gnd>\d{1})(?<year>\d{2})(?<month>\d{2})(?<department1>\d{1})(?<department2>[0-9AB]{1})(?<place>\d{3})(?<indv>\d{3})(?<ctrl>\d{2})$/, sample)
end

def test_danish_id_number_formatted
sample = @tester.danish_id_number(formatted: true)
assert_match(/^\d{6}-\d{4}$/, sample)
Expand Down

0 comments on commit 65e5bb9

Please sign in to comment.