symmetric-encryption 3.2 → 3.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,3 @@
1
1
  module SymmetricEncryption #:nodoc
2
- VERSION = "3.2"
2
+ VERSION = "3.3"
3
3
  end
@@ -1,18 +1,6 @@
1
- # Allow examples to be run in-place without requiring a gem install
2
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
3
-
4
- require 'rubygems'
5
- require 'logger'
6
- require 'erb'
7
- require 'test/unit'
8
- # Since we want both the AR and Mongoid extensions loaded we need to require them first
9
- require 'active_record'
10
- require 'mongoid'
11
- require 'symmetric-encryption'
12
- # Should redefines Proc#bind so must include after Rails
13
- require 'shoulda'
14
-
15
- ActiveRecord::Base.logger = Logger.new($stderr)
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ ActiveRecord::Base.logger = SemanticLogger[ActiveRecord]
16
4
  ActiveRecord::Base.configurations = YAML::load(ERB.new(IO.read('test/config/database.yml')).result)
17
5
  ActiveRecord::Base.establish_connection('test')
18
6
 
@@ -22,7 +10,18 @@ ActiveRecord::Schema.define :version => 0 do
22
10
  t.string :encrypted_social_security_number
23
11
  t.string :encrypted_string
24
12
  t.text :encrypted_long_string
13
+ t.text :encrypted_data_yaml
14
+ t.text :encrypted_data_json
25
15
  t.string :name
16
+
17
+ t.string :encrypted_integer_value
18
+ t.string :encrypted_float_value
19
+ t.string :encrypted_decimal_value
20
+ t.string :encrypted_datetime_value
21
+ t.string :encrypted_time_value
22
+ t.string :encrypted_date_value
23
+ t.string :encrypted_true_value
24
+ t.string :encrypted_false_value
26
25
  end
27
26
  end
28
27
 
@@ -31,6 +30,17 @@ class User < ActiveRecord::Base
31
30
  attr_encrypted :social_security_number
32
31
  attr_encrypted :string, :random_iv => true
33
32
  attr_encrypted :long_string, :random_iv => true, :compress => true
33
+ attr_encrypted :data_yaml, :random_iv => true, :compress => true, :type => :yaml
34
+ attr_encrypted :data_json, :random_iv => true, :compress => true, :type => :json
35
+
36
+ attr_encrypted :integer_value, :type => :integer
37
+ attr_encrypted :float_value, :type => :float
38
+ attr_encrypted :decimal_value, :type => :decimal
39
+ attr_encrypted :datetime_value, :type => :datetime
40
+ attr_encrypted :time_value, :type => :time
41
+ attr_encrypted :date_value, :type => :date
42
+ attr_encrypted :true_value, :type => :boolean
43
+ attr_encrypted :false_value, :type => :boolean
34
44
 
35
45
  validates :encrypted_bank_account_number, :symmetric_encryption => true
36
46
  validates :encrypted_social_security_number, :symmetric_encryption => true
@@ -66,12 +76,31 @@ class AttrEncryptedTest < Test::Unit::TestCase
66
76
 
67
77
  @name = 'Joe Bloggs'
68
78
 
79
+ @integer_value = 12
80
+ @float_value = 88.12345
81
+ @decimal_value = BigDecimal.new("22.51")
82
+ @datetime_value = DateTime.new(2001, 11, 26, 20, 55, 54, "-5")
83
+ @time_value = Time.new(2013, 01, 01, 22, 30, 00, "-04:00")
84
+ @date_value = Date.new(1927, 04, 02)
85
+ @h = { :a => 'A', :b => 'B' }
86
+
69
87
  @user = User.new(
70
88
  # Encrypted Attribute
71
89
  :bank_account_number => @bank_account_number,
72
90
  # Encrypted Attribute
73
91
  :social_security_number => @social_security_number,
74
- :name => @name
92
+ :name => @name,
93
+ # data type specific fields
94
+ :integer_value => @integer_value,
95
+ :float_value => @float_value,
96
+ :decimal_value => @decimal_value,
97
+ :datetime_value => @datetime_value,
98
+ :time_value => @time_value,
99
+ :date_value => @date_value,
100
+ :true_value => true,
101
+ :false_value => false,
102
+ :data_yaml => @h.dup,
103
+ :data_json => @h.dup
75
104
  )
76
105
  end
77
106
 
@@ -80,6 +109,8 @@ class AttrEncryptedTest < Test::Unit::TestCase
80
109
  assert_equal true, @user.respond_to?(:bank_account_number)
81
110
  assert_equal true, @user.respond_to?(:encrypted_social_security_number)
82
111
  assert_equal true, @user.respond_to?(:social_security_number)
112
+ assert_equal true, @user.respond_to?(:data_yaml)
113
+ assert_equal true, @user.respond_to?(:data_json)
83
114
  assert_equal false, @user.respond_to?(:encrypted_name)
84
115
  end
85
116
 
@@ -247,7 +278,274 @@ class AttrEncryptedTest < Test::Unit::TestCase
247
278
  assert_equal @bank_account_number_encrypted, @user.encrypted_bank_account_number
248
279
  assert_equal @bank_account_number, @user.bank_account_number
249
280
  end
250
- end
251
281
 
282
+ context "data types" do
283
+ setup do
284
+ @user_clone = User.find(@user.id)
285
+ end
286
+
287
+ context "integer values" do
288
+ should "return correct data type" do
289
+ assert_equal @integer_value, @user_clone.integer_value
290
+ assert @user.clone.integer_value.kind_of?(Integer)
291
+ end
292
+
293
+ should "permit replacing value with nil" do
294
+ @user_clone.integer_value = nil
295
+ @user_clone.save!
296
+
297
+ @user.reload
298
+ assert_nil @user.integer_value
299
+ assert_nil @user.encrypted_integer_value
300
+ end
301
+
302
+ should "permit replacing value" do
303
+ new_integer_value = 98
304
+ @user_clone.integer_value = new_integer_value
305
+ @user_clone.save!
306
+
307
+ @user.reload
308
+ assert_equal new_integer_value, @user.integer_value
309
+ end
310
+ end
311
+
312
+ context "float values" do
313
+ should "return correct data type" do
314
+ assert_equal @float_value, @user_clone.float_value
315
+ assert @user.clone.float_value.kind_of?(Float)
316
+ end
317
+
318
+ should "permit replacing value with nil" do
319
+ @user_clone.float_value = nil
320
+ @user_clone.save!
321
+
322
+ @user.reload
323
+ assert_nil @user.float_value
324
+ assert_nil @user.encrypted_float_value
325
+ end
326
+
327
+ should "permit replacing value" do
328
+ new_float_value = 45.4321
329
+ @user_clone.float_value = new_float_value
330
+ @user_clone.save!
331
+
332
+ @user.reload
333
+ assert_equal new_float_value, @user.float_value
334
+ end
335
+ end
336
+
337
+ context "decimal values" do
338
+ should "return correct data type" do
339
+ assert_equal @decimal_value, @user_clone.decimal_value
340
+ assert @user.clone.decimal_value.kind_of?(BigDecimal)
341
+ end
342
+
343
+ should "permit replacing value with nil" do
344
+ @user_clone.decimal_value = nil
345
+ @user_clone.save!
346
+
347
+ @user.reload
348
+ assert_nil @user.decimal_value
349
+ assert_nil @user.encrypted_decimal_value
350
+ end
351
+
352
+ should "permit replacing value" do
353
+ new_decimal_value = BigDecimal.new("99.95")
354
+ @user_clone.decimal_value = new_decimal_value
355
+ @user_clone.save!
356
+
357
+ @user.reload
358
+ assert_equal new_decimal_value, @user.decimal_value
359
+ end
360
+ end
361
+
362
+ context "datetime values" do
363
+ should "return correct data type" do
364
+ assert_equal @datetime_value, @user_clone.datetime_value
365
+ assert @user.clone.datetime_value.kind_of?(DateTime)
366
+ end
367
+
368
+ should "permit replacing value with nil" do
369
+ @user_clone.datetime_value = nil
370
+ @user_clone.save!
371
+
372
+ @user.reload
373
+ assert_nil @user.datetime_value
374
+ assert_nil @user.encrypted_datetime_value
375
+ end
376
+
377
+ should "permit replacing value" do
378
+ new_datetime_value = DateTime.new(1998, 10, 21, 8, 33, 28, "+5")
379
+ @user_clone.datetime_value = new_datetime_value
380
+ @user_clone.save!
381
+
382
+ @user.reload
383
+ assert_equal new_datetime_value, @user.datetime_value
384
+ end
385
+ end
386
+
387
+ context "time values" do
388
+ should "return correct data type" do
389
+ assert_equal @time_value, @user_clone.time_value
390
+ assert @user.clone.time_value.kind_of?(Time)
391
+ end
392
+
393
+ should "permit replacing value with nil" do
394
+ @user_clone.time_value = nil
395
+ @user_clone.save!
396
+
397
+ @user.reload
398
+ assert_nil @user.time_value
399
+ assert_nil @user.encrypted_time_value
400
+ end
401
+
402
+ should "permit replacing value" do
403
+ new_time_value = Time.new(1998, 10, 21, 8, 33, 28, "+04:00")
404
+ @user_clone.time_value = new_time_value
405
+ @user_clone.save!
406
+
407
+ @user.reload
408
+ assert_equal new_time_value, @user.time_value
409
+ end
410
+ end
411
+
412
+ context "date values" do
413
+ should "return correct data type" do
414
+ assert_equal @date_value, @user_clone.date_value
415
+ assert @user.clone.date_value.kind_of?(Date)
416
+ end
417
+
418
+ should "permit replacing value with nil" do
419
+ @user_clone.date_value = nil
420
+ @user_clone.save!
421
+
422
+ @user.reload
423
+ assert_nil @user.date_value
424
+ assert_nil @user.encrypted_date_value
425
+ end
426
+
427
+ should "permit replacing value" do
428
+ new_date_value = Date.new(1998, 10, 21)
429
+ @user_clone.date_value = new_date_value
430
+ @user_clone.save!
431
+
432
+ @user.reload
433
+ assert_equal new_date_value, @user.date_value
434
+ end
435
+ end
436
+
437
+ context "true values" do
438
+ should "return correct data type" do
439
+ assert_equal true, @user_clone.true_value
440
+ assert @user.clone.true_value.kind_of?(TrueClass)
441
+ end
442
+
443
+ should "permit replacing value with nil" do
444
+ @user_clone.true_value = nil
445
+ @user_clone.save!
446
+
447
+ @user.reload
448
+ assert_nil @user.true_value
449
+ assert_nil @user.encrypted_true_value
450
+ end
451
+
452
+ should "permit replacing value" do
453
+ new_value = false
454
+ @user_clone.true_value = new_value
455
+ @user_clone.save!
456
+
457
+ @user.reload
458
+ assert_equal new_value, @user.true_value
459
+ end
460
+ end
461
+
462
+ context "false values" do
463
+ should "return correct data type" do
464
+ assert_equal false, @user_clone.false_value
465
+ assert @user.clone.false_value.kind_of?(FalseClass)
466
+ end
467
+
468
+ should "permit replacing value with nil" do
469
+ @user_clone.false_value = nil
470
+ @user_clone.save!
471
+
472
+ @user.reload
473
+ assert_nil @user.false_value
474
+ assert_nil @user.encrypted_false_value
475
+ end
476
+
477
+ should "permit replacing value" do
478
+ new_value = true
479
+ @user_clone.false_value = new_value
480
+ @user_clone.save!
481
+
482
+ @user.reload
483
+ assert_equal new_value, @user.false_value
484
+ end
485
+ end
486
+
487
+ context "JSON Serialization" do
488
+ setup do
489
+ # JSON Does not support symbols, so they will come back as strings
490
+ # Convert symbols to string in the test
491
+ @h.keys.each do |k|
492
+ @h[k.to_s] = @h[k]
493
+ @h.delete(k)
494
+ end
495
+ end
496
+
497
+ should "return correct data type" do
498
+ assert_equal @h, @user_clone.data_json
499
+ assert @user.clone.data_json.kind_of?(Hash)
500
+ end
501
+
502
+ should "permit replacing value with nil" do
503
+ @user_clone.data_json = nil
504
+ @user_clone.save!
505
+
506
+ @user.reload
507
+ assert_nil @user.data_json
508
+ assert_nil @user.encrypted_data_json
509
+ end
510
+
511
+ should "permit replacing value" do
512
+ new_value = @h.clone
513
+ new_value['c'] = 'C'
514
+ @user_clone.data_json = new_value
515
+ @user_clone.save!
516
+
517
+ @user.reload
518
+ assert_equal new_value, @user.data_json
519
+ end
520
+ end
521
+
522
+ context "YAML Serialization" do
523
+ should "return correct data type" do
524
+ assert_equal @h, @user_clone.data_yaml
525
+ assert @user.clone.data_yaml.kind_of?(Hash)
526
+ end
527
+
528
+ should "permit replacing value with nil" do
529
+ @user_clone.data_yaml = nil
530
+ @user_clone.save!
531
+
532
+ @user.reload
533
+ assert_nil @user.data_yaml
534
+ assert_nil @user.encrypted_data_yaml
535
+ end
536
+
537
+ should "permit replacing value" do
538
+ new_value = @h.clone
539
+ new_value[:c] = 'C'
540
+ @user_clone.data_yaml = new_value
541
+ @user_clone.save!
542
+
543
+ @user.reload
544
+ assert_equal new_value, @user.data_yaml
545
+ end
546
+ end
547
+
548
+ end
549
+ end
252
550
  end
253
551
  end
data/test/cipher_test.rb CHANGED
@@ -1,13 +1,4 @@
1
- # Allow examples to be run in-place without requiring a gem install
2
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
3
-
4
- require 'rubygems'
5
- require 'test/unit'
6
- require 'shoulda'
7
- require 'symmetric_encryption'
8
-
9
- # Load Symmetric Encryption keys
10
- SymmetricEncryption.load!(File.join(File.dirname(__FILE__), 'config', 'symmetric-encryption.yml'), 'test')
1
+ require File.dirname(__FILE__) + '/test_helper'
11
2
 
12
3
  # Unit Test for SymmetricEncryption::Cipher
13
4
  #
@@ -1,17 +1,6 @@
1
- # Allow examples to be run in-place without requiring a gem install
2
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
3
-
4
- require 'rubygems'
5
- require 'logger'
6
- require 'erb'
7
- require 'test/unit'
8
- require 'shoulda'
9
- # Since we want both the Mongoid extensions loaded we need to require it first
10
- require 'active_record'
11
- require 'mongoid'
12
- require 'symmetric-encryption'
13
-
14
- Mongoid.logger = Logger.new($stdout)
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ Mongoid.logger = SemanticLogger[Mongoid]
15
4
  filename = defined?(Mongoid::VERSION) ? "test/config/mongoid_v3.yml" : "test/config/mongoid_v2.yml"
16
5
  Mongoid.load!(filename)
17
6
 
@@ -24,8 +13,20 @@ class MongoidUser
24
13
  field :encrypted_string, :type => String, :encrypted => {:random_iv => true}
25
14
  field :encrypted_long_string, :type => String, :encrypted => {:random_iv => true, :compress => true}
26
15
 
27
- # validates :encrypted_bank_account_number, :symmetric_encrypted => true
28
- # validates :encrypted_social_security_number, :symmetric_encrypted => true
16
+ field :encrypted_integer_value, :type => String, :encrypted => {:type => :integer}
17
+ field :encrypted_float_value, :type => String, :encrypted => {:type => :float}
18
+ field :encrypted_decimal_value, :type => String, :encrypted => {:type => :decimal}
19
+ field :encrypted_datetime_value, :type => String, :encrypted => {:type => :datetime}
20
+ field :encrypted_time_value, :type => String, :encrypted => {:type => :time}
21
+ field :encrypted_date_value, :type => String, :encrypted => {:type => :date}
22
+ field :encrypted_true_value, :type => String, :encrypted => {:type => :boolean}
23
+ field :encrypted_false_value, :type => String, :encrypted => {:type => :boolean}
24
+ field :encrypted_data_yaml, :type => String, :encrypted => {:random_iv => true, :compress => true, :type => :yaml}
25
+ field :encrypted_data_json, :type => String, :encrypted => {:random_iv => true, :compress => true, :type => :json}
26
+
27
+ # TODO Validates should work
28
+ #validates :encrypted_bank_account_number, :symmetric_encrypted => true
29
+ #validates :encrypted_social_security_number, :symmetric_encrypted => true
29
30
  end
30
31
 
31
32
  # Load Symmetric Encryption keys
@@ -55,11 +56,29 @@ class FieldEncryptedTest < Test::Unit::TestCase
55
56
  @string = "A string containing some data to be encrypted with a random initialization vector"
56
57
  @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"
57
58
 
58
- # #TODO Intercept passing in attributes to create etc.
59
+ @integer_value = 12
60
+ @float_value = 88.12345
61
+ @decimal_value = BigDecimal.new("22.51")
62
+ @datetime_value = DateTime.new(2001, 11, 26, 20, 55, 54, "-5")
63
+ @time_value = Time.new(2013, 01, 01, 22, 30, 00, "-04:00")
64
+ @date_value = Date.new(1927, 04, 02)
65
+ @h = { :a => 'A', :b => 'B' }
66
+
59
67
  @user = MongoidUser.new(
60
68
  :encrypted_bank_account_number => @bank_account_number_encrypted,
61
69
  :encrypted_social_security_number => @social_security_number_encrypted,
62
- :name => "Joe Bloggs"
70
+ :name => "Joe Bloggs",
71
+ # data type specific fields
72
+ :integer_value => @integer_value,
73
+ :float_value => @float_value,
74
+ :decimal_value => @decimal_value,
75
+ :datetime_value => @datetime_value,
76
+ :time_value => @time_value,
77
+ :date_value => @date_value,
78
+ :true_value => true,
79
+ :false_value => false,
80
+ :data_yaml => @h.dup,
81
+ :data_json => @h.dup
63
82
  )
64
83
  end
65
84
 
@@ -168,6 +187,274 @@ class FieldEncryptedTest < Test::Unit::TestCase
168
187
  assert_equal @bank_account_number_encrypted, user.encrypted_bank_account_number
169
188
  assert_equal @social_security_number_encrypted, user.encrypted_social_security_number
170
189
  end
171
- end
172
190
 
191
+ context "data types" do
192
+ setup do
193
+ @user.save!
194
+ @user_clone = MongoidUser.find(@user.id)
195
+ end
196
+
197
+ context "integer values" do
198
+ should "return correct data type" do
199
+ assert_equal @integer_value, @user_clone.integer_value
200
+ assert @user.clone.integer_value.kind_of?(Integer)
201
+ end
202
+
203
+ should "permit replacing value with nil" do
204
+ @user_clone.integer_value = nil
205
+ @user_clone.save!
206
+
207
+ @user.reload
208
+ assert_nil @user.integer_value
209
+ assert_nil @user.encrypted_integer_value
210
+ end
211
+
212
+ should "permit replacing value" do
213
+ new_integer_value = 98
214
+ @user_clone.integer_value = new_integer_value
215
+ @user_clone.save!
216
+
217
+ @user.reload
218
+ assert_equal new_integer_value, @user.integer_value
219
+ end
220
+ end
221
+
222
+ context "float values" do
223
+ should "return correct data type" do
224
+ assert_equal @float_value, @user_clone.float_value
225
+ assert @user.clone.float_value.kind_of?(Float)
226
+ end
227
+
228
+ should "permit replacing value with nil" do
229
+ @user_clone.float_value = nil
230
+ @user_clone.save!
231
+
232
+ @user.reload
233
+ assert_nil @user.float_value
234
+ assert_nil @user.encrypted_float_value
235
+ end
236
+
237
+ should "permit replacing value" do
238
+ new_float_value = 45.4321
239
+ @user_clone.float_value = new_float_value
240
+ @user_clone.save!
241
+
242
+ @user.reload
243
+ assert_equal new_float_value, @user.float_value
244
+ end
245
+ end
246
+
247
+ context "decimal values" do
248
+ should "return correct data type" do
249
+ assert_equal @decimal_value, @user_clone.decimal_value
250
+ assert @user.clone.decimal_value.kind_of?(BigDecimal)
251
+ end
252
+
253
+ should "permit replacing value with nil" do
254
+ @user_clone.decimal_value = nil
255
+ @user_clone.save!
256
+
257
+ @user.reload
258
+ assert_nil @user.decimal_value
259
+ assert_nil @user.encrypted_decimal_value
260
+ end
261
+
262
+ should "permit replacing value" do
263
+ new_decimal_value = BigDecimal.new("99.95")
264
+ @user_clone.decimal_value = new_decimal_value
265
+ @user_clone.save!
266
+
267
+ @user.reload
268
+ assert_equal new_decimal_value, @user.decimal_value
269
+ end
270
+ end
271
+
272
+ context "datetime values" do
273
+ should "return correct data type" do
274
+ assert_equal @datetime_value, @user_clone.datetime_value
275
+ assert @user.clone.datetime_value.kind_of?(DateTime)
276
+ end
277
+
278
+ should "permit replacing value with nil" do
279
+ @user_clone.datetime_value = nil
280
+ @user_clone.save!
281
+
282
+ @user.reload
283
+ assert_nil @user.datetime_value
284
+ assert_nil @user.encrypted_datetime_value
285
+ end
286
+
287
+ should "permit replacing value" do
288
+ new_datetime_value = DateTime.new(1998, 10, 21, 8, 33, 28, "+5")
289
+ @user_clone.datetime_value = new_datetime_value
290
+ @user_clone.save!
291
+
292
+ @user.reload
293
+ assert_equal new_datetime_value, @user.datetime_value
294
+ end
295
+ end
296
+
297
+ context "time values" do
298
+ should "return correct data type" do
299
+ assert_equal @time_value, @user_clone.time_value
300
+ assert @user.clone.time_value.kind_of?(Time)
301
+ end
302
+
303
+ should "permit replacing value with nil" do
304
+ @user_clone.time_value = nil
305
+ @user_clone.save!
306
+
307
+ @user.reload
308
+ assert_nil @user.time_value
309
+ assert_nil @user.encrypted_time_value
310
+ end
311
+
312
+ should "permit replacing value" do
313
+ new_time_value = Time.new(1998, 10, 21, 8, 33, 28, "+04:00")
314
+ @user_clone.time_value = new_time_value
315
+ @user_clone.save!
316
+
317
+ @user.reload
318
+ assert_equal new_time_value, @user.time_value
319
+ end
320
+ end
321
+
322
+ context "date values" do
323
+ should "return correct data type" do
324
+ assert_equal @date_value, @user_clone.date_value
325
+ assert @user.clone.date_value.kind_of?(Date)
326
+ end
327
+
328
+ should "permit replacing value with nil" do
329
+ @user_clone.date_value = nil
330
+ @user_clone.save!
331
+
332
+ @user.reload
333
+ assert_nil @user.date_value
334
+ assert_nil @user.encrypted_date_value
335
+ end
336
+
337
+ should "permit replacing value" do
338
+ new_date_value = Date.new(1998, 10, 21)
339
+ @user_clone.date_value = new_date_value
340
+ @user_clone.save!
341
+
342
+ @user.reload
343
+ assert_equal new_date_value, @user.date_value
344
+ end
345
+ end
346
+
347
+ context "true values" do
348
+ should "return correct data type" do
349
+ assert_equal true, @user_clone.true_value
350
+ assert @user.clone.true_value.kind_of?(TrueClass)
351
+ end
352
+
353
+ should "permit replacing value with nil" do
354
+ @user_clone.true_value = nil
355
+ @user_clone.save!
356
+
357
+ @user.reload
358
+ assert_nil @user.true_value
359
+ assert_nil @user.encrypted_true_value
360
+ end
361
+
362
+ should "permit replacing value" do
363
+ new_value = false
364
+ @user_clone.true_value = new_value
365
+ @user_clone.save!
366
+
367
+ @user.reload
368
+ assert_equal new_value, @user.true_value
369
+ end
370
+ end
371
+
372
+ context "false values" do
373
+ should "return correct data type" do
374
+ assert_equal false, @user_clone.false_value
375
+ assert @user.clone.false_value.kind_of?(FalseClass)
376
+ end
377
+
378
+ should "permit replacing value with nil" do
379
+ @user_clone.false_value = nil
380
+ @user_clone.save!
381
+
382
+ @user.reload
383
+ assert_nil @user.false_value
384
+ assert_nil @user.encrypted_false_value
385
+ end
386
+
387
+ should "permit replacing value" do
388
+ new_value = true
389
+ @user_clone.false_value = new_value
390
+ @user_clone.save!
391
+
392
+ @user.reload
393
+ assert_equal new_value, @user.false_value
394
+ end
395
+ end
396
+
397
+ context "JSON Serialization" do
398
+ setup do
399
+ # JSON Does not support symbols, so they will come back as strings
400
+ # Convert symbols to string in the test
401
+ @h.keys.each do |k|
402
+ @h[k.to_s] = @h[k]
403
+ @h.delete(k)
404
+ end
405
+ end
406
+
407
+ should "return correct data type" do
408
+ assert_equal @h, @user_clone.data_json
409
+ assert @user.clone.data_json.kind_of?(Hash)
410
+ end
411
+
412
+ should "permit replacing value with nil" do
413
+ @user_clone.data_json = nil
414
+ @user_clone.save!
415
+
416
+ @user.reload
417
+ assert_nil @user.data_json
418
+ assert_nil @user.encrypted_data_json
419
+ end
420
+
421
+ should "permit replacing value" do
422
+ new_value = @h.clone
423
+ new_value['c'] = 'C'
424
+ @user_clone.data_json = new_value
425
+ @user_clone.save!
426
+
427
+ @user.reload
428
+ assert_equal new_value, @user.data_json
429
+ end
430
+ end
431
+
432
+ context "YAML Serialization" do
433
+ should "return correct data type" do
434
+ assert_equal @h, @user_clone.data_yaml
435
+ assert @user.clone.data_yaml.kind_of?(Hash)
436
+ end
437
+
438
+ should "permit replacing value with nil" do
439
+ @user_clone.data_yaml = nil
440
+ @user_clone.save!
441
+
442
+ @user.reload
443
+ assert_nil @user.data_yaml
444
+ assert_nil @user.encrypted_data_yaml
445
+ end
446
+
447
+ should "permit replacing value" do
448
+ new_value = @h.clone
449
+ new_value[:c] = 'C'
450
+ @user_clone.data_yaml = new_value
451
+ @user_clone.save!
452
+
453
+ @user.reload
454
+ assert_equal new_value, @user.data_yaml
455
+ end
456
+ end
457
+ end
458
+
459
+ end
173
460
  end