Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Devise/Cucumber - Adding a step which confirm a user exists

I'm new to cucumber and I find following snippets to test the Devise login feature. However it seems one more step missing, and I didn't find any solution:

Given /^that a confirmed user exists$/ do
  pending # express the regexp above with the code you wish you had
end

Here the following code:

features/authentication/session.feature

Feature: Session handling
  In order to use the site
  As a registered user
  I need to be able to login and logout

Background: 
  Given that a confirmed user exists

Scenario Outline: Logging in
  Given I am on the login page
  When I fill in "user_email" with "<email>"
  And I fill in "user_password" with "<password>"
  And I press "Sign in"
  Then I should <action>
  Examples:
    |         email       |  password   |              action             |
    | [email protected] |  test1234   | see "Signed in successfully"    |
    | [email protected]     |  password   | see "Invalid email or password" |

Scenario: Logging out
  Given I am logged in
  When I go to the sign out link
  Then I should see "Signed out successfully"

features/step_definitions/authentication_steps.rb

# Session
Given /^I am logged in$/ do
  visit path_to('the login page')
  fill_in('user_email', :with => @user.email)
  fill_in('user_password', :with => @user.password)
  click_button('Sign in')
  if defined?(Spec::Rails::Matchers)
    page.should have_content('Signed in successfully')
  else
    assert page.has_content?('Signed in successfully')
  end
end

spec/factories/user.rb

Factory.define :minimal_user, :class => User do |u|
  u.username 'minimal'
  u.email '[email protected]'
  u.password 'test1234'
  u.password_confirmation 'test1234'
end

Here the link to the orginal code

Many thanks for your help!!

like image 459
benoitr Avatar asked Nov 02 '10 23:11

benoitr


2 Answers

Your title says "validate that a user exists", but that's might not be what you need to do there -- your Given steps don't need to be asserting that something worked, they invoke code to create the application state for your scenario. Of course, they're still tests since they can still fail.

I think you're looking for something like this:

Given /^that a confirmed user exists$/ do
  Factory.create(:minimal_user)
end

That will create and save a new confirmed user from your factory definition so the rest of the Scenario can proceed.

like image 188
Daniel Mendel Avatar answered Nov 15 '22 11:11

Daniel Mendel


To complete the Daniel's answer and because I enable the Devise confirmable module, I should add a line in my fixture in order to tell that the user is confirmed.

For example:

Factory.define :minimal_user, :class => User do |u|
  u.username 'minimal'
  u.email '[email protected]'
  u.password 'test1234'
  u.password_confirmation 'test1234'
  u.confirmed_at 'here the date you want'
end

Also, debug steps you can find here are very useful.

Hope it helps some people.

like image 24
benoitr Avatar answered Nov 15 '22 09:11

benoitr