Failing functional tests when controllers work

I have three models (users, issues, retailers) and three corresponding
controllers. In functional tests for all three controllers, I have the
same problems:

* Creating a record which should work, fails in the functional test.
* Updating a record which should fail (invalid) succeeds (and
therefore the test fails.)

Other tests of these actions (e.g. a valid update, an invalid
creation) work as expected. I am unable to recreate the problem in the
console with the same data, even when using the test environment.

I would suspect a bug in the controllers except that all three
functional tests fail in the same way.

Here's a sample with users:

  def create # Creates a user with admin role
    @user = User.new(params[:user])
    @user.role = "Admin"

    if @user.save
                        # Tests never reach this code
      flash[:notice] = "User successfully created"
      redirect_to :action => 'show', :id => @user.id
    else
      flash[:warning] = "Please try again."
      render :action => 'new'
    end
  end

and the test is...

  def test_create # Supposed to succeed, but fails.
    old = User.count
    post :create, {:username => "testuser", :password =>
'secret', :password_confirmation => 'secret', :email =>
'test@example.com'}, {:user => users(:admin1)} # Need an admin user in
the session to allow this
# n.b. there is a validation to check for presence of username,
password, and email; also to check pw confirmation
    assert_not_nil assigns(:user)
    assert assigns(:user).is_admin?
    assert_response :redirect
    assert_redirected_to :action => "show", :id => assigns(:user).id
    assert_equal "User successfully created", flash[:notice]
    assert_equal old + 1, User.count
  end

The test fails at the assert_response :redirect, so it's the
@user.save which isn't behaving as expected. The same thing happens in
two other controllers, with two other models.

Any ideas?

pjm

pjmorse wrote:

  def create # Creates a user with admin role
    @user = User.new(params[:user])
    @user.role = "Admin"

    if @user.save
                        # Tests never reach this code
      flash[:notice] = "User successfully created"
      redirect_to :action => 'show', :id => @user.id
    else
      flash[:warning] = "Please try again."
      render :action => 'new'
    end
  end

and the test is...

  def test_create # Supposed to succeed, but fails.
    old = User.count
    post :create, {:username => "testuser", :password =>
'secret', :password_confirmation => 'secret', :email =>
'test@example.com'}, {:user => users(:admin1)} # Need an admin user in
the session to allow this
# n.b. there is a validation to check for presence of username,

Any ideas?

pjm

I think your error is before the save, in the test case, your :user is
not passing in the required fields to populate a new user. Here is what
you can do to verify this.

1) sudo gem install ruby-debug
2) insert: "debugger" a the top of your controller's create method
3) run: rdebug test/script/<test case name> [<test name>]

# you are now in the debugger..

cont # debugger starts on first line of the file, hit cont to go to your bp
irb # when you hit your bp
@user

hth

ilan

pjmorse wrote:

    if @user.save
                        # Tests never reach this code

Temporarily change that to @user.save! and read the error diagnostic?

Phlip wrote:

pjmorse wrote:

    if @user.save
                        # Tests never reach this code

Temporarily change that to @user.save! and read the error diagnostic?

no need to even do that.. just type @user and see what the debugger
gives you.. I believe that your password fields will not be set which
therefore failed the validation tests in your model

hth

ilan

Ilan, thanks for the ruby-debug tip, I'll need that one of these days.

For this one, I followed Phlip's suggestion and switched to save!,
which confirmed Ilan's suggestion that the parameters were not
correct. I needed to set the params to create a user object, e.g.

    post :create, {:user => {:username => "testuser", :password =>
'secret', :password_confirmation => 'secret', :email =>
'test@example.com'}}, {:user => users(:admin1)}

...not sure yet how this will work with the update bug, but it should
fix the save bug across all three tests. Thanks!