Skip to content

Commit

Permalink
Add Spanish citizen id and docs (#1147)
Browse files Browse the repository at this point in the history
* update rake

* add id_number docs

* add tests for ssn

* add failing tests for spanish IDs

* add spanish citizen ids for issue #872

* cleanup comments

* give spanish_citizen_number correct checksum

* add validation checksum to Spanish NIE

* convert asserts into asert_equals

* replacing string concatenation with interpolation

* Minor changes

* Run rubocop and fix lint
  • Loading branch information
PuZZleDucK authored and vbrazo committed May 15, 2018
1 parent cc15d17 commit 2b7c10b
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 8 deletions.
21 changes: 13 additions & 8 deletions .rubocop.yml
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
Metrics/LineLength:

Lint/AmbiguousBlockAssociation:
Enabled: false
Metrics/MethodLength:
Lint/UnifiedInteger:
Enabled: false
Metrics/ClassLength:

Metrics/AbcSize:
Enabled: false
Metrics/BlockLength:
Enabled: false
Metrics/AbcSize:
Enabled: false
Metrics/PerceivedComplexity:
Metrics/ClassLength:
Enabled: false
Metrics/CyclomaticComplexity:
Enabled: false
Style/Documentation:
Metrics/LineLength:
Enabled: false
Metrics/MethodLength:
Enabled: false
Metrics/PerceivedComplexity:
Enabled: false

Style/DateTime:
Enabled: false
Lint/UnifiedInteger:
Style/Documentation:
Enabled: false
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ Contents
- [Faker::Hobbit](doc/hobbit.md)
- [Faker::HowIMetYourMother](doc/how_i_met_your_mother.md)
- [Faker::HitchhikersGuideToTheGalaxy](doc/hitchhikers_guide_to_the_galaxy.md)
- [Faker::IDNumber](doc/id_number.md)
- [Faker::Internet](doc/internet.md)
- [Faker::Job](doc/job.md)
- [Faker::Kpop](doc/kpop.md)
Expand Down
15 changes: 15 additions & 0 deletions doc/id_number.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Faker::IDNumber

```ruby
# Generate a valid US Social Security number
Faker::IDNumber.valid #=> "552-56-3593"

# Generate an invalid US Social Security number
Faker::IDNumber.invalid #=> "311-72-0000"

# Generate a Spanish citizen identifier (DNI)
Faker::IDNumber.spanish_citizen_number

# Generate a Spanish foreign born citizen identifier (NIE)
Faker::IDNumber.spanish_foreign_citizen_number
```
18 changes: 18 additions & 0 deletions lib/faker/id_number.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
module Faker
class IDNumber < Base
CHECKS = 'TRWAGMYFPDXBNJZSQVHLCKE'.freeze
INVALID_SSN = [
/0{3}-\d{2}-\d{4}/,
/\d{3}-0{2}-\d{4}/,
Expand All @@ -23,6 +24,23 @@ def ssn_valid
INVALID_SSN.any? { |regex| regex =~ ssn } ? ssn_valid : ssn
end

def spanish_citizen_number
num = Faker::Number.number(8)
mod = num.to_i % 23
check = CHECKS[mod]
"#{num}-#{check}"
end

def spanish_foreign_citizen_number
code = 'XYZ'
digits = Faker::Number.number(7)
prefix = code[rand(code.length)]
prefix_val = 'XYZ'.index(prefix).to_s
mod = "#{prefix_val}#{digits}".to_i % 23
check = CHECKS[mod]
"#{prefix}-#{digits}-#{check}"
end

private

def _translate(key)
Expand Down
48 changes: 48 additions & 0 deletions test/test_faker_id_number.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
require File.expand_path(File.dirname(__FILE__) + '/test_helper.rb')

class TestFakerIdNumber < Test::Unit::TestCase
def setup
@tester = Faker::IDNumber
end

def test_valid_ssn
sample = @tester.valid
assert sample.length == 11
assert_equal '-', sample[3]
assert_equal '-', sample[6]
assert sample[0..2].split.map { :to_i }.all? { :is_digit? }
assert sample[4..5].split.map { :to_i }.all? { :is_digit? }
assert sample[7..9].split.map { :to_i }.all? { :is_digit? }
end

def test_invalid_ssn
sample = @tester.invalid
assert sample.length == 11
assert_equal '-', sample[3]
assert_equal '-', sample[6]
assert sample[0..2].split.map { :to_i }.all? { :is_digit? }
assert sample[4..5].split.map { :to_i }.all? { :is_digit? }
assert sample[7..9].split.map { :to_i }.all? { :is_digit? }
end

def test_spanish_dni
sample = @tester.spanish_citizen_number
assert_equal 10, sample.length
assert sample[0..7].split.map { :to_i }.all? { :is_digit? }
assert_equal sample[8], '-'
mod = sample[0..7].to_i % 23
assert_equal Faker::IDNumber::CHECKS[mod], sample[9]
end

def test_spanish_nie
sample = @tester.spanish_foreign_citizen_number
assert_equal 11, sample.length
assert 'XYZ'.include?(sample[0])
assert_equal '-', sample[1]
assert sample[2..8].split.map { :to_i }.all? { :is_digit? }
assert_equal '-', sample[9]
prefix = 'XYZ'.index(sample[0]).to_s
mod = "#{prefix}#{sample[2..8]}".to_i % 23
assert_equal Faker::IDNumber::CHECKS[mod], sample[10]
end
end

0 comments on commit 2b7c10b

Please sign in to comment.