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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/Rakefile +16 -16
- data/examples/symmetric-encryption.yml +33 -38
- data/lib/rails/generators/symmetric_encryption/config/templates/symmetric-encryption.yml +10 -14
- data/lib/rails/generators/symmetric_encryption/heroku_config/templates/symmetric-encryption.yml +28 -25
- data/lib/symmetric_encryption.rb +14 -6
- data/lib/symmetric_encryption/cipher.rb +151 -130
- data/lib/symmetric_encryption/config.rb +0 -1
- data/lib/symmetric_encryption/encoder.rb +79 -0
- data/lib/symmetric_encryption/extensions/active_record/base.rb +94 -134
- data/lib/symmetric_encryption/extensions/mongo_mapper/plugins/encrypted_key.rb +3 -89
- data/lib/symmetric_encryption/key_encryption_key.rb +32 -0
- data/lib/symmetric_encryption/railtie.rb +3 -3
- data/lib/symmetric_encryption/symmetric_encryption.rb +41 -8
- data/lib/symmetric_encryption/utils/re_encrypt_config_files.rb +82 -0
- data/lib/symmetric_encryption/version.rb +1 -1
- data/test/active_record_test.rb +149 -140
- data/test/cipher_test.rb +98 -6
- data/test/config/{mongoid_v5.yml → mongoid.yml} +0 -0
- data/test/config/symmetric-encryption.yml +4 -10
- data/test/config/test_new.key +2 -2
- data/test/encoder_test.rb +61 -0
- data/test/mongoid_test.rb +12 -22
- data/test/reader_test.rb +16 -11
- data/test/symmetric_encryption_test.rb +23 -3
- data/test/test_db.sqlite3 +0 -0
- data/test/test_helper.rb +2 -16
- data/test/writer_test.rb +1 -5
- metadata +11 -12
- data/test/config/mongoid_v2.yml +0 -6
- data/test/config/mongoid_v3.yml +0 -9
- 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/
|
7
|
-
require '
|
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
|
-
|
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.
|
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:
|
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/
|
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/
|
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: '
|
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.
|
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/
|
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/
|
118
|
+
- test/encoder_test.rb
|
120
119
|
- test/mongoid_test.rb
|
121
120
|
- test/reader_test.rb
|
122
121
|
- test/symmetric_encryption_test.rb
|
data/test/config/mongoid_v2.yml
DELETED
data/test/config/mongoid_v3.yml
DELETED
data/test/mongo_mapper_test.rb
DELETED
@@ -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
|