Calling a method directly from a test => no method error

I’m trying to get a test to pass and keep getting a “no method error”
I’m using the routines from Chapter 8 of “Security on Rails” and can’t
get the test to pass. I keep getting “no method error” for decrypt.
Can someone help me with the correct “address” for decrypt so I can
call it directly.

Here is the routine definition:

module Encryptor
module Routines
def decrypt(cipher_text, key, opts)
cipher = OpenSSL::Cipher::Cipher.new(algorithm(opts))
decoded_cipher_text = Base64.decode64(cipher_text)
#cipher.decrypt(key, decoded_cipher_text.slice!(0…15))
cipher.decrypt
cipher.pkcs5_keyivgen(key)
# DW 11/3/10 Above two lines per deprecation warning and
stackoverflow site
# TODO Use a real Salt instead of Thoracic1
out = cipher.update(decoded_cipher_text)
out << cipher.final
end
end
end

Here is the “after save” hook:

module Encryptor
module ActiveRecord
class Encryptor
include ::Encryptor::Routines

  def after_save(model)
    unless model[@field].blank?
      key = model.class.encryption_key
      model[@field] = decrypt(model[@field], key, @options)
    end
  end
end

end
end

Here is the test:

require ‘test_helper’
class UserTest < ActiveSupport::TestCase

fixtures :users

test “the_encrypter” do
@user = users(:bob)
@user.secret_answer = “Volvo”
assert @user.save
@answer = User.connection.select_all(
“select secret_answer from users where id = 1”
)
cipher_text = @answer.first[‘secret_answer’]
opts = Encryptor::ActiveRecord::Encryptor.default_options
@plain_text = decrypt(cipher_text, User.encryption_key, opts)
assert_equal @plain_text, “Volvo”
end
end

On Nov 4, 10:33pm, dwormuth [email protected] wrote:

I’m trying to get a test to pass and keep getting a “no method error”
I’m using the routines from Chapter 8 of “Security on Rails” and can’t
get the test to pass. I keep getting “no method error” for decrypt.
Can someone help me with the correct “address” for decrypt so I can
call it directly.

Depending on what it is you’re trying to test you could either create
an instance of your Encryptor class (decrypt is an instance method
there) or mixin your Routines module into the test case.

Fred