Bruno Canongia
Bruno Canongia

Reputation: 524

Rails Fixtures with BCrypt

I'm having a problem with fixtures for BCrypt password: my User model is both setup with has_secure_password and validates_presence_of :password.

The point is that BCrypt uses password and password_confirmation but in the schema there is only the password_digest field.

The fixture is complaining that the password field does not exists.

How can I avoid this?

Thank you

Upvotes: 15

Views: 3499

Answers (2)

silverdr
silverdr

Reputation: 2172

Apparently for performance reasons fixtures are being pushed to database directly. That means that instead of password: you need password_digest: in your fixtures:

test_user:
  email: "[email protected]"
  password_digest: <%= BCrypt::Password.create('testpassword', cost: 5) %>

when using bcrypt based passwords with has_secure_password. As mentioned in the comments cost argument is optional. If you don't use it a sensible default will be used.

Update: in Rails 6 bcrypt is not available by default and needs to be explicitly added/required

Upvotes: 28

Bruno Canongia
Bruno Canongia

Reputation: 524

I solved this problem with setup function on model test. We can define objects in setup and use it through the test file.

def setup
    @user = User.new
    @user.name = 'Brunoid'
    @user.email = 'brunoid@localhost'
    @user.phone = '(01)2345-6789'
    @user.cpf = '123.456.789-10'
    @user.password = 'segamastersystem'
    @user.password_confirmation = 'segamastersystem'
    @user.card = Card.first
end

test 'must validate' do
    assert @user.valid?
end
...

Upvotes: -3

Related Questions