ssn_validator 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. data/.gitignore +4 -0
  2. data/History.txt +41 -0
  3. data/LICENSE +20 -0
  4. data/PostInstall.txt +29 -0
  5. data/README.rdoc +98 -0
  6. data/Rakefile +60 -0
  7. data/VERSION.yml +5 -0
  8. data/generators/death_master_file_migration/death_master_file_migration_generator.rb +12 -0
  9. data/generators/death_master_file_migration/templates/migration.rb +26 -0
  10. data/generators/ssn_validator_migration/ssn_validator_migration_generator.rb +12 -0
  11. data/generators/ssn_validator_migration/templates/migration.rb +18 -0
  12. data/lib/ssn_validator.rb +12 -0
  13. data/lib/ssn_validator/models/death_master_file.rb +5 -0
  14. data/lib/ssn_validator/models/death_master_file_loader.rb +235 -0
  15. data/lib/ssn_validator/models/ssn_high_group_code.rb +5 -0
  16. data/lib/ssn_validator/models/ssn_high_group_code_loader.rb +87 -0
  17. data/lib/ssn_validator/models/ssn_validator.rb +94 -0
  18. data/lib/ssn_validator/ntis.rb +9 -0
  19. data/lib/tasks/ssn_validator.rake +24 -0
  20. data/rdoc/classes/DeathMasterFile.html +111 -0
  21. data/rdoc/classes/DeathMasterFileLoader.html +298 -0
  22. data/rdoc/classes/SsnHighGroupCode.html +111 -0
  23. data/rdoc/classes/SsnHighGroupCodeLoader.html +202 -0
  24. data/rdoc/classes/SsnValidator.html +116 -0
  25. data/rdoc/classes/SsnValidator/Ntis.html +111 -0
  26. data/rdoc/classes/SsnValidator/Ssn.html +315 -0
  27. data/rdoc/created.rid +1 -0
  28. data/rdoc/files/LICENSE.html +129 -0
  29. data/rdoc/files/README_rdoc.html +262 -0
  30. data/rdoc/files/lib/ssn_validator/models/death_master_file_loader_rb.html +112 -0
  31. data/rdoc/files/lib/ssn_validator/models/death_master_file_rb.html +108 -0
  32. data/rdoc/files/lib/ssn_validator/models/ssn_high_group_code_loader_rb.html +108 -0
  33. data/rdoc/files/lib/ssn_validator/models/ssn_high_group_code_rb.html +108 -0
  34. data/rdoc/files/lib/ssn_validator/models/ssn_validator_rb.html +101 -0
  35. data/rdoc/files/lib/ssn_validator/ntis_rb.html +101 -0
  36. data/rdoc/files/lib/ssn_validator_rb.html +113 -0
  37. data/rdoc/fr_class_index.html +33 -0
  38. data/rdoc/fr_file_index.html +35 -0
  39. data/rdoc/fr_method_index.html +37 -0
  40. data/rdoc/index.html +24 -0
  41. data/rdoc/rdoc-style.css +208 -0
  42. data/script/console +10 -0
  43. data/script/destroy +14 -0
  44. data/script/generate +14 -0
  45. data/ssn_validator.gemspec +130 -0
  46. data/test/files/test_dmf_funky_data_load.txt +6 -0
  47. data/test/files/test_dmf_initial_load.txt +5 -0
  48. data/test/files/test_dmf_update_load.txt +5 -0
  49. data/test/files/valid_csv_from_funky_data_file.txt +6 -0
  50. data/test/mocks/test/death_master_file_loader.rb +40 -0
  51. data/test/test_death_master_file_loader.rb +113 -0
  52. data/test/test_helper.rb +62 -0
  53. data/test/test_ssn_high_group_code_loader.rb +22 -0
  54. data/test/test_ssn_validator.rb +85 -0
  55. metadata +145 -0
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/ssn_validator.rb'}"
9
+ puts "Loading ssn_validator gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,130 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ssn_validator}
8
+ s.version = "1.0.4"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Kevin Tyll"]
12
+ s.date = %q{2010-02-05}
13
+ s.description = %q{Validates whether an SSN has likely been issued or not.}
14
+ s.email = %q{kevintyll@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "History.txt",
22
+ "LICENSE",
23
+ "PostInstall.txt",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION.yml",
27
+ "generators/death_master_file_migration/death_master_file_migration_generator.rb",
28
+ "generators/death_master_file_migration/templates/migration.rb",
29
+ "generators/ssn_validator_migration/.DS_Store",
30
+ "generators/ssn_validator_migration/ssn_validator_migration_generator.rb",
31
+ "generators/ssn_validator_migration/templates/.DS_Store",
32
+ "generators/ssn_validator_migration/templates/migration.rb",
33
+ "lib/ssn_validator.rb",
34
+ "lib/ssn_validator/models/death_master_file.rb",
35
+ "lib/ssn_validator/models/death_master_file_loader.rb",
36
+ "lib/ssn_validator/models/ssn_high_group_code.rb",
37
+ "lib/ssn_validator/models/ssn_high_group_code_loader.rb",
38
+ "lib/ssn_validator/models/ssn_validator.rb",
39
+ "lib/ssn_validator/ntis.rb",
40
+ "lib/tasks/ssn_validator.rake",
41
+ "rdoc/classes/DeathMasterFile.html",
42
+ "rdoc/classes/DeathMasterFileLoader.html",
43
+ "rdoc/classes/SsnHighGroupCode.html",
44
+ "rdoc/classes/SsnHighGroupCodeLoader.html",
45
+ "rdoc/classes/SsnValidator.html",
46
+ "rdoc/classes/SsnValidator/Ntis.html",
47
+ "rdoc/classes/SsnValidator/Ssn.html",
48
+ "rdoc/created.rid",
49
+ "rdoc/files/LICENSE.html",
50
+ "rdoc/files/README_rdoc.html",
51
+ "rdoc/files/lib/ssn_validator/models/death_master_file_loader_rb.html",
52
+ "rdoc/files/lib/ssn_validator/models/death_master_file_rb.html",
53
+ "rdoc/files/lib/ssn_validator/models/ssn_high_group_code_loader_rb.html",
54
+ "rdoc/files/lib/ssn_validator/models/ssn_high_group_code_rb.html",
55
+ "rdoc/files/lib/ssn_validator/models/ssn_validator_rb.html",
56
+ "rdoc/files/lib/ssn_validator/ntis_rb.html",
57
+ "rdoc/files/lib/ssn_validator_rb.html",
58
+ "rdoc/fr_class_index.html",
59
+ "rdoc/fr_file_index.html",
60
+ "rdoc/fr_method_index.html",
61
+ "rdoc/index.html",
62
+ "rdoc/rdoc-style.css",
63
+ "script/console",
64
+ "script/destroy",
65
+ "script/generate",
66
+ "ssn_validator.gemspec",
67
+ "test/files/test_dmf_funky_data_load.txt",
68
+ "test/files/test_dmf_initial_load.txt",
69
+ "test/files/test_dmf_update_load.txt",
70
+ "test/files/valid_csv_from_funky_data_file.txt",
71
+ "test/mocks/test/death_master_file_loader.rb",
72
+ "test/test_death_master_file_loader.rb",
73
+ "test/test_helper.rb",
74
+ "test/test_ssn_high_group_code_loader.rb",
75
+ "test/test_ssn_validator.rb"
76
+ ]
77
+ s.homepage = %q{http://kevintyll.git.com/ssn_validator}
78
+ s.post_install_message = %q{
79
+ For more information on ssn_validator, see http://kevintyll.github.com/ssn_validator/
80
+
81
+ * To create the necessary db migration, from the command line, run:
82
+ script/generate ssn_validator_migration
83
+ * Require the gem in your environment.rb file in the Rails::Initializer block:
84
+ config.gem 'kevintyll-ssn_validator', :lib => 'ssn_validator'
85
+ * To load your table with the current SSN data, from the command line, run:
86
+ rake ssn_validator:update_data
87
+ * The SSN data is updated monthly, so you'll want to run this rake task monthly to keep your validations accurate.
88
+ * If you've purchased the death master file data, create the death_master_files migration:
89
+ script/generate death_master_file_migration
90
+ * To load the dmf files you receive from ntis:
91
+ rake ssn_validator:death_master_file:load_file PATH='path/to/file' AS_OF='2009-03-01'
92
+ * You'll need to pass in the full path to where the file is on disk. You'll also need
93
+ to pass in the date this file's data are as of in the format yyyy-mm-dd.
94
+ * This task must be used to load the initial file you receive from ntis on CD. It can optionally be used
95
+ to load the monthly update files you download from the website. If you manually download the update files,
96
+ you do not need to add your user name and password to the environment.rb file. For a more automated approach
97
+ to loading the update files, add your user name and password to the environment.rb file and use the 2nd rake task.
98
+ * To load the monthly updates from the ntis website:
99
+ * Add your user_name and password to the environment.rb file
100
+ SsnValidator::Ntis.user_name = 'REPLACE WITH YOUR dmf.ntis.gov USER NAME'
101
+ SsnValidator::Ntis.password = 'REPLACE WITH YOUR dmf.ntis.gov PASSWORD'
102
+ * Run the rake task:
103
+ rake ssn_validator:death_master_file:update_data
104
+ * This rake task will determine the most recent file that has been loaded, and loads all subsequent files in order
105
+ from the dmf.ntis.gov website.
106
+ * The death master file data is updated monthly, so you'll want to run this rake task monthly to keep your validations accurate.
107
+ }
108
+ s.rdoc_options = ["--charset=UTF-8"]
109
+ s.require_paths = ["lib"]
110
+ s.rubygems_version = %q{1.3.5}
111
+ s.summary = %q{Validates whether an SSN has likely been issued or not.}
112
+ s.test_files = [
113
+ "test/mocks/test/death_master_file_loader.rb",
114
+ "test/test_death_master_file_loader.rb",
115
+ "test/test_helper.rb",
116
+ "test/test_ssn_high_group_code_loader.rb",
117
+ "test/test_ssn_validator.rb"
118
+ ]
119
+
120
+ if s.respond_to? :specification_version then
121
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
122
+ s.specification_version = 3
123
+
124
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
125
+ else
126
+ end
127
+ else
128
+ end
129
+ end
130
+
@@ -0,0 +1,6 @@
1
+ A772781978BAD DEATH DAY ANTHONY GABRIEL P031020090130200910
2
+ A772783025BAD DEATH MONTH JUAN P000220091101191010
3
+ A772786197BAD BIRTH YEAR ISAIAH P0202200901100009FO
4
+ A772786123QUOTED MIDDLE NAME ISAIAH ' P0202200901102009FO
5
+ A342786123QUOTED'NAME ISAIAH P0202200901102009FO
6
+ A344566123QUOTED NAME' ISAIAH P0202200901102009FO
@@ -0,0 +1,5 @@
1
+ 772781978NARANJO ANTHONY GABRIEL P030320090130200910
2
+ 772783025MANCO ESPICHAN JUAN P030220091101191010
3
+ 772786197OWENS ISAIAH P0202200901102009FO
4
+ 772789442ASTACIO JUANJOSE TOMAS P021320090129200910
5
+ 772789569BROWN ALANNAH SYEISSIE NICOL P030720090125200910
@@ -0,0 +1,5 @@
1
+ D772781978NARANJO ANTHONY GABRIEL P030320090130200910
2
+ A772783025REPLACED JUAN P030220091101191010
3
+ A772786198NEW ISAIAH P0202200901102009FO
4
+ D772789442CHANGED JUANJOSE TOMAS P021320090129200910
5
+ C772789569CHANGED ALANNAH SYEISSIE NICOL P030720090125200910
@@ -0,0 +1,6 @@
1
+ ``,`772781978`,`BAD DEATH DAY`,``,`ANTHONY`,`GABRIEL`,`P`,`2009-03-10`,`2009-01-30`,`10`,``,``,`2009-04-23 13:59:45`,`2009-04-23 13:59:45`,`2009-11-30`
2
+ ``,`772783025`,`BAD DEATH MONTH`,``,`JUAN`,``,`P`,``,`1910-11-01`,`10`,``,``,`2009-04-23 13:59:45`,`2009-04-23 13:59:45`,`2009-11-30`
3
+ ``,`772786197`,`BAD BIRTH YEAR`,``,`ISAIAH`,``,`P`,`2009-02-02`,`0009-01-10`,``,``,``,`2009-04-23 13:59:45`,`2009-04-23 13:59:45`,`2009-11-30`
4
+ ``,`772786123`,`QUOTED MIDDLE NAME`,``,`ISAIAH`,`'`,`P`,`2009-02-02`,`2009-01-10`,``,``,``,`2009-04-23 13:59:45`,`2009-04-23 13:59:45`,`2009-11-30`
5
+ ``,`342786123`,`QUOTED'NAME`,``,`ISAIAH`,``,`P`,`2009-02-02`,`2009-01-10`,``,``,``,`2009-04-23 13:59:45`,`2009-04-23 13:59:45`,`2009-11-30`
6
+ ``,`344566123`,`QUOTED NAME'`,``,`ISAIAH`,``,`P`,`2009-02-02`,`2009-01-10`,``,``,``,`2009-04-23 13:59:45`,`2009-04-23 13:59:45`,`2009-11-30`
@@ -0,0 +1,40 @@
1
+ require 'ssn_validator/models/death_master_file_loader'
2
+
3
+ class DeathMasterFileLoader
4
+
5
+ #Gives access to the private convert_file_to_csv method
6
+ def create_csv_file
7
+ convert_file_to_csv
8
+ end
9
+
10
+ def get_file_from_web
11
+ case @file_path_or_url
12
+ when /MA\d\d\d\d\d\d/ #these are the valid urls I want to mock a response to.
13
+ first_upload = Date.today.beginning_of_month - 2.months #based on the test, we know we are loading the last 3 months
14
+ if @file_path_or_url =~ /MA#{first_upload.strftime("%y%m%d")}/
15
+ return ['A772783123UPDATED JUAN P030220091101191010']
16
+ elsif @file_path_or_url =~ /MA#{(first_upload + 1.month).strftime("%y%m%d")}/
17
+ return ['A772783456UPDATED JUAN P030220091101191010']
18
+ elsif @file_path_or_url =~ /MA#{(first_upload + 2.months).strftime("%y%m%d")}/
19
+ return ['A772783789UPDATED JUAN P030220091101191010']
20
+ end
21
+ else
22
+ uri = URI.parse(@file_path_or_url)
23
+
24
+ request = Net::HTTP::Get.new(uri.request_uri)
25
+ request.basic_auth(SsnValidator::Ntis.user_name,SsnValidator::Ntis.password)
26
+
27
+ http = Net::HTTP.new(uri.host, uri.port)
28
+ http.use_ssl = (uri.port == 443)
29
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
30
+
31
+ response = http.request(request)
32
+
33
+ raise(ArgumentError, "Invalid URL: #{@file_path_or_url}") if response.kind_of?(Net::HTTPNotFound)
34
+ raise(ArgumentError, "Authorization Required: Invalid username or password. Set the variables SsnValidator::Ntis.user_name and SsnValidator::Ntis.password in your environment.rb file.") if response.kind_of?(Net::HTTPUnauthorized)
35
+
36
+ return response.body
37
+ end
38
+ end
39
+
40
+ end
@@ -0,0 +1,113 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestDeathMasterFileLoader < Test::Unit::TestCase
4
+
5
+ def setup
6
+ setup_death_master_file_table
7
+ end
8
+
9
+ def test_validations_for_load_file
10
+ exception = assert_raise ArgumentError do
11
+ DeathMasterFileLoader.new(nil,nil)
12
+ end
13
+ assert_equal "path_or_url not specified", exception.message
14
+
15
+ exception = assert_raise ArgumentError do
16
+ DeathMasterFileLoader.new('some/path.txt',nil)
17
+ end
18
+ assert_equal "as_of not specified", exception.message
19
+
20
+ exception = assert_raise Errno::ENOENT do
21
+ DeathMasterFileLoader.new('some/path.txt','2009-01-01')
22
+ end
23
+ assert_equal "No such file or directory - some/path.txt", exception.message
24
+
25
+ exception = assert_raise URI::InvalidURIError do
26
+ DeathMasterFileLoader.new('https://dmf.bad_url.gov/dmldata/monthly/bad_url','2009-01-01')
27
+ end
28
+ assert_equal "the scheme https does not accept registry part: dmf.bad_url.gov (or bad hostname?)", exception.message
29
+
30
+ exception = assert_raise ArgumentError do
31
+ DeathMasterFileLoader.new('https://dmf.ntis.gov/bad_url','2009-01-01')
32
+ end
33
+ assert_equal "Invalid URL: https://dmf.ntis.gov/bad_url", exception.message
34
+
35
+ exception = assert_raise ArgumentError do
36
+ DeathMasterFileLoader.new('https://dmf.ntis.gov/dmldata/monthly/bad_url','2009-01-01')
37
+ end
38
+ assert_equal "Authorization Required: Invalid username or password. Set the variables SsnValidator::Ntis.user_name and SsnValidator::Ntis.password in your environment.rb file.", exception.message
39
+ end
40
+
41
+ def test_should_load_table_from_file
42
+ assert_equal(0,DeathMasterFile.count)
43
+ DeathMasterFileLoader.new(File.dirname(__FILE__) + '/files/test_dmf_initial_load.txt','2009-01-01').load_file
44
+ assert DeathMasterFile.count == 5
45
+
46
+ #load update file
47
+ #update file adds 1 record, deletes 2 records, and changes 2 records
48
+ DeathMasterFileLoader.new(File.dirname(__FILE__) + '/files/test_dmf_update_load.txt','2009-02-01').load_file
49
+ assert DeathMasterFile.count == 4
50
+ assert 1, DeathMasterFile.count(:conditions => {:last_name => 'NEW'})
51
+ assert 2, DeathMasterFile.count(:conditions => {:last_name => 'CHANGED'})
52
+ end
53
+
54
+ def test_should_not_load_table_if_as_of_already_in_table_for_load_file
55
+ DeathMasterFileLoader.new(File.dirname(__FILE__) + '/files/test_dmf_initial_load.txt','2009-01-01').load_file
56
+ assert DeathMasterFile.count > 0
57
+ record_count = DeathMasterFile.count
58
+
59
+ exception = assert_raise ArgumentError do
60
+ DeathMasterFileLoader.new(File.dirname(__FILE__) + '/files/test_dmf_update_load.txt','2008-01-01').load_file
61
+ end
62
+ assert_equal "A more recent file has already been processed. DB as_of date 2009-01-01", exception.message
63
+
64
+ assert_equal(record_count, DeathMasterFile.count)
65
+ end
66
+
67
+ def test_should_load_all_unloaded_updates
68
+ #initial load was 3 months ago
69
+ initial_run = Date.today.beginning_of_month - 3.months
70
+ DeathMasterFileLoader.new(File.dirname(__FILE__) + '/files/test_dmf_initial_load.txt',initial_run.strftime('%Y-%m-%d')).load_file
71
+ assert DeathMasterFile.count == 5
72
+
73
+ #this will load the last 3 months of files
74
+ #this has been mocked, not really hitting the web site for this
75
+ DeathMasterFileLoader.load_update_files_from_web
76
+ assert DeathMasterFile.count == 8
77
+ assert DeathMasterFile.find_by_as_of(initial_run.to_s(:db))
78
+ assert DeathMasterFile.find_by_as_of((initial_run += 1.month).to_s(:db))
79
+ assert DeathMasterFile.find_by_as_of((initial_run += 1.month).to_s(:db))
80
+ assert DeathMasterFile.find_by_as_of((initial_run += 1.month).to_s(:db))
81
+ end
82
+
83
+ def test_should_load_file_with_funky_data
84
+ DeathMasterFileLoader.new(File.dirname(__FILE__) + '/files/test_dmf_funky_data_load.txt','2009-04-01').load_file
85
+ assert DeathMasterFile.count == 6
86
+ DeathMasterFile.find(:all).each do |dmf|
87
+ # this is more of an issue with the bulk mysql load, but since, I'm using
88
+ #sqlight3 for it's in memory db, I can't test the mysql load.
89
+ assert_not_nil dmf.as_of
90
+ end
91
+ end
92
+
93
+ def test_should_create_csv_file_for_mysql_import
94
+ #since, I'm using sqlight3 for it's in memory db, I can't test the mysql load
95
+ #but I can test the csv file creation.
96
+ loader = DeathMasterFileLoader.new(File.dirname(__FILE__) + '/files/test_dmf_funky_data_load.txt','2009-11-30')
97
+ csv = loader.create_csv_file #this method was created in the mock only to call the private convert_file_to_csv method
98
+ correctly_formatted_csv = File.open(File.dirname(__FILE__) + '/files/valid_csv_from_funky_data_file.txt')
99
+ #csv is open and at the end of the file, so we need to reopen it so we can read the lines.
100
+ generated_file = File.open(csv.path).readlines
101
+ #compare the values of each csv line, with the correctly formated "control file"
102
+ correctly_formatted_csv.each_with_index do |line,i|
103
+ csv_line = generated_file[i]
104
+ correctly_formatted_record_array = line.split(',')
105
+ csv_record_array = csv_line.split(',')
106
+ comparable_value_indices = (0..11).to_a << 14 #skip indices 12 and 13, they are the created_at and updated_at fields, they will never match.
107
+ comparable_value_indices.each do |i|
108
+ assert_equal correctly_formatted_record_array[i], csv_record_array[i]
109
+ end
110
+ end
111
+ end
112
+
113
+ end
@@ -0,0 +1,62 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'mocks/test/death_master_file_loader'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'ssn_validator'
8
+
9
+ ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => ':memory:'
10
+
11
+
12
+ def setup_high_group_codes_table
13
+ ActiveRecord::Base.connection.tables.each { |table| ActiveRecord::Base.connection.drop_table(table) }
14
+ create_ssn_high_group_codes_table
15
+ end
16
+
17
+ def setup_death_master_file_table
18
+ ActiveRecord::Base.connection.tables.each { |table| ActiveRecord::Base.connection.drop_table(table) }
19
+ create_death_master_file_table
20
+ end
21
+
22
+ private
23
+
24
+ def create_ssn_high_group_codes_table
25
+ silence_stream(STDOUT) do
26
+ ActiveRecord::Schema.define(:version => 1) do
27
+ create_table :ssn_high_group_codes do |t|
28
+ t.date :as_of
29
+ t.string :area
30
+ t.string :group
31
+ t.timestamps
32
+ end
33
+
34
+ add_index :ssn_high_group_codes, [:area]
35
+ add_index :ssn_high_group_codes, [:area, :as_of]
36
+ end
37
+ end
38
+ end
39
+
40
+ def create_death_master_file_table
41
+ silence_stream(STDOUT) do
42
+ ActiveRecord::Schema.define(:version => 1) do
43
+ create_table :death_master_files do |t|
44
+ t.string :social_security_number
45
+ t.string :last_name
46
+ t.string :name_suffix
47
+ t.string :first_name
48
+ t.string :middle_name
49
+ t.string :verify_proof_code
50
+ t.date :date_of_death
51
+ t.date :date_of_birth
52
+ t.string :state_of_residence
53
+ t.string :last_known_zip_residence
54
+ t.string :last_known_zip_payment
55
+ t.timestamps
56
+ t.date :as_of
57
+ end
58
+ add_index :death_master_files, :social_security_number, :unique => true
59
+ add_index :death_master_files, :as_of
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestSsnHighGroupCodeLoader < Test::Unit::TestCase
4
+
5
+ def setup
6
+ setup_high_group_codes_table
7
+ end
8
+
9
+ def test_should_load_table_with_current_file
10
+ assert_equal(0,SsnHighGroupCode.count)
11
+ SsnHighGroupCodeLoader.load_current_high_group_codes_file
12
+ assert SsnHighGroupCode.count > 0
13
+ end
14
+
15
+ def test_should_not_load_table_if_as_of_already_in_table
16
+ SsnHighGroupCodeLoader.load_current_high_group_codes_file
17
+ assert SsnHighGroupCode.count > 0
18
+ record_count = SsnHighGroupCode.count
19
+ SsnHighGroupCodeLoader.load_current_high_group_codes_file
20
+ assert_equal(record_count, SsnHighGroupCode.count)
21
+ end
22
+ end
@@ -0,0 +1,85 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestSsnValidator < Test::Unit::TestCase
4
+
5
+ KNOWN_DUMMY_SSNS = %w(078051120 111111111 123456789 219099999 999999999)
6
+ MISSPLACED_HYPHEN_SSNS = %w(1-2-3456789 12-345678-9 123-4-56789 123-456789 1234567-89 12-345-6789 12345-6789 1234-5-6789)
7
+ INVALID_LENGTH_SSNS = %w(1 12 123 1234 12345 123456 1234567 13245678 1234567890)
8
+ NONDIGIT_SSNS = %w(078051a20 078F51120 78051#20 051,20 078051m20)
9
+ INVALID_ZEROS_SSNS = %w(166-00-1234 073-96-0000)
10
+ GROUPS_NOT_ASSIGNED_TO_AREA_SSNS = %w(752991234 755971234 762991254)
11
+ AREA_NOT_ASSIGNED_SSNS = %w(666991234)
12
+
13
+ VALID_SSNS = %w(001021234 161-84-9876 223981111)
14
+ VALID_INTEGER_SSNS = [115941234, 161849876, 223981111]
15
+
16
+ def setup
17
+ setup_high_group_codes_table
18
+ SsnHighGroupCodeLoader.load_current_high_group_codes_file
19
+ end
20
+
21
+ def test_ssn_validations
22
+ KNOWN_DUMMY_SSNS.each do |ssn|
23
+ validator = SsnValidator::Ssn.new(ssn)
24
+ assert !validator.valid?
25
+ assert validator.errors.include?('Known dummy SSN.'), "Errors: #{validator.errors}"
26
+ end
27
+
28
+ MISSPLACED_HYPHEN_SSNS.each do |ssn|
29
+ validator = SsnValidator::Ssn.new(ssn)
30
+ assert !validator.valid?
31
+ assert validator.errors.include?('Hyphen misplaced.'), "Errors: #{validator.errors}"
32
+ end
33
+
34
+ INVALID_LENGTH_SSNS.each do |ssn|
35
+ validator = SsnValidator::Ssn.new(ssn)
36
+ assert !validator.valid?
37
+ assert validator.errors.include?('SSN not 9 digits long.'), "Errors: #{validator.errors}"
38
+ end
39
+
40
+ NONDIGIT_SSNS.each do |ssn|
41
+ validator = SsnValidator::Ssn.new(ssn)
42
+ assert !validator.valid?
43
+ assert validator.errors.include?('Non-digit found.'), "Errors: #{validator.errors}"
44
+ end
45
+
46
+ INVALID_ZEROS_SSNS.each do |ssn|
47
+ validator = SsnValidator::Ssn.new(ssn)
48
+ assert !validator.valid?
49
+ assert validator.errors.include?('Invalid group or serial number.'), "Errors: #{validator.errors}"
50
+ end
51
+
52
+ AREA_NOT_ASSIGNED_SSNS.each do |ssn|
53
+ validator = SsnValidator::Ssn.new(ssn)
54
+ assert !validator.valid?
55
+ assert validator.errors.include?("Area '#{validator.area}' has not been assigned."), "Errors: #{validator.errors}"
56
+ end
57
+
58
+ GROUPS_NOT_ASSIGNED_TO_AREA_SSNS.each do |ssn|
59
+ validator = SsnValidator::Ssn.new(ssn)
60
+ assert !validator.valid?
61
+ assert validator.errors.include?("Group '#{validator.group}' has not been assigned yet for area '#{validator.area}'"), "Errors: #{validator.errors}"
62
+ end
63
+
64
+ (VALID_SSNS + VALID_INTEGER_SSNS).each do |ssn|
65
+ validator = SsnValidator::Ssn.new(ssn)
66
+ assert validator.valid?, "Errors: #{validator.errors}"
67
+ end
68
+
69
+
70
+ end
71
+
72
+ def test_death_master_file_hit
73
+ create_death_master_file_table
74
+ DeathMasterFileLoader.new(File.dirname(__FILE__) + '/files/test_dmf_initial_load.txt','2009-01-01').load_file
75
+
76
+ validator = SsnValidator::Ssn.new('772781978')#ssn from file
77
+ assert DeathMasterFile, validator.death_master_file_record.class
78
+ assert validator.death_master_file_hit?
79
+
80
+ validator = SsnValidator::Ssn.new('666781978')#ssn not in file
81
+ assert_nil validator.death_master_file_record
82
+ assert !validator.death_master_file_hit?
83
+ end
84
+
85
+ end