BCrypt::Errors::InvalidHash error while running test cases

600 Views Asked by At

I've been trying to pass the last test in this chapter but all my tests return a invalid hash error.

Here is the error :

Failures:

  1) User 
     Failure/Error: password_digest: BCrypt::Password.create('foobar').to_s)
     BCrypt::Errors::InvalidHash:
       invalid hash
     # ./spec/models/user_spec.rb:20:in `block (2 levels) in <top (required)>'

  2) User 
     Failure/Error: password_digest: BCrypt::Password.create('foobar').to_s)
     BCrypt::Errors::InvalidHash:
       invalid hash
     # ./spec/models/user_spec.rb:20:in `block (2 levels) in <top (required)>'

  3) User 
     Failure/Error: password_digest: BCrypt::Password.create('foobar').to_s)
     BCrypt::Errors::InvalidHash:
       invalid hash
     # ./spec/models/user_spec.rb:20:in `block (2 levels) in <top (required)>'

  4) User 
     Failure/Error: password_digest: BCrypt::Password.create('foobar').to_s)
     BCrypt::Errors::InvalidHash:
       invalid hash
     # ./spec/models/user_spec.rb:20:in `block (2 levels) in <top (required)>'

  ...

Finished in 1.34 seconds
20 examples, 20 failures

user.rb file :

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation, :password_digest
  has_secure_password

  before_save { |user| user.email = email.downcase }

  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence:   true,
            format:     { with: VALID_EMAIL_REGEX },
            uniqueness: { case_sensitive: false }
  validates :password, presence: true, length: { minimum: 6 }
  validates :password_confirmation, presence: true
end

user_spec.rb file :

require 'spec_helper'
require 'bcrypt'

describe User do

  before do
    @user = User.new(name: "Example User", email: "[email protected]",
                     password: "foobar", password_confirmation: "foobar",
                     password_digest: BCrypt::Password.create('foobar').to_s)
  end

  subject { @user }

  it { should respond_to(:name) }
  it { should respond_to(:email) }
  it { should respond_to(:password_digest) }
  it { should respond_to(:password) }
  it { should respond_to(:password_confirmation) }

  it { should be_valid }

  describe "when name is not present" do
    before { @user.name = " " }
    it { should_not be_valid }
  end

  describe "when email is not present" do
    before { @user.email = " " }
    it { should_not be_valid }
  end

  describe "when name is too long" do
    before { @user.name = "a" * 51 }
    it { should_not be_valid }
  end

  describe "when email format is invalid" do
    it "should be invalid" do
      addresses = %w[user@foo,com user_at_foo.org example.user@foo.
                     foo@bar_baz.com foo@bar+baz.com]
      addresses.each do |invalid_address|
        @user.email = invalid_address
        @user.should_not be_valid
      end
    end
  end

  describe "when email format is valid" do
    it "should be valid" do
      addresses = %w[[email protected] [email protected] [email protected] [email protected]]
      addresses.each do |valid_address|
        @user.email = valid_address
        @user.should be_valid
      end
    end
  end

  describe "when email address is already taken" do
    before do
      user_with_same_email = @user.dup
      user_with_same_email.email = @user.email.upcase
      user_with_same_email.save
    end

    it { should_not be_valid }
  end

  describe "when password is not present" do
    before { @user.password = @user.password_confirmation = " " }
    it { should_not be_valid }
  end

  describe "when password doesn't match confirmation" do
    before { @user.password_confirmation = "mismatch" }
    it { should_not be_valid }
  end

  describe "when password confirmation is nil" do
    before { @user.password_confirmation = nil }
    it { should_not be_valid }
  end

  describe "with a password that's too short" do
    before { @user.password = @user.password_confirmation = "a" * 5 }
    it { should be_invalid }
  end

  describe "return value of authenticate method" do
    before { @user.save }
    let(:found_user) { User.find_by_email(@user.email) }

    describe "with valid password" do
      it { should == found_user.authenticate(@user.password) }
    end

    describe "with invalid password" do
      let(:user_for_invalid_password) { found_user.authenticate("invalid") }

      it { should_not == user_for_invalid_password }
      specify { user_for_invalid_password.should be_false }
    end
  end
end

GemFile :

source 'https://rubygems.org'

gem 'rails', '3.2.22.5'
gem 'bootstrap-sass', '2.1'
gem 'bcrypt-ruby', '3.0.1'

# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'

group :development, :test do
  gem 'sqlite3', '1.3.5'
  gem 'rspec-rails', '2.11.0'
end

group :development do
  gem 'annotate', '2.5.0'
end

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '3.2.5'
  gem 'coffee-rails', '3.2.2'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platforms => :ruby

  gem 'uglifier', '1.2.3'
end

gem 'jquery-rails', '2.0.2'

group :test do
  gem 'capybara', '1.1.2'
end

group :production do
  gem 'pg', '0.12.2'
end

gem 'rake', '< 11.0'

I've been trying to make a random user in the console with same results. Tried to change the gem for bcrypt-3.1.12 but it kept asking to add bcryptruby instead. Decided to copy paste the exact code from the tutorial and the problem is still the same.

Any help would be very appreciated, thank you !

0

There are 0 best solutions below