mirror of
https://github.com/TracksApp/tracks.git
synced 2026-01-24 09:46:11 +01:00
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:
parent
85dc6f4898
commit
d47e863dfc
12 changed files with 257 additions and 74 deletions
|
|
@ -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
|
||||
|
|
|
|||
41
stories/notes/view_add_remove.story
Normal file
41
stories/notes/view_add_remove.story
Normal 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
|
||||
|
||||
|
|
@ -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
94
stories/steps/notes.rb
Normal 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
30
stories/steps/users.rb
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue