symmetric-encryption 3.8.2 → 3.8.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f99ee3679f67ccf977755f31245de76084376f2
4
- data.tar.gz: 82e2ddb9b6e96b8674a306521111591233878b88
3
+ metadata.gz: 788a470ed0ed501adc827789838ad6460fa6070b
4
+ data.tar.gz: ba3c6a6865c5127fa409271e477ab2caee65c1a6
5
5
  SHA512:
6
- metadata.gz: d4568a1b15d970a687aa1457367a0921a0a680a10976cf4e6b2e8540beb2c41bd76b92c3ccc0ae132b0bf000430522fc2a5b6e5a0ca84faf0ca6a69c7530412c
7
- data.tar.gz: d9ccc83d7ac47c75ce04e743b6b42e9bd76e25ebdd5a05c2b89cda9f09da19be8d36a5e246db6bde21d730557e3cb100940e277b815c82b54054bc21928cf4d3
6
+ metadata.gz: 525c6df5648bbf5af0432eaab63a235e0ac0fbf3a9a503576e3cf89d11a8d074820aeea9017067afcce950d37f9902f3b39620e81c3239f615488316be57ff19
7
+ data.tar.gz: ac5ae0631681185ac0c2bbdfdb0fce0b61a803ddaa1410bc19cb77a98be7b1b37a9ef7417b047781c38c69ae6b75369085d654578767143e1d7b7143821ce251
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # symmetric-encryption
1
+ # Symmetric Encryption
2
2
  ![](https://img.shields.io/gem/v/symmetric-encryption.svg) ![](https://img.shields.io/travis/rocketjob/symmetric-encryption.svg) ![](https://img.shields.io/gem/dt/symmetric-encryption.svg) ![](https://img.shields.io/badge/status-production%20ready-blue.svg)
3
3
 
4
4
  * http://github.com/rocketjob/symmetric-encryption
@@ -19,21 +19,22 @@ expose all the encryption algorithms supported by OpenSSL.
19
19
 
20
20
  ## Documentation
21
21
 
22
- For complete documentation see: http://rocketjob.github.io/symmetric-encryption/
23
-
24
- ## Documentation
25
-
26
22
  [Symmetric Encryption Guide](http://rocketjob.github.io/symmetric-encryption)
27
23
 
28
24
  [Reference Documentation](http://www.rubydoc.info/gems/symmetric-encryption/)
29
25
 
26
+ ## Rocket Job
27
+
28
+ Checkout the sister project [Rocket Job](http://rocketjob.io): Ruby's missing batch system.
29
+
30
+ Fully supports Symmetric Encryption to encrypt data in flight and at rest while running jobs in the background.
31
+
30
32
  ## Supports
31
33
 
32
- Symmetric Encryption works with the following Ruby interpreters:
34
+ Symmetric Encryption works with the following Ruby VMs:
33
35
 
34
- * Ruby 1.9.3, 2.0, 2.1, 2.2, or greater
35
- * JRuby 1.7, 9.0, or greater
36
- * Rubinius 2.5, or greater
36
+ - Ruby 2.1, 2.2, 2.3, and above
37
+ - JRuby 1.7.23, 9.0.5 and above
37
38
 
38
39
  ## Upgrading to SymmetricEncryption V3
39
40
 
@@ -383,7 +383,7 @@ module SymmetricEncryption
383
383
  end
384
384
  if include_key
385
385
  len = buffer.slice!(0..1).unpack('v').first
386
- key = decryption_cipher.binary_decrypt(buffer.slice!(0..len-1), header=false)
386
+ key = decryption_cipher.binary_decrypt(buffer.slice!(0..len-1), false)
387
387
  end
388
388
  if include_cipher
389
389
  len = buffer.slice!(0..1).unpack('v').first
@@ -476,7 +476,7 @@ module SymmetricEncryption
476
476
  self.class.build_header(version, compress, random_iv ? iv : nil, nil, nil) +
477
477
  openssl_cipher.update(compress ? Zlib::Deflate.deflate(string) : string)
478
478
  else
479
- openssl_cipher.iv = @iv if @iv
479
+ openssl_cipher.iv = @iv if defined?(@iv) && @iv
480
480
  openssl_cipher.update(string)
481
481
  end
482
482
  result << openssl_cipher.final
@@ -14,7 +14,7 @@ module SymmetricEncryption
14
14
  # Coerce given value into given type
15
15
  # Does not coerce json or yaml values
16
16
  def self.coerce(value, type, from_type=nil)
17
- return if value.nil? || (value.is_a?(String) && (value !~ /[^[:space:]]/))
17
+ return if blank?(value)
18
18
 
19
19
  from_type ||= value.class
20
20
  case type
@@ -71,5 +71,22 @@ module SymmetricEncryption
71
71
  TYPE_MAP[symbol]
72
72
  end
73
73
  end
74
+
75
+ private
76
+
77
+ BLANK_RE = /\A[[:space:]]*\z/
78
+
79
+ # Returns [true|false] whether the supplied value is blank?
80
+ def self.blank?(value)
81
+ return true if value.nil?
82
+ if value.is_a?(String)
83
+ return true if value.empty?
84
+ # When Binary data is supplied that cannot convert to UTF-8 it is clearly not blank
85
+ return false unless value.dup.force_encoding(SymmetricEncryption::UTF8_ENCODING).valid_encoding?
86
+ (value =~ BLANK_RE) == 0
87
+ else
88
+ false
89
+ end
90
+ end
74
91
  end
75
92
  end
@@ -106,7 +106,7 @@ module ActiveRecord #:nodoc:
106
106
  encrypted_columns.include?(attribute)
107
107
  end
108
108
 
109
- protected
109
+ private
110
110
 
111
111
  # Allows you to use dynamic methods like <tt>find_by_email</tt> or <tt>scoped_by_email</tt> for
112
112
  # encrypted attributes
@@ -49,10 +49,10 @@ module MongoMapper
49
49
  #
50
50
  # The above document results in the following document in the Mongo collection 'persons':
51
51
  # {
52
- # "name" : "Joe",
53
- # "encrypted_social_security_number" : "...",
54
- # "age" : 21
55
- # "encrypted_life_history" : "...",
52
+ # 'name' : 'Joe',
53
+ # 'encrypted_social_security_number' : '...',
54
+ # 'age' : 21
55
+ # 'encrypted_life_history' : '...',
56
56
  # }
57
57
  #
58
58
  # Symmetric Encryption creates the getters and setters to be able to work with the field
@@ -67,12 +67,12 @@ module MongoMapper
67
67
  # puts "Decrypted Social Security Number is: #{SymmetricEncryption.decrypt(person.encrypted_social_security_number)}"
68
68
  #
69
69
  # # Sets the encrypted_social_security_number to encrypted version
70
- # person.social_security_number = "123456789"
70
+ # person.social_security_number = '123456789'
71
71
  #
72
72
  # # Or, is equivalent to:
73
- # person.encrypted_social_security_number = SymmetricEncryption.encrypt("123456789")
73
+ # person.encrypted_social_security_number = SymmetricEncryption.encrypt('123456789')
74
74
  #
75
- # Note: Only "String" types are currently supported for encryption
75
+ # Note: Only 'String' types are currently supported for encryption
76
76
  #
77
77
  # Note: Unlike attr_encrypted finders must use the encrypted field name
78
78
  # Invalid Example, does not work:
@@ -30,10 +30,10 @@
30
30
  #
31
31
  # The above document results in the following document in the Mongo collection 'persons':
32
32
  # {
33
- # "name" : "Joe",
34
- # "encrypted_social_security_number" : "...",
35
- # "age" : 21
36
- # "encrypted_life_history" : "...",
33
+ # 'name' : 'Joe',
34
+ # 'encrypted_social_security_number' : '...',
35
+ # 'age' : 21
36
+ # 'encrypted_life_history' : '...',
37
37
  # }
38
38
  #
39
39
  # Symmetric Encryption creates the getters and setters to be able to work with the field
@@ -48,12 +48,12 @@
48
48
  # puts "Decrypted Social Security Number is: #{SymmetricEncryption.decrypt(person.encrypted_social_security_number)}"
49
49
  #
50
50
  # # Sets the encrypted_social_security_number to encrypted version
51
- # person.social_security_number = "123456789"
51
+ # person.social_security_number = '123456789'
52
52
  #
53
53
  # # Or, is equivalent to:
54
- # person.encrypted_social_security_number = SymmetricEncryption.encrypt("123456789")
54
+ # person.encrypted_social_security_number = SymmetricEncryption.encrypt('123456789')
55
55
  #
56
- # Note: Only "String" types are currently supported for encryption
56
+ # Note: Only 'String' types are currently supported for encryption
57
57
  #
58
58
  # Note: Unlike attr_encrypted finders must use the encrypted field name
59
59
  # Invalid Example, does not work:
@@ -25,7 +25,7 @@ module SymmetricEncryption
25
25
  # Freeze the decrypted field value so that it is not modified directly
26
26
  def #{decrypted_name}=(value)
27
27
  v = SymmetricEncryption::Coerce.coerce(value, :#{type})
28
- self.#{encrypted_name} = @stored_#{encrypted_name} = ::SymmetricEncryption.encrypt(v,#{random_iv},#{compress},:#{type})
28
+ self.#{encrypted_name} = @stored_#{encrypted_name} = ::SymmetricEncryption.encrypt(v, #{random_iv}, #{compress}, :#{type})
29
29
  @#{decrypted_name} = v.freeze
30
30
  end
31
31
 
@@ -33,8 +33,8 @@ module SymmetricEncryption
33
33
  # The decrypted value is cached and is only decrypted if the encrypted value has changed
34
34
  # If this method is not called, then the encrypted value is never decrypted
35
35
  def #{decrypted_name}
36
- if @stored_#{encrypted_name} != self.#{encrypted_name}
37
- @#{decrypted_name} = ::SymmetricEncryption.decrypt(self.#{encrypted_name},version=nil,:#{type}).freeze
36
+ if !defined?(@stored_#{encrypted_name}) || (@stored_#{encrypted_name} != self.#{encrypted_name})
37
+ @#{decrypted_name} = ::SymmetricEncryption.decrypt(self.#{encrypted_name}, nil, :#{type}).freeze
38
38
  @stored_#{encrypted_name} = self.#{encrypted_name}
39
39
  end
40
40
  @#{decrypted_name}
@@ -1,3 +1,3 @@
1
1
  module SymmetricEncryption #:nodoc
2
- VERSION = '3.8.2'
2
+ VERSION = '3.8.3'
3
3
  end
@@ -79,7 +79,7 @@ module SymmetricEncryption
79
79
  # # Example: Encrypt and write data to a file
80
80
  # SymmetricEncryption::Writer.open('test_file') do |file|
81
81
  # file.write "Hello World\n"
82
- # file.write "Keep this secret"
82
+ # file.write 'Keep this secret'
83
83
  # end
84
84
  #
85
85
  # # Example: Compress, Encrypt and write data to a file
@@ -193,7 +193,7 @@ module SymmetricEncryption
193
193
  # Returns self
194
194
  #
195
195
  # Example:
196
- # file << "Hello.\n" << "This is Jack"
196
+ # file << "Hello.\n" << 'This is Jack'
197
197
  def <<(data)
198
198
  write(data)
199
199
  self
@@ -9,8 +9,9 @@ ActiveRecord::Schema.define version: 0 do
9
9
  create_table :users, force: true do |t|
10
10
  t.string :encrypted_bank_account_number
11
11
  t.string :encrypted_social_security_number
12
- t.string :encrypted_string
13
- t.text :encrypted_long_string
12
+ t.string :encrypted_string_value
13
+ t.text :encrypted_long_string_value
14
+ t.text :encrypted_binary_string_value
14
15
  t.text :encrypted_data_yaml
15
16
  t.text :encrypted_data_json
16
17
  t.string :name
@@ -38,10 +39,11 @@ end
38
39
  class User < ActiveRecord::Base
39
40
  attr_encrypted :bank_account_number
40
41
  attr_encrypted :social_security_number
41
- attr_encrypted :string, random_iv: true
42
- attr_encrypted :long_string, random_iv: true, compress: true
43
- attr_encrypted :data_yaml, random_iv: true, compress: true, type: :yaml
44
- attr_encrypted :data_json, random_iv: true, compress: true, type: :json
42
+ attr_encrypted :string_value, random_iv: true
43
+ attr_encrypted :long_string_value, random_iv: true, compress: true
44
+ attr_encrypted :binary_string_value, random_iv: true, compress: true
45
+ attr_encrypted :data_yaml, random_iv: true, compress: true, type: :yaml
46
+ attr_encrypted :data_json, random_iv: true, compress: true, type: :json
45
47
 
46
48
  attr_encrypted :integer_value, type: :integer
47
49
  attr_encrypted :float_value, type: :float
@@ -71,14 +73,14 @@ class UniqueUser < ActiveRecord::Base
71
73
 
72
74
  validates :username,
73
75
  length: {in: 3..20},
74
- format: {with: /\A[\w\d\-[[:alnum:]]]+\z/},
76
+ format: {with: /\A[\w\-]+\z/},
75
77
  allow_blank: true
76
78
  end
77
79
  #@formatter:on
78
80
 
79
81
  # Initialize the database connection
80
82
  config_file = File.join(File.dirname(__FILE__), 'config', 'database.yml')
81
- raise 'database config not found. Create a config file at: test/config/database.yml' unless File.exists? config_file
83
+ raise 'database config not found. Create a config file at: test/config/database.yml' unless File.exist? config_file
82
84
 
83
85
  cfg = YAML.load(ERB.new(File.new(config_file).read).result)['test']
84
86
  raise("Environment 'test' not defined in test/config/database.yml") unless cfg
@@ -90,12 +92,15 @@ User.establish_connection(cfg)
90
92
  #
91
93
  class ActiveRecordTest < Minitest::Test
92
94
  describe 'ActiveRecord' do
93
- INTEGER_VALUE = 12
94
- FLOAT_VALUE = 88.12345
95
- DECIMAL_VALUE = BigDecimal.new("22.51")
96
- DATETIME_VALUE = DateTime.new(2001, 11, 26, 20, 55, 54, "-5")
97
- TIME_VALUE = Time.new(2013, 01, 01, 22, 30, 00, "-04:00")
98
- DATE_VALUE = Date.new(1927, 04, 02)
95
+ INTEGER_VALUE = 12
96
+ FLOAT_VALUE = 88.12345
97
+ DECIMAL_VALUE = BigDecimal.new('22.51')
98
+ DATETIME_VALUE = DateTime.new(2001, 11, 26, 20, 55, 54, "-5")
99
+ TIME_VALUE = Time.new(2013, 01, 01, 22, 30, 00, "-04:00")
100
+ DATE_VALUE = Date.new(1927, 04, 02)
101
+ STRING_VALUE = 'A string containing some data to be encrypted with a random initialization vector'
102
+ LONG_STRING_VALUE = 'A string containing some data to be encrypted with a random initialization vector and compressed since it takes up so much space in plain text form'
103
+ BINARY_STRING_VALUE = "Non-UTF8 Binary \x92 string".force_encoding('BINARY')
99
104
 
100
105
  before do
101
106
  @bank_account_number = '1234567890'
@@ -104,9 +109,6 @@ class ActiveRecordTest < Minitest::Test
104
109
  @social_security_number = '987654321'
105
110
  @social_security_number_encrypted = 'QEVuQwIAS+8X1NRrqdfEIQyFHVPuVA=='
106
111
 
107
- @string = 'A string containing some data to be encrypted with a random initialization vector'
108
- @long_string = 'A string containing some data to be encrypted with a random initialization vector and compressed since it takes up so much space in plain text form'
109
-
110
112
  @name = 'Joe Bloggs'
111
113
 
112
114
  @h = {a: 'A', b: 'B'}
@@ -118,6 +120,9 @@ class ActiveRecordTest < Minitest::Test
118
120
  social_security_number: @social_security_number,
119
121
  name: @name,
120
122
  # data type specific fields
123
+ string_value: STRING_VALUE,
124
+ long_string_value: LONG_STRING_VALUE,
125
+ binary_string_value: BINARY_STRING_VALUE,
121
126
  integer_value: INTEGER_VALUE,
122
127
  float_value: FLOAT_VALUE,
123
128
  decimal_value: DECIMAL_VALUE,
@@ -164,18 +169,18 @@ class ActiveRecordTest < Minitest::Test
164
169
  end
165
170
 
166
171
  it 'support a random iv' do
167
- @user.string = @string
168
- assert first_value = @user.encrypted_string
172
+ @user.string_value = STRING_VALUE
173
+ assert first_value = @user.encrypted_string_value
169
174
  # Assign the same value
170
- @user.string = @string.dup
171
- assert_equal true, first_value != @user.encrypted_string
175
+ @user.string_value = STRING_VALUE.dup
176
+ assert first_value != @user.encrypted_string_value
172
177
  end
173
178
 
174
179
  it 'support a random iv and compress' do
175
- @user.string = @long_string
176
- @user.long_string = @long_string
180
+ @user.string_value = STRING_VALUE
181
+ @user.long_string_value = STRING_VALUE
177
182
 
178
- assert_equal true, (@user.encrypted_long_string.length.to_f / @user.encrypted_string.length) < 0.8
183
+ refute_equal @user.encrypted_long_string_value, @user.encrypted_string_value
179
184
  end
180
185
 
181
186
  it 'encrypt' do
@@ -238,51 +243,51 @@ class ActiveRecordTest < Minitest::Test
238
243
  it 'return encrypted keys for the class' do
239
244
  expect = [:social_security_number, :bank_account_number]
240
245
  result = User.encrypted_keys
241
- expect.each { |val| assert_equal true, result.include?(val) }
246
+ expect.each { |val| assert result.include?(val) }
242
247
 
243
248
  # Also check encrypted_attribute?
244
- expect.each { |val| assert_equal true, User.encrypted_attribute?(val) }
249
+ expect.each { |val| assert User.encrypted_attribute?(val) }
245
250
  end
246
251
 
247
252
  it 'return encrypted columns for the class' do
248
253
  expect = [:encrypted_social_security_number, :encrypted_bank_account_number]
249
254
  result = User.encrypted_columns
250
- expect.each { |val| assert_equal true, result.include?(val) }
255
+ expect.each { |val| assert result.include?(val) }
251
256
 
252
257
  # Also check encrypted_column?
253
- expect.each { |val| assert_equal true, User.encrypted_column?(val) }
258
+ expect.each { |val| assert User.encrypted_column?(val) }
254
259
  end
255
260
 
256
261
  it 'validate encrypted data' do
257
- assert_equal true, @user.valid?
262
+ assert @user.valid?
258
263
  @user.encrypted_bank_account_number = '123'
259
264
  assert_equal false, @user.valid?
260
- assert_equal ["must be a value encrypted using SymmetricEncryption.encrypt"], @user.errors[:encrypted_bank_account_number]
265
+ assert_equal ['must be a value encrypted using SymmetricEncryption.encrypt'], @user.errors[:encrypted_bank_account_number]
261
266
  @user.encrypted_bank_account_number = SymmetricEncryption.encrypt('123')
262
- assert_equal true, @user.valid?
267
+ assert @user.valid?
263
268
  @user.bank_account_number = '123'
264
- assert_equal true, @user.valid?
269
+ assert @user.valid?
265
270
  end
266
271
 
267
272
  it 'validate un-encrypted string data' do
268
- assert_equal true, @user.valid?
273
+ assert @user.valid?
269
274
  @user.text = '123'
270
275
  assert_equal false, @user.valid?
271
- assert_equal ["only allows letters"], @user.errors[:text]
276
+ assert_equal ['only allows letters'], @user.errors[:text]
272
277
  @user.text = nil
273
278
  assert_equal false, @user.valid?
274
- assert_equal ["only allows letters", "can't be blank"], @user.errors[:text]
279
+ assert_equal ['only allows letters', "can't be blank"], @user.errors[:text]
275
280
  @user.text = ''
276
281
  assert_equal false, @user.valid?
277
- assert_equal ["only allows letters", "can't be blank"], @user.errors[:text]
282
+ assert_equal ['only allows letters', "can't be blank"], @user.errors[:text]
278
283
  end
279
284
 
280
285
  it 'validate un-encrypted integer data with coercion' do
281
- assert_equal true, @user.valid?
286
+ assert @user.valid?
282
287
  @user.number = '123'
283
- assert_equal true, @user.valid?
288
+ assert @user.valid?
284
289
  assert_equal 123, @user.number
285
- assert_equal true, @user.valid?
290
+ assert @user.valid?
286
291
  @user.number = ''
287
292
  assert_equal false, @user.valid?
288
293
  assert_equal nil, @user.number
@@ -294,22 +299,22 @@ class ActiveRecordTest < Minitest::Test
294
299
  assert_equal ["can't be blank"], @user.errors[:number]
295
300
  end
296
301
 
297
- describe "with saved user" do
302
+ describe 'with saved user' do
298
303
  before do
299
304
  @user.save!
300
305
  end
301
306
 
302
307
  after do
303
- @user.destroy
308
+ @user.destroy if @user
304
309
  end
305
310
 
306
- it "return correct data type before save" do
307
- u = User.new(integer_value: "5")
311
+ it 'return correct data type before save' do
312
+ u = User.new(integer_value: '5')
308
313
  assert_equal 5, u.integer_value
309
314
  assert u.integer_value.kind_of?(Integer)
310
315
  end
311
316
 
312
- it "handle gsub! for non-encrypted_field" do
317
+ it 'handle gsub! for non-encrypted_field' do
313
318
  @user.name.gsub!('a', 'v')
314
319
  new_name = @name.gsub('a', 'v')
315
320
  assert_equal new_name, @user.name
@@ -324,7 +329,7 @@ class ActiveRecordTest < Minitest::Test
324
329
  end
325
330
  end
326
331
 
327
- it "revert changes on reload" do
332
+ it 'revert changes on reload' do
328
333
  new_bank_account_number = '444444444'
329
334
  @user.bank_account_number = new_bank_account_number
330
335
  assert_equal new_bank_account_number, @user.bank_account_number
@@ -335,7 +340,7 @@ class ActiveRecordTest < Minitest::Test
335
340
  assert_equal @bank_account_number, @user.bank_account_number
336
341
  end
337
342
 
338
- it "revert changes to encrypted field on reload" do
343
+ it 'revert changes to encrypted field on reload' do
339
344
  new_bank_account_number = '111111111'
340
345
  new_encrypted_bank_account_number = SymmetricEncryption.encrypt(new_bank_account_number)
341
346
  @user.encrypted_bank_account_number = new_encrypted_bank_account_number
@@ -348,21 +353,24 @@ class ActiveRecordTest < Minitest::Test
348
353
  assert_equal @bank_account_number, @user.bank_account_number
349
354
  end
350
355
 
351
- describe "data types" do
356
+ describe 'data types' do
352
357
  before do
353
358
  @user_clone = User.find(@user.id)
354
359
  end
355
360
 
356
361
  [
357
362
  #@formatter:off
358
- { attribute: :integer_value, klass: Integer, value: INTEGER_VALUE, new_value: 98 },
359
- { attribute: :float_value, klass: Float, value: FLOAT_VALUE, new_value: 45.4321 },
360
- { attribute: :decimal_value, klass: BigDecimal, value: DECIMAL_VALUE, new_value: BigDecimal.new("99.95"), coercible: "22.51"},
361
- { attribute: :datetime_value, klass: DateTime, value: DATETIME_VALUE, new_value: DateTime.new(1998, 10, 21, 8, 33, 28, "+5"), coercible: DATETIME_VALUE.to_time},
362
- { attribute: :time_value, klass: Time, value: TIME_VALUE, new_value: Time.new(2000, 01, 01, 22, 30, 00, "-04:00") },
363
- { attribute: :date_value, klass: Date, value: DATE_VALUE, new_value: Date.new(2027, 04, 02), coercible: DATE_VALUE.to_time },
364
- { attribute: :true_value, klass: TrueClass, value: true, new_value: false },
365
- { attribute: :false_value, klass: FalseClass, value: false, new_value: true },
363
+ {attribute: :integer_value, klass: Integer, value: INTEGER_VALUE, new_value: 98},
364
+ {attribute: :float_value, klass: Float, value: FLOAT_VALUE, new_value: 45.4321},
365
+ {attribute: :decimal_value, klass: BigDecimal, value: DECIMAL_VALUE, new_value: BigDecimal.new('99.95'), coercible: '22.51'},
366
+ {attribute: :datetime_value, klass: DateTime, value: DATETIME_VALUE, new_value: DateTime.new(1998, 10, 21, 8, 33, 28, '+5'), coercible: DATETIME_VALUE.to_time},
367
+ {attribute: :time_value, klass: Time, value: TIME_VALUE, new_value: Time.new(2000, 01, 01, 22, 30, 00, "-04:00")},
368
+ {attribute: :date_value, klass: Date, value: DATE_VALUE, new_value: Date.new(2027, 04, 02), coercible: DATE_VALUE.to_time},
369
+ {attribute: :true_value, klass: TrueClass, value: true, new_value: false},
370
+ {attribute: :false_value, klass: FalseClass, value: false, new_value: true},
371
+ {attribute: :string_value, klass: String, value: STRING_VALUE, new_value: 'Hello World'},
372
+ {attribute: :long_string_value, klass: String, value: LONG_STRING_VALUE, new_value: 'A Really long Hello World'},
373
+ {attribute: :binary_string_value, klass: String, value: BINARY_STRING_VALUE, new_value: "A new Non-UTF8 Binary \x92 string".force_encoding('BINARY')},
366
374
  #@formatter:on
367
375
  ].each do |value_test|
368
376
  describe "#{value_test[:klass]} values" do
@@ -374,18 +382,18 @@ class ActiveRecordTest < Minitest::Test
374
382
  @new_value = value_test[:new_value]
375
383
  end
376
384
 
377
- it "return correct data type" do
378
- assert_equal @value, @user_clone.send(@attribute)
385
+ it 'return correct data type' do
386
+ assert_equal @value, @user_clone.send(@attribute), @user_clone.attributes.ai
379
387
  assert @user.clone.send(@attribute).kind_of?(@klass)
380
388
  end
381
389
 
382
- it "coerce data type before save" do
390
+ it 'coerce data type before save' do
383
391
  u = User.new(@attribute => @value)
384
392
  assert_equal @value, u.send(@attribute)
385
393
  assert u.send(@attribute).kind_of?(@klass), "Value supposed to be coerced into #{@klass}, but is #{u.send(@attribute).class.name}"
386
394
  end
387
395
 
388
- it "permit replacing value with nil" do
396
+ it 'permit replacing value with nil' do
389
397
  @user_clone.send("#{@attribute}=".to_sym, nil)
390
398
  @user_clone.save!
391
399
 
@@ -394,7 +402,7 @@ class ActiveRecordTest < Minitest::Test
394
402
  assert_nil @user.send("encrypted_#{@attribute}".to_sym)
395
403
  end
396
404
 
397
- it "permit replacing value with an empty string" do
405
+ it 'permit replacing value with an empty string' do
398
406
  @user_clone.send("#{@attribute}=".to_sym, '')
399
407
  @user_clone.save!
400
408
 
@@ -403,7 +411,7 @@ class ActiveRecordTest < Minitest::Test
403
411
  assert_nil @user.send("encrypted_#{@attribute}".to_sym)
404
412
  end
405
413
 
406
- it "permit replacing value with a blank string" do
414
+ it 'permit replacing value with a blank string' do
407
415
  @user_clone.send("#{@attribute}=".to_sym, ' ')
408
416
  @user_clone.save!
409
417
 
@@ -412,7 +420,7 @@ class ActiveRecordTest < Minitest::Test
412
420
  assert_nil @user.send("encrypted_#{@attribute}".to_sym)
413
421
  end
414
422
 
415
- it "permit replacing value" do
423
+ it 'permit replacing value' do
416
424
  @user_clone.send("#{@attribute}=".to_sym, @new_value)
417
425
  @user_clone.save!
418
426
 
@@ -422,7 +430,7 @@ class ActiveRecordTest < Minitest::Test
422
430
  end
423
431
  end
424
432
 
425
- describe "JSON Serialization" do
433
+ describe 'JSON Serialization' do
426
434
  before do
427
435
  # JSON Does not support symbols, so they will come back as strings
428
436
  # Convert symbols to string in the test
@@ -432,18 +440,18 @@ class ActiveRecordTest < Minitest::Test
432
440
  end
433
441
  end
434
442
 
435
- it "return correct data type" do
443
+ it 'return correct data type' do
436
444
  assert_equal @h, @user_clone.data_json
437
445
  assert @user.clone.data_json.kind_of?(Hash)
438
446
  end
439
447
 
440
- it "not coerce data type (leaves as hash) before save" do
448
+ it 'not coerce data type (leaves as hash) before save' do
441
449
  u = User.new(data_json: @h)
442
450
  assert_equal @h, u.data_json
443
451
  assert u.data_json.kind_of?(Hash)
444
452
  end
445
453
 
446
- it "permit replacing value with nil" do
454
+ it 'permit replacing value with nil' do
447
455
  @user_clone.data_json = nil
448
456
  @user_clone.save!
449
457
 
@@ -452,7 +460,7 @@ class ActiveRecordTest < Minitest::Test
452
460
  assert_nil @user.encrypted_data_json
453
461
  end
454
462
 
455
- it "permit replacing value" do
463
+ it 'permit replacing value' do
456
464
  new_value = @h.clone
457
465
  new_value['c'] = 'C'
458
466
  @user_clone.data_json = new_value
@@ -463,19 +471,19 @@ class ActiveRecordTest < Minitest::Test
463
471
  end
464
472
  end
465
473
 
466
- describe "YAML Serialization" do
467
- it "return correct data type" do
474
+ describe 'YAML Serialization' do
475
+ it 'return correct data type' do
468
476
  assert_equal @h, @user_clone.data_yaml
469
477
  assert @user.clone.data_yaml.kind_of?(Hash)
470
478
  end
471
479
 
472
- it "not coerce data type (leaves as hash) before save" do
480
+ it 'not coerce data type (leaves as hash) before save' do
473
481
  u = User.new(data_yaml: @h)
474
482
  assert_equal @h, u.data_yaml
475
483
  assert u.data_yaml.kind_of?(Hash)
476
484
  end
477
485
 
478
- it "permit replacing value with nil" do
486
+ it 'permit replacing value with nil' do
479
487
  @user_clone.data_yaml = nil
480
488
  @user_clone.save!
481
489
 
@@ -484,7 +492,7 @@ class ActiveRecordTest < Minitest::Test
484
492
  assert_nil @user.encrypted_data_yaml
485
493
  end
486
494
 
487
- it "permit replacing value" do
495
+ it 'permit replacing value' do
488
496
  new_value = @h.clone
489
497
  new_value[:c] = 'C'
490
498
  @user_clone.data_yaml = new_value
@@ -504,8 +512,8 @@ class ActiveRecordTest < Minitest::Test
504
512
 
505
513
  it 'return true if it was changed' do
506
514
  @user.bank_account_number = '15424623'
507
- assert_equal true, @user.encrypted_bank_account_number_changed?
508
- assert_equal true, @user.bank_account_number_changed?
515
+ assert @user.encrypted_bank_account_number_changed?
516
+ assert @user.bank_account_number_changed?
509
517
  end
510
518
  end
511
519
  end