Started moving selenium on rails tests over to RSpec stories. See the updated README_DEVELOPERS for info on running the new tests.

This commit is contained in:
Luke Melia 2008-06-19 00:14:04 -04:00
parent 85dc6f4898
commit d47e863dfc
12 changed files with 257 additions and 74 deletions

View file

@ -7,6 +7,7 @@ require 'spec'
require 'spec/rails'
require 'spec/story'
require 'webrat/selenium'
require 'action_controller/test_process'
module Spec
module Story
@ -47,10 +48,30 @@ class SeleniumRailsStory < Test::Unit::TestCase
end
end
def should_not_see(text_or_regexp)
if text_or_regexp.is_a?(Regexp)
response.should_not have_tag("*", text_or_regexp)
else
response.should_not have_tag("*", /#{Regexp.escape(text_or_regexp)}/i)
end
end
def response
webrat_session.response_body
end
def logged_in_as(user)
visits("/selenium_helper/login?as=#{user.login}")
end
def selenium
SeleniumDriverManager.instance.running_selenium_driver
end
def badge_count_should_show(count)
response.should have_tag('#badge_count', count.to_s)
end
def method_missing(name, *args)
if webrat_session.respond_to?(name)
webrat_session.send(name, *args)
@ -70,6 +91,7 @@ end
class DatabaseResetListener
include Singleton
def scenario_started(*args)
if defined?(ActiveRecord::Base)
connection = ActiveRecord::Base.connection
@ -79,24 +101,23 @@ class DatabaseResetListener
end
end
def scenario_succeeded(*args)
def method_missing sym, *args, &block
# ignore all messages you don't care about
end
alias :scenario_pending :scenario_succeeded
alias :scenario_failed :scenario_succeeded
end
class CookieResetListener
include Singleton
def scenario_started(*args)
%w[tracks_login auth_token _session_id].each do |cookie_name|
SeleniumDriverManager.instance.running_selenium_driver.get_eval("window.document.cookie = '#{cookie_name}=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/';")
end
end
def scenario_succeeded(*args)
def method_missing sym, *args, &block
# ignore all messages you don't care about
end
alias :scenario_pending :scenario_succeeded
alias :scenario_failed :scenario_succeeded
end
class Spec::Story::Runner::ScenarioRunner

View file

@ -0,0 +1,41 @@
Story: View, add, remove notes
As a Tracks user
I want to view, add, and remove notes
So that I can keep important information easily accessible
Scenario: View and toggle notes
Given a logged in user Luis
And Luis has two projects with one note each
When Luis visits the notes page
Then two notes should be visible
And the badge should show 2
When Luis clicks Toggle Notes
Then the body of the notes should be shown
Scenario: Add a new note
Given a logged in user Luis
And Luis has one project Pass Final Exam with no notes
When Luis adds a note from the Pass Final Exam project page
Then Luis should see the note on the Pass Final Exam project page
And Luis should see the note on the notes page
And the badge on the notes page should show 1
Scenario: Delete note from notes page
Given a logged in user Luis
And Luis has one project Pass Final Exam with 2 notes
When Luis visits the notes page
And Luis deletes the first note
Then the first note should disappear
Then the badge should show 1
Scenario: Link to note
Given a logged in user Luis
And Luis has one project Pass Final Exam with 1 note
When Luis visits the Pass Final Exam project page
And clicks the icon next to the note
Then he should see the note text

View file

@ -1,19 +1,6 @@
steps_for :login do
Given "an admin user Reinier with the password abracadabra" do
@reinier = User.create!(:login => 'reinier', :password => 'abracadabra', :password_confirmation => 'abracadabra', :is_admin => true)
@reinier.create_preference
end
Given "Reinier is not logged in" do
end
Given "no users exist" do
User.delete_all
end
Given "a visitor named Reinier" do
end
steps_for :login do
include_steps_for :users
When "Reinier submits the login form with an incorrect password" do
fills_in 'Login', :with => 'reinier'
fills_in 'Password', :with => 'incorrectpass'

94
stories/steps/notes.rb Normal file
View file

@ -0,0 +1,94 @@
steps_for :notes do
include_steps_for :users
Given "Luis has two projects with one note each" do
project_a = @luis.projects.create!(:name => 'project A')
project_a.notes.create!(:user_id => @luis.id, :body => 'note for project A')
project_b = @luis.projects.create!(:name => 'project B')
project_b.notes.create!(:user_id => @luis.id, :body => 'note for project B')
end
Given "Luis has one project Pass Final Exam with no notes" do
@exam_project = @luis.projects.create!(:name => 'Pass Final Exam')
end
Given "Luis has one project Pass Final Exam with 1 note" do
Given "Luis has one project Pass Final Exam with no notes"
@exam_project.notes.create!(:user_id => @luis.id, :body => 'exam note 1')
end
Given "Luis has one project Pass Final Exam with 2 notes" do
Given "Luis has one project Pass Final Exam with 1 note"
@exam_project.notes.create!(:user_id => @luis.id, :body => 'exam note 2')
end
When "Luis visits the notes page" do
visits '/notes'
end
When "Luis adds a note from the Pass Final Exam project page" do
When "Luis visits the Pass Final Exam project page"
clicks_link 'Add a note', :wait => :ajax
fills_in 'new_note_body', :with => 'new exam note'
clicks_button 'Add note', :wait => :ajax
end
When "Luis visits the Pass Final Exam project page" do
visits "/projects/#{@exam_project.to_param}"
end
When "Luis deletes the first note" do
selenium.click "css=a.delete_note"
selenium.get_confirmation.should =~ /delete/
end
When "clicks the icon next to the note" do
selenium.click "css=a.link_to_notes"
wait_for_page_to_load
end
When "Luis clicks Toggle Notes" do
clicks_link 'Toggle notes', :wait => :effects
end
Then "the body of the notes should be shown" do
wait_for_effects
selenium.is_visible("css=body.notes").should be_true
end
Then "Luis should see the note on the Pass Final Exam project page" do
should_see "new exam note"
end
Then "Luis should see the note on the notes page" do
visits '/notes'
should_see "new exam note"
end
Then "the badge on the notes page should show 1" do
badge_count_should_show(1)
end
Then "the first note should disappear" do
wait_for_ajax_and_effects
should_not_see 'exam note 1'
end
Then "the badge should show 1" do
wait_for_ajax_and_effects
badge_count_should_show(1)
end
Then "the badge should show 2" do
badge_count_should_show(2)
end
Then "two notes should be visible" do
should_see 'note for project A'
should_see 'note for project B'
end
Then "he should see the note text" do
should_see 'exam note 1'
end
end

30
stories/steps/users.rb Normal file
View file

@ -0,0 +1,30 @@
steps_for :users do
Given "an admin user Reinier with the password abracadabra" do
@reinier = User.create!(:login => 'reinier', :password => 'abracadabra', :password_confirmation => 'abracadabra', :is_admin => true)
@reinier.create_preference
end
Given "an admin user Reinier" do
Given "an admin user Reinier with the password abracadabra"
end
Given "a logged in user Luis" do
@luis = User.create!(:login => 'luis', :password => 'sesame', :password_confirmation => 'sesame', :is_admin => false)
@luis.create_preference
logged_in_as @luis
end
Given "no users exist" do
User.delete_all
end
Given "Reinier is not logged in" do
#nothing to do
end
Given "a visitor named Reinier" do
#nothing to do
end
end