test/mongoid_test.rb in symmetric-encryption-3.7.2 vs test/mongoid_test.rb in symmetric-encryption-3.8.0
- old
+ new
@@ -3,13 +3,14 @@
require_relative 'test_helper'
require_relative '../lib/symmetric_encryption/extensions/mongoid/encrypted'
ENV['RACK_ENV'] = 'test'
Mongoid.logger = SemanticLogger[Mongoid]
- filename = defined?(Mongoid::VERSION) ? "test/config/mongoid_v3.yml" : "test/config/mongoid_v2.yml"
+ filename = defined?(Mongoid::VERSION) ? "test/config/mongoid_v3.yml" : "test/config/mongoid_v2.yml"
Mongoid.load!(filename)
+ #@formatter:off
class MongoidUser
include Mongoid::Document
field :name, type: String
field :encrypted_bank_account_number, type: String, encrypted: true
@@ -31,62 +32,78 @@
validates :encrypted_bank_account_number, symmetric_encryption: true
validates :encrypted_social_security_number, symmetric_encryption: true
end
+ class MongoidUniqueUser
+ include Mongoid::Document
+
+ field :encrypted_email, type: String, encrypted: true
+ field :encrypted_username, type: String, encrypted: true
+
+ validates_uniqueness_of :encrypted_email, allow_blank: true, if: :encrypted_email_changed?
+ validates_uniqueness_of :encrypted_username, allow_blank: true, if: :encrypted_username_changed?
+
+ validates :username,
+ length: {in: 3..20},
+ format: {with: /\A[\w\d\-[[:alnum:]]]+\z/},
+ allow_blank: true
+ end
+ #@formatter:on
+
#
# Unit Tests for field encrypted and validation aspects of SymmetricEncryption
#
class MongoidTest < Minitest::Test
- context 'Mongoid' do
- setup do
- @bank_account_number = "1234567890"
+ describe 'Mongoid' do
+ before do
+ @bank_account_number = "1234567890"
@bank_account_number_encrypted = "QEVuQwIAL94ArJeFlJrZp6SYsvoOGA=="
- @social_security_number = "987654321"
+ @social_security_number = "987654321"
@social_security_number_encrypted = "QEVuQwIAS+8X1NRrqdfEIQyFHVPuVA=="
- @integer = 32768
+ @integer = 32768
@integer_encrypted = "FA3smFQEKqB/ITv+A0xACg=="
- @float = 0.9867
+ @float = 0.9867
@float_encrypted = "z7Pwt2JDp74d+u0IXFAdrQ=="
- @date = Date.parse('20120320')
+ @date = Date.parse('20120320')
@date_encrypted = "WTkSPHo5ApSSHBJMxxWt2A=="
- @string = "A string containing some data to be encrypted with a random initialization vector"
+ @string = "A string containing some data to be encrypted with a random initialization vector"
@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"
- @integer_value = 12
- @float_value = 88.12345
- @decimal_value = BigDecimal.new("22.51")
+ @integer_value = 12
+ @float_value = 88.12345
+ @decimal_value = BigDecimal.new("22.51")
@datetime_value = DateTime.new(2001, 11, 26, 20, 55, 54, "-5")
- @time_value = Time.new(2013, 01, 01, 22, 30, 00, "-04:00")
- @date_value = Date.new(1927, 04, 02)
- @h = { a: 'A', b: 'B' }
+ @time_value = Time.new(2013, 01, 01, 22, 30, 00, "-04:00")
+ @date_value = Date.new(1927, 04, 02)
+ @h = {a: 'A', b: 'B'}
@user = MongoidUser.new(
- encrypted_bank_account_number: @bank_account_number_encrypted,
+ encrypted_bank_account_number: @bank_account_number_encrypted,
encrypted_social_security_number: @social_security_number_encrypted,
- name: "Joe Bloggs",
+ name: "Joe Bloggs",
# data type specific fields
- integer_value: @integer_value,
- aliased_integer_value: @integer_value,
- float_value: @float_value,
- decimal_value: @decimal_value,
- datetime_value: @datetime_value,
- time_value: @time_value,
- date_value: @date_value,
- true_value: true,
- false_value: false,
- data_yaml: @h.dup,
- data_json: @h.dup
+ integer_value: @integer_value,
+ aliased_integer_value: @integer_value,
+ float_value: @float_value,
+ decimal_value: @decimal_value,
+ datetime_value: @datetime_value,
+ time_value: @time_value,
+ date_value: @date_value,
+ true_value: true,
+ false_value: false,
+ data_yaml: @h.dup,
+ data_json: @h.dup
)
end
- should "have encrypted methods" do
+ it "have encrypted methods" do
assert_equal true, @user.respond_to?(:encrypted_bank_account_number)
assert_equal true, @user.respond_to?(:encrypted_social_security_number)
assert_equal true, @user.respond_to?(:encrypted_string)
assert_equal true, @user.respond_to?(:encrypted_long_string)
assert_equal false, @user.respond_to?(:encrypted_name)
@@ -96,11 +113,11 @@
assert_equal true, @user.respond_to?(:encrypted_string=)
assert_equal true, @user.respond_to?(:encrypted_long_string=)
assert_equal false, @user.respond_to?(:encrypted_name=)
end
- should "have unencrypted methods" do
+ it "have unencrypted methods" do
assert_equal true, @user.respond_to?(:bank_account_number)
assert_equal true, @user.respond_to?(:social_security_number)
assert_equal true, @user.respond_to?(:string)
assert_equal true, @user.respond_to?(:long_string)
assert_equal true, @user.respond_to?(:name)
@@ -110,66 +127,66 @@
assert_equal true, @user.respond_to?(:string=)
assert_equal true, @user.respond_to?(:long_string=)
assert_equal true, @user.respond_to?(:name=)
end
- should "support aliased fields" do
+ it "support aliased fields" do
assert_equal true, @user.respond_to?(:aliased_integer_value=)
assert_equal true, @user.respond_to?(:aliased_integer_value)
end
- should "have unencrypted values" do
+ it "have unencrypted values" do
assert_equal @bank_account_number, @user.bank_account_number
assert_equal @social_security_number, @user.social_security_number
end
- should "have encrypted values" do
+ it "have encrypted values" do
assert_equal @bank_account_number_encrypted, @user.encrypted_bank_account_number
assert_equal @social_security_number_encrypted, @user.encrypted_social_security_number
end
- should "support same iv" do
+ it "support same iv" do
@user.social_security_number = @social_security_number
assert first_value = @user.social_security_number
# Assign the same value
@user.social_security_number = @social_security_number
assert_equal first_value, @user.social_security_number
end
- should "support a random iv" do
+ it "support a random iv" do
@user.string = @string
assert first_value = @user.encrypted_string
# Assign the same value
@user.string = @string.dup
assert_equal true, first_value != @user.encrypted_string
end
- should "support a random iv and compress" do
- @user.string = @long_string
+ it "support a random iv and compress" do
+ @user.string = @long_string
@user.long_string = @long_string
assert_equal true, (@user.encrypted_long_string.length.to_f / @user.encrypted_string.length) < 0.8
end
- should "encrypt" do
- user = MongoidUser.new
+ it "encrypt" do
+ user = MongoidUser.new
user.bank_account_number = @bank_account_number
assert_equal @bank_account_number, user.bank_account_number
assert_equal @bank_account_number_encrypted, user.encrypted_bank_account_number
end
- should "all paths should lead to the same result" do
+ it "all paths it lead to the same result" do
assert_equal @bank_account_number_encrypted, (@user.encrypted_social_security_number = @bank_account_number_encrypted)
assert_equal @bank_account_number, @user.social_security_number
end
- should "all paths should lead to the same result 2" do
+ it "all paths it lead to the same result 2" do
assert_equal @bank_account_number, (@user.social_security_number = @bank_account_number)
assert_equal @bank_account_number_encrypted, @user.encrypted_social_security_number
end
- should "all paths should lead to the same result, check uninitialized" do
+ it "all paths it lead to the same result, check uninitialized" do
user = MongoidUser.new
assert_equal nil, user.social_security_number
assert_equal @bank_account_number, (user.social_security_number = @bank_account_number)
assert_equal @bank_account_number, user.social_security_number
assert_equal @bank_account_number_encrypted, user.encrypted_social_security_number
@@ -177,366 +194,407 @@
assert_equal nil, (user.social_security_number = nil)
assert_equal nil, user.social_security_number
assert_equal nil, user.encrypted_social_security_number
end
- should "allow unencrypted values to be passed to the constructor" do
+ it "allow unencrypted values to be passed to the constructor" do
user = MongoidUser.new(bank_account_number: @bank_account_number, social_security_number: @social_security_number)
assert_equal @bank_account_number, user.bank_account_number
assert_equal @social_security_number, user.social_security_number
assert_equal @bank_account_number_encrypted, user.encrypted_bank_account_number
assert_equal @social_security_number_encrypted, user.encrypted_social_security_number
end
- should "allow both encrypted and unencrypted values to be passed to the constructor" do
+ it "allow both encrypted and unencrypted values to be passed to the constructor" do
user = MongoidUser.new(encrypted_bank_account_number: @bank_account_number_encrypted, social_security_number: @social_security_number)
assert_equal @bank_account_number, user.bank_account_number
assert_equal @social_security_number, user.social_security_number
assert_equal @bank_account_number_encrypted, user.encrypted_bank_account_number
assert_equal @social_security_number_encrypted, user.encrypted_social_security_number
end
- context "data types" do
- setup do
+ describe 'changed?' do
+ before do
@user.save!
+ end
+
+ after do
+ @user.destroy if @user
+ end
+
+ it 'return false if it was not changed' do
+ assert_equal false, @user.encrypted_bank_account_number_changed?
+ assert_equal false, @user.bank_account_number_changed?
+ end
+
+ it 'return true if it was changed' do
+ @user.bank_account_number = '15424623'
+ assert_equal true, @user.encrypted_bank_account_number_changed?
+ assert_equal true, @user.bank_account_number_changed?
+ end
+ end
+
+ describe "data types" do
+ before do
+ @user.save!
@user_clone = MongoidUser.find(@user.id)
end
- context "aliased fields" do
- should "return correct data type" do
+ after do
+ @user.destroy if @user
+ end
+
+ describe "aliased fields" do
+ it "return correct data type" do
@user_clone.aliased_integer_value = "5"
assert_equal 5, @user_clone.aliased_integer_value
end
end
- context "integer values" do
- should "return correct data type" do
+ describe "integer values" do
+ it "return correct data type" do
assert_equal @integer_value, @user_clone.integer_value
assert @user.clone.integer_value.kind_of?(Integer)
end
- should "coerce data type before save" do
+ it "coerce data type before save" do
u = MongoidUser.new(integer_value: "5")
assert_equal 5, u.integer_value
assert u.integer_value.kind_of?(Integer)
end
- should "permit replacing value with nil" do
+ it "permit replacing value with nil" do
@user_clone.integer_value = nil
@user_clone.save!
@user.reload
assert_nil @user.integer_value
assert_nil @user.encrypted_integer_value
end
- should "permit replacing value" do
- new_integer_value = 98
+ it "permit replacing value" do
+ new_integer_value = 98
@user_clone.integer_value = new_integer_value
@user_clone.save!
@user.reload
assert_equal new_integer_value, @user.integer_value
end
end
- context "float values" do
- should "return correct data type" do
+ describe "float values" do
+ it "return correct data type" do
assert_equal @float_value, @user_clone.float_value
assert @user.clone.float_value.kind_of?(Float)
end
- should "coerce data type before save" do
+ it "coerce data type before save" do
u = MongoidUser.new(float_value: "5.6")
assert_equal 5.6, u.float_value
assert u.float_value.kind_of?(Float)
end
- should "permit replacing value with nil" do
+ it "permit replacing value with nil" do
@user_clone.float_value = nil
@user_clone.save!
@user.reload
assert_nil @user.float_value
assert_nil @user.encrypted_float_value
end
- should "permit replacing value" do
- new_float_value = 45.4321
+ it "permit replacing value" do
+ new_float_value = 45.4321
@user_clone.float_value = new_float_value
@user_clone.save!
@user.reload
assert_equal new_float_value, @user.float_value
end
end
- context "decimal values" do
- should "return correct data type" do
+ describe "decimal values" do
+ it "return correct data type" do
assert_equal @decimal_value, @user_clone.decimal_value
assert @user.clone.decimal_value.kind_of?(BigDecimal)
end
- should "coerce data type before save" do
+ it "coerce data type before save" do
u = MongoidUser.new(decimal_value: "99.95")
assert_equal BigDecimal.new("99.95"), u.decimal_value
assert u.decimal_value.kind_of?(BigDecimal)
end
- should "permit replacing value with nil" do
+ it "permit replacing value with nil" do
@user_clone.decimal_value = nil
@user_clone.save!
@user.reload
assert_nil @user.decimal_value
assert_nil @user.encrypted_decimal_value
end
- should "permit replacing value" do
- new_decimal_value = BigDecimal.new("99.95")
+ it "permit replacing value" do
+ new_decimal_value = BigDecimal.new("99.95")
@user_clone.decimal_value = new_decimal_value
@user_clone.save!
@user.reload
assert_equal new_decimal_value, @user.decimal_value
end
end
- context "datetime values" do
- should "return correct data type" do
+ describe "datetime values" do
+ it "return correct data type" do
assert_equal @datetime_value, @user_clone.datetime_value
assert @user.clone.datetime_value.kind_of?(DateTime)
end
- should "coerce data type before save" do
+ it "coerce data type before save" do
now = Time.now
- u = MongoidUser.new(datetime_value: now)
+ u = MongoidUser.new(datetime_value: now)
assert_equal now, u.datetime_value
assert u.datetime_value.kind_of?(DateTime)
end
- should "permit replacing value with nil" do
+ it "permit replacing value with nil" do
@user_clone.datetime_value = nil
@user_clone.save!
@user.reload
assert_nil @user.datetime_value
assert_nil @user.encrypted_datetime_value
end
- should "permit replacing value" do
- new_datetime_value = DateTime.new(1998, 10, 21, 8, 33, 28, "+5")
+ it "permit replacing value" do
+ new_datetime_value = DateTime.new(1998, 10, 21, 8, 33, 28, "+5")
@user_clone.datetime_value = new_datetime_value
@user_clone.save!
@user.reload
assert_equal new_datetime_value, @user.datetime_value
end
end
- context "time values" do
- should "return correct data type" do
+ describe "time values" do
+ it "return correct data type" do
assert_equal @time_value, @user_clone.time_value
assert @user.clone.time_value.kind_of?(Time)
end
- should "coerce data type before save" do
+ it "coerce data type before save" do
now = Time.now
- u = MongoidUser.new(time_value: now)
+ u = MongoidUser.new(time_value: now)
assert_equal now, u.time_value
assert u.time_value.kind_of?(Time)
end
- should "permit replacing value with nil" do
+ it "permit replacing value with nil" do
@user_clone.time_value = nil
@user_clone.save!
@user.reload
assert_nil @user.time_value
assert_nil @user.encrypted_time_value
end
- should "permit replacing value" do
- new_time_value = Time.new(1998, 10, 21, 8, 33, 28, "+04:00")
+ it "permit replacing value" do
+ new_time_value = Time.new(1998, 10, 21, 8, 33, 28, "+04:00")
@user_clone.time_value = new_time_value
@user_clone.save!
@user.reload
assert_equal new_time_value, @user.time_value
end
end
- context "date values" do
- should "return correct data type" do
+ describe "date values" do
+ it "return correct data type" do
assert_equal @date_value, @user_clone.date_value
assert @user.clone.date_value.kind_of?(Date)
end
- should "coerce data type before save" do
+ it "coerce data type before save" do
now = Time.now
- u = MongoidUser.new(date_value: now)
+ u = MongoidUser.new(date_value: now)
assert_equal now.to_date, u.date_value
assert u.date_value.kind_of?(Date)
end
- should "permit replacing value with nil" do
+ it "permit replacing value with nil" do
@user_clone.date_value = nil
@user_clone.save!
@user.reload
assert_nil @user.date_value
assert_nil @user.encrypted_date_value
end
- should "permit replacing value" do
- new_date_value = Date.new(1998, 10, 21)
+ it "permit replacing value" do
+ new_date_value = Date.new(1998, 10, 21)
@user_clone.date_value = new_date_value
@user_clone.save!
@user.reload
assert_equal new_date_value, @user.date_value
end
end
- context "true values" do
- should "return correct data type" do
+ describe "true values" do
+ it "return correct data type" do
assert_equal true, @user_clone.true_value
assert @user.clone.true_value.kind_of?(TrueClass)
end
- should "coerce data type before save" do
+ it "coerce data type before save" do
u = MongoidUser.new(true_value: "1")
assert_equal true, u.true_value
assert u.true_value.kind_of?(TrueClass)
end
- should "permit replacing value with nil" do
+ it "permit replacing value with nil" do
@user_clone.true_value = nil
@user_clone.save!
@user.reload
assert_nil @user.true_value
assert_nil @user.encrypted_true_value
end
- should "permit replacing value" do
- new_value = false
+ it "permit replacing value" do
+ new_value = false
@user_clone.true_value = new_value
@user_clone.save!
@user.reload
assert_equal new_value, @user.true_value
end
end
- context "false values" do
- should "return correct data type" do
+ describe "false values" do
+ it "return correct data type" do
assert_equal false, @user_clone.false_value
assert @user.clone.false_value.kind_of?(FalseClass)
end
- should "coerce data type before save" do
+ it "coerce data type before save" do
u = MongoidUser.new(false_value: "0")
assert_equal false, u.false_value
assert u.false_value.kind_of?(FalseClass)
end
- should "permit replacing value with nil" do
+ it "permit replacing value with nil" do
@user_clone.false_value = nil
@user_clone.save!
@user.reload
assert_nil @user.false_value
assert_nil @user.encrypted_false_value
end
- should "permit replacing value" do
- new_value = true
+ it "permit replacing value" do
+ new_value = true
@user_clone.false_value = new_value
@user_clone.save!
@user.reload
assert_equal new_value, @user.false_value
end
end
- context "JSON Serialization" do
- setup do
+ describe "JSON Serialization" do
+ before do
# JSON Does not support symbols, so they will come back as strings
# Convert symbols to string in the test
@h.keys.each do |k|
@h[k.to_s] = @h[k]
@h.delete(k)
end
end
- should "return correct data type" do
+ it "return correct data type" do
assert_equal @h, @user_clone.data_json
assert @user.clone.data_json.kind_of?(Hash)
end
- should "not coerce data type (leaves as hash) before save" do
+ it "not coerce data type (leaves as hash) before save" do
u = MongoidUser.new(data_json: @h)
assert_equal @h, u.data_json
assert u.data_json.kind_of?(Hash)
end
- should "permit replacing value with nil" do
+ it "permit replacing value with nil" do
@user_clone.data_json = nil
@user_clone.save!
@user.reload
assert_nil @user.data_json
assert_nil @user.encrypted_data_json
end
- should "permit replacing value" do
- new_value = @h.clone
- new_value['c'] = 'C'
+ it "permit replacing value" do
+ new_value = @h.clone
+ new_value['c'] = 'C'
@user_clone.data_json = new_value
@user_clone.save!
@user.reload
assert_equal new_value, @user.data_json
end
end
- context "YAML Serialization" do
- should "return correct data type" do
+ describe "YAML Serialization" do
+ it "return correct data type" do
assert_equal @h, @user_clone.data_yaml
assert @user.clone.data_yaml.kind_of?(Hash)
end
- should "not coerce data type (leaves as hash) before save" do
+ it "not coerce data type (leaves as hash) before save" do
u = MongoidUser.new(data_yaml: @h)
assert_equal @h, u.data_yaml
assert u.data_yaml.kind_of?(Hash)
end
- should "permit replacing value with nil" do
+ it "permit replacing value with nil" do
@user_clone.data_yaml = nil
@user_clone.save!
@user.reload
assert_nil @user.data_yaml
assert_nil @user.encrypted_data_yaml
end
- should "permit replacing value" do
- new_value = @h.clone
- new_value[:c] = 'C'
+ it "permit replacing value" do
+ new_value = @h.clone
+ new_value[:c] = 'C'
@user_clone.data_yaml = new_value
@user_clone.save!
@user.reload
assert_equal new_value, @user.data_yaml
end
end
end
+ describe 'uniqueness' do
+ before do
+ MongoidUniqueUser.destroy_all
+ @email = 'whatever@not-unique.com'
+ @username = 'gibby007'
+ @user = MongoidUniqueUser.create!(email: @email)
+ @email_user = MongoidUniqueUser.create!(username: @username)
+ end
+
+ it 'does not allow duplicate values' do
+ duplicate = MongoidUniqueUser.new(email: @email)
+ assert_equal false, duplicate.valid?
+ assert_equal 'has already been taken', duplicate.errors.messages[:encrypted_email].first
+ end
+ end
+
end
end
rescue LoadError
puts "Not running Mongoid tests because mongoid gem is not installed!!!"
-end
\ No newline at end of file
+end