Fix regressions and refactorings

This commit is contained in:
Reinier Balt 2012-03-19 14:05:54 +01:00
parent 41ebd2ec9b
commit ca7d81d75a
21 changed files with 259 additions and 397 deletions

16
Gemfile
View file

@ -14,8 +14,12 @@ gem "aasm", "~>2.2.0"
gem "rubyjedi-actionwebservice", :require => "actionwebservice" gem "rubyjedi-actionwebservice", :require => "actionwebservice"
gem "rubycas-client", "~>2.2.1" gem "rubycas-client", "~>2.2.1"
gem "ruby-openid", :require => "openid" gem "ruby-openid", :require => "openid"
# you may comment out the database driver you will not be using.
# This will prevent a native build of the driver. Building native drivers is not always possible on all hosters
gem "sqlite3" gem "sqlite3"
gem "mysql" gem "mysql"
gem 'bcrypt-ruby', '~> 2.1.4' gem 'bcrypt-ruby', '~> 2.1.4'
gem 'htmlentities', '~> 4.3.0' gem 'htmlentities', '~> 4.3.0'
gem "mail" gem "mail"
@ -47,10 +51,14 @@ group :test do
gem "thoughtbot-factory_girl" gem "thoughtbot-factory_girl"
gem 'memory_test_fix', '~>0.1.3' gem 'memory_test_fix', '~>0.1.3'
gem "capybara", ">=0.3.5" gem "capybara", ">=0.3.5"
gem "selenium-webdriver", "2.14.0" # is locked to 2.14.0 for https://code.google.com/p/selenium/issues/detail?id=3075 gem "selenium-webdriver" # Note that > 2.14 has problems: https://code.google.com/p/selenium/issues/detail?id=3075
gem "capybara-webkit"
gem "capybara-screenshot"
gem "launchy"
gem "database_cleaner", ">=0.5.0" gem "database_cleaner", ">=0.5.0"
gem "cucumber-rails", "~>0.3.2" gem "cucumber-rails", "~>0.3.2"
# uncomment to use the webkit option. This depends on Qt to be installed
#gem "capybara-webkit"
# uncomment to be able to make screenshots from scenarios
#gem "capybara-screenshot"
#gem "launchy"
end end

View file

@ -16,7 +16,6 @@ GEM
activesupport (= 2.3.14) activesupport (= 2.3.14)
activesupport (2.3.14) activesupport (2.3.14)
acts_as_list (0.1.4) acts_as_list (0.1.4)
addressable (2.2.6)
bcrypt-ruby (2.1.4) bcrypt-ruby (2.1.4)
builder (3.0.0) builder (3.0.0)
capybara (1.1.2) capybara (1.1.2)
@ -26,11 +25,6 @@ GEM
rack-test (>= 0.5.4) rack-test (>= 0.5.4)
selenium-webdriver (~> 2.0) selenium-webdriver (~> 2.0)
xpath (~> 0.1.4) xpath (~> 0.1.4)
capybara-screenshot (0.1.10)
capybara (>= 1.0)
capybara-webkit (0.9.0)
capybara (>= 1.0.0, < 1.2)
json
cgi_multipart_eof_fix (2.5.0) cgi_multipart_eof_fix (2.5.0)
childprocess (0.3.1) childprocess (0.3.1)
ffi (~> 1.0.6) ffi (~> 1.0.6)
@ -62,8 +56,6 @@ GEM
httpclient (2.2.4) httpclient (2.2.4)
i18n (0.6.0) i18n (0.6.0)
json (1.6.5) json (1.6.5)
launchy (2.0.5)
addressable (~> 2.2.6)
linecache (0.46) linecache (0.46)
rbx-require-relative (> 0.0.4) rbx-require-relative (> 0.0.4)
mail (2.4.1) mail (2.4.1)
@ -77,7 +69,7 @@ GEM
daemons (>= 1.0.3) daemons (>= 1.0.3)
fastthread (>= 1.0.1) fastthread (>= 1.0.1)
gem_plugin (>= 0.2.3) gem_plugin (>= 0.2.3)
multi_json (1.0.4) multi_json (1.1.0)
mysql (2.8.1) mysql (2.8.1)
nokogiri (1.4.7) nokogiri (1.4.7)
polyglot (0.3.3) polyglot (0.3.3)
@ -112,10 +104,10 @@ GEM
rubyzip (0.9.6.1) rubyzip (0.9.6.1)
sanitize (1.2.1) sanitize (1.2.1)
nokogiri (~> 1.4.1) nokogiri (~> 1.4.1)
selenium-webdriver (2.14.0) selenium-webdriver (2.20.0)
childprocess (>= 0.2.1) childprocess (>= 0.2.5)
ffi (~> 1.0.9) ffi (~> 1.0)
multi_json (~> 1.0.4) multi_json (~> 1.0)
rubyzip rubyzip
soap4r (1.5.8) soap4r (1.5.8)
httpclient (>= 2.1.1) httpclient (>= 2.1.1)
@ -142,8 +134,6 @@ DEPENDENCIES
acts_as_list (~> 0.1.4) acts_as_list (~> 0.1.4)
bcrypt-ruby (~> 2.1.4) bcrypt-ruby (~> 2.1.4)
capybara (>= 0.3.5) capybara (>= 0.3.5)
capybara-screenshot
capybara-webkit
cucumber-rails (~> 0.3.2) cucumber-rails (~> 0.3.2)
database_cleaner (>= 0.5.0) database_cleaner (>= 0.5.0)
flexmock flexmock
@ -152,7 +142,6 @@ DEPENDENCIES
hoe hoe
hpricot hpricot
htmlentities (~> 4.3.0) htmlentities (~> 4.3.0)
launchy
mail mail
memory_test_fix (~> 0.1.3) memory_test_fix (~> 0.1.3)
mongrel mongrel
@ -166,7 +155,7 @@ DEPENDENCIES
rubycas-client (~> 2.2.1) rubycas-client (~> 2.2.1)
rubyjedi-actionwebservice rubyjedi-actionwebservice
sanitize (~> 1.2.1) sanitize (~> 1.2.1)
selenium-webdriver (= 2.14.0) selenium-webdriver
soap4r (~> 1.5.8) soap4r (~> 1.5.8)
sqlite3 sqlite3
test-unit (= 1.2.3) test-unit (= 1.2.3)

View file

@ -9,7 +9,7 @@ Feature: dependencies
| testuser | secret | false | | testuser | secret | false |
And I have logged in as "testuser" with password "secret" And I have logged in as "testuser" with password "secret"
@javascript @webkit_only @javascript
Scenario: Adding dependency to dependency by drag and drop Scenario: Adding dependency to dependency by drag and drop
Given I have a project "dependencies" with 3 todos Given I have a project "dependencies" with 3 todos
And "todo 2" depends on "todo 1" And "todo 2" depends on "todo 1"
@ -73,9 +73,9 @@ Feature: dependencies
Then I should see "test 1" in the completed container Then I should see "test 1" in the completed container
And I should see "test 2" in the action container And I should see "test 2" in the action container
And I should not see "test 2" in the deferred container And I should not see "test 2" in the deferred container
And I should see the empty message in the deferred container And I should see empty message for deferred todos of project
@javascript @selenium_only @javascript
Scenario: Deleting a predecessor will activate successors Scenario: Deleting a predecessor will activate successors
Given I have a context called "@pc" Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos And I have a project "dependencies" that has the following todos
@ -90,9 +90,9 @@ Feature: dependencies
When I delete the action "test 1" When I delete the action "test 1"
Then I should see "test 2" in the action container Then I should see "test 2" in the action container
And I should not see "test 2" in the deferred container And I should not see "test 2" in the deferred container
And I should see the empty message in the deferred container And I should see empty message for deferred todos of project
@javascript @selenium_only @javascript
Scenario: Deleting a successor will update predecessor Scenario: Deleting a successor will update predecessor
Given I have a context called "@pc" Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos And I have a project "dependencies" that has the following todos
@ -111,7 +111,7 @@ Feature: dependencies
Then I should see "test 3" within the dependencies of "test 1" Then I should see "test 3" within the dependencies of "test 1"
And I should not see "test 2" And I should not see "test 2"
@javascript @webkit_only @javascript
Scenario: Dragging an action to a completed action will not add it as a dependency Scenario: Dragging an action to a completed action will not add it as a dependency
Given I have a context called "@pc" Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos And I have a project "dependencies" that has the following todos
@ -124,7 +124,7 @@ Feature: dependencies
Then I should see an error flash message saying "Cannot add this action as a dependency to a completed action!" Then I should see an error flash message saying "Cannot add this action as a dependency to a completed action!"
And I should see "test 1" in project container for "dependencies" And I should see "test 1" in project container for "dependencies"
@javascript @webkit_only @javascript
Scenario Outline: Marking a successor as complete will update predecessor Scenario Outline: Marking a successor as complete will update predecessor
Given I have a context called "@pc" Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos And I have a project "dependencies" that has the following todos
@ -146,7 +146,7 @@ Feature: dependencies
| "dependencies" project | | "dependencies" project |
| tag page for "bla" | | tag page for "bla" |
@javascript @webkit_only @javascript
Scenario Outline: Marking a successor as active will update predecessor Scenario Outline: Marking a successor as active will update predecessor
Given I have a context called "@pc" Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos And I have a project "dependencies" that has the following todos

View file

@ -109,7 +109,7 @@ Feature: Edit a next action from every page
| tag page for "starred" | tag | | tag page for "starred" | tag |
| "visible project" project | project | | "visible project" project | project |
@javascript @wip @javascript
Scenario Outline: I can mark a completed todo active and it will update empty messages and context containers Scenario Outline: I can mark a completed todo active and it will update empty messages and context containers
Given I have a completed todo with description "visible todo" in project "visible project" with tags "starred" in the context "visible context" Given I have a completed todo with description "visible todo" in project "visible project" with tags "starred" in the context "visible context"
When I go to the <page> When I go to the <page>
@ -209,8 +209,10 @@ Feature: Edit a next action from every page
When I go to the tickler page When I go to the tickler page
Then I should see "start later" Then I should see "start later"
@javascript @javascript @wip
Scenario: I can defer a todo Scenario: I can defer a todo
# this script fails on https://code.google.com/p/selenium/issues/detail?id=3075 for selenium-webdriver > 2.14.
# and selenium-webdriver < 2.20 fails on firefox 11 :-( So @wip for now. This will work on webkit though
When I go to the home page When I go to the home page
And I submit a new action with description "start later" in the context "@pc" And I submit a new action with description "start later" in the context "@pc"
And I defer "start later" for 1 day And I defer "start later" for 1 day
@ -218,8 +220,10 @@ Feature: Edit a next action from every page
When I go to the tickler page When I go to the tickler page
Then I should see "start later" Then I should see "start later"
@javascript @javascript @wip
Scenario: I can make a project from a todo Scenario: I can make a project from a todo
# this script fails on https://code.google.com/p/selenium/issues/detail?id=3075 for selenium-webdriver > 2.14.
# and selenium-webdriver < 2.20 fails on firefox 11 :-( So @wip for now. This will work on webkit though
When I go to the home page When I go to the home page
And I submit a new action with description "buy mediacenter" in the context "@pc" And I submit a new action with description "buy mediacenter" in the context "@pc"
And I make a project of "buy mediacenter" And I make a project of "buy mediacenter"

View file

@ -33,8 +33,7 @@ Feature: View, add, remove notes
Given I have a project "Pass Final Exam" with 2 notes Given I have a project "Pass Final Exam" with 2 notes
When I go to the notes page When I go to the notes page
And I delete the first note And I delete the first note
Then the first note should disappear Then the badge should show 1
And the badge should show 1
@javascript @javascript
Scenario: Edit a note Scenario: Edit a note

View file

@ -16,14 +16,14 @@ Feature: Edit a project
When I click on the first note icon When I click on the first note icon
Then I should go to that note page Then I should go to that note page
@selenium @javascript
Scenario: I can describe the project using markup Scenario: I can describe the project using markup
When I go to the "manage me" project When I go to the "manage me" project
And I edit the project description to "_successfull outcome_: project is *done*" And I edit the project description to "_successfull outcome_: project is *done*"
Then I should see the italic text "successfull outcome" in the project description Then I should see the italic text "successfull outcome" in the project description
And I should see the bold text "done" in the project description And I should see the bold text "done" in the project description
@selenium @javascript
Scenario: I can edit the project name in place Scenario: I can edit the project name in place
Given I have a project "release tracks 1.8" with 1 todos Given I have a project "release tracks 1.8" with 1 todos
When I go to the "release tracks 1.8" project When I go to the "release tracks 1.8" project
@ -33,7 +33,7 @@ Feature: Edit a project
Then I should see that a project named "release tracks 1.8" is not present Then I should see that a project named "release tracks 1.8" is not present
And I should see that a project named "release tracks 2.0" is present And I should see that a project named "release tracks 2.0" is present
@selenium @javascript
Scenario: I cannot edit the project name in two places at once Scenario: I cannot edit the project name in two places at once
Given I have a project "release tracks 1.8" with 1 todos Given I have a project "release tracks 1.8" with 1 todos
When I go to the "release tracks 1.8" project When I go to the "release tracks 1.8" project
@ -43,14 +43,14 @@ Feature: Edit a project
Then I should not be able to change the project name in place Then I should not be able to change the project name in place
# Ticket #1041 # Ticket #1041
@selenium @javascript
Scenario: I can change the name of the project using the Edit Project Settings form Scenario: I can change the name of the project using the Edit Project Settings form
Given I have a project "bananas" with 1 todos Given I have a project "bananas" with 1 todos
When I go to the "bananas" project When I go to the "bananas" project
And I edit the project name to "cherries" And I edit the project name to "cherries"
Then the project title should be "cherries" Then the project title should be "cherries"
@selenium @javascript
Scenario: I can change the name of the project and it should update the new todo form Scenario: I can change the name of the project and it should update the new todo form
Given I have a project "bananas" with 1 todos Given I have a project "bananas" with 1 todos
When I go to the "bananas" project When I go to the "bananas" project
@ -58,7 +58,7 @@ Feature: Edit a project
Then the project title should be "cherries" Then the project title should be "cherries"
And the project field of the new todo form should contain "cherries" And the project field of the new todo form should contain "cherries"
@selenium @javascript
Scenario: I can change the default context of the project and it should update the new todo form Scenario: I can change the default context of the project and it should update the new todo form
Given I have a project "bananas" with 1 todos Given I have a project "bananas" with 1 todos
When I go to the "bananas" project When I go to the "bananas" project
@ -69,7 +69,7 @@ Feature: Edit a project
Then the default context of the new todo form should be "@pc" Then the default context of the new todo form should be "@pc"
# Ticket #1042 # Ticket #1042
@selenium @javascript
Scenario: I cannot change the name of a project in the project view to the name of another existing project Scenario: I cannot change the name of a project in the project view to the name of another existing project
Given I have a project "test" with 1 todos Given I have a project "test" with 1 todos
When I go to the projects page When I go to the projects page
@ -79,7 +79,7 @@ Feature: Edit a project
Then I should see "Name already exists" Then I should see "Name already exists"
# Ticket #1042 # Ticket #1042
@selenium @javascript
Scenario: I cannot change the name of a project in the project list view to the name of another existing project Scenario: I cannot change the name of a project in the project list view to the name of another existing project
Given I have a project "test" with 1 todos Given I have a project "test" with 1 todos
When I go to the projects page When I go to the projects page
@ -87,29 +87,29 @@ Feature: Edit a project
When I try to edit the project name of "manage me" to "test" When I try to edit the project name of "manage me" to "test"
Then I should see "Name already exists" Then I should see "Name already exists"
@selenium @javascript
Scenario: I can add a note to the project Scenario: I can add a note to the project
Given I have a project called "test" Given I have a project called "test"
When I go to the "test" project When I go to the "test" project
And I add a note "hello I'm testing" to the project And I add a note "hello I'm testing" to the project
Then I should see one note in the project Then I should see one note in the project
@selenium @javascript
Scenario: Cancelling adding a note to the project will remove form Scenario: Cancelling adding a note to the project will remove form
Given I have a project called "test" Given I have a project called "test"
When I go to the "test" project When I go to the "test" project
And I cancel adding a note to the project And I cancel adding a note to the project
Then the form for adding a note should not be visible Then the form for adding a note should not be visible
@selenium @javascript @wip
Scenario: Long notes in a project are shown cut off Scenario: Long notes in a project are shown cut off
Given I have a project called "test" Given I have a project called "test"
When I go to the "test" project When I go to the "test" project
And I add a note "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890TOO LONG" to the project And I add a note "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890TOO LONG" to the project
Then I should not see "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890TOO LONG" Then I should not see the note "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890TOO LONG"
And I should see "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456" And I should see the note "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456"
@selenium @javascript
Scenario: Cancelling editing a project will restore project settings Scenario: Cancelling editing a project will restore project settings
Given I have a project called "test" Given I have a project called "test"
When I go to the "test" project When I go to the "test" project
@ -119,7 +119,7 @@ Feature: Edit a project
When I cancel the project edit form When I cancel the project edit form
Then I should see the default project settings Then I should see the default project settings
@selenium @javascript
Scenario: Moving the todo to the tickler will move todo to tickler container and update empty messages Scenario: Moving the todo to the tickler will move todo to tickler container and update empty messages
Given I have a project "test" with 1 todos Given I have a project "test" with 1 todos
When I go to the "test" project When I go to the "test" project
@ -132,34 +132,34 @@ Feature: Edit a project
And I should see empty message for completed todos of project And I should see empty message for completed todos of project
And I should see empty message for todos of project And I should see empty message for todos of project
@selenium @javascript
Scenario: Moving the todo out of the tickler will move todo to active container and update empty messages Scenario: Moving the todo out of the tickler will move todo to active container and update empty messages
Given I have a project "test" with 1 deferred todos Given I have a project "test" with 1 deferred todos
When I go to the "test" project When I go to the "test" project
Then I should see "todo 1" in the deferred container Then I should see "deferred todo 1" in the deferred container
And I should see empty message for todos of project And I should see empty message for todos of project
And I should not see empty message for deferred todos of project And I should not see empty message for deferred todos of project
When I clear the show from date of "todo 1" When I clear the show from date of "deferred todo 1"
Then I should see "todo 1" in the action container Then I should see "deferred todo 1" in the action container
And I should see empty message for deferred todos of project And I should see empty message for deferred todos of project
And I should not see empty message for todos of project And I should not see empty message for todos of project
@selenium @javascript
Scenario: Making all todos inactive will show empty message Scenario: Making all todos inactive will show empty message
Given I have a project "test" with 1 todos Given I have a project "test" with 1 todos
When I go to the "test" project When I go to the "test" project
And I mark "todo 1" as complete And I mark "todo 1" as complete
Then I should see empty message for todos of project Then I should see empty message for todos of project
@selenium @javascript
Scenario: Making all deferred todos inactive will show empty message Scenario: Making all deferred todos inactive will show empty message
Given I have a project "test" with 1 deferred todos Given I have a project "test" with 1 deferred todos
When I go to the "test" project When I go to the "test" project
And I mark "todo 1" as complete And I mark "deferred todo 1" as complete
Then I should see empty message for todos of project Then I should see empty message for todos of project
# Ticket #1043 # Ticket #1043
@selenium @javascript
Scenario: I can move a todo out of the current project Scenario: I can move a todo out of the current project
Given I have a project "foo" with 2 todos Given I have a project "foo" with 2 todos
And I have a project called "bar" And I have a project called "bar"

View file

@ -155,14 +155,14 @@ end
####### Repeat patterns ####### ####### Repeat patterns #######
Then /^I should see "([^"]*)" in the active recurring todos container$/ do |repeat_pattern| Then /^I should (see|not see) "([^"]*)" in the active recurring todos container$/ do |visibility, repeat_pattern|
repeat = @current_user.recurring_todos.find_by_description(repeat_pattern) repeat = @current_user.recurring_todos.find_by_description(repeat_pattern)
unless repeat.nil? unless repeat.nil?
xpath = "//div[@id='active_recurring_todos_container']//div[@id='recurring_todo_#{repeat.id}']" xpath = "//div[@id='active_recurring_todos_container']//div[@id='recurring_todo_#{repeat.id}']"
page.should have_xpath(xpath, :visible => true) page.send(visibility == "see" ? "should" : "should_not", have_xpath(xpath, :visible => true))
else else
step "I should see \"#{repeat_pattern}\"" step "I should #{visibility} \"#{repeat_pattern}\""
end end
end end

View file

@ -7,25 +7,19 @@ When /^I delete the context "([^\"]*)"$/ do |context_name|
end end
get_confirm_text.should == "Are you sure that you want to delete the context '#{context_name}'? Be aware that this will also delete all (repeating) actions in this context!" get_confirm_text.should == "Are you sure that you want to delete the context '#{context_name}'? Be aware that this will also delete all (repeating) actions in this context!"
wait_until do # wait until the context is removed
!page.has_css?("a#delete_context_#{context.id}") page.should_not have_css("a#delete_context_#{context.id}")
end
end end
When /^I edit the context to rename it to "([^\"]*)"$/ do |new_name| When /^I edit the context to rename it to "([^\"]*)"$/ do |new_name|
find("a#link_edit_context_#{@context.id}").click find("a#link_edit_context_#{@context.id}").click
page.should have_css("button#submit_context_#{@context.id}", :visible=>true)
wait_until do
page.has_css?("button#submit_context_#{@context.id}")
end
fill_in "context_name", :with => new_name fill_in "context_name", :with => new_name
click_button "submit_context_#{@context.id}" click_button "submit_context_#{@context.id}"
wait_until do # wait for the form to go away
!page.has_css?("button#submit_context_#{@context.id}", :visible=>true) page.should have_css("a#link_edit_context_#{@context.id}", :visible=> true)
end
end end
When /^I add a new context "([^"]*)"$/ do |context_name| When /^I add a new context "([^"]*)"$/ do |context_name|
@ -64,11 +58,11 @@ Then /^I should see that a context named "([^"]*)" is not present$/ do |context_
end end
Then /^I should see that the context container for (.*) contexts is not present$/ do |state| Then /^I should see that the context container for (.*) contexts is not present$/ do |state|
page.has_css?("div#list-#{state}-contexts-container", :visible => true).should be_false page.should_not have_css("div#list-#{state}-contexts-container", :visible => true)
end end
Then /^I should see that the context container for (.*) contexts is present$/ do |state| Then /^I should see that the context container for (.*) contexts is present$/ do |state|
find("div#list-#{state}-contexts-container", :visible => true).should_not be_nil page.should have_css("div#list-#{state}-contexts-container", :visible => true)
end end
Then /^I should see the context "([^"]*)" under "([^"]*)"$/ do |context_name, state| Then /^I should see the context "([^"]*)" under "([^"]*)"$/ do |context_name, state|

View file

@ -72,17 +72,17 @@ Then /^he should see that a context named "([^\"]*)" is not present$/ do |contex
end end
Then /^I should not see empty message for todos of context/ do Then /^I should not see empty message for todos of context/ do
find("div#c#{@context.id}empty-nd").should_not be_visible page.should_not have_css("div#c#{@context.id}empty-nd", :visible=>true)
end end
Then /^I should see empty message for todos of context/ do Then /^I should see empty message for todos of context/ do
find("div#c#{@context.id}empty-nd").should be_visible page.should have_css("div#c#{@context.id}empty-nd", :visible => true)
end end
Then /^I should not see empty message for completed todos of context$/ do Then /^I should not see empty message for completed todos of context$/ do
find("div#empty-d").should_not be_visible page.should_not have_css("div#empty-d", :visible=>true)
end end
When /^I should see empty message for completed todos of context$/ do When /^I should see empty message for completed todos of context$/ do
find("div#empty-d").should be_visible page.should have_css("div#empty-d", :visible=>true)
end end

View file

@ -11,7 +11,7 @@ When /^I drag "(.*)" to "(.*)"$/ do |dragged, target|
drag_id = Todo.find_by_description(dragged).id drag_id = Todo.find_by_description(dragged).id
drop_id = Todo.find_by_description(target).id drop_id = Todo.find_by_description(target).id
drag_elem = page.find(:xpath, "//div[@id='line_todo_#{drag_id}']//img[@class='grip']") drag_elem = page.find(:xpath, "//div[@id='line_todo_#{drag_id}']//img[@class='grip']")
drop_elem = page.find(:xpath, "//div[@id='line_todo_#{drop_id}']//div[@class='description']") drop_elem = page.find(:xpath, "//div[@id='line_todo_#{drop_id}']")
drag_elem.drag_to(drop_elem) drag_elem.drag_to(drop_elem)
end end
@ -35,7 +35,6 @@ When /^I edit the dependency of "([^"]*)" to add "([^"]*)" as predecessor$/ do |
open_edit_form_for(todo) open_edit_form_for(todo)
form_css = "form#form_todo_#{todo.id}" form_css = "form#form_todo_#{todo.id}"
within form_css do within form_css do
fill_in 'predecessor_input', :with => predecessor_description fill_in 'predecessor_input', :with => predecessor_description
end end
@ -86,8 +85,12 @@ Then /^the successors of "(.*)" should include "(.*)"$/ do |parent_name, child_n
parent = @current_user.todos.find_by_description(parent_name) parent = @current_user.todos.find_by_description(parent_name)
parent.should_not be_nil parent.should_not be_nil
child = parent.pending_successors.find_by_description(child_name) # wait until the successor is added. TODO: make this not loop indefinitly
child.should_not be_nil wait_until do
found = !parent.pending_successors.find_by_description(child_name).nil?
sleep 0.2 unless found
found
end
end end
Then /^I should see "([^\"]*)" within the dependencies of "([^\"]*)"$/ do |successor_description, todo_description| Then /^I should see "([^\"]*)" within the dependencies of "([^\"]*)"$/ do |successor_description, todo_description|

View file

@ -1,21 +1,3 @@
Given /^I have one project "([^\"]*)" with no notes$/ do |project_name|
@current_user.projects.create!(:name => project_name)
end
Given /^I have two projects with one note each$/ do
project_a = @current_user.projects.create!(:name => 'project A')
project_a.notes.create!(:user_id => @current_user.id, :body => 'note for project A')
project_b = @current_user.projects.create!(:name => 'project B')
project_b.notes.create!(:user_id => @current_user.id, :body => 'note for project B')
end
Given /^I have a project "([^\"]*)" with (.*) notes?$/ do |project_name, num|
project = @current_user.projects.create!(:name => project_name)
1.upto num.to_i do |i|
project.notes.create!(:user_id => @current_user.id, :body => "A note #{i}. This is the very long body of note #{i} where you should not see the last part of the note after 50 characters")
end
end
When /^I add note "([^\"]*)" from the "([^\"]*)" project page$/ do |note, project| When /^I add note "([^\"]*)" from the "([^\"]*)" project page$/ do |note, project|
project = Project.find_by_name(project) project = Project.find_by_name(project)
project.notes.create!(:user_id => @current_user.id, :body => note) project.notes.create!(:user_id => @current_user.id, :body => note)
@ -29,6 +11,8 @@ When /^I delete the first note$/ do
click_link "delete_note_#{id}" click_link "delete_note_#{id}"
end end
get_confirm_text.should == "Are you sure that you want to delete the note '#{id}'?" get_confirm_text.should == "Are you sure that you want to delete the note '#{id}'?"
page.should_not have_css("a#delete_note_#{id}")
end end
When /^I click the icon next to the note$/ do When /^I click the icon next to the note$/ do
@ -49,7 +33,6 @@ When /^I toggle the note of "([^"]*)"$/ do |todo_description|
todo.should_not be_nil todo.should_not be_nil
xpath = "//div[@id='line_todo_#{todo.id}']/div/a/img" xpath = "//div[@id='line_todo_#{todo.id}']/div/a/img"
page.find(:xpath, xpath).click page.find(:xpath, xpath).click
end end
@ -84,9 +67,7 @@ Then /^the first note should disappear$/ do
id = title.split(' ').last id = title.split(' ').last
note = "div#note_#{id}" note = "div#note_#{id}"
wait_until do page.should_not have_css(note, :visible=>true)
!page.has_selector?(note)
end
end end
Then /^I should see the note text$/ do Then /^I should see the note text$/ do
@ -95,11 +76,10 @@ end
Then /^I should not see the note "([^"]*)"$/ do |note_content| Then /^I should not see the note "([^"]*)"$/ do |note_content|
if page.has_selector?("div", :text => note_content) if page.has_selector?("div", :text => note_content)
page.find("div", :text => note_content).visible?.should be_false page.find("div", :text => note_content).should_not be_visible
end end
end end
Then /^I should see the note "([^"]*)"$/ do |note_content| Then /^I should see the note "([^"]*)"$/ do |note_content|
page.find("div", :text => note_content).visible?.should be_true page.find("div", :text => note_content).should be_visible
end end

View file

@ -1,31 +1,3 @@
Given /^I have a project "([^"]*)" with (\d+) active todos$/ do |name, count|
@context = @current_user.contexts.find_or_create_by_name("Context A")
@project = @current_user.projects.find_or_create_by_name(name)
@todos=[]
1.upto count.to_i do |i|
todo = @current_user.todos.create!(
:project_id => @project.id,
:context_id => @context.id,
:description => "todo #{i}")
@todos << todo
end
end
Given /^I have a project "([^"]*)" with (\d+) deferred actions$/ do |name, deferred|
step "I have a project \"#{name}\" with #{deferred} active todos"
@todos.each do |t|
t.show_from = Time.zone.now + 1.week
t.description = "deferred " + t.description
t.save!
end
end
Given /^I have a project "([^"]*)" with (\d+) active actions and (\d+) deferred actions$/ do |name, active_count, deferred_count|
step "I have a project \"#{name}\" with #{active_count} active todos"
step "I have a project \"#{name}\" with #{deferred_count} deferred actions"
end
When /^I delete project "([^"]*)"$/ do |project_name| When /^I delete project "([^"]*)"$/ do |project_name|
project = @current_user.projects.find_by_name(project_name) project = @current_user.projects.find_by_name(project_name)
project.should_not be_nil project.should_not be_nil
@ -134,7 +106,7 @@ Then /^the new project form should be visible$/ do
end end
Then /^the new project form should not be visible$/ do Then /^the new project form should not be visible$/ do
page.has_css?("div#project_new", :visible => true).should be_false page.should_not have_css("div#project_new", :visible => true)
end end
Then /^the project "([^"]*)" should have (\d+) actions listed$/ do |name, count| Then /^the project "([^"]*)" should have (\d+) actions listed$/ do |name, count|

View file

@ -1,3 +1,7 @@
Given /^I have no projects$/ do
Project.delete_all
end
Given /^I have an outdated project "([^"]*)" with (\d+) todos$/ do |project_name, num_todos| Given /^I have an outdated project "([^"]*)" with (\d+) todos$/ do |project_name, num_todos|
step "I have a project \"#{project_name}\" with #{num_todos} todos" step "I have a project \"#{project_name}\" with #{num_todos} todos"
@project = @current_user.projects.find_by_name(project_name) @project = @current_user.projects.find_by_name(project_name)
@ -5,9 +9,18 @@ Given /^I have an outdated project "([^"]*)" with (\d+) todos$/ do |project_name
@project.save @project.save
end end
Given /^I have a project "([^\"]*)" with ([0-9]+) todos$/ do |project_name, num_todos| Given /^I have a project "([^"]*)" with (\d+) deferred actions$/ do |name, deferred|
step "I have a project \"#{name}\" with #{deferred} deferred todos"
end
Given /^I have a project "([^"]*)" with (\d+) active actions and (\d+) deferred actions$/ do |name, active_count, deferred_count|
step "I have a project \"#{name}\" with #{active_count} active todos"
step "I have a project \"#{name}\" with #{deferred_count} deferred todos"
end
Given /^I have a project "([^\"]*)" with ([0-9]+) (todo|active todo|deferred todo)s$/ do |project_name, num_todos, state|
@context = @current_user.contexts.find_or_create_by_name("Context A") @context = @current_user.contexts.find_or_create_by_name("Context A")
@project = @current_user.projects.create!(:name => project_name) @project = @current_user.projects.find_or_create_by_name(project_name)
# acts_as_list adds at top by default, but that is counter-intuitive when reading scenario's, so reverse this # acts_as_list adds at top by default, but that is counter-intuitive when reading scenario's, so reverse this
@project.move_to_bottom @project.move_to_bottom
@ -16,20 +29,14 @@ Given /^I have a project "([^\"]*)" with ([0-9]+) todos$/ do |project_name, num_
todo = @current_user.todos.create!( todo = @current_user.todos.create!(
:project_id => @project.id, :project_id => @project.id,
:context_id => @context.id, :context_id => @context.id,
:description => "todo #{i}") :description => "#{state} #{i}")
todo.show_from = Time.zone.now + 1.week if state=="deferred todo"
todo.save!
@todos << todo @todos << todo
end end
end end
Given /^I have a project "([^\"]*)" with ([0-9]+) deferred todos$/ do |project_name, num_todos| Given /^there exists a project (?:|called )"([^"]*)" for user "([^"]*)"$/ do |project_name, user_name|
step "I have a project \"#{project_name}\" with #{num_todos} todos"
@todos.each do |todo|
todo.show_from = Time.zone.now + 1.week
todo.save!
end
end
Given /^there exists a project "([^\"]*)" for user "([^\"]*)"$/ do |project_name, user_name|
user = User.find_by_login(user_name) user = User.find_by_login(user_name)
user.should_not be_nil user.should_not be_nil
@project = user.projects.create!(:name => project_name) @project = user.projects.create!(:name => project_name)
@ -37,17 +44,12 @@ Given /^there exists a project "([^\"]*)" for user "([^\"]*)"$/ do |project_name
@project.move_to_bottom @project.move_to_bottom
end end
Given /^there exists a project called "([^"]*)" for user "([^"]*)"$/ do |project_name, login| Given /^I have a project (?:|called )"([^"]*)"$/ do |project_name|
# TODO: regexp change to integrate this with the previous since only 'called' is different @project = @current_user.projects.create!(:name => project_name)
step "there exists a project \"#{project_name}\" for user \"#{login}\""
end
Given /^I have a project called "([^"]*)"$/ do |project_name|
step "there exists a project \"#{project_name}\" for user \"#{@current_user.login}\""
end end
Given /^I have a project "([^"]*)" with a default context of "([^"]*)"$/ do |project_name, context_name| Given /^I have a project "([^"]*)" with a default context of "([^"]*)"$/ do |project_name, context_name|
step "there exists a project \"#{project_name}\" for user \"#{@current_user.login}\"" step "I have a project \"#{project_name}\""
context = @current_user.contexts.create!(:name => context_name) context = @current_user.contexts.create!(:name => context_name)
@project.default_context = context @project.default_context = context
@project.save! @project.save!
@ -55,7 +57,7 @@ end
Given /^I have the following projects:$/ do |table| Given /^I have the following projects:$/ do |table|
table.hashes.each do |project| table.hashes.each do |project|
step 'I have a project called "'+project[:project_name]+'"' step "I have a project called \"#{project[:project_name]}\""
# acts_as_list puts the last added project at the top, but we want it # acts_as_list puts the last added project at the top, but we want it
# at the bottom to be consistent with the table in the scenario # at the bottom to be consistent with the table in the scenario
@project.move_to_bottom @project.move_to_bottom
@ -63,11 +65,11 @@ Given /^I have the following projects:$/ do |table|
end end
end end
Given /^I have a completed project called "([^"]*)"$/ do |project_name| Given /^I have a (completed|hidden) project called "([^"]*)"$/ do |state, project_name|
step "I have a project called \"#{project_name}\"" step "I have a project called \"#{project_name}\""
@project.complete! @project.send(state=="completed" ? "complete!" : "hide!")
@project.reload @project.reload
assert @project.completed? assert @project.send(state=="completed" ? "completed?" : "hidden?")
end end
Given /^I have (\d+) completed projects$/ do |number_of_projects| Given /^I have (\d+) completed projects$/ do |number_of_projects|
@ -76,13 +78,22 @@ Given /^I have (\d+) completed projects$/ do |number_of_projects|
end end
end end
Given /^I have no projects$/ do Given /^I have one project "([^\"]*)" with no notes$/ do |project_name|
Project.delete_all step "I have a project called \"#{project_name}\""
end end
Given /^I have a hidden project called "([^"]*)"$/ do |project_name| Given /^I have two projects with one note each$/ do
@project = @current_user.projects.create!(:name => project_name) step "I have a project \"project A\""
@project.hide! @project.notes.create!(:user_id => @current_user.id, :body => 'note for project A')
step "I have a project \"project B\""
@project.notes.create!(:user_id => @current_user.id, :body => 'note for project B')
end
Given /^I have a project "([^\"]*)" with (.*) notes?$/ do |project_name, num|
project = @current_user.projects.create!(:name => project_name)
1.upto num.to_i do |i|
project.notes.create!(:user_id => @current_user.id, :body => "A note #{i}. This is the very long body of note #{i} where you should not see the last part of the note after 50 characters")
end
end end
When /^I open the project edit form$/ do When /^I open the project edit form$/ do
@ -92,10 +103,7 @@ end
When /^I cancel the project edit form$/ do When /^I cancel the project edit form$/ do
click_link "cancel_project_#{@project.id}" click_link "cancel_project_#{@project.id}"
page.should_not have_css("submit_project_#{@project.id}")
wait_until do
!page.has_css?("submit_project_#{@project.id}")
end
end end
When /^I edit the project description to "([^\"]*)"$/ do |new_description| When /^I edit the project description to "([^\"]*)"$/ do |new_description|
@ -135,8 +143,8 @@ Then /^I should (see|not see) empty message for (todos|deferred todos|completed
end end
elem = find(css) elem = find(css)
elem.nil?.should be_false elem.should_not be_nil
elem.visible?.should(visible=="see" ? be_true : be_false) elem.send(visible=="see" ? "should" : "should_not", be_visible)
end end
Then /^I edit the default tags to "([^"]*)"$/ do |default_tags| Then /^I edit the default tags to "([^"]*)"$/ do |default_tags|
@ -169,9 +177,7 @@ end
Then /^I should be able to change the project name in place$/ do Then /^I should be able to change the project name in place$/ do
#Note that this is not changing the project name #Note that this is not changing the project name
wait_until do page.should have_css("div#project_name>form>input")
page.has_css? "div#project_name>form>input"
end
page.find("div#project_name > form > button[type=cancel]").click page.find("div#project_name > form > button[type=cancel]").click
end end
@ -179,12 +185,12 @@ When /^I edit the project settings$/ do
@project.should_not be_nil @project.should_not be_nil
click_link "link_edit_project_#{@project.id}" click_link "link_edit_project_#{@project.id}"
page.has_xpath?("//div[@id='edit_project_#{@project.id}']/form//button[@id='submit_project_#{@project.id}']").should be_true page.should have_xpath("//div[@id='edit_project_#{@project.id}']/form//button[@id='submit_project_#{@project.id}']")
end end
Then /^I should not be able to change the project name in place$/ do Then /^I should not be able to change the project name in place$/ do
step "I click to edit the project name in place" step "I click to edit the project name in place"
page.has_xpath?("//div[@id='project_name']/form/input").should be_false page.should_not have_xpath("//div[@id='project_name']/form/input")
end end
When /^I close the project settings$/ do When /^I close the project settings$/ do
@ -194,7 +200,6 @@ When /^I close the project settings$/ do
wait_for_animations_to_end wait_for_animations_to_end
end end
When /^I edit the project state of "([^"]*)" to "([^"]*)"$/ do |project_name, state_name| When /^I edit the project state of "([^"]*)" to "([^"]*)"$/ do |project_name, state_name|
project = @current_user.projects.find_by_name(project_name) project = @current_user.projects.find_by_name(project_name)
project.should_not be_nil project.should_not be_nil
@ -243,7 +248,6 @@ Then /^I should see the bold text "([^\"]*)" in the project description$/ do |te
page.should have_xpath(xpath) page.should have_xpath(xpath)
bold_text = page.find(:xpath, xpath).text bold_text = page.find(:xpath, xpath).text
bold_text.should =~ /#{text_in_bold}/ bold_text.should =~ /#{text_in_bold}/
end end
@ -252,7 +256,6 @@ Then /^I should see the italic text "([^\"]*)" in the project description$/ do |
page.should have_xpath(xpath) page.should have_xpath(xpath)
italic_text = page.find(:xpath, xpath).text italic_text = page.find(:xpath, xpath).text
italic_text.should =~ /#{text_in_italic}/ italic_text.should =~ /#{text_in_italic}/
end end
@ -268,12 +271,12 @@ end
Then /^I should (see|not see) the default project settings$/ do |visible| Then /^I should (see|not see) the default project settings$/ do |visible|
default_settings = "This project is active with no default context and with no default tags" default_settings = "This project is active with no default context and with no default tags"
if visible == "see"
elem = page.find("div.project_settings") elem = page.find("div.project_settings")
elem.visible?.should be_true
if visible == "see"
elem.should be_visible
elem.text.should =~ /#{default_settings}/ elem.text.should =~ /#{default_settings}/
else else
elem = page.find("div.project_settings") elem.should_not be_visible
elem.visible?.should be_false
end end
end end

View file

@ -68,17 +68,10 @@ When /^I delete the pattern "([^"]*)"$/ do |pattern_name|
page.should_not have_css("#delete_icon_#{pattern.id}") page.should_not have_css("#delete_icon_#{pattern.id}")
end end
When /^I mark the pattern "([^"]*)" as complete$/ do |pattern_name| When /^I mark the pattern "([^"]*)" as (complete|active)$/ do |pattern_name, state|
pattern = @current_user.recurring_todos.find_by_description(pattern_name) pattern = @current_user.recurring_todos.find_by_description(pattern_name)
pattern.should_not be_nil pattern.should_not be_nil
pattern.completed?.should be_false pattern.completed?.should(state=="complete" ? be_false : be_true)
page.find("#check_#{pattern.id}").click
end
When /^I mark the pattern "([^"]*)" as active$/ do |pattern_name|
pattern = @current_user.recurring_todos.find_by_description(pattern_name)
pattern.should_not be_nil
pattern.completed?.should be_true
page.find("#check_#{pattern.id}").click page.find("#check_#{pattern.id}").click
end end

View file

@ -160,7 +160,7 @@ end
####### PROJECT WITH TODOS ###### ####### PROJECT WITH TODOS ######
Given /^I have a project "([^"]*)" that has the following todos$/ do |project_name, todos| Given /^I have a project "([^"]*)" that has the following (todos|deferred todos)$/ do |project_name, kind_of_todo, todos|
step "I have a project called \"#{project_name}\"" step "I have a project called \"#{project_name}\""
@project.should_not be_nil @project.should_not be_nil
todos.hashes.each do |todo| todos.hashes.each do |todo|
@ -171,26 +171,7 @@ Given /^I have a project "([^"]*)" that has the following todos$/ do |project_na
:context_id => context.id, :context_id => context.id,
:project_id=>@project.id, :project_id=>@project.id,
:notes => todo[:notes]) :notes => todo[:notes])
unless todo[:tags].nil? new_todo.show_from = Time.zone.now+1.week if kind_of_todo=="deferred todos"
new_todo.tag_with(todo[:tags])
end
unless todo[:completed].nil?
new_todo.complete! if todo[:completed] == 'yes'
end
end
end
Given /^I have a project "([^"]*)" that has the following deferred todos$/ do |project_name, todos|
step "I have a project called \"#{project_name}\""
@project.should_not be_nil
todos.hashes.each do |todo|
context = @current_user.contexts.find_by_name(todo[:context])
context.should_not be_nil
new_todo = @current_user.todos.create!(
:description => todo[:description],
:context_id => context.id,
:project_id=>@project.id,
:show_from=>Time.zone.now+1.week)
unless todo[:tags].nil? unless todo[:tags].nil?
new_todo.tag_with(todo[:tags]) new_todo.tag_with(todo[:tags])
end end
@ -213,9 +194,6 @@ When /^I submit a new action with description "([^"]*)" with a dependency on "([
fill_in "todo[description]", :with => todo_description fill_in "todo[description]", :with => todo_description
fill_in "predecessor_input", :with => predecessor_description fill_in "predecessor_input", :with => predecessor_description
# input = "xpath=//form[@id='todo-form-new-action']//input[@id='predecessor_input']"
# selenium.focus(input)
# selenium.type_keys input, predecessor_description
# wait for auto complete # wait for auto complete
autocomplete = "//a[@id='ui-active-menuitem']" autocomplete = "//a[@id='ui-active-menuitem']"

View file

@ -81,6 +81,7 @@ end
When /^I edit the description of "([^"]*)" to "([^"]*)"$/ do |action_description, new_description| When /^I edit the description of "([^"]*)" to "([^"]*)"$/ do |action_description, new_description|
todo = @current_user.todos.find_by_description(action_description) todo = @current_user.todos.find_by_description(action_description)
todo.should_not be_nil todo.should_not be_nil
open_edit_form_for(todo) open_edit_form_for(todo)
fill_in "todo_description", :with => new_description fill_in "todo_description", :with => new_description
submit_edit_todo_form(todo) submit_edit_todo_form(todo)
@ -89,6 +90,7 @@ end
When /^I try to edit the description of "([^"]*)" to "([^"]*)"$/ do |action_description, new_description| When /^I try to edit the description of "([^"]*)" to "([^"]*)"$/ do |action_description, new_description|
todo = @current_user.todos.find_by_description(action_description) todo = @current_user.todos.find_by_description(action_description)
todo.should_not be_nil todo.should_not be_nil
open_edit_form_for(todo) open_edit_form_for(todo)
fill_in "todo_description", :with => new_description fill_in "todo_description", :with => new_description
submit_button_xpath = "//div[@id='edit_todo_#{todo.id}']//button[@id='submit_todo_#{todo.id}']" submit_button_xpath = "//div[@id='edit_todo_#{todo.id}']//button[@id='submit_todo_#{todo.id}']"
@ -119,6 +121,7 @@ end
When /^I clear the due date of "([^"]*)"$/ do |action_description| When /^I clear the due date of "([^"]*)"$/ do |action_description|
todo = @current_user.todos.find_by_description(action_description) todo = @current_user.todos.find_by_description(action_description)
todo.should_not be_nil todo.should_not be_nil
open_edit_form_for(todo) open_edit_form_for(todo)
within "div#edit_todo_#{todo.id}" do within "div#edit_todo_#{todo.id}" do
find("a#due_x_todo_#{todo.id}").click find("a#due_x_todo_#{todo.id}").click
@ -132,6 +135,7 @@ end
When /^I edit the show from date of "([^"]*)" to next month$/ do |action_description| When /^I edit the show from date of "([^"]*)" to next month$/ do |action_description|
todo = @current_user.todos.find_by_description(action_description) todo = @current_user.todos.find_by_description(action_description)
todo.should_not be_nil todo.should_not be_nil
open_edit_form_for(todo) open_edit_form_for(todo)
fill_in "show_from_todo_#{todo.id}", :with => format_date(todo.created_at + 1.month) fill_in "show_from_todo_#{todo.id}", :with => format_date(todo.created_at + 1.month)
submit_edit_todo_form(todo) submit_edit_todo_form(todo)
@ -143,7 +147,6 @@ When /^I remove the show from date from "([^"]*)"$/ do |action_description|
open_edit_form_for(todo) open_edit_form_for(todo)
page.find(:xpath, "//div[@id='edit_todo_#{todo.id}']//a[@id='show_from_x_todo_#{todo.id}']/img").click page.find(:xpath, "//div[@id='edit_todo_#{todo.id}']//a[@id='show_from_x_todo_#{todo.id}']/img").click
submit_edit_todo_form(todo) submit_edit_todo_form(todo)
end end
@ -156,6 +159,7 @@ When /^I defer "([^"]*)" for 1 day$/ do |action_description|
todo.should_not be_nil todo.should_not be_nil
open_submenu_for(todo) open_submenu_for(todo)
page.should have_css("a#defer_1_todo_#{todo.id}", :visible=>true)
click_link "defer_1_todo_#{todo.id}" click_link "defer_1_todo_#{todo.id}"
wait_for_ajax wait_for_ajax
@ -176,6 +180,7 @@ When /^I make a project of "([^"]*)"$/ do |action_description|
todo.should_not be_nil todo.should_not be_nil
open_submenu_for(todo) open_submenu_for(todo)
page.should have_css("a#to_project_todo_#{todo.id}", :visible=>true)
click_link "to_project_todo_#{todo.id}" click_link "to_project_todo_#{todo.id}"
page.should have_no_css("div#line_todo_#{todo.id}") page.should have_no_css("div#line_todo_#{todo.id}")
@ -187,5 +192,5 @@ end
Then /^I should see an error message$/ do Then /^I should see an error message$/ do
error_block = "//form/div[@id='edit_error_status']" error_block = "//form/div[@id='edit_error_status']"
page.find(:xpath, error_block).should_not be_nil page.should have_xpath(error_block)
end end

View file

@ -26,9 +26,7 @@ When /^I open the notes of "([^"]*)"$/ do |action_description|
page.find(:xpath, "//div[@id='line_todo_#{todo.id}']/div/a/img").click page.find(:xpath, "//div[@id='line_todo_#{todo.id}']/div/a/img").click
wait_until do page.should have_xpath("//div[@id='notes_todo_#{todo.id}']", :visible=>true)
page.find(:xpath, "//div[@id='notes_todo_#{todo.id}']").visible?
end
end end
####### THEN ####### ####### THEN #######
@ -38,7 +36,6 @@ Then /^I should see a starred "([^"]*)"$/ do |action_description|
todo.should_not be_nil todo.should_not be_nil
xpath_starred = "//div[@id='line_todo_#{todo.id}']//img[@class='todo_star starred']" xpath_starred = "//div[@id='line_todo_#{todo.id}']//img[@class='todo_star starred']"
page.should have_xpath(xpath_starred) page.should have_xpath(xpath_starred)
end end
@ -55,13 +52,6 @@ Then /^I should see ([0-9]+) todos$/ do |count|
total.should == count.to_i total.should == count.to_i
end end
Then /^there should not be an error$/ do
# form should be gone and thus no errors visible
wait_for :timeout => 5 do
!selenium.is_visible("edit_todo_#{@dep_todo.id}")
end
end
Then /^I should see the todo "([^\"]*)"$/ do |todo_description| Then /^I should see the todo "([^\"]*)"$/ do |todo_description|
page.should have_xpath("//span[.=\"#{todo_description}\"]", :visible => true) page.should have_xpath("//span[.=\"#{todo_description}\"]", :visible => true)
end end
@ -76,14 +66,7 @@ Then /^I should see a completed todo "([^"]*)"$/ do |todo_description|
# only completed todos have a grey span with the completed_at date # only completed todos have a grey span with the completed_at date
xpath = "//div[@id='line_todo_#{todo.id}']/div/span[@class='grey']" xpath = "//div[@id='line_todo_#{todo.id}']/div/span[@class='grey']"
page.should have_xpath(xpath, :visible=>true)
unless selenium.is_element_present(xpath)
wait_for :timeout => 5 do
selenium.is_element_present(xpath)
end
end
selenium.is_visible(xpath).should be_true
end end
Then /^I should see an active todo "([^"]*)"$/ do |todo_description| Then /^I should see an active todo "([^"]*)"$/ do |todo_description|
@ -105,9 +88,6 @@ end
Then /^the selected project should be "([^"]*)"$/ do |content| Then /^the selected project should be "([^"]*)"$/ do |content|
# Works for mobile. TODO: make it work for both mobile and non-mobile # Works for mobile. TODO: make it work for both mobile and non-mobile
if content.blank? if content.blank?
if page.has_css?("select#todo_project_id option[selected='selected']")
puts "text=#{page.find("select#todo_project_id option[selected='selected']").text}"
end
page.has_css?("select#todo_project_id option[selected='selected']").should be_false page.has_css?("select#todo_project_id option[selected='selected']").should be_false
else else
page.find("select#todo_project_id option[selected='selected']").text.should =~ /#{content}/ page.find("select#todo_project_id option[selected='selected']").text.should =~ /#{content}/
@ -117,10 +97,6 @@ end
Then /^the selected context should be "([^"]*)"$/ do |content| Then /^the selected context should be "([^"]*)"$/ do |content|
# Works for mobile. TODO: make it work for both mobile and non-mobile # Works for mobile. TODO: make it work for both mobile and non-mobile
if content.blank? if content.blank?
if page.has_css?("select#todo_context_id option[selected='selected']")
puts "text=#{page.find("select#todo_context_id option[selected='selected']").text}"
save_and_open_page
end
page.has_css?("select#todo_context_id option[selected='selected']").should be_false page.has_css?("select#todo_context_id option[selected='selected']").should be_false
else else
page.find("select#todo_context_id option[selected='selected']").text.should =~ /#{content}/ page.find("select#todo_context_id option[selected='selected']").text.should =~ /#{content}/
@ -132,9 +108,7 @@ Then /^I should see the page selector$/ do
end end
Then /^the page should be "([^"]*)"$/ do |page_number| Then /^the page should be "([^"]*)"$/ do |page_number|
page_number_found = -1 page.find(:xpath, ".//span[@class='current']").text.should == page_number
page_number_xpath = ".//span[@class='current']"
page.find(:xpath, page_number_xpath).text.should == page_number
end end
Then /^the project field of the new todo form should contain "([^"]*)"$/ do |project_name| Then /^the project field of the new todo form should contain "([^"]*)"$/ do |project_name|
@ -172,41 +146,19 @@ Then /^I should see "([^"]*)" in the completed section of the mobile site$/ do |
page.should have_xpath(xpath) page.should have_xpath(xpath)
end end
Then /^I should not see empty message for todos of home/ do Then /^I should (see|not see) empty message for (completed todos|todos) of home/ do |visible, kind_of_todo|
find("div#no_todos_in_view").should_not be_visible elem = find(kind_of_todo=="todos" ? "div#no_todos_in_view" : "div#empty-d")
end elem.send(visible=="see" ? "should" : "should_not", be_visible)
Then /^I should see empty message for todos of home/ do
find("div#no_todos_in_view").should be_visible
end
Then /^I should not see empty message for completed todos of home$/ do
find("div#empty-d").should_not be_visible
end
Then /^I should see empty message for completed todos of home$/ do
find("div#empty-d").should be_visible
end end
Then /^I should (see|not see) the empty tickler message$/ do |see| Then /^I should (see|not see) the empty tickler message$/ do |see|
elem = find("div#tickler-empty-nd") elem = find("div#tickler-empty-nd")
if see=="see" elem.send(see=="see" ? "should" : "should_not", be_visible)
elem.should be_visible
else
elem.should_not be_visible
end
end end
Then /^I should not see the notes of "([^"]*)"$/ do |todo_description| Then /^I should (see|not see) the notes of "([^"]*)"$/ do |visible, todo_description|
todo = @current_user.todos.find_by_description(todo_description) todo = @current_user.todos.find_by_description(todo_description)
todo.should_not be_nil todo.should_not be_nil
page.find("div#notes_todo_#{todo.id}").should_not be_visible page.find("div#notes_todo_#{todo.id}").send(visible=="see" ? "should" : "should_not", be_visible)
end
Then /^I should see the notes of "([^"]*)"$/ do |todo_description|
todo = @current_user.todos.find_by_description(todo_description)
todo.should_not be_nil
page.find("div#notes_todo_#{todo.id}").should be_visible
end end

View file

@ -36,7 +36,8 @@ end
When /^I change my password to "([^"]*)"$/ do |password| When /^I change my password to "([^"]*)"$/ do |password|
step 'I should be on the change password page' step 'I should be on the change password page'
%w{password password_confirmation}.each { |name| fill_in "user[#{name}]", :with => password } fill_in "user[password]", :with => password
fill_in "user[password_confirmation]", :with => password
click_button "Change password" click_button "Change password"
end end
@ -55,9 +56,7 @@ When /^I delete the user "([^\"]*)"$/ do |username|
end end
get_confirm_text.should == "Warning: this will delete user '#{user.login}', all their actions, contexts, project and notes. Are you sure that you want to continue?" get_confirm_text.should == "Warning: this will delete user '#{user.login}', all their actions, contexts, project and notes. Are you sure that you want to continue?"
wait_until do page.should_not have_css("tr#user-#{user.id}")
!page.has_css?("tr#user-#{user.id}")
end
end end
Then /^I should see that a user named "([^\"]*)" is not present$/ do |username| Then /^I should see that a user named "([^\"]*)" is not present$/ do |username|

View file

@ -1,128 +1,46 @@
module TracksStepHelper module TracksStepHelper
def submit_multiple_next_action_form
xpath = "//form[@id='todo-form-multi-new-action']//button[@id='todo_multi_new_action_submit']"
handle_js_confirm do
within("form#todo-form-multi-new-action") do
click_button("todo_multi_new_action_submit")
end
wait_for_ajax
wait_for_animations_to_end
end
end
def submit_next_action_form
handle_js_confirm do
within("#todo-form-new-action") do
click_button("todo_new_action_submit")
end
wait_for_ajax
wait_for_animations_to_end
end
end
def submit_new_context_form
within "form#context-form" do
find("button#context_new_submit").click
end
wait_for_ajax
wait_for_animations_to_end
end
def submit_new_project_form
within "form#project_form" do
click_button "project_new_project_submit"
end
wait_for_ajax
wait_for_animations_to_end
end
def wait_for_form_to_go_away(todo)
page.should_not have_content("button#submit_todo_#{todo.id}")
end
def submit_edit_todo_form (todo)
within "div#edit_todo_#{todo.id}" do
click_button "submit_todo_#{todo.id}"
end
wait_for_form_to_go_away(todo)
end
def format_date(date)
# copy-and-past from ApplicationController::format_date
return date ? date.in_time_zone(@current_user.prefs.time_zone).strftime("#{@current_user.prefs.date_format}") : ''
end
def execute_javascript(js)
page.execute_script(js)
end
def clear_context_name_from_next_action_form
execute_javascript("$('#todo_context_name').val('');")
end
def clear_project_name_from_next_action_form
execute_javascript("$('#todo_project_name').val('');")
end
def open_edit_form_for(todo) def open_edit_form_for(todo)
within "div#line_todo_#{todo.id}" do within "div#line_todo_#{todo.id}" do
find("a#icon_edit_todo_#{todo.id}").click find("a#icon_edit_todo_#{todo.id}").click
end end
wait_for_ajax
wait_for_animations_to_end wait_for_animations_to_end
end end
def wait_for_animations_to_end def submit_form(form_css, button_name)
wait_until do handle_js_confirm do
page.evaluate_script('$(":animated").length') == 0 within(form_css) do
click_button(button_name)
end end
end wait_for_ajax
def wait_for_ajax
start_time = Time.now
page.evaluate_script('jQuery.isReady&&jQuery.active==0').class.should_not eql(String)
until(page.evaluate_script('jQuery.isReady&&jQuery.active==0') || (start_time + 5.seconds) < Time.now)
sleep 1
end
end
def handle_js_confirm(accept=true)
page.execute_script "window.original_confirm_function = window.confirm"
page.execute_script "window.confirmMsg = null"
page.execute_script "window.confirm = function(msg) { window.confirmMsg = msg; return #{!!accept}; }"
yield
ensure
page.execute_script "window.confirm = window.original_confirm_function"
end
def get_confirm_text
page.evaluate_script "window.confirmMsg"
end
def open_submenu_for(todo)
submenu_arrow = "div#line_todo_#{todo.id} img.todo-submenu"
page.find(submenu_arrow).should be_visible
page.find(submenu_arrow).click
# wait for the submenu to be visible
wait_until do
page.find("div#line_todo_#{todo.id} ul#ultodo_#{todo.id}").visible?
end
wait_for_animations_to_end wait_for_animations_to_end
end end
def context_list_find_index(context_name)
div_id = "context_#{@current_user.contexts.find_by_name(context_name).id}"
contexts = page.all("div.context").map { |x| x[:id] }
return contexts.find_index(div_id)
end end
def project_list_find_index(project_name) def submit_multiple_next_action_form
# TODO: refactor with context_list_find_index submit_form("form#todo-form-multi-new-action", "todo_multi_new_action_submit")
div_id = "project_#{@current_user.projects.find_by_name(project_name).id}" end
project = page.all("div.project").map { |x| x[:id] }
return project.find_index(div_id) def submit_next_action_form
submit_form("#todo-form-new-action", "todo_new_action_submit")
end
def submit_new_context_form
submit_form("form#context-form", "context_new_submit")
end
def submit_new_project_form
submit_form("form#project_form", "project_new_project_submit")
end
def submit_edit_todo_form (todo)
submit_form("div#edit_todo_#{todo.id}", "submit_todo_#{todo.id}")
wait_for_todo_form_to_go_away(todo)
end
def wait_for_todo_form_to_go_away(todo)
page.should_not have_content("button#submit_todo_#{todo.id}")
end end
def open_project_edit_form(project) def open_project_edit_form(project)
@ -152,10 +70,75 @@ module TracksStepHelper
end end
def edit_project_settings(project) def edit_project_settings(project)
open_project_edit_form(project) edit_project(project) do
yield yield
submit_project_edit_form(project) end
page.should_not have_css("button#submit_project_#{project.id}", :visible => true) end
def open_submenu_for(todo)
submenu_arrow = "div#line_todo_#{todo.id} img.todo-submenu"
page.should have_css(submenu_arrow, :visible=>true)
page.find(submenu_arrow).click
page.should have_css("div#line_todo_#{todo.id} ul#ultodo_#{todo.id}", :visible => true)
end
def context_list_find_index(context_name)
div_id = "context_#{@current_user.contexts.find_by_name(context_name).id}"
contexts = page.all("div.context").map { |x| x[:id] }
return contexts.find_index(div_id)
end
def project_list_find_index(project_name)
# TODO: refactor with context_list_find_index
div_id = "project_#{@current_user.projects.find_by_name(project_name).id}"
project = page.all("div.project").map { |x| x[:id] }
return project.find_index(div_id)
end
def wait_for_animations_to_end
wait_until do
page.evaluate_script('$(":animated").length') == 0
end
end
def wait_for_ajax
start_time = Time.now
page.evaluate_script('jQuery.isReady&&jQuery.active==0').class.should_not eql(String)
until(page.evaluate_script('jQuery.isReady&&jQuery.active==0') || (start_time + 5.seconds) < Time.now)
sleep 1
end
end
def format_date(date)
# copy-and-past from ApplicationController::format_date
return date ? date.in_time_zone(@current_user.prefs.time_zone).strftime("#{@current_user.prefs.date_format}") : ''
end
def execute_javascript(js)
page.execute_script(js)
end
def clear_context_name_from_next_action_form
execute_javascript("$('#todo_context_name').val('');")
end
def clear_project_name_from_next_action_form
execute_javascript("$('#todo_project_name').val('');")
end
def handle_js_confirm(accept=true)
page.execute_script "window.original_confirm_function = window.confirm"
page.execute_script "window.confirmMsg = null"
page.execute_script "window.confirm = function(msg) { window.confirmMsg = msg; return #{!!accept}; }"
yield
ensure
page.execute_script "window.confirm = window.original_confirm_function"
end
def get_confirm_text
page.evaluate_script "window.confirmMsg"
end end
end end

View file

@ -131,7 +131,7 @@ Feature: Show done
When I delete the pattern "test pattern" When I delete the pattern "test pattern"
Then I should not see "test pattern" in the completed recurring todos container Then I should not see "test pattern" in the completed recurring todos container
When I go to the recurring todos page When I go to the recurring todos page
Then I should see "test pattern" in the active recurring todos container Then I should not see "test pattern" in the active recurring todos container
@selenium @selenium
Scenario Outline: I can toggle a todo active from the done pages Scenario Outline: I can toggle a todo active from the done pages

View file

@ -534,12 +534,12 @@ var TodoItems = {
}); });
$('.item-show').droppable({ $('.item-show').droppable({
drop: TodoItems.drop_todo, drop: TodoItems.drop_todo,
tolerance: 'pointer', tolerance: 'intersect', /* warning: selenium fails on drag_and_drop when this is 'pointer' */
hoverClass: 'hover' hoverClass: 'hover'
}); });
$('.context_target').droppable({ $('.context_target').droppable({
drop: TodoItems.drop_todo_on_context, drop: TodoItems.drop_todo_on_context,
tolerance: 'pointer', tolerance: 'intersect', /* warning: selenium fails on drag_and_drop when this is 'pointer' */
hoverClass: 'hover' hoverClass: 'hover'
}); });
}, },