test/attr_encrypted_test.rb in symmetric-encryption-3.2 vs test/attr_encrypted_test.rb in symmetric-encryption-3.3
- old
+ new
@@ -1,39 +1,49 @@
-# Allow examples to be run in-place without requiring a gem install
-$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
+require File.dirname(__FILE__) + '/test_helper'
-require 'rubygems'
-require 'logger'
-require 'erb'
-require 'test/unit'
-# Since we want both the AR and Mongoid extensions loaded we need to require them first
-require 'active_record'
-require 'mongoid'
-require 'symmetric-encryption'
-# Should redefines Proc#bind so must include after Rails
-require 'shoulda'
-
-ActiveRecord::Base.logger = Logger.new($stderr)
+ActiveRecord::Base.logger = SemanticLogger[ActiveRecord]
ActiveRecord::Base.configurations = YAML::load(ERB.new(IO.read('test/config/database.yml')).result)
ActiveRecord::Base.establish_connection('test')
ActiveRecord::Schema.define :version => 0 do
create_table :users, :force => true do |t|
t.string :encrypted_bank_account_number
t.string :encrypted_social_security_number
t.string :encrypted_string
t.text :encrypted_long_string
+ t.text :encrypted_data_yaml
+ t.text :encrypted_data_json
t.string :name
+
+ t.string :encrypted_integer_value
+ t.string :encrypted_float_value
+ t.string :encrypted_decimal_value
+ t.string :encrypted_datetime_value
+ t.string :encrypted_time_value
+ t.string :encrypted_date_value
+ t.string :encrypted_true_value
+ t.string :encrypted_false_value
end
end
class User < ActiveRecord::Base
attr_encrypted :bank_account_number
attr_encrypted :social_security_number
attr_encrypted :string, :random_iv => true
attr_encrypted :long_string, :random_iv => true, :compress => true
+ attr_encrypted :data_yaml, :random_iv => true, :compress => true, :type => :yaml
+ attr_encrypted :data_json, :random_iv => true, :compress => true, :type => :json
+ attr_encrypted :integer_value, :type => :integer
+ attr_encrypted :float_value, :type => :float
+ attr_encrypted :decimal_value, :type => :decimal
+ attr_encrypted :datetime_value, :type => :datetime
+ attr_encrypted :time_value, :type => :time
+ attr_encrypted :date_value, :type => :date
+ attr_encrypted :true_value, :type => :boolean
+ attr_encrypted :false_value, :type => :boolean
+
validates :encrypted_bank_account_number, :symmetric_encryption => true
validates :encrypted_social_security_number, :symmetric_encryption => true
end
# Load Symmetric Encryption keys
@@ -64,24 +74,45 @@
@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"
@name = 'Joe Bloggs'
+ @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' }
+
@user = User.new(
# Encrypted Attribute
:bank_account_number => @bank_account_number,
# Encrypted Attribute
:social_security_number => @social_security_number,
- :name => @name
+ :name => @name,
+ # data type specific fields
+ :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
assert_equal true, @user.respond_to?(:encrypted_bank_account_number)
assert_equal true, @user.respond_to?(:bank_account_number)
assert_equal true, @user.respond_to?(:encrypted_social_security_number)
assert_equal true, @user.respond_to?(:social_security_number)
+ assert_equal true, @user.respond_to?(:data_yaml)
+ assert_equal true, @user.respond_to?(:data_json)
assert_equal false, @user.respond_to?(:encrypted_name)
end
should "have unencrypted values" do
assert_equal @bank_account_number, @user.bank_account_number
@@ -245,9 +276,276 @@
# Reload User model from the database
@user.reload
assert_equal @bank_account_number_encrypted, @user.encrypted_bank_account_number
assert_equal @bank_account_number, @user.bank_account_number
end
- end
+ context "data types" do
+ setup do
+ @user_clone = User.find(@user.id)
+ end
+
+ context "integer values" do
+ should "return correct data type" do
+ assert_equal @integer_value, @user_clone.integer_value
+ assert @user.clone.integer_value.kind_of?(Integer)
+ end
+
+ should "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
+ @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
+ assert_equal @float_value, @user_clone.float_value
+ assert @user.clone.float_value.kind_of?(Float)
+ end
+
+ should "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
+ @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
+ assert_equal @decimal_value, @user_clone.decimal_value
+ assert @user.clone.decimal_value.kind_of?(BigDecimal)
+ end
+
+ should "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")
+ @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
+ assert_equal @datetime_value, @user_clone.datetime_value
+ assert @user.clone.datetime_value.kind_of?(DateTime)
+ end
+
+ should "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")
+ @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
+ assert_equal @time_value, @user_clone.time_value
+ assert @user.clone.time_value.kind_of?(Time)
+ end
+
+ should "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")
+ @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
+ assert_equal @date_value, @user_clone.date_value
+ assert @user.clone.date_value.kind_of?(Date)
+ end
+
+ should "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)
+ @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
+ assert_equal true, @user_clone.true_value
+ assert @user.clone.true_value.kind_of?(TrueClass)
+ end
+
+ should "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
+ @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
+ assert_equal false, @user_clone.false_value
+ assert @user.clone.false_value.kind_of?(FalseClass)
+ end
+
+ should "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
+ @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
+ # 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
+ assert_equal @h, @user_clone.data_json
+ assert @user.clone.data_json.kind_of?(Hash)
+ end
+
+ should "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'
+ @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
+ assert_equal @h, @user_clone.data_yaml
+ assert @user.clone.data_yaml.kind_of?(Hash)
+ end
+
+ should "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'
+ @user_clone.data_yaml = new_value
+ @user_clone.save!
+
+ @user.reload
+ assert_equal new_value, @user.data_yaml
+ end
+ end
+
+ end
+ end
end
end
\ No newline at end of file