symmetric-encryption 3.8.3 → 3.9.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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/Rakefile +16 -16
  4. data/examples/symmetric-encryption.yml +33 -38
  5. data/lib/rails/generators/symmetric_encryption/config/templates/symmetric-encryption.yml +10 -14
  6. data/lib/rails/generators/symmetric_encryption/heroku_config/templates/symmetric-encryption.yml +28 -25
  7. data/lib/symmetric_encryption.rb +14 -6
  8. data/lib/symmetric_encryption/cipher.rb +151 -130
  9. data/lib/symmetric_encryption/config.rb +0 -1
  10. data/lib/symmetric_encryption/encoder.rb +79 -0
  11. data/lib/symmetric_encryption/extensions/active_record/base.rb +94 -134
  12. data/lib/symmetric_encryption/extensions/mongo_mapper/plugins/encrypted_key.rb +3 -89
  13. data/lib/symmetric_encryption/key_encryption_key.rb +32 -0
  14. data/lib/symmetric_encryption/railtie.rb +3 -3
  15. data/lib/symmetric_encryption/symmetric_encryption.rb +41 -8
  16. data/lib/symmetric_encryption/utils/re_encrypt_config_files.rb +82 -0
  17. data/lib/symmetric_encryption/version.rb +1 -1
  18. data/test/active_record_test.rb +149 -140
  19. data/test/cipher_test.rb +98 -6
  20. data/test/config/{mongoid_v5.yml → mongoid.yml} +0 -0
  21. data/test/config/symmetric-encryption.yml +4 -10
  22. data/test/config/test_new.key +2 -2
  23. data/test/encoder_test.rb +61 -0
  24. data/test/mongoid_test.rb +12 -22
  25. data/test/reader_test.rb +16 -11
  26. data/test/symmetric_encryption_test.rb +23 -3
  27. data/test/test_db.sqlite3 +0 -0
  28. data/test/test_helper.rb +2 -16
  29. data/test/writer_test.rb +1 -5
  30. metadata +11 -12
  31. data/test/config/mongoid_v2.yml +0 -6
  32. data/test/config/mongoid_v3.yml +0 -9
  33. data/test/mongo_mapper_test.rb +0 -599
data/test/test_db.sqlite3 CHANGED
Binary file
data/test/test_helper.rb CHANGED
@@ -1,25 +1,11 @@
1
- # Allow examples to be run in-place without requiring a gem install
2
1
  $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
3
2
 
4
3
  require 'yaml'
5
4
  require 'minitest/autorun'
6
- require 'minitest/reporters'
7
- require 'semantic_logger'
8
- # Since we want both the AR and Mongoid extensions loaded we need to require them first
5
+ require 'minitest/stub_any_instance'
6
+ require 'awesome_print'
9
7
  require 'active_record'
10
8
  require 'symmetric-encryption'
11
- require 'awesome_print'
12
-
13
- begin
14
- require 'active_model/serializers'
15
- rescue LoadError
16
- # Only used when running Rails 5 and MongoMapper
17
- end
18
-
19
- #Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
20
-
21
- SemanticLogger.add_appender(file_name: 'test.log', formatter: :color)
22
- SemanticLogger.default_level = :trace
23
9
 
24
10
  # Load Symmetric Encryption keys
25
11
  SymmetricEncryption.load!(File.join(File.dirname(__FILE__), 'config', 'symmetric-encryption.yml'), 'test')
data/test/writer_test.rb CHANGED
@@ -13,11 +13,7 @@ class WriterTest < Minitest::Test
13
13
  ]
14
14
  @data_str = @data.inject('') { |sum, str| sum << str }
15
15
  @data_len = @data_str.length
16
- cipher = SymmetricEncryption.cipher
17
- before = cipher.always_add_header
18
- cipher.always_add_header = false
19
- @data_encrypted = SymmetricEncryption.cipher.binary_encrypt(@data_str, false, false)
20
- cipher.always_add_header = before
16
+ @data_encrypted = SymmetricEncryption.cipher.binary_encrypt(@data_str, false, false, false)
21
17
  @filename = '._test'
22
18
  end
23
19
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: symmetric-encryption
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.8.3
4
+ version: 3.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-19 00:00:00.000000000 Z
11
+ date: 2017-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: coercible
@@ -46,16 +46,19 @@ files:
46
46
  - lib/symmetric_encryption/cipher.rb
47
47
  - lib/symmetric_encryption/coerce.rb
48
48
  - lib/symmetric_encryption/config.rb
49
+ - lib/symmetric_encryption/encoder.rb
49
50
  - lib/symmetric_encryption/exception.rb
50
51
  - lib/symmetric_encryption/extensions/active_record/base.rb
51
52
  - lib/symmetric_encryption/extensions/mongo_mapper/plugins/encrypted_key.rb
52
53
  - lib/symmetric_encryption/extensions/mongoid/encrypted.rb
53
54
  - lib/symmetric_encryption/generator.rb
55
+ - lib/symmetric_encryption/key_encryption_key.rb
54
56
  - lib/symmetric_encryption/railtie.rb
55
57
  - lib/symmetric_encryption/railties/symmetric_encryption.rake
56
58
  - lib/symmetric_encryption/railties/symmetric_encryption_validator.rb
57
59
  - lib/symmetric_encryption/reader.rb
58
60
  - lib/symmetric_encryption/symmetric_encryption.rb
61
+ - lib/symmetric_encryption/utils/re_encrypt_config_files.rb
59
62
  - lib/symmetric_encryption/version.rb
60
63
  - lib/symmetric_encryption/writer.rb
61
64
  - test/active_record_test.rb
@@ -63,15 +66,13 @@ files:
63
66
  - test/config/database.yml
64
67
  - test/config/empty.csv
65
68
  - test/config/mongo_mapper.yml
66
- - test/config/mongoid_v2.yml
67
- - test/config/mongoid_v3.yml
68
- - test/config/mongoid_v5.yml
69
+ - test/config/mongoid.yml
69
70
  - test/config/symmetric-encryption.yml
70
71
  - test/config/test_new.iv
71
72
  - test/config/test_new.key
72
73
  - test/config/test_secondary_1.iv
73
74
  - test/config/test_secondary_1.key
74
- - test/mongo_mapper_test.rb
75
+ - test/encoder_test.rb
75
76
  - test/mongoid_test.rb
76
77
  - test/reader_test.rb
77
78
  - test/symmetric_encryption_test.rb
@@ -90,7 +91,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
91
  requirements:
91
92
  - - ">="
92
93
  - !ruby/object:Gem::Version
93
- version: '0'
94
+ version: '2.1'
94
95
  required_rubygems_version: !ruby/object:Gem::Requirement
95
96
  requirements:
96
97
  - - ">="
@@ -98,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
99
  version: '0'
99
100
  requirements: []
100
101
  rubyforge_project:
101
- rubygems_version: 2.5.1
102
+ rubygems_version: 2.6.11
102
103
  signing_key:
103
104
  specification_version: 4
104
105
  summary: Encryption for Ruby, and Ruby on Rails
@@ -108,15 +109,13 @@ test_files:
108
109
  - test/config/database.yml
109
110
  - test/config/empty.csv
110
111
  - test/config/mongo_mapper.yml
111
- - test/config/mongoid_v2.yml
112
- - test/config/mongoid_v3.yml
113
- - test/config/mongoid_v5.yml
112
+ - test/config/mongoid.yml
114
113
  - test/config/symmetric-encryption.yml
115
114
  - test/config/test_new.iv
116
115
  - test/config/test_new.key
117
116
  - test/config/test_secondary_1.iv
118
117
  - test/config/test_secondary_1.key
119
- - test/mongo_mapper_test.rb
118
+ - test/encoder_test.rb
120
119
  - test/mongoid_test.rb
121
120
  - test/reader_test.rb
122
121
  - test/symmetric_encryption_test.rb
@@ -1,6 +0,0 @@
1
- test:
2
- host: localhost
3
- # All Dates and Times should be returned in UTC, not the local timezone
4
- use_utc: true
5
- persist_in_safe_mode: true
6
- database: symmetric_encryption_test
@@ -1,9 +0,0 @@
1
- test:
2
- sessions:
3
- default:
4
- hosts:
5
- - localhost:27017
6
- # All Dates and Times should be returned in UTC, not the local timezone
7
- use_utc: true
8
- persist_in_safe_mode: true
9
- database: symmetric_encryption_test
@@ -1,599 +0,0 @@
1
- begin
2
- require 'mongo_mapper'
3
- require_relative 'test_helper'
4
- require_relative '../lib/symmetric_encryption/extensions/mongo_mapper/plugins/encrypted_key'
5
-
6
- # Initialize MongoMapper
7
- config_file = File.join('test', 'config', 'mongo_mapper.yml')
8
- config = YAML.load(ERB.new(File.read(config_file)).result)
9
- MongoMapper.setup(config, 'test', logger: SemanticLogger['Mongo'])
10
-
11
- #@formatter:off
12
- class MongoMapperUser
13
- include MongoMapper::Document
14
-
15
- key :name, String
16
- encrypted_key :bank_account_number, String
17
- encrypted_key :social_security_number, String
18
- encrypted_key :string, String, encrypted: { random_iv: true }
19
- encrypted_key :long_string, String, encrypted: { random_iv: true, compress: true }
20
-
21
- # Valid Types: String, Integer, Float, BigDecimal, DateTime, Time, Date, Hash
22
- encrypted_key :integer_value, Integer
23
- encrypted_key :aliased_integer_value, Integer, encrypted: { encrypt_as: :aiv }
24
- encrypted_key :float_value, Float
25
- encrypted_key :decimal_value, BigDecimal
26
- encrypted_key :datetime_value, DateTime
27
- encrypted_key :time_value, Time
28
- encrypted_key :date_value, Date
29
- encrypted_key :true_value, Boolean
30
- encrypted_key :false_value, Boolean
31
- encrypted_key :data_json, Hash, encrypted: {random_iv: true, compress: true}
32
- encrypted_key :data_yaml, Hash, encrypted: {random_iv: true, compress: true, type: :yaml}
33
-
34
- validates :encrypted_bank_account_number, symmetric_encryption: true
35
- validates :encrypted_social_security_number, symmetric_encryption: true
36
- end
37
-
38
- class MongoMapperUniqueUser
39
- include MongoMapper::Document
40
-
41
- encrypted_key :email, String, symmetric_encryption: true
42
- encrypted_key :username, String, symmetric_encryption: true
43
-
44
- validates_uniqueness_of :encrypted_email, allow_blank: true, if: :encrypted_email_changed?
45
- validates_uniqueness_of :encrypted_username, allow_blank: true, if: :encrypted_username_changed?
46
-
47
- validates :username,
48
- length: {in: 3..20},
49
- format: {with: /\A[\w\-]+\z/},
50
- allow_blank: true
51
- end
52
- #@formatter:on
53
-
54
- #
55
- # Unit Tests for MongoMapper
56
- #
57
- class MongoMapperTest < Minitest::Test
58
- describe 'MongoMapperUser' do
59
- before do
60
- @bank_account_number = '1234567890'
61
- @bank_account_number_encrypted = 'QEVuQwIAL94ArJeFlJrZp6SYsvoOGA=='
62
-
63
- @social_security_number = '987654321'
64
- @social_security_number_encrypted = 'QEVuQwIAS+8X1NRrqdfEIQyFHVPuVA=='
65
-
66
- @integer = 32768
67
- @integer_encrypted = 'FA3smFQEKqB/ITv+A0xACg=='
68
-
69
- @float = 0.9867
70
- @float_encrypted = 'z7Pwt2JDp74d+u0IXFAdrQ=='
71
-
72
- @date = Date.parse('20120320')
73
- @date_encrypted = 'WTkSPHo5ApSSHBJMxxWt2A=='
74
-
75
- @string = 'A string containing some data to be encrypted with a random initialization vector'
76
- @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'
77
-
78
- @integer_value = 12
79
- @float_value = 88.12345
80
- @decimal_value = BigDecimal.new('22.51')
81
- @datetime_value = DateTime.new(2001, 11, 26, 20, 55, 54, "-5")
82
- @time_value = Time.new(2013, 01, 01, 22, 30, 00, "-04:00")
83
- @date_value = Date.new(1927, 04, 02)
84
- @h = {a: 'A', b: 'B'}
85
-
86
- @user = MongoMapperUser.new(
87
- encrypted_bank_account_number: @bank_account_number_encrypted,
88
- encrypted_social_security_number: @social_security_number_encrypted,
89
- name: 'Joe Bloggs',
90
- # data type specific fields
91
- integer_value: @integer_value,
92
- aliased_integer_value: @integer_value,
93
- float_value: @float_value,
94
- decimal_value: @decimal_value,
95
- datetime_value: @datetime_value,
96
- time_value: @time_value,
97
- date_value: @date_value,
98
- true_value: true,
99
- false_value: false,
100
- data_yaml: @h.dup,
101
- data_json: @h.dup
102
- )
103
- end
104
-
105
- it 'have encrypted methods' do
106
- assert_equal true, @user.respond_to?(:encrypted_bank_account_number)
107
- assert_equal true, @user.respond_to?(:encrypted_social_security_number)
108
- assert_equal true, @user.respond_to?(:encrypted_string)
109
- assert_equal true, @user.respond_to?(:encrypted_long_string)
110
- assert_equal false, @user.respond_to?(:encrypted_name)
111
-
112
- assert_equal true, @user.respond_to?(:encrypted_bank_account_number=)
113
- assert_equal true, @user.respond_to?(:encrypted_social_security_number=)
114
- assert_equal true, @user.respond_to?(:encrypted_string=)
115
- assert_equal true, @user.respond_to?(:encrypted_long_string=)
116
- assert_equal false, @user.respond_to?(:encrypted_name=)
117
- end
118
-
119
- it 'have unencrypted methods' do
120
- assert_equal true, @user.respond_to?(:bank_account_number)
121
- assert_equal true, @user.respond_to?(:social_security_number)
122
- assert_equal true, @user.respond_to?(:string)
123
- assert_equal true, @user.respond_to?(:long_string)
124
- assert_equal true, @user.respond_to?(:name)
125
-
126
- assert_equal true, @user.respond_to?(:bank_account_number=)
127
- assert_equal true, @user.respond_to?(:social_security_number=)
128
- assert_equal true, @user.respond_to?(:string=)
129
- assert_equal true, @user.respond_to?(:long_string=)
130
- assert_equal true, @user.respond_to?(:name=)
131
- end
132
-
133
- it 'support aliased fields' do
134
- assert_equal true, @user.respond_to?(:aliased_integer_value=)
135
- assert_equal true, @user.respond_to?(:aliased_integer_value)
136
- end
137
-
138
- it 'have unencrypted values' do
139
- assert_equal @bank_account_number, @user.bank_account_number
140
- assert_equal @social_security_number, @user.social_security_number
141
- end
142
-
143
- it 'have encrypted values' do
144
- assert_equal @bank_account_number_encrypted, @user.encrypted_bank_account_number
145
- assert_equal @social_security_number_encrypted, @user.encrypted_social_security_number
146
- end
147
-
148
- it 'support same iv' do
149
- @user.social_security_number = @social_security_number
150
- assert first_value = @user.social_security_number
151
- # Assign the same value
152
- @user.social_security_number = @social_security_number
153
- assert_equal first_value, @user.social_security_number
154
- end
155
-
156
- it 'support a random iv' do
157
- @user.string = @string
158
- assert first_value = @user.encrypted_string
159
- # Assign the same value
160
- @user.string = @string.dup
161
- assert_equal true, first_value != @user.encrypted_string
162
- end
163
-
164
- it 'support a random iv and compress' do
165
- @user.string = @long_string
166
- @user.long_string = @long_string
167
-
168
- assert_equal true, (@user.encrypted_long_string.length.to_f / @user.encrypted_string.length) < 0.8
169
- end
170
-
171
- it 'encrypt' do
172
- user = MongoMapperUser.new
173
- user.bank_account_number = @bank_account_number
174
- assert_equal @bank_account_number, user.bank_account_number
175
- assert_equal @bank_account_number_encrypted, user.encrypted_bank_account_number
176
- end
177
-
178
- it 'all paths it lead to the same result' do
179
- assert_equal @bank_account_number_encrypted, (@user.encrypted_social_security_number = @bank_account_number_encrypted)
180
- assert_equal @bank_account_number, @user.social_security_number
181
- end
182
-
183
- it 'all paths it lead to the same result 2' do
184
- assert_equal @bank_account_number, (@user.social_security_number = @bank_account_number)
185
- assert_equal @bank_account_number_encrypted, @user.encrypted_social_security_number
186
- end
187
-
188
- it "all paths it lead to the same result, check uninitialized" do
189
- user = MongoMapperUser.new
190
- assert_equal nil, user.social_security_number
191
- assert_equal @bank_account_number, (user.social_security_number = @bank_account_number)
192
- assert_equal @bank_account_number, user.social_security_number
193
- assert_equal @bank_account_number_encrypted, user.encrypted_social_security_number
194
-
195
- assert_equal nil, (user.social_security_number = nil)
196
- assert_equal nil, user.social_security_number
197
- assert_equal nil, user.encrypted_social_security_number
198
- end
199
-
200
- it 'allow unencrypted values to be passed to the constructor' do
201
- user = MongoMapperUser.new(bank_account_number: @bank_account_number, social_security_number: @social_security_number)
202
- assert_equal @bank_account_number, user.bank_account_number
203
- assert_equal @social_security_number, user.social_security_number
204
- assert_equal @bank_account_number_encrypted, user.encrypted_bank_account_number
205
- assert_equal @social_security_number_encrypted, user.encrypted_social_security_number
206
- end
207
-
208
- it 'allow both encrypted and unencrypted values to be passed to the constructor' do
209
- user = MongoMapperUser.new(encrypted_bank_account_number: @bank_account_number_encrypted, social_security_number: @social_security_number)
210
- assert_equal @bank_account_number, user.bank_account_number
211
- assert_equal @social_security_number, user.social_security_number
212
- assert_equal @bank_account_number_encrypted, user.encrypted_bank_account_number
213
- assert_equal @social_security_number_encrypted, user.encrypted_social_security_number
214
- end
215
-
216
- describe 'changed?' do
217
- before do
218
- @user.save!
219
- end
220
-
221
- after do
222
- @user.destroy if @user
223
- end
224
-
225
- it 'return false if it was not changed' do
226
- assert_equal false, @user.encrypted_bank_account_number_changed?
227
- assert_equal false, @user.bank_account_number_changed?
228
- end
229
-
230
- it 'return true if it was changed' do
231
- @user.bank_account_number = '15424623'
232
- assert_equal true, @user.encrypted_bank_account_number_changed?
233
- assert_equal true, @user.bank_account_number_changed?
234
- end
235
- end
236
-
237
- describe 'data types' do
238
- before do
239
- @user.save!
240
- @user_clone = MongoMapperUser.find(@user.id)
241
- end
242
-
243
- after do
244
- @user.destroy if @user
245
- end
246
-
247
- describe 'aliased fields' do
248
- it 'return correct data type' do
249
- @user_clone.aliased_integer_value = '5'
250
- assert_equal 5, @user_clone.aliased_integer_value
251
- end
252
- end
253
-
254
- describe 'integer values' do
255
- it 'return correct data type' do
256
- assert_equal @integer_value, @user_clone.integer_value
257
- assert @user.clone.integer_value.kind_of?(Integer)
258
- end
259
-
260
- it 'coerce data type before save' do
261
- u = MongoMapperUser.new(integer_value: '5')
262
- assert_equal 5, u.integer_value
263
- assert u.integer_value.kind_of?(Integer)
264
- end
265
-
266
- it 'permit replacing value with nil' do
267
- @user_clone.integer_value = nil
268
- @user_clone.save!
269
-
270
- @user.reload
271
- assert_nil @user.integer_value
272
- assert_nil @user.encrypted_integer_value
273
- end
274
-
275
- it 'permit replacing value' do
276
- new_integer_value = 98
277
- @user_clone.integer_value = new_integer_value
278
- @user_clone.save!
279
-
280
- @user.reload
281
- assert_equal new_integer_value, @user.integer_value
282
- end
283
- end
284
-
285
- describe 'float values' do
286
- it 'return correct data type' do
287
- assert_equal @float_value, @user_clone.float_value
288
- assert @user.clone.float_value.kind_of?(Float)
289
- end
290
-
291
- it 'coerce data type before save' do
292
- u = MongoMapperUser.new(float_value: '5.6')
293
- assert_equal 5.6, u.float_value
294
- assert u.float_value.kind_of?(Float)
295
- end
296
-
297
- it 'permit replacing value with nil' do
298
- @user_clone.float_value = nil
299
- @user_clone.save!
300
-
301
- @user.reload
302
- assert_nil @user.float_value
303
- assert_nil @user.encrypted_float_value
304
- end
305
-
306
- it 'permit replacing value' do
307
- new_float_value = 45.4321
308
- @user_clone.float_value = new_float_value
309
- @user_clone.save!
310
-
311
- @user.reload
312
- assert_equal new_float_value, @user.float_value
313
- end
314
- end
315
-
316
- describe 'decimal values' do
317
- it 'return correct data type' do
318
- assert_equal @decimal_value, @user_clone.decimal_value
319
- assert @user.clone.decimal_value.kind_of?(BigDecimal)
320
- end
321
-
322
- it 'coerce data type before save' do
323
- u = MongoMapperUser.new(decimal_value: '99.95')
324
- assert_equal BigDecimal.new('99.95'), u.decimal_value
325
- assert u.decimal_value.kind_of?(BigDecimal)
326
- end
327
-
328
- it 'permit replacing value with nil' do
329
- @user_clone.decimal_value = nil
330
- @user_clone.save!
331
-
332
- @user.reload
333
- assert_nil @user.decimal_value
334
- assert_nil @user.encrypted_decimal_value
335
- end
336
-
337
- it 'permit replacing value' do
338
- new_decimal_value = BigDecimal.new('99.95')
339
- @user_clone.decimal_value = new_decimal_value
340
- @user_clone.save!
341
-
342
- @user.reload
343
- assert_equal new_decimal_value, @user.decimal_value
344
- end
345
- end
346
-
347
- describe 'datetime values' do
348
- it 'return correct data type' do
349
- assert_equal @datetime_value, @user_clone.datetime_value
350
- assert @user.clone.datetime_value.kind_of?(DateTime)
351
- end
352
-
353
- it 'coerce data type before save' do
354
- now = Time.now
355
- u = MongoMapperUser.new(datetime_value: now)
356
- assert_equal now, u.datetime_value
357
- assert u.datetime_value.kind_of?(DateTime)
358
- end
359
-
360
- it 'permit replacing value with nil' do
361
- @user_clone.datetime_value = nil
362
- @user_clone.save!
363
-
364
- @user.reload
365
- assert_nil @user.datetime_value
366
- assert_nil @user.encrypted_datetime_value
367
- end
368
-
369
- it 'permit replacing value' do
370
- new_datetime_value = DateTime.new(1998, 10, 21, 8, 33, 28, '+5')
371
- @user_clone.datetime_value = new_datetime_value
372
- @user_clone.save!
373
-
374
- @user.reload
375
- assert_equal new_datetime_value, @user.datetime_value
376
- end
377
- end
378
-
379
- describe 'time values' do
380
- it 'return correct data type' do
381
- assert_equal @time_value, @user_clone.time_value
382
- assert @user.clone.time_value.kind_of?(Time)
383
- end
384
-
385
- it 'coerce data type before save' do
386
- now = Time.now
387
- u = MongoMapperUser.new(time_value: now)
388
- assert_equal now, u.time_value
389
- assert u.time_value.kind_of?(Time)
390
- end
391
-
392
- it 'permit replacing value with nil' do
393
- @user_clone.time_value = nil
394
- @user_clone.save!
395
-
396
- @user.reload
397
- assert_nil @user.time_value
398
- assert_nil @user.encrypted_time_value
399
- end
400
-
401
- it 'permit replacing value' do
402
- new_time_value = Time.new(1998, 10, 21, 8, 33, 28, '+04:00')
403
- @user_clone.time_value = new_time_value
404
- @user_clone.save!
405
-
406
- @user.reload
407
- assert_equal new_time_value, @user.time_value
408
- end
409
- end
410
-
411
- describe 'date values' do
412
- it 'return correct data type' do
413
- assert_equal @date_value, @user_clone.date_value
414
- assert @user.clone.date_value.kind_of?(Date)
415
- end
416
-
417
- it 'coerce data type before save' do
418
- now = Time.now
419
- u = MongoMapperUser.new(date_value: now)
420
- assert_equal now.to_date, u.date_value
421
- assert u.date_value.kind_of?(Date)
422
- end
423
-
424
- it 'permit replacing value with nil' do
425
- @user_clone.date_value = nil
426
- @user_clone.save!
427
-
428
- @user.reload
429
- assert_nil @user.date_value
430
- assert_nil @user.encrypted_date_value
431
- end
432
-
433
- it 'permit replacing value' do
434
- new_date_value = Date.new(1998, 10, 21)
435
- @user_clone.date_value = new_date_value
436
- @user_clone.save!
437
-
438
- @user.reload
439
- assert_equal new_date_value, @user.date_value
440
- end
441
- end
442
-
443
- describe 'true values' do
444
- it 'return correct data type' do
445
- assert_equal true, @user_clone.true_value
446
- assert @user.clone.true_value.kind_of?(TrueClass)
447
- end
448
-
449
- it 'coerce data type before save' do
450
- u = MongoMapperUser.new(true_value: '1')
451
- assert_equal true, u.true_value
452
- assert u.true_value.kind_of?(TrueClass)
453
- end
454
-
455
- it 'permit replacing value with nil' do
456
- @user_clone.true_value = nil
457
- @user_clone.save!
458
-
459
- @user.reload
460
- assert_nil @user.true_value
461
- assert_nil @user.encrypted_true_value
462
- end
463
-
464
- it 'permit replacing value' do
465
- new_value = false
466
- @user_clone.true_value = new_value
467
- @user_clone.save!
468
-
469
- @user.reload
470
- assert_equal new_value, @user.true_value
471
- end
472
- end
473
-
474
- describe 'false values' do
475
- it 'return correct data type' do
476
- assert_equal false, @user_clone.false_value
477
- assert @user.clone.false_value.kind_of?(FalseClass)
478
- end
479
-
480
- it 'coerce data type before save' do
481
- u = MongoMapperUser.new(false_value: '0')
482
- assert_equal false, u.false_value
483
- assert u.false_value.kind_of?(FalseClass)
484
- end
485
-
486
- it 'permit replacing value with nil' do
487
- @user_clone.false_value = nil
488
- @user_clone.save!
489
-
490
- @user.reload
491
- assert_nil @user.false_value
492
- assert_nil @user.encrypted_false_value
493
- end
494
-
495
- it 'permit replacing value' do
496
- new_value = true
497
- @user_clone.false_value = new_value
498
- @user_clone.save!
499
-
500
- @user.reload
501
- assert_equal new_value, @user.false_value
502
- end
503
- end
504
-
505
- describe 'JSON Serialization' do
506
- before do
507
- # JSON Does not support symbols, so they will come back as strings
508
- # Convert symbols to string in the test
509
- @h.keys.each do |k|
510
- @h[k.to_s] = @h[k]
511
- @h.delete(k)
512
- end
513
- end
514
-
515
- it 'return correct data type' do
516
- assert_equal @h, @user_clone.data_json
517
- assert @user.clone.data_json.kind_of?(Hash)
518
- end
519
-
520
- it 'not coerce data type (leaves as hash) before save' do
521
- u = MongoMapperUser.new(data_json: @h)
522
- assert_equal @h, u.data_json
523
- assert u.data_json.kind_of?(Hash)
524
- end
525
-
526
- it 'permit replacing value with nil' do
527
- @user_clone.data_json = nil
528
- @user_clone.save!
529
-
530
- @user.reload
531
- assert_nil @user.data_json
532
- assert_nil @user.encrypted_data_json
533
- end
534
-
535
- it 'permit replacing value' do
536
- new_value = @h.clone
537
- new_value['c'] = 'C'
538
- @user_clone.data_json = new_value
539
- @user_clone.save!
540
-
541
- @user.reload
542
- assert_equal new_value, @user.data_json
543
- end
544
- end
545
-
546
- describe 'YAML Serialization' do
547
- it 'return correct data type' do
548
- assert_equal @h, @user_clone.data_yaml
549
- assert @user.clone.data_yaml.kind_of?(Hash)
550
- end
551
-
552
- it 'not coerce data type (leaves as hash) before save' do
553
- u = MongoMapperUser.new(data_yaml: @h)
554
- assert_equal @h, u.data_yaml
555
- assert u.data_yaml.kind_of?(Hash)
556
- end
557
-
558
- it 'permit replacing value with nil' do
559
- @user_clone.data_yaml = nil
560
- @user_clone.save!
561
-
562
- @user.reload
563
- assert_nil @user.data_yaml
564
- assert_nil @user.encrypted_data_yaml
565
- end
566
-
567
- it 'permit replacing value' do
568
- new_value = @h.clone
569
- new_value[:c] = 'C'
570
- @user_clone.data_yaml = new_value
571
- @user_clone.save!
572
-
573
- @user.reload
574
- assert_equal new_value, @user.data_yaml
575
- end
576
- end
577
-
578
- end
579
-
580
- describe 'uniqueness' do
581
- before do
582
- MongoMapperUniqueUser.destroy_all
583
- @email = 'whatever@not-unique.com'
584
- @username = 'gibby007'
585
- @user = MongoMapperUniqueUser.create!(email: @email)
586
- end
587
-
588
- it 'does not allow duplicate values' do
589
- duplicate = MongoMapperUniqueUser.new(email: @email)
590
- assert_equal false, duplicate.valid?
591
- assert_equal 'has already been taken', duplicate.errors.messages[:encrypted_email].first
592
- end
593
- end
594
-
595
- end
596
- end
597
- rescue LoadError
598
- puts 'Not running MongoMapper tests because mongo_mapper gem is not installed!!!'
599
- end