Rails Tutorial ６章　演習

課題１

```Ruby:user_spec.rb
require 'spec_helper'

describe User do

  before do
    @user=User.new(name:"Example User",
                   email:"user@example.com",
                   password:"foobar",
                   password_confirmation:"foobar" )
  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 respond_to(:authenticate)}

  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
        expect(@user).not_to be_valid
      end
    end
  end

  describe "when email format is valid" do
    it "should be valid" do
      addresses = %w[user@foo.COM A_US-ER@f.b.org frst.lst@foo.jp a+b@baz.cn]
      addresses.each do |valid_address|
        @user.email = valid_address
        expect(@user).to 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 "email address with mixed case" do
   let(:mixed_case_email){"Foo@ExAMOle.CoM"}

   it "should be saved as all lower-case" do
     @user.email=mixed_case_email
     @user.save
     expect(@user.reload.email).to eq mixed_case_email.downcase
   end
 end
#--------------------------
  describe "when password is not present" do
    before do
      @user=User.new(name:"Example User",
                    email:"user@example.com",
                    password:" ",
                    password_confirmation:" ")
    end
    it{should_not be_valid}
  end

  describe "when password doesn't match confirmatio" do
    before {@user.password_confirmation="mismatch"}
    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 eq found_user.authenticate(@user.password)}
    end
  
    describe "with invalid password" do
      let(:user_for_invalid_password){found_user.authenticate("invalid")}

      it{should_not eq user_for_invalid_password}
      specify{expect(user_for_invalid_password).to be_false}
    end
  end
end
```

課題２

```Ruby:user.rb
class User < ActiveRecord::Base
    
  has_secure_password           #<---課題２の内容
  before_save{email.downcase!}  #<---

  before_save{self.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}
  #has_secure_password
  validates :password,length:{minimum: 6}
end
```

課題３

test_addressとして間違ったアドレスを作ってテストをした。
テストスイートではたしかにエラーが出たが、そもそも記述方法に間違いがあった可能性もある。
この部分はもう一度復習が必要のようですね。。。