data-anonymization 0.1.2 → 0.2.0

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 (103) hide show
  1. data/.documentup.json +1 -0
  2. data/.travis.yml +0 -1
  3. data/README.md +277 -52
  4. data/blacklist_dsl.rb +1 -3
  5. data/data-anonymization.gemspec +4 -0
  6. data/lib/core/dsl.rb +1 -1
  7. data/lib/data-anonymization.rb +3 -0
  8. data/lib/strategy/base.rb +21 -11
  9. data/lib/strategy/blacklist.rb +2 -1
  10. data/lib/strategy/field/contact/geojson_base.rb +24 -0
  11. data/lib/strategy/field/contact/random_address.rb +17 -0
  12. data/lib/strategy/field/contact/random_city.rb +17 -0
  13. data/lib/strategy/field/contact/random_phone_number.rb +13 -0
  14. data/lib/strategy/field/contact/random_province.rb +17 -0
  15. data/lib/strategy/field/contact/random_zipcode.rb +17 -0
  16. data/lib/strategy/field/datetime/anonymize_date.rb +39 -0
  17. data/lib/strategy/field/datetime/anonymize_datetime.rb +15 -0
  18. data/lib/strategy/field/datetime/anonymize_time.rb +58 -0
  19. data/lib/strategy/field/datetime/date_delta.rb +21 -0
  20. data/lib/strategy/field/{date_time_delta.rb → datetime/date_time_delta.rb} +3 -3
  21. data/lib/strategy/field/datetime/time_delta.rb +12 -0
  22. data/lib/strategy/field/default_anon.rb +12 -7
  23. data/lib/strategy/field/email/gmail_template.rb +16 -0
  24. data/lib/strategy/field/{random_email.rb → email/random_email.rb} +0 -0
  25. data/lib/strategy/field/{random_mailinator_email.rb → email/random_mailinator_email.rb} +0 -2
  26. data/lib/strategy/field/fields.rb +51 -20
  27. data/lib/strategy/field/name/random_first_name.rb +14 -0
  28. data/lib/strategy/field/{random_full_name.rb → name/random_full_name.rb} +0 -0
  29. data/lib/strategy/field/name/random_last_name.rb +14 -0
  30. data/lib/strategy/field/{random_user_name.rb → name/random_user_name.rb} +0 -0
  31. data/lib/strategy/field/number/random_float.rb +23 -0
  32. data/lib/strategy/field/{random_float_delta.rb → number/random_float_delta.rb} +2 -4
  33. data/lib/strategy/field/{random_int.rb → number/random_integer.rb} +1 -1
  34. data/lib/strategy/field/{random_integer_delta.rb → number/random_integer_delta.rb} +2 -5
  35. data/lib/strategy/field/{random_phone_number.rb → string/formatted_string_numbers.rb} +4 -1
  36. data/lib/strategy/field/{lorem_ipsum.rb → string/lorem_ipsum.rb} +0 -0
  37. data/lib/strategy/field/{random_string.rb → string/random_string.rb} +0 -0
  38. data/lib/strategy/field/{distinct_column_values.rb → string/select_from_database.rb} +2 -3
  39. data/lib/strategy/field/string/select_from_file.rb +18 -0
  40. data/lib/strategy/field/string/select_from_list.rb +17 -0
  41. data/lib/strategy/field/{string_template.rb → string/string_template.rb} +0 -0
  42. data/lib/strategy/whitelist.rb +4 -2
  43. data/lib/utils/database.rb +8 -6
  44. data/lib/utils/geojson_parser.rb +42 -0
  45. data/lib/utils/logging.rb +0 -9
  46. data/lib/utils/progress_bar.rb +29 -0
  47. data/lib/utils/random_float.rb +12 -0
  48. data/lib/utils/random_int.rb +3 -7
  49. data/lib/utils/resource.rb +4 -0
  50. data/lib/version.rb +1 -1
  51. data/resources/UK_addresses.geojson +300 -0
  52. data/resources/US_addresses.geojson +300 -0
  53. data/spec/acceptance/rdbms_blacklist_spec.rb +2 -2
  54. data/spec/acceptance/rdbms_whitelist_spec.rb +6 -8
  55. data/spec/resource/sample.geojson +1 -0
  56. data/spec/spec_helper.rb +3 -2
  57. data/spec/strategy/field/contact/random_address_spec.rb +12 -0
  58. data/spec/strategy/field/contact/random_city_spec.rb +14 -0
  59. data/spec/strategy/field/contact/random_phone_number_spec.rb +16 -0
  60. data/spec/strategy/field/contact/random_province_spec.rb +14 -0
  61. data/spec/strategy/field/contact/random_zipcode_spec.rb +14 -0
  62. data/spec/strategy/field/datetime/anonymize_date_spec.rb +27 -0
  63. data/spec/strategy/field/datetime/anonymize_datetime_spec.rb +57 -0
  64. data/spec/strategy/field/datetime/anonymize_time_spec.rb +57 -0
  65. data/spec/strategy/field/datetime/date_delta_spec.rb +36 -0
  66. data/spec/strategy/field/{date_time_delta_spec.rb → datetime/date_time_delta_spec.rb} +3 -2
  67. data/spec/strategy/field/datetime/time_delta_spec.rb +44 -0
  68. data/spec/strategy/field/default_anon_spec.rb +42 -0
  69. data/spec/strategy/field/email/gmail_template_spec.rb +17 -0
  70. data/spec/strategy/field/{random_email_spec.rb → email/random_email_spec.rb} +2 -2
  71. data/spec/strategy/field/email/random_mailinator_email_spec.rb +14 -0
  72. data/spec/strategy/field/{random_first_name_spec.rb → name/random_first_name_spec.rb} +2 -2
  73. data/spec/strategy/field/{random_full_name_spec.rb → name/random_full_name_spec.rb} +2 -2
  74. data/spec/strategy/field/{random_last_name_spec.rb → name/random_last_name_spec.rb} +2 -2
  75. data/spec/strategy/field/{random_user_name_spec.rb → name/random_user_name_spec.rb} +2 -2
  76. data/spec/strategy/field/{random_float_delta_spec.rb → number/random_float_delta_spec.rb} +2 -2
  77. data/spec/strategy/field/number/random_float_spec.rb +28 -0
  78. data/spec/strategy/field/{random_integer_delta_spec.rb → number/random_integer_delta_spec.rb} +3 -5
  79. data/spec/strategy/field/{random_int_spec.rb → number/random_integer_spec.rb} +4 -4
  80. data/spec/strategy/field/random_boolean_spec.rb +2 -2
  81. data/spec/strategy/field/string/formatted_string_numbers_spec.rb +15 -0
  82. data/spec/strategy/field/{lorem_ipsum_spec.rb → string/lorem_ipsum_spec.rb} +2 -2
  83. data/spec/strategy/field/{random_string_spec.rb → string/random_string_spec.rb} +2 -2
  84. data/spec/strategy/field/{distinct_column_values_spec.rb → string/select_from_database_spec.rb} +3 -3
  85. data/spec/strategy/field/{random_selection_spec.rb → string/select_from_list_spec.rb} +5 -5
  86. data/spec/strategy/field/{string_template_spec.rb → string/string_template_spec.rb} +2 -2
  87. data/spec/strategy/field/whitelist_spec.rb +2 -2
  88. data/spec/support/customer_sample.rb +1 -1
  89. data/spec/utils/database_spec.rb +2 -2
  90. data/spec/utils/geojson_parser_spec.rb +38 -0
  91. data/whitelist_dsl.rb +4 -6
  92. metadata +163 -59
  93. data/lib/strategy/field/anonymize_time.rb +0 -57
  94. data/lib/strategy/field/gmail_template.rb +0 -17
  95. data/lib/strategy/field/random_first_name.rb +0 -18
  96. data/lib/strategy/field/random_last_name.rb +0 -19
  97. data/lib/strategy/field/random_selection.rb +0 -23
  98. data/lib/strategy/field/user_name_template.rb +0 -22
  99. data/spec/strategy/field/anonymize_time_spec.rb +0 -23
  100. data/spec/strategy/field/gmail_template_spec.rb +0 -14
  101. data/spec/strategy/field/random_mailinator_email_spec.rb +0 -21
  102. data/spec/strategy/field/random_phone_number_spec.rb +0 -35
  103. data/spec/strategy/field/user_name_template_spec.rb +0 -13
@@ -17,12 +17,12 @@ describe "End 2 End RDBMS Blacklist Acceptance Test using SQLite database" do
17
17
 
18
18
  table 'customers' do
19
19
  primary_key 'cust_id'
20
- anonymize('email').using DataAnon::Strategy::Field::StringTemplate.new('test+#{row_number}@gmail.com')
20
+ anonymize('email').using FieldStrategy::StringTemplate.new('test+#{row_number}@gmail.com')
21
21
  end
22
22
  end
23
23
 
24
24
  DataAnon::Utils::SourceDatabase.establish_connection connection_spec
25
- source = DataAnon::Utils::SourceTable.create 'customers', 'cust_id'
25
+ source = DataAnon::Utils::SourceTable.create 'customers', ['cust_id']
26
26
  new_rec = source.find(CustomerSample::SAMPLE_DATA[:cust_id])
27
27
  new_rec['email'].should == 'test+1@gmail.com'
28
28
 
@@ -15,8 +15,6 @@ describe "End 2 End RDBMS Whitelist Acceptance Test using SQLite database" do
15
15
 
16
16
  it "should anonymize customer table record " do
17
17
 
18
- DF = DataAnon::Strategy::Field
19
-
20
18
  database "Customer" do
21
19
  strategy DataAnon::Strategy::Whitelist
22
20
  source_db source_connection_spec
@@ -25,16 +23,16 @@ describe "End 2 End RDBMS Whitelist Acceptance Test using SQLite database" do
25
23
  table 'customers' do
26
24
  primary_key 'cust_id'
27
25
  whitelist 'cust_id', 'address', 'zipcode'
28
- anonymize('first_name').using DF::RandomFirstName.new
29
- anonymize('last_name').using DF::RandomLastName.new
30
- anonymize('state').using DF::RandomSelection.new(['Gujrat','Karnataka'])
31
- anonymize('phone').using DF::RandomPhoneNumber.new
32
- anonymize('email').using DF::StringTemplate.new('test+#{row_number}@gmail.com')
26
+ anonymize('first_name').using FieldStrategy::RandomFirstName.new
27
+ anonymize('last_name').using FieldStrategy::RandomLastName.new
28
+ anonymize('state').using FieldStrategy::SelectFromList.new(['Gujrat','Karnataka'])
29
+ anonymize('phone').using FieldStrategy::RandomPhoneNumber.new
30
+ anonymize('email').using FieldStrategy::StringTemplate.new('test+#{row_number}@gmail.com')
33
31
  end
34
32
  end
35
33
 
36
34
  DataAnon::Utils::DestinationDatabase.establish_connection dest_connection_spec
37
- dest_table = DataAnon::Utils::DestinationTable.create 'customers', 'cust_id'
35
+ dest_table = DataAnon::Utils::DestinationTable.create 'customers', ['cust_id']
38
36
  new_rec = dest_table.find(CustomerSample::SAMPLE_DATA[:cust_id])
39
37
  new_rec.first_name.should_not be("Sunit")
40
38
  new_rec.last_name.should_not be("Parekh")
@@ -0,0 +1 @@
1
+ {"geometry": {"type": "Point", "coordinates": [-134.412039, 58.30057]}, "type": "Feature", "id": "SG_5xejzYOfDRcyoVHXqvO2hB_58.300570_-134.412039@1293731153", "properties": {"province": "AK", "city": "Juneau", "name": "Purchasing Dept", "tags": ["state"], "country": "US", "classifiers": [{"category": "Government", "type": "Public Place", "subcategory": "Office"}], "phone": "+1 907 465 2250", "href": "http://api.simplegeo.com/1.0/features/SG_5xejzYOfDRcyoVHXqvO2hB_58.300570_-134.412039@1293731153.json", "address": "333 Willoughby Ave", "owner": "simplegeo", "postcode": "99801"}}
data/spec/spec_helper.rb CHANGED
@@ -2,11 +2,12 @@ require 'rspec'
2
2
  require "pry"
3
3
  require 'data-anonymization'
4
4
 
5
+
6
+ ENV['show_progress'] = 'false'
7
+
5
8
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
6
9
 
7
10
  DataAnon::Utils::Logging.logger.level = Logger::INFO
8
- DataAnon::Utils::Logging.progress_logger.level = Logger::WARN
9
-
10
11
 
11
12
  RSpec.configure do |config|
12
13
  config.expect_with :rspec
@@ -0,0 +1,12 @@
1
+ require "spec_helper"
2
+
3
+ describe DataAnon::Strategy::Field::RandomAddress do
4
+
5
+ RandomAddress = DataAnon::Strategy::Field::RandomAddress
6
+ let(:field) {DataAnon::Core::Field.new('address','1 Infinite Loop',1,nil)}
7
+
8
+ describe 'anonymized address should be different from original address' do
9
+ let(:anonymized_address) {RandomAddress.region_US.anonymize(field)}
10
+ it {anonymized_address.should_not eq("1 Infinite Loop")}
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+ describe DataAnon::Strategy::Field::RandomCity do
4
+
5
+ RandomCity = DataAnon::Strategy::Field::RandomCity
6
+ let(:field) { DataAnon::Core::Field.new('city', 'Atlanta', 1, nil) }
7
+
8
+ describe 'anonymized city should be different from original city' do
9
+ let(:anonymized_city) { RandomCity.region_US.anonymize(field) }
10
+
11
+ it { anonymized_city.should_not be_nil }
12
+ it { anonymized_city.should_not eq("Atlanta") }
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe FieldStrategy::RandomPhoneNumber do
4
+
5
+ RandomPhoneNumber = FieldStrategy::RandomPhoneNumber
6
+ let(:field) { DataAnon::Core::Field.new('phone_number', "+0 (123) 456-7890", 1, nil) }
7
+
8
+ describe 'anonymized phone number preserving the format' do
9
+ let(:anonymized_number) { RandomPhoneNumber.new().anonymize(field) }
10
+
11
+ it { anonymized_number.should_not equal field.value }
12
+ it { anonymized_number.should match /\+\d\ \(\d{3}\)\ \d{3}-\d{4}$/ }
13
+ end
14
+
15
+
16
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+ describe DataAnon::Strategy::Field::RandomProvince do
4
+
5
+ RandomProvince = DataAnon::Strategy::Field::RandomProvince
6
+ let(:field) { DataAnon::Core::Field.new('province', 'Atlanta', 1, nil) }
7
+
8
+ describe 'anonymized province should be different from original province' do
9
+ let(:anonymized_province) { RandomProvince.region_US.anonymize(field) }
10
+
11
+ it { anonymized_province.should_not be_nil }
12
+ it { anonymized_province.should_not eq("Atlanta") }
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+ describe DataAnon::Strategy::Field::RandomZipcode do
4
+
5
+ RandomZipcode = DataAnon::Strategy::Field::RandomZipcode
6
+ let(:field) { DataAnon::Core::Field.new('zipcode', '12345', 1, nil) }
7
+
8
+ describe 'anonymized zipcode should be different from original zipcode' do
9
+ let(:anonymized_zipcode) { RandomZipcode.region_US.anonymize(field) }
10
+
11
+ it { anonymized_zipcode.should_not be_nil }
12
+ it { anonymized_zipcode.should_not eq("12345") }
13
+ end
14
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe FieldStrategy::AnonymizeDate do
4
+
5
+ AnonymizeDate = FieldStrategy::AnonymizeDate
6
+ let(:field) { DataAnon::Core::Field.new('date', Date.new(2011,7,5), 1, nil) }
7
+
8
+ describe 'providing true only for month should randomize only the month field' do
9
+
10
+ let(:anonymized_time) { AnonymizeDate.only_month.anonymize(field) }
11
+
12
+ it { anonymized_time.should be_kind_of Date}
13
+ it { anonymized_time.year.should be 2011 }
14
+ it { anonymized_time.month.should be_between(1,12)}
15
+ it { anonymized_time.day.should be 5 }
16
+ end
17
+
18
+ describe 'providing true only for date should randomize only the date field' do
19
+
20
+ let(:anonymized_time) { AnonymizeDate.only_day.anonymize(field) }
21
+
22
+ it { anonymized_time.year.should be 2011 }
23
+ it { anonymized_time.month.should be 7}
24
+ it { anonymized_time.day.should be_between(1,31) }
25
+ end
26
+
27
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+
3
+ describe FieldStrategy::AnonymizeDateTime do
4
+
5
+ AnonymizeDateTime = FieldStrategy::AnonymizeDateTime
6
+ let(:field) { DataAnon::Core::Field.new('date', DateTime.new(2000,1,1,12,12,12), 1, nil) }
7
+
8
+ describe 'providing true only for month should randomize only the month field' do
9
+
10
+ let(:anonymized_time) { AnonymizeDateTime.only_month.anonymize(field) }
11
+
12
+ it { anonymized_time.should be_kind_of DateTime}
13
+ it { anonymized_time.year.should be 2000 }
14
+ it { anonymized_time.month.should be_between(1,12)}
15
+ it { anonymized_time.day.should be 1 }
16
+ it { anonymized_time.hour.should be 12}
17
+ it { anonymized_time.min.should be 12}
18
+ it { anonymized_time.sec.should be 12}
19
+ end
20
+
21
+ describe 'providing true only for date should randomize only the date field' do
22
+
23
+ let(:anonymized_time) { AnonymizeDateTime.only_day.anonymize(field) }
24
+
25
+ it { anonymized_time.year.should be 2000 }
26
+ it { anonymized_time.month.should be 1}
27
+ it { anonymized_time.day.should be_between(1,31) }
28
+ it { anonymized_time.hour.should be 12}
29
+ it { anonymized_time.min.should be 12}
30
+ it { anonymized_time.sec.should be 12}
31
+ end
32
+
33
+ describe 'providing true only for hour should randomize only the hour field' do
34
+
35
+ let(:anonymized_time) { AnonymizeDateTime.only_hour.anonymize(field) }
36
+
37
+ it { anonymized_time.year.should be 2000 }
38
+ it { anonymized_time.month.should be 1}
39
+ it { anonymized_time.day.should be 1 }
40
+ it { anonymized_time.hour.should be_between(1,24)}
41
+ it { anonymized_time.min.should be 12}
42
+ it { anonymized_time.sec.should be 12}
43
+ end
44
+
45
+ describe 'providing true only for minute should randomize only the minute field' do
46
+
47
+ let(:anonymized_time) { AnonymizeDateTime.only_minute.anonymize(field) }
48
+
49
+ it { anonymized_time.year.should be 2000 }
50
+ it { anonymized_time.month.should be 1}
51
+ it { anonymized_time.day.should be 1 }
52
+ it { anonymized_time.hour.should be 12}
53
+ it { anonymized_time.min.should be_between(1,60)}
54
+ it { anonymized_time.sec.should be 12}
55
+ end
56
+
57
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+
3
+ describe FieldStrategy::AnonymizeTime do
4
+
5
+ AnonymizeTime = FieldStrategy::AnonymizeTime
6
+ let(:field) { DataAnon::Core::Field.new('date', Time.new(2000,1,1,12,12,12), 1, nil) }
7
+
8
+ describe 'providing true only for month should randomize only the month field' do
9
+
10
+ let(:anonymized_time) { AnonymizeTime.only_month.anonymize(field) }
11
+
12
+ it { anonymized_time.should be_kind_of Time}
13
+ it { anonymized_time.year.should be 2000 }
14
+ it { anonymized_time.month.should be_between(1,12)}
15
+ it { anonymized_time.day.should be 1 }
16
+ it { anonymized_time.hour.should be 12}
17
+ it { anonymized_time.min.should be 12}
18
+ it { anonymized_time.sec.should be 12}
19
+ end
20
+
21
+ describe 'providing true only for date should randomize only the date field' do
22
+
23
+ let(:anonymized_time) { AnonymizeTime.only_day.anonymize(field) }
24
+
25
+ it { anonymized_time.year.should be 2000 }
26
+ it { anonymized_time.month.should be 1}
27
+ it { anonymized_time.day.should be_between(1,31) }
28
+ it { anonymized_time.hour.should be 12}
29
+ it { anonymized_time.min.should be 12}
30
+ it { anonymized_time.sec.should be 12}
31
+ end
32
+
33
+ describe 'providing true only for hour should randomize only the hour field' do
34
+
35
+ let(:anonymized_time) { AnonymizeTime.only_hour.anonymize(field) }
36
+
37
+ it { anonymized_time.year.should be 2000 }
38
+ it { anonymized_time.month.should be 1}
39
+ it { anonymized_time.day.should be 1 }
40
+ it { anonymized_time.hour.should be_between(1,24)}
41
+ it { anonymized_time.min.should be 12}
42
+ it { anonymized_time.sec.should be 12}
43
+ end
44
+
45
+ describe 'providing true only for minute should randomize only the minute field' do
46
+
47
+ let(:anonymized_time) { AnonymizeTime.only_minute.anonymize(field) }
48
+
49
+ it { anonymized_time.year.should be 2000 }
50
+ it { anonymized_time.month.should be 1}
51
+ it { anonymized_time.day.should be 1 }
52
+ it { anonymized_time.hour.should be 12}
53
+ it { anonymized_time.min.should be_between(1,60)}
54
+ it { anonymized_time.sec.should be 12}
55
+ end
56
+
57
+ end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+
3
+ describe FieldStrategy::DateDelta do
4
+
5
+ DateDelta = FieldStrategy::DateDelta
6
+ let(:field) { DataAnon::Core::Field.new('date', Date.new(2011,4,7), 1, nil) }
7
+
8
+ describe 'date should not remain the same' do
9
+
10
+ let(:anonymized_value) { DateDelta.new().anonymize(field) }
11
+ let(:date_difference) {anonymized_value - field.value}
12
+
13
+ it { anonymized_value.should be_kind_of Date}
14
+ it { anonymized_value.should_not == Date.new(2011,4,7) }
15
+ it { date_difference.should be_between(-5.days, 5.days) }
16
+ end
17
+
18
+ describe 'date should not change when provided with 0 delta for both date and time' do
19
+
20
+ let(:anonymized_date) { DateDelta.new(0).anonymize(field) }
21
+
22
+ it {anonymized_date.should == Date.new(2011,4,7) }
23
+
24
+ end
25
+
26
+ describe 'date should be anonymized within provided delta' do
27
+
28
+ let(:anonymized_value) { DateDelta.new(5).anonymize(field) }
29
+ let(:date_difference) {anonymized_value - field.value}
30
+
31
+ it { date_difference.should be_between(-5.days, 5.days) }
32
+
33
+ end
34
+
35
+
36
+ end
@@ -1,8 +1,8 @@
1
1
  require "spec_helper"
2
2
 
3
- describe DataAnon::Strategy::Field::DateTimeDelta do
3
+ describe FieldStrategy::DateTimeDelta do
4
4
 
5
- DateTimeDelta = DataAnon::Strategy::Field::DateTimeDelta
5
+ DateTimeDelta = FieldStrategy::DateTimeDelta
6
6
  let(:field) { DataAnon::Core::Field.new('date', DateTime.new(2000,1,1), 1, nil) }
7
7
 
8
8
  describe 'datetime should not remain the same' do
@@ -10,6 +10,7 @@ describe DataAnon::Strategy::Field::DateTimeDelta do
10
10
  let(:anonymized_value) { DateTimeDelta.new().anonymize(field) }
11
11
  let(:date_difference) {anonymized_value.to_i - field.value.to_i}
12
12
 
13
+ it { anonymized_value.should be_kind_of DateTime}
13
14
  it {date_difference.should_not be 0 }
14
15
  end
15
16
 
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+
3
+ describe FieldStrategy::TimeDelta do
4
+
5
+ TimeDelta = FieldStrategy::TimeDelta
6
+ let(:field) { DataAnon::Core::Field.new('date', Time.new(2012,10,10,13,20,10), 1, nil) }
7
+
8
+ describe 'time should not remain the same' do
9
+
10
+ let(:anonymized_value) { TimeDelta.new().anonymize(field) }
11
+ let(:date_difference) {anonymized_value.to_i - field.value.to_i}
12
+
13
+ it { anonymized_value.should be_kind_of Time}
14
+ it {date_difference.should_not be 0 }
15
+ end
16
+
17
+ describe 'time should not change when provided with 0 delta for both date and time' do
18
+
19
+ let(:anonymized_value) { TimeDelta.new(0,0).anonymize(field) }
20
+ let(:date_difference) {anonymized_value.to_i - field.value.to_i}
21
+
22
+ it {date_difference.should be 0 }
23
+
24
+ end
25
+
26
+ describe 'date should be anonymized within provided delta' do
27
+
28
+ let(:anonymized_value) { TimeDelta.new(5,0).anonymize(field) }
29
+ let(:date_difference) {anonymized_value.to_i - field.value.to_i}
30
+
31
+ it { date_difference.should be_between(-5.days, 5.days) }
32
+
33
+ end
34
+
35
+ describe 'time should be anonymized within provided delta' do
36
+
37
+ let(:anonymized_value) { TimeDelta.new(0,10).anonymize(field) }
38
+ let(:date_difference) {anonymized_value.to_i - field.value.to_i}
39
+
40
+ it { date_difference.should be_between(-10.minutes, 10.minutes)}
41
+ end
42
+
43
+
44
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+
3
+ describe FieldStrategy::DefaultAnon do
4
+
5
+ DefaultAnon = FieldStrategy::DefaultAnon
6
+
7
+ describe 'anonymized boolean true value' do
8
+ let(:field) {DataAnon::Core::Field.new('boolean_field',true,1,nil)}
9
+ let(:anonymized_value) {DefaultAnon.new.anonymize(field)}
10
+
11
+ it { [TrueClass,FalseClass].should include(anonymized_value.class) }
12
+ end
13
+
14
+ describe 'anonymized boolean false value' do
15
+ let(:field) {DataAnon::Core::Field.new('boolean_field',false,1,nil)}
16
+ let(:anonymized_value) {DefaultAnon.new.anonymize(field)}
17
+
18
+ it { [TrueClass,FalseClass].should include(anonymized_value.class) }
19
+ end
20
+
21
+ describe 'anonymized float value' do
22
+ let(:field) {DataAnon::Core::Field.new('float_field',2.0,1,nil)}
23
+ let(:anonymized_value) {DefaultAnon.new.anonymize(field)}
24
+
25
+ it { anonymized_value.should be_kind_of Float }
26
+ end
27
+
28
+ describe 'anonymized int value' do
29
+ let(:field) {DataAnon::Core::Field.new('int_field',2,1,nil)}
30
+ let(:anonymized_value) {DefaultAnon.new.anonymize(field)}
31
+
32
+ it { anonymized_value.should be_kind_of Fixnum }
33
+ end
34
+
35
+ describe 'anonymized string value' do
36
+ let(:field) {DataAnon::Core::Field.new('string_field','String',1,nil)}
37
+ let(:anonymized_value) {DefaultAnon.new.anonymize(field)}
38
+
39
+ it { anonymized_value.should be_kind_of String }
40
+ end
41
+
42
+ end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ describe FieldStrategy::GmailTemplate do
4
+
5
+ GmailTemplate = FieldStrategy::GmailTemplate
6
+ let(:field) { DataAnon::Core::Field.new('email', 'user@company.com', 456, nil) }
7
+
8
+ describe 'generated email using default username' do
9
+ let(:anonymized_email) { GmailTemplate.new.anonymize(field) }
10
+ it { anonymized_email.should eq('someusername+456@gmail.com') }
11
+ end
12
+
13
+ describe 'generated email using given username' do
14
+ let(:anonymized_email) { GmailTemplate.new("fake").anonymize(field) }
15
+ it { anonymized_email.should eq('fake+456@gmail.com') }
16
+ end
17
+ end