Michael Hartl's Ruby on Rails Tutorial: Chapter 9, Exercise 3

Obviously a novice here, but working through Hartl's book. I can't seem to figure out how to write the right tests for Exercise 3: "The current authentication tests check that navigation links such as “Profile” and “Settings” appear when a user is signed in. Add tests to make sure that these links don’t appear when a user isn’t signed in.":

Here's my authentication_pages_spec.rb:

require 'spec_helper'

describe "AuthenticationPages" do

subject { page }

  describe "signin path" do
    before { visit signin_path }

    it { should have_selector('h1',     text: "Sign in") }
    it { should have_selector('title',  text: "Sign in") }
  end

  describe "should not have show profile and settings in menu" do

    it { should_not have_link('Profile',        href: user_path(user)) }
    it { should_not have_link('Settings',   href: edit_user_path(user)) }
  end

  describe "signin" do
    before { visit signin_path }

    describe "with invalid signin information" do
      before { click_button "Sign in" }

      it { should have_selector('title', text: 'Sign in') }
      it { should have_selector('div.alert.alert-error', text: "Invalid") }

      describe "after visiting another page" do
        before { click_link "Home" }

        it { should_not have_selector('div.alert.alert-error') }
      end
    end

    describe "with valid signin information" do
      let(:user) { FactoryGirl.create(:user) }
      before { sign_in user } 

      it { should have_selector('title', text: user.name) }

      it { should have_link('Users',    href: users_path) }
      it { should have_link('Profile',  href: user_path(user)) }
      it { should have_link('Settings',     href: edit_user_path(user)) }
      it { should have_link('Sign out',     href: signout_path) }
      it { should_not have_link('Sign in',  href: signin_path) }

      describe "followed by signout" do
        before { click_link "Sign out" }
        it { should have_link('Sign in') }
      end
    end

    describe "authorization" do

      describe "for non-signed-in users" do
        let(:user) { FactoryGirl.create(:user) }

        describe "when attempting to visit a protected page" do
          before do
            visit edit_user_path(user)
            fill_in "Email",        with: user.email
            fill_in "Password", with: user.password
            click_button "Sign in"
          end

          describe "after signing in" do
            it "should render the desired protected page" do
              page.should have_selector('title', text: 'Edit user')
            end
          end
        end

        describe "in the Users controller" do

          describe "visiting the edit page" do
            before { visit edit_user_path(user) }
            it { should have_selector('title', text: 'Sign in') }
          end

          describe "submitting to the update action" do
            before { put user_path(user) }
            specify { response.should redirect_to(signin_path) }
          end

          describe "visiting the user index" do
            before { visit users_path }
            it { should have_selector('title', text: "Sign in") }
          end
        end
      end

      describe "as wrong user" do
        let(:user) { FactoryGirl.create(:user) }
        let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
        before { sign_in user }

        describe "visiting Users#edit page" do
          before { visit edit_user_path(wrong_user) }
          it { should_not have_selector('title', text: full_title('Edit user')) }
        end

        describe "submitting a PUT request to the Users#update action" do
          before { put user_path(wrong_user) }
          specify { response.should redirect_to(root_url) }
        end
      end

      describe "as a non-admin user" do
        let(:user) { FactoryGirl.create(:user) }
        let(:non_admin) { FactoryGirl.create(:user) }

        before { sign_in non_admin }

        describe "submitting a DELETE request to the User#destroy action" do
          before { delete user_path(user) }
          specify { response.should redirect_to(root_url) }
        end
      end
   end
 end
end

The lines I added have the tests still failing. Any insight would be helpful. Thanks.

Answers


I might be missing something but I can't see which tests you have added for this exercise.

I have just completed this and now the first AuthenticationPages tests look like this.

authentication_pages_spec.rb

describe "sigin page" do
  before { visit signin_path }

  it { should have_content('Sign in') }
  it { should have_title('Sign in') }

  it { should_not have_link('Users') }
  it { should_not have_link('Profile') }
  it { should_not have_link('Settings') }
  it { should_not have_link('Sign out', href: signout_path) }
  it { should have_link('Sign in', href: signin_path) }
end

In addition KnownColor's tests above, I added the following tests to verify that the links do not show on profile pages when the user is not signed in:

authentication_pages_spec.rb

describe "authorization" do

  describe "for non-signed-in users" do

    let(:user) {FactoryGirl.create(:user)}

    describe "when visiting a non-protected page" do
      before {visit user_path(user)}
      it {should have_link('Sign in', href: signin_path)}
      it {should_not have_link('Users')}
      it {should_not have_link('Profile')}
      it {should_not have_link('Settings')}
      it {should_not have_link('Sign out')}
    end
    ...
  end
  ...
end

Need Your Help

How can I fake superscript and subscript with Core Text and an Attributed String?

objective-c ipad nsattributedstring core-text subscript

I'm using an NSMutableAttribtuedString in order to build a string with formatting, which I then pass to Core Text to render into a frame. The problem is, that I need to use superscript and subscript.

Play and stop a sound sample on iOS (Novocaine)

ios objective-c audio novocaine

I'm trying to make a simple Drumpad app. The app needs to be super fast and play the sound with as little latency as possible. The premise is store audio samples in an array and each one is played ...