cucumber removal

This commit is contained in:
ericmoon 2018-07-24 12:34:55 -07:00
parent 97bfad71ca
commit 6dcaa76f09
74 changed files with 1 additions and 5920 deletions

View file

@ -49,7 +49,6 @@ gem "font-awesome-sass", "~> 4.5.0"
group :development do
gem "spring"
gem "spring-commands-cucumber"
gem "yard"
gem 'tolk', '~> 1.9.3'
@ -71,7 +70,6 @@ group :test do
gem "factory_girl_rails"
gem "capybara"
gem "cucumber-rails", :require => false
gem "rspec-expectations"
gem "database_cleaner"
gem "mocha", :require => false

View file

@ -57,7 +57,6 @@ GEM
aruba (0.14.5)
childprocess (>= 0.6.3, < 0.10.0)
contracts (~> 0.9)
cucumber (>= 1.3.19)
ffi (~> 1.9.10)
rspec-expectations (>= 2.99)
thor (~> 0.19)
@ -96,28 +95,6 @@ GEM
concurrent-ruby (1.0.5)
contracts (0.16.0)
crass (1.0.4)
cucumber (3.1.1)
builder (>= 2.1.2)
cucumber-core (~> 3.1.0)
cucumber-expressions (~> 6.0.0)
cucumber-wire (~> 0.0.1)
diff-lcs (~> 1.3)
gherkin (~> 5.1.0)
multi_json (>= 1.7.5, < 2.0)
multi_test (>= 0.1.2)
cucumber-core (3.1.0)
backports (>= 3.8.0)
cucumber-tag_expressions (~> 1.1.0)
gherkin (>= 5.0.0)
cucumber-expressions (6.0.1)
cucumber-rails (1.5.0)
capybara (>= 1.1.2, < 3)
cucumber (>= 1.3.8, < 4)
mime-types (>= 1.17, < 4)
nokogiri (~> 1.5)
railties (>= 4, < 5.2)
cucumber-tag_expressions (1.1.1)
cucumber-wire (0.0.1)
daemons (1.2.6)
database_cleaner (1.7.0)
diff-lcs (1.3)
@ -261,8 +238,6 @@ GEM
simplecov-html (0.10.2)
spring (2.0.2)
activesupport (>= 4.2)
spring-commands-cucumber (1.0.1)
spring (>= 0.9.1)
sprockets (3.7.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
@ -316,7 +291,6 @@ DEPENDENCIES
capybara
codeclimate-test-reporter
coffee-rails (~> 4.1.0)
cucumber-rails
database_cleaner
factory_girl_rails
font-awesome-sass (~> 4.5.0)
@ -340,7 +314,6 @@ DEPENDENCIES
selenium-webdriver (~> 2.53)
simplecov
spring
spring-commands-cucumber
sqlite3
swf_fu
therubyracer

View file

@ -1,3 +1,3 @@
<% if Rails.env.test? || Rails.env.cucumber? %>
<% if Rails.env.test? %>
$.fx.off = true;
<% end %>

View file

@ -1,10 +0,0 @@
#!/usr/bin/env ruby
if ENV["RAILS_ENV"] != "production"
exec("#{__dir__}/../script/docker-environment", $PROGRAM_NAME, *ARGV) unless File.exist?("/etc/app-env")
end
begin
load File.expand_path("../spring", __FILE__)
rescue LoadError
end
require 'bundler/setup'
load Gem.bin_path('cucumber', 'cucumber')

View file

@ -1,8 +0,0 @@
<%
rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} --strict --tags ~@wip"
%>
default: <%= std_opts %> features
wip: --tags @wip:15 --wip features
rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip

View file

@ -35,6 +35,3 @@ test: &TEST
database: tracks_test
username: root
encoding: utf8
cucumber:
<<: *TEST

View file

@ -1,42 +0,0 @@
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb
# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
# your test database is "scratch space" for the test suite and is wiped
# and recreated between test runs. Don't rely on the data there!
config.cache_classes = true
# Configure static asset server for tests with Cache-Control for performance
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"
# Log error messages when you accidentally call methods on nil
config.whiny_nils = true
# Show full error reports and disable caching
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
# Raise exceptions instead of rendering exception templates
config.action_dispatch.show_exceptions = false
# Disable request forgery protection in test environment
config.action_controller.allow_forgery_protection = false
# Tell Action Mailer not to deliver emails to the real world.
# The :test delivery method accumulates sent emails in the
# ActionMailer::Base.deliveries array.
config.action_mailer.delivery_method = :test
# Raise exception on mass assignment protection for Active Record models
config.active_record.mass_assignment_sanitizer = :strict
# Print deprecation notices to the stderr
config.active_support.deprecation = :stderr
# Unique cookies and use cookies for session
# config.action_controller.session_store :cookie_store, :key => 'TracksCucumber'
config.time_zone = 'UTC'
end

View file

@ -1,36 +0,0 @@
Feature: Add a todo to Tracks on console
In order to be able to add a todo from the command line
As a user who has installed Tracks with console access
I want to run the script to add a todo
These scenarios are tagged javascript so that there is a Tracks server running
to use from the command line script
Background:
Given the following user records
| login | password | is_admin |
| testuser | secret | false |
| admin | secret | true |
And I have logged in as "testuser" with password "secret"
And I have a context called "Context A"
And I have a project called "Project A"
@javascript @aruba
Scenario: Create a single todo
Given a console input that looks like
"""
a new todo
"""
When I execute the add-todo script
Then I should have 1 todo in project "Project A"
@javascript @aruba
Scenario: Create multiple todos
Given a console input that looks like
"""
todo 1
todo 2
"""
When I execute the add-todo script
Then I should have 2 todos in project "Project A"

View file

@ -1,58 +0,0 @@
Feature: Show all due actions in a calendar view
As a Tracks user
In order to keep overview of my due todos
I want to manage due todos in a calendar view
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
And I have a context called "@calendar"
@javascript
Scenario: Setting due date of a todo will show it in the calendar
When I submit a new action with description "something new" in the context "@calendar"
And I go to the calendar page
Then the badge should show 0
And I should not see the todo "something new"
When I go to the home page
Then I should see the todo "something new"
When I edit the due date of "something new" to tomorrow
And I go to the calendar page
Then I should see the todo "something new"
And the badge should show 1
@javascript @wip
Scenario: Clearing the due date of a todo will remove it from the calendar
When I go to the home page
And I submit a new action with description "something new" in the context "@calendar"
And I edit the due date of "something new" to tomorrow
And I go to the calendar page
Then I should see the todo "something new"
When I clear the due date of "something new"
Then I should not see the todo "something new"
@javascript @wip
Scenario: Marking a todo complete will remove it from the calendar
Given I have a todo "something new" in the context "@calendar" which is due tomorrow
When I go to the calendar page
Then I should see the todo "something new"
When I clear the due date of "something new"
Then I should not see the todo "something new"
@javascript
Scenario: Deleting a todo will remove it from the calendar
Given I have a todo "something new" in the context "@calendar" which is due tomorrow
When I go to the calendar page
Then I should see the todo "something new"
When I delete the action "something new"
Then I should not see the todo "something new"
@javascript
Scenario: Changing due date of a todo will move it in the calendar
Given I have a todo "something new" in the context "@calendar" which is due tomorrow
When I go to the calendar page
Then I should see the todo "something new"
When I edit the due date of "something new" to next month
Then I should see "something new" in the due next month container

View file

@ -1,120 +0,0 @@
Feature: Edit a context
In order to work on todos in a context
As a Tracks user
I want to manage todos in a context
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
And I have a context called "@pc"
And I have a project called "test project"
And I have 2 todos in project "test project" in context "@pc" with tags "starred" prefixed by "test_project "
@javascript
Scenario: In place edit of context name
When I go to the context page for "@pc"
And I edit the context name in place to be "OutAndAbout"
Then I should see the context name is "OutAndAbout"
When I go to the contexts page
Then I should see that a context named "Errands" is not present
And I should see that a context named "OutAndAbout" is present
# Ticket #1796
@javascript
Scenario: I can change the name of the context and it should update the new todo form
When I go to the context page for "@pc"
And I edit the context name in place to be "OutAndAbout"
Then the context field of the new todo form should contain "OutAndAbout"
# Ticket #1789
@javascript
Scenario: I can change the name of the context and it should still allow me to add new actions
When I go to the context page for "@pc"
And I edit the context name in place to be "OutAndAbout"
And I submit a new action with description "a new next action"
Then I should see the todo "a new next action"
@javascript
Scenario: Editing the context of a todo will remove the todo
When I go to the the context page for "@pc"
Then the badge should show 2
When I edit the context of "test_project todo 1" to "@laptop"
Then I should not see the todo "todo 1"
And the badge should show 1
@javascript
Scenario: Editing the description of a a todo will update that todo
When I go to the the context page for "@pc"
And I edit the description of "test_project todo 1" to "changed"
Then I should not see the todo "test_project todo 1"
And I should see "changed"
@javascript @wip
Scenario: Editing the context of the last todo will remove the todo and show empty message
When I go to the the context page for "@pc"
And I edit the context of "test_project todo 1" to "@laptop"
Then I should not see the todo "test_project todo 1"
And the badge should show 1
When I edit the context of "test_project todo 2" to "@laptop"
Then I should not see the todo "test_project todo 2"
And the badge should show 0
And I should see empty message for todos of context
@javascript
Scenario: Adding a todo to a hidden project will not show the todo
Given I have a hidden project called "hidden project"
When I go to the the context page for "@pc"
And I edit the project of "test_project todo 1" to "hidden project"
Then I should not see the todo "test_project todo 1"
When I submit a new action with description "todo X" to project "hidden project" in the context "@pc"
Then I should not see the todo "todo X"
When I go to the "hidden project" project
Then I should see the todo "test_project todo 1"
And I should see the todo "todo X"
And the badge should show 2
@javascript
Scenario: Adding a todo to a hidden context will show that todo
Given I have a hidden context called "@personal"
When I go to the the context page for "@pc"
And I edit the context of "test_project todo 1" to "@personal"
Then I should not see the todo "test_project todo 1"
When I go to the context page for "@personal"
Then I should see the todo "test_project todo 1"
When I submit a new action with description "todo X" to project "test project" in the context "@personal"
Then I should see the todo "todo X"
@javascript
Scenario: Moving the todo to the tickler will move todo to tickler container and update empty messages
Given I have a context "test" with 1 todos
When I go to the "test" context
Then I should see "todo 1" in the action container
And I should see empty message for deferred todos of context
And I should see empty message for completed todos of context
When I defer "todo 1" for 1 day
Then I should see "todo 1" in the deferred container
And I should not see empty message for deferred todos of context
And I should see empty message for completed todos of context
And I should see empty message for todos of context
@javascript
Scenario: Moving the todo out of the tickler will move todo to active container and update empty messages
Given I have a context "test" with 1 deferred todos
When I go to the "test" context
Then I should see "deferred todo 1" in the deferred container
And I should see empty message for todos of context
And I should not see empty message for deferred todos of context
When I clear the show from date of "deferred todo 1"
Then I should see "deferred todo 1" in the action container
And I should see empty message for deferred todos of context
And I should not see empty message for todos of context
@javascript
Scenario: Making all deferred todos inactive will show empty message
Given I have a context "test" with 1 deferred todos
When I go to the "test" context
And I mark "deferred todo 1" as complete
Then I should see empty message for todos of context
And I should see empty message for deferred todos of context

View file

@ -1,140 +0,0 @@
Feature: Manage the list of contexts
In order to keep track and manage all of my contexts
As a Tracks user
I want to manage my list of contexts
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
Scenario: The list of contexts contain all contexts
Given I have the following contexts
| context | hide |
| @ipad | false |
| @home | false |
| @boss | false |
When I go to the contexts page
Then I should see "@ipad"
And I should see "@home"
And I should see "@boss"
And the badge should show 3
Scenario: Clicking on a context takes me to the context page
Given I have a context called "@computer"
When I go to the contexts page
And I follow "@computer"
Then I should be on the context page for "@computer"
Scenario: The context view shows all todos
Given I have a todo "foo" in the context "@bar" which is due tomorrow
Given I have a deferred todo "foo2" in the context "@bar"
Given I have a todo "foo3" in the context "@bar"
When I go to the contexts page
And I follow "@bar"
Then I should be on the context page for "@bar"
And the badge should show 3
@javascript
Scenario: Delete context from context page should update badge
Given I have a context called "@computer"
And I have a context called "@ipad"
When I go to the contexts page
Then the badge should show 2
And the context list badge for active contexts should show 2
When I delete the context "@computer"
Then I should see that a context named "@computer" is not present
And the badge should show 1
And the context list badge for active contexts should show 1
@javascript
Scenario: Delete last context from context page should remove the contexts container
Given I have a context called "@computer"
And I have a hidden context called "@ipad"
And I have a closed context called "@ibm-pc"
When I go to the contexts page
And I should see that the context container for active contexts is present
And I should see that the context container for hidden contexts is present
And I should see that the context container for closed contexts is present
When I delete the context "@computer"
Then I should see that a context named "@computer" is not present
And I should see empty message for active contexts
When I delete the context "@ipad"
Then I should see that a context named "@ipad" is not present
And I should see empty message for hidden contexts
When I delete the context "@ibm-pc"
Then I should see that a context named "@ibm-pc" is not present
And I should see empty message for closed contexts
@javascript
Scenario: Delete context from context page right after an edit
Given I have a context called "@computer"
When I go to the contexts page
And I edit the context to rename it to "@laptop"
When I delete the context "@laptop"
Then he should see that a context named "@laptop" is not present
And the badge should show 0
@javascript
Scenario: Edit context from context twice
Given I have a context called "@computer"
When I go to the contexts page
And I edit the context to rename it to "@laptop"
And I edit the context to rename it to "@ipad"
Then he should see that a context named "@computer" is not present
And he should see that a context named "@laptop" is not present
And he should see that a context named "@ipad" is present
And the badge should show 1
@javascript
Scenario Outline: Showing a new context with state
Given I have the following contexts
| context | hide |
| @ipad | true |
| @home | false |
When I go to the contexts page
And I add a new <state> context "<name>"
Then I should see the context "<name>" under "<state>"
Examples:
| state | name |
| active | @phone |
| hidden | @hidden |
@javascript
Scenario: Showing a new context with state
When I go to the contexts page
Then I should see empty message for active contexts
And I should see empty message for hidden contexts
And I should see empty message for closed contexts
When I add a new active context "@active"
Then I should see the context "@active" under "active"
And I should not see empty message for active contexts
When I add a new hidden context "@hidden"
Then I should see the context "@hidden" under "hidden"
And I should not see empty message for hidden contexts
When I edit the state of context "@hidden" to closed
Then I should not see empty message for closed contexts
And I should see the context "@hidden" under "closed"
@javascript
Scenario: I can drag and drop to order the contexts
Given I have the following contexts
| context |
| @ipad |
| @home |
| @boss |
When I go to the contexts page
Then context "@ipad" should be above context "@home"
When I drag context "@home" above context "@ipad"
Then context "@home" should be above context "@ipad"
@javascript
Scenario: Hiding and unhiding the new context form
When I go to the contexts page
Then the new context form should be visible
When I follow "Hide form"
Then the new context form should not be visible
When I follow "Create a new context"
Then the new context form should be visible

View file

@ -1,36 +0,0 @@
Feature: Signup new users
In order to be able to administer Tracks
As a user who just installed Tracks
I want to create an admin account
Background:
Given the following user records
| login | password | is_admin |
| testuser | secret | false |
| admin | secret | true |
Scenario: Successful signup
Given no users exists
When I go to the homepage
Then I should be redirected to the signup page
When I submit the signup form with username "admin", password "secret" and confirm with "secret"
Then I should be on the homepage
And I should be an admin
@wip
Scenario: Signup should be refused when password and confirmation is not the same
Given no users exists
When I go to the signup page
And I submit the signup form with username "admin", password "secret" and confirm with "error"
Then I should be redirected to the signup page
And I should see "Password doesn't match confirmation"
Scenario: With public signups turned off, signup should be refused when an admin user exists
Given public signups are turned off
When I go to the signup page
Then I should see "You don't have permission to sign up for a new account."
Scenario: With public signups turned on, signup should possible when an admin user exists
Given public signups are turned on
When I go to the signup page
Then I should see "Sign up a new user"

View file

@ -1,176 +0,0 @@
Feature: dependencies
As a Tracks user
In order to keep track of complex todos that are dependent on each other
I want to assign and manage todo dependencies
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
@javascript
Scenario: Adding dependency to dependency by drag and drop
Given I have a project "dependencies" with 3 todos
And "todo 2" depends on "todo 1"
When I go to the "dependencies" project
And I drag "todo 3" to "todo 2"
Then the successors of "todo 1" should include "todo 2"
And the successors of "todo 2" should include "todo 3"
When I expand the dependencies of "todo 1"
Then I should see "todo 2" within the dependencies of "todo 1"
And I should see "todo 3" within the dependencies of "todo 1"
When I expand the dependencies of "todo 2"
Then I should see "todo 3" within the dependencies of "todo 2"
@javascript @wip
Scenario: I can edit a todo to add the todo as a dependency to another
Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos
| description | context |
| test 1 | @pc |
| test 2 | @pc |
| test 3 | @pc |
When I go to the "dependencies" project
When I edit the dependency of "test 1" to add "test 2" as predecessor
Then I should see "test 1" within the dependencies of "test 2"
And I should see "test 1" in the deferred container
When I edit the dependency of "test 1" to add "test 3" as predecessor
Then I should see "test 1" within the dependencies of "test 2"
Then I should see "test 1" within the dependencies of "test 3"
When I edit the dependency of "test 1" to remove "test 3" as predecessor
And I edit the dependency of "test 2" to add "test 3" as predecessor
Then I should see "test 1" within the dependencies of "test 3"
Then I should see "test 2" within the dependencies of "test 3"
@javascript
Scenario: I can remove a dependency by editing the todo
Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos
| description | context |
| test 1 | @pc |
| test 2 | @pc |
And "test 1" depends on "test 2"
When I go to the "dependencies" project
Then I should see "test 1" in the deferred container
When I edit the dependency of "test 1" to remove "test 2" as predecessor
Then I should not see "test 1" within the dependencies of "test 2"
And I should not see "test 1" in the deferred container
@javascript
Scenario: Completing a predecessor will activate successors
Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos
| description | context |
| test 1 | @pc |
| test 2 | @pc |
| test 3 | @pc |
And "test 2" depends on "test 1"
When I go to the "dependencies" project
Then I should see "test 2" in the deferred container
And I should see "test 1" in the context container for "@pc"
When I mark "test 1" as complete
Then I should see "test 1" in the completed container
And I should see "test 2" in the context container for "@pc"
And I should not see "test 2" in the deferred container
And I should see empty message for deferred todos of project
@javascript
Scenario: Deleting a predecessor will activate successors
Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos
| description | context |
| test 1 | @pc |
| test 2 | @pc |
| test 3 | @pc |
And "test 2" depends on "test 1"
When I go to the "dependencies" project
Then I should see "test 2" in the deferred container
And I should see "test 1" in the context container for "@pc"
When I delete the action "test 1"
Then I should see "test 2" in the context container for "@pc"
And I should not see "test 2" in the deferred container
And I should see empty message for deferred todos of project
@javascript
Scenario: Deleting a successor will update predecessor
Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos
| description | context |
| test 1 | @pc |
| test 2 | @pc |
| test 3 | @pc |
And "test 2" depends on "test 1"
And "test 3" depends on "test 1"
When I go to the "dependencies" project
And I expand the dependencies of "test 1"
Then I should see "test 2" within the dependencies of "test 1"
And I should see "test 3" within the dependencies of "test 1"
When I delete the action "test 2"
And I expand the dependencies of "test 1"
Then I should see "test 3" within the dependencies of "test 1"
And I should not see "test 2"
@javascript
Scenario: Dragging an action to a completed action will not add it as a dependency
Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos
| description | context | completed |
| test 1 | @pc | no |
| test 2 | @pc | no |
| test 3 | @pc | yes |
When I go to the "dependencies" project
And I drag "test 1" to "test 3"
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 the context container for "@pc"
@javascript
Scenario Outline: Marking a successor as complete will update predecessor
Given I have a context called "@pc"
And I have selected the view for group by <grouping>
And I have a project "dependencies" that has the following todos
| description | context | completed | tags |
| test 1 | @pc | no | bla |
| test 2 | @pc | no | bla |
| test 3 | @pc | yes | bla |
When I go to the <page>
And I drag "test 1" to "test 2"
When I expand the dependencies of "test 2"
Then I should see "test 1" within the dependencies of "test 2"
And I should see "test 1" in the deferred container
When I mark "test 1" as complete
Then I should see that "test 2" does not have dependencies
And I should see "test 1" in the completed container
Scenarios:
| page | grouping |
| "dependencies" project | project |
| tag page for "bla" | context |
| tag page for "bla" | project |
@javascript
Scenario Outline: Marking a successor as active will update predecessor
Given I have a context called "@pc"
And I have selected the view for group by <grouping>
And I have a project "dependencies" that has the following todos
| description | context | completed | tags |
| test 1 | @pc | no | bla |
| test 2 | @pc | no | bla |
| test 3 | @pc | yes | bla |
When I go to the <page>
And I drag "test 1" to "test 2"
Then I should see "test 1" in the deferred container
When I mark "test 1" as complete
And I should see "test 1" in the completed container
And I should see that "test 2" does not have dependencies
When I mark the completed todo "test 1" active
Then I should not see "test 1" in the completed container
And I should see "test 1" in the deferred container
And I should see "test 1" within the dependencies of "test 2"
Scenarios:
| page | grouping |
| "dependencies" project | project |
| "dependencies" project | context |
| tag page for "bla" | context |
| tag page for "bla" | project |

View file

@ -1,352 +0,0 @@
Feature: Edit a next action from every page
In order to manage a next action
As a Tracks user
I want to to be able to change the next action from every page
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
And I have a context called "@pc"
@javascript
Scenario: I can toggle the star of a todo
Given I have a todo "star me" in the context "@home"
When I go to the home page
And I star the action "star me"
Then I should see a starred "star me"
When I go to the tag page for "starred"
Then I should see "star me"
@javascript
Scenario Outline: I can delete a todo
Given I have a todo "delete me" in the context "@home"
And I have selected the view for group by <grouping>
When I go to the home page
Then I should see "delete me"
When I delete the action "delete me"
Then I should not see "delete me"
Scenarios:
| grouping |
| context |
| project |
@javascript
Scenario Outline: Removing the last todo in container will hide that container
Given I have a todo "delete me" in the context "@home" in the project "do it!"
And I have selected the view for group by <grouping>
When I go to the home page
Then I should see the <container>
And I should see "delete me" in the <container>
When I mark "delete me" as complete
Then I should not see the <container>
And I should see "delete me" in the completed container
When I mark "delete me" as uncompleted
Then I should see the <container>
And I should see "delete me" in the <container>
Scenarios:
| grouping | container |
| context | container for context "@home" |
| project | container for project "do it!" |
@javascript
Scenario Outline: Changing container of the todo in that container will hide it
Given I have a todo "delete me" in the context "@home" in the project "do it"
And I have a project "go for it"
And I have selected the view for group by <grouping>
When I go to the home page
And I edit the <grouping> of "delete me" to <new_grouping>
Then I should not see the <container>
And I should see the <new_container>
And I should see "delete me" in the <new_container>
When I delete the todo "delete me"
Then I should not see the todo "delete me"
And I should not see the <container>
And I should not see the <new_container>
Scenarios:
| grouping | container | new_grouping | new_container |
| context | container for context "@home" | "@pc" | container for context "@pc" |
| project | container for project "do it" | "go for it" | container for project "go for it" |
@javascript
Scenario Outline: Deleting the last todo in container will show empty message # only project, context, tag, not todo
Given I have a context called "@home"
And I have selected the view for group by <grouping>
And I have a project "my project" that has the following todos
| context | description | tags |
| @home | first action | test, bla |
| @home | second action | bla |
When I go to the <page>
Then I should not see empty message for todos of <page type>
And I should see "first action"
When I delete the todo "first action"
Then I should not see empty message for todos of <page type>
When I delete the todo "second action"
Then I should see empty message for todos of <page type>
Scenarios:
| page | page type | grouping |
| "my project" project | project | project |
| "my project" project | project | context |
| context page for "@home" | context | context |
| context page for "@home" | context | project |
| tag page for "bla" | tag | context |
| tag page for "bla" | tag | project |
@javascript
Scenario Outline: I can mark an active todo complete and it will update empty messages
Given I have a context called "visible context"
And I have a project called "visible project"
When I go to the <page>
Then I should see empty message for todos of <page type>
When I submit a new action with description "visible todo" to project "visible project" with tags "starred" in the context "visible context"
Then I should see "visible todo"
And I should not see empty message for todos of <page type>
When I mark "visible todo" as complete
And I should see empty message for todos of <page type>
And I should see "visible todo" in the completed container
Scenarios:
| page | page type |
| home page | home |
| "visible project" project | project |
| tag page for "starred" | tag |
| context page for "visible context" | context |
@javascript
Scenario Outline: I can mark a deferred todo complete and it will update empty messages
Given I have a context called "visible context"
And I have a project called "visible project"
When I go to the <page>
Then I should see empty message for deferred todos of <page type>
When I submit a new deferred action with description "visible todo" to project "visible project" with tags "starred" in the context "visible context"
Then I should see "visible todo"
And I should not see empty message for deferred todos of <page type>
When I mark "visible todo" as complete
And I should see empty message for deferred todos of <page type>
And I should see "visible todo" in the completed container
Scenarios:
| page | page type |
| tag page for "starred" | tag |
| "visible project" project | project |
| context page for "visible context" | context |
@javascript
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"
And I have selected the view for group by <grouping>
When I go to the <page>
Then I should see empty message for todos of <page type>
And I should not see the <container>
And I should not see empty message for completed todos of <page type>
When I mark the completed todo "visible todo" active
Then I should see the <container>
And I should see empty message for completed todos of <page type>
And I should see "visible todo" in the <container>
And I should not see empty message for todos of <page type>
Scenarios:
| page | page type | grouping | container |
| tag page for "starred" | tag | context | container for context "visible context" |
| tag page for "starred" | tag | project | container for project "visible project" |
| home page | home | context | container for context "visible context" |
| home page | home | project | container for project "visible project" |
@javascript
Scenario Outline: I can mark a completed todo active and it will update empty messages for pages without hideable containers
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>
Then I should see empty message for todos of <page type>
And I should not see empty message for completed todos of <page type>
When I mark the completed todo "visible todo" active
And I should see empty message for completed todos of <page type>
And I should not see empty message for todos of <page type>
Scenarios:
| page | page type |
| context page for "visible context" | context |
| "visible project" project | project |
@javascript
Scenario Outline: I can edit a todo to change its description
Given I have a todo with description "visible todo" in project "visible project" with tags "starred" in the context "visible context" that is due next week
And I have selected the view for group by <grouping>
When I go to the <page>
And I edit the description of "visible todo" to "changed todo"
Then I should not see the todo "visible todo"
And I should see the todo "changed todo"
Scenarios:
| page | grouping |
| home page | context |
| home page | project |
| context page for "visible context" | context |
| "visible project" project | context |
| tag page for "starred" | context |
| tag page for "starred" | project |
| calendar page | context |
@javascript
Scenario Outline: I can edit a todo to move it to another container
Given I have a context called "@laptop"
And I have selected the view for group by <grouping>
And I have a project "project 1" that has the following todos
| context | description | tags |
| @pc | first action | bla |
| @laptop | second action | bla |
And I have a project "project 2"
When I go to the <page>
Then I should see "first action" in the <container>
When I edit the <grouping> of "first action" to <new grouping>
Then I should not see "first action" in the <container>
Then I should see "first action" in the <new container>
Scenarios:
| page | grouping | container | new grouping | new container |
| home page | context | context container for "@pc" | "@laptop" | context container for "@laptop" |
| home page | project | project container for "project 1" | "project 2" | project container for "project 2" |
| tag page for "bla" | context | context container for "@pc" | "@laptop" | context container for "@laptop" |
| tag page for "bla" | project | project container for "project 1" | "project 2" | project container for "project 2" |
@javascript
Scenario: I can edit a todo to move it to another context in tickler page
Given I have a context called "@laptop"
And I have a project "my project" that has the following deferred todos
| context | description |
| @pc | first action |
| @laptop | second action |
When I go to the tickler page
Then I should see "first action" in the context container for "@pc"
When I edit the context of "first action" to "@laptop"
Then I should not see "first action" in the context container for "@pc"
Then I should see "first action" in the context container for "@laptop"
@javascript
Scenario: I can edit a todo to move it to another project
Given I have a project called "project one"
And I have a project "project two" with 1 todos
When I go to the "project two" project
And I edit the project of "todo 1" to "project one"
Then I should not see the todo "todo 1"
When I go to the "project one" project
Then I should see the todo "todo 1"
@javascript
Scenario: I can give a todo without a project a blank project name
Given I have a todo "todo 1" in the context "@pc"
When I go to the home page
And I edit the project of "todo 1" to ""
Then I should see the todo "todo 1"
@javascript
Scenario: I can edit a todo without a project and the project remains blank
Given I have a todo "todo 1"
When I go to the home page
And I change the todo[description] field of "todo 1" to "todo 1 edit"
Then I should see the todo "todo 1 edit" with project name ""
@javascript
Scenario: I can edit a todo to move it to the tickler
When I go to the home page
And I submit a new action with description "start later" in the context "@pc"
And I edit the show from date of "start later" to next month
Then I should not see the todo "start later"
When I go to the tickler page
Then I should see the todo "start later"
@javascript
Scenario: I can defer a todo
When I go to the home page
And I submit a new action with description "start later" in the context "@pc"
When I go to the home page
And I defer "start later" for 1 day
Then I should not see "start later"
When I go to the tickler page
Then I should see "start later"
@javascript
Scenario: I can make a project from a todo
When I go to the home page
And I submit a new action with description "buy mediacenter" in the context "@pc"
When I go to the home page
And I make a project of "buy mediacenter"
#sidebar does not update
Then I should be on the "buy mediacenter" project
When I go to the projects page
Then I should see "buy mediacenter"
@javascript
Scenario: I can show the notes of a todo
Given I have a todo "read the notes" with notes "several things to read"
When I go to the home page
Then I should see "read the notes"
And I should not see the notes of "read the notes"
When I open the notes of "read the notes"
Then I should see the notes of "read the notes"
@javascript
Scenario: I can tag a todo
Given I have a todo "tag me"
When I go to the home page
And I edit the tags of "tag me" to "bla, bli"
Then I should see the todo "bla"
And I should see the todo "bli"
Scenario: Clicking a tag of a todo will go to that tag page
Given I have a todo "tag you are it" in context "@tags" with tags "taga, tagb"
When I go to the home page
Then I should see "tag you are it"
And I should see "taga"
When I follow "taga"
Then I should be on the tag page for "taga"
@javascript
Scenario: I can edit the tags of a todo
Given I have a todo "tag you are it" in context "@tags" with tags "taga, tagb"
When I go to the home page
Then I should see "tag you are it"
When I edit the tags of "tag you are it" to "tagb, tagc"
Then I should not see "taga"
And I should see "tagb"
And I should see "tagc"
@javascript
Scenario Outline: Editing the container of a todo to a new container will show new container
Given I have a todo "moving" in context "@pc" in project "project 1 " with tags "tag"
And I have selected the view for group by <grouping>
When I go to the <page>
And I edit the <grouping> of "moving" to <new grouping>
And I should see the <container>
Scenarios:
| page | grouping | new grouping | container |
| home page | context | "@new" | container for context "@new" |
| home page | project | "project 2" | container for project "project 2" |
| tag page for "tag" | context | "@new" | container for context "@new" |
| tag page for "tag" | project | "project 2" | container for project "project 2" |
@javascript
Scenario: Editing the context of a todo in the tickler to a new context will show new context
Given I have a deferred todo "moving" in context "@pc" with tags "tag"
When I go to the tickler page
And I edit the context of "moving" to "@new"
Then I should see the container for context "@new"
@javascript
Scenario: Editing the context of a todo in the project view to a new context will show new context
Given I have a todo "something" in the context "@pc" in the project "project"
When I go to the "project" project page
And I edit the context of "something" to "@new"
Then I should see the container for context "@new"
@javascript
Scenario: Making an error when editing a todo will show error message
Given I have a todo "test"
When I go to the home page
And I try to edit the description of "test" to ""
Then I should see an error message

View file

@ -1,48 +0,0 @@
Feature: Get all sorts of lists from Tracks
In order to get reports on todos managed by Tracks
As a Tracks user
I want to be be able to select a feed
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
And I have the following contexts:
| context |
| @pc |
| @home |
| @shops |
| @boss |
And I have the following projects:
| project_name |
| Test feedlist |
| Get release out |
Scenario: I cannot see context scripts when I do not have a context
Given I have no contexts
When I go to the feeds page
Then I should see a message that you need a context to get feeds for contexts
Scenario: I cannot see proejct scripts when I do not have a project
Given I have no projects
When I go to the feeds page
Then I should see a message that you need a project to get feeds for projects
Scenario: I can see scripts when I have one or more contexts
When I go to the feeds page
Then I should see feeds for projects
And I should see "Test feedlist" as the selected project
And I should see feeds for contexts
And I should see "@pc" as the selected context
@javascript
Scenario Outline: I can select the item for getting feeds for that item
When I go to the feeds page
And I select "<item>" from "<item-list>"
Then I should see feeds for "<item>" in list of "<item-type>"
Examples:
| item | item-list | item-type |
| @boss | feed-contexts | context |
| Get release out | feed-projects | project |

View file

@ -1,59 +0,0 @@
Feature: Existing user logging in
In order to keep my things private
As an existing user
I want to log in with my username and password
Background:
Given the following user records
| login | password | is_admin | first_name | last_name |
| testuser | secret | false | Test | User |
| admin | secret | true | Admin | User |
Scenario Outline: Successful and unsuccessful login
When I go to the login page
And I submit the login form as user "<user>" with password "<password>"
Then I should be <there>
And I should see "<message>"
Examples:
| user | password | there | message |
| admin | secret | redirected to the home page | Login successful |
| admin | wrong | on the login page | Login unsuccessful |
Scenario Outline: Unauthorized users cannot access Tracks and need to log in first
Given there exists a project called "top secret" for user "testuser"
And there exists a context called "@secret location" for user "testuser"
When I go to the <page>
Then I should be redirected to the login page
When I submit the login form as user "testuser" with password "secret"
Then I should be redirected to the <next page>
And I should see "<logout>"
Examples:
| page | next page | logout |
| home page | home page | Logout |
| contexts page | contexts page | Logout |
| projects page | projects page | Logout |
| notes page | notes page | Logout |
| recurring todos page | recurring todos page | Logout |
| statistics page | statistics page | Logout |
| manage users page | manage users page | 401 Unauthorized |
| integrations page | integrations page | Logout |
| starred page | starred page | Logout |
| tickler page | tickler page | Logout |
| calendar page | calendar page | Logout |
| feeds page | feeds page | Logout |
| preference page | preference page | Logout |
| export page | export page | Logout |
| rest api docs page | rest api docs page | Logout |
| search page | search page | Logout |
| "top secret" project for user "testuser" | "top secret" project for user "testuser" | Logout |
| context page for "@secret location" for user "testuser" | context page for "@secret location" for user "testuser" | Logout |
@javascript
Scenario: When session expires, you should be logged out
When I go to the login page
And I submit the login form as user "testuser" with password "secret"
Then I should be on the home page
When my session expires
Then I should be on the login page

View file

@ -1,37 +0,0 @@
Feature: Create project from template on console
In order to be able to create a project from a template
As a user who has installed Tracks with console access
I want to run the script to add projects and actions from a template
These scenarios are tagged javascript so that there is a Tracks server running
to use from the command line script
Background:
Given the following user records
| login | password | is_admin |
| testuser | secret | false |
| admin | secret | true |
And I have logged in as "testuser" with password "secret"
And I have a context called "Context A"
@javascript @aruba
Scenario: Create a project with one task
Given a template that looks like
"""
My first project
.My first task in this project
"""
When I execute the template script
Then I should have a project called "My first project"
And I should have 1 todo in project "My first project"
@javascript @aruba
Scenario: Create a project with dependent tasks
Given a template that looks like
"""
My first project
.Todo
^Dependent
"""
When I execute the template script
Then the successors of "Todo" should include "Dependent"

View file

@ -1,30 +0,0 @@
Feature: Manage users
In order to be able to manage the users able to use Tracks
As the administrator of this installed Tracks
I want to add and delete accounts of users
Background:
Given the following user records
| login | password | is_admin |
| testuser | secret | false |
| admin | secret | true |
And I have logged in as "admin" with password "secret"
Scenario: Show all accounts
When I go to the manage users page
Then I should see "testuser"
And I should see "admin"
Scenario: Add new account
When I go to the manage users page
And I follow "Sign up new user"
Then I should be on the signup page
When I submit the signup form with username "new.user", password "secret123" and confirm with "secret123"
Then I should be on the manage users page
And I should see "new.user"
@javascript
Scenario: Delete account from users page
When I go to the manage users page
And I delete the user "testuser"
Then I should see that a user named "testuser" is not present

View file

@ -1,36 +0,0 @@
Feature: Add new next action from mobile page
In order to be able to add next actions from the mobile interface
As a Tracks user
I want to to be able to add a new next actions from the mobile interface and prepopulate the context and / or project of the prior page
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I am working on the mobile interface
And I have logged in as "testuser" with password "secret"
And I have a context called "a context"
And I have a project "test project" with a default context of "test context"
Scenario Outline: The new action form is prefilled with context and project
Given I am on the <page>
When I follow "New"
Then the selected project should be "<project>"
And the selected context should be "<context>"
Scenarios: # empty means no selected, i.e. first in list is shown
| page | project | context |
| home page | | |
| tickler page | | |
| "test project" project | test project | test context |
| context page for "test context" | | test context |
| tag page for "starred" | | |
Scenario: I can add a new todo using the mobile interface
Given I am on the home page
Then the badge should show 0
When I follow "New"
And I fill in "Description" with "test me"
And I press "Create"
Then I should see "test me"
And the badge should show 1

View file

@ -1,23 +0,0 @@
Feature: View the list of contexts from mobile
In order to be able to see all contexts from the mobile interface
As a Tracks user
I want to to be able to see a list of project
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I am working on the mobile interface
And I have logged in as "testuser" with password "secret"
And I have a context called "@mobile"
And I have a project "test project" that has the following todos
| context | description |
| @mobile | test action |
Scenario: I can go to a context from the mobile context list page
Given I have a todo "test mobile page" in the context "@mobile"
And I am on the contexts page
Then I should see "@mobile"
When I follow "@mobile"
Then the badge should show 2
And I should see "@mobile"

View file

@ -1,50 +0,0 @@
Feature: Edit a next action from the mobile view
In order to manage a next action
As a Tracks user
I want to to be able to edit a next action
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I am working on the mobile interface
And I have logged in as "testuser" with password "secret"
And I have a context called "@mobile"
And I have a project "test project" that has the following todos
| context | description |
| @mobile | test action |
Scenario: I can edit an action on the mobile page
When I am on the home page
Then the badge should show 1
And I should see "test action"
When I follow "test action"
Then I should see "Actions"
When I press "Edit action"
Then I should see "Description"
And I fill in "Description" with "changed action"
And I press "Update"
Then I should see "changed action"
And I should not see "test action"
When I follow "changed action"
And I press "Mark complete"
Then I should see "changed action" in the completed section of the mobile site
Scenario: Navigate from home page
move this to separate features when other scenarios are created for these features
When I am on the home page
Then the badge should show 1
When I follow "Tickler"
Then the badge should show 0
When I follow "Feeds"
Then I should see "Last 15 actions"
Scenario: I can defer an action on the mobile page
When I am on the home page
Then the badge should show 1
And I should see "test action"
When I follow "test action"
And I press "Defer 1 day"
Then I should see "Currently there are no incomplete actions"
When I follow "Tickler"
Then I should see "test action"

View file

@ -1,22 +0,0 @@
Feature: View the list of projects from mobile
In order to be able to see all project from the mobile interface
As a Tracks user
I want to to be able to see a list of project
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I am working on the mobile interface
And I have logged in as "testuser" with password "secret"
And I have a context called "@mobile"
And I have a project "test project" that has the following todos
| context | description |
| @mobile | test action |
Scenario: I can go to a project from the list of project in mobile view
Given I am on the projects page
Then I should see "test project"
When I follow "test project"
Then the badge should show 1
And I should see "test action"

View file

@ -1,24 +0,0 @@
Feature: Show the actions that are tagged on the mobile page
In order to be able to see all actions tags with a certain tag
As a Tracks user
I want to to be able to find all actions with a specific tag
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I am working on the mobile interface
And I have logged in as "testuser" with password "secret"
And I have a context called "@mobile"
And I have a project "my project" that has the following todos
| context | description | tags |
| @mobile | first action | test, bla |
| @mobile | second action | bla |
Scenario: I can follow the tag of a action to see all actions belonging to that todo
When I go to the home page
And I follow the tag "test"
Then the badge should show 1
When I go to the home page
And I follow the tag "bla"
Then the badge should show 2

View file

@ -1,66 +0,0 @@
Feature: View, add, remove notes
In order to manage my notes
As a Tracks user
I want to view, add, and remove notes
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
Scenario: View notes
Given I have two projects with one note each
When I go to the notes page
Then 2 notes should be visible
And the badge should show 2
Scenario: Add a new note
Given I have one project "Pass Final Exam" with no notes
When I add note "My Note A" from the "Pass Final Exam" project page
Then I should see note "My Note A" on the "Pass Final Exam" project page
And I should see note "My Note A" on the notes page
Then the badge should show 1
Scenario: Link to note
Given I have a project "Pass Final Exam" with 1 note
When I go to the "Pass Final Exam" project
And I click the icon next to the note
Then I should see the note text
@javascript
Scenario: Delete note from notes page
Given I have a project "Pass Final Exam" with 2 notes
When I go to the notes page
And I delete the first note
Then the badge should show 1
@javascript
Scenario: Edit a note
Given I have a project "Pass Final Exam" with 2 notes
When I go to the notes page
And I edit the first note to "edited note"
Then I should see "edited note"
@javascript
Scenario: Toggle all notes
Given I have a context called "@pc"
And I have a project "take notes" that has the following todos
| description | context | notes |
| test 1 | @pc | note A |
| test 2 | @pc | note B |
| test 3 | @pc | note C |
When I go to the home page
Then I should not see the note "note A"
And I should not see the note "note B"
And I should not see the note "note C"
When I toggle the note of "test 1"
Then I should see the note "note A"
And I should not see the note "note B"
And I should not see the note "note C"
When I toggle the note of "test 1"
Then I should not see the note "note A"
When I toggle all notes
Then I should see the note "note A"
And I should see the note "note B"
And I should see the note "note C"

View file

@ -1,41 +0,0 @@
Feature: Manage preferences
In order to customize Tracks to my needs
As a Tracks user
I want to be be able change my preferences
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
Scenario: I can change my password
When I go to the preferences page
And I set the password and confirmation to "secret123"
When I log out of Tracks
And I go to the login page
And I submit the login form as user "testuser" with password "secret"
Then I should see "Login unsuccessful"
When I submit the login form as user "testuser" with password "secret123"
Then I should see "Login successful"
Scenario: I can leave password field empty and the password will not be changed
When I go to the preferences page
And I set the password and confirmation to ""
When I log out of Tracks
And I go to the login page
And I submit the login form as user "testuser" with password ""
Then I should see "Login unsuccessful"
When I submit the login form as user "testuser" with password "secret"
Then I should see "Login successful"
Scenario: The password and the confirmation need to be the same
When I go to the preferences page
And I set the password to "secret" and confirmation to "wrong"
Then I should see "Password confirmation doesn't match confirmation"
Scenario: I can edit preferences
When I go to the preferences page
Then I should see "testuser Preferences"
When I edit my last name to "Tester"
Then I should see "Tester Preferences"

View file

@ -1,180 +0,0 @@
Feature: Edit a project
In order to reach a goal by doing several related todos
As a Tracks user
I want to manage these todos in a project
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And there exists a project "manage me" for user "testuser"
And I have logged in as "testuser" with password "secret"
Scenario: I can go to the note of a project
Given I have a project "test" with 2 notes
When I go to the "test" project
When I click on the first note icon
Then I should go to that note page
@javascript
Scenario: I can describe the project using markup
When I go to the "manage me" project
And I edit the project description to "_successful outcome_: project is *done*"
Then I should see the italic text "successful outcome" in the project description
And I should see the bold text "done" in the project description
@javascript
Scenario: I can edit the project name in place
Given I have a project "release tracks 1.8" with 1 todos
When I go to the "release tracks 1.8" project
And I edit the project name in place to be "release tracks 2.0"
Then I should see the project name is "release tracks 2.0"
When I go to the projects page
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
@javascript
Scenario: I cannot edit the project name in two places at once
Given I have a project "release tracks 1.8" with 1 todos
When I go to the "release tracks 1.8" project
And I click to edit the project name in place
Then I should be able to change the project name in place
When I edit the project settings
Then I should not be able to change the project name in place
# Ticket #1041
@javascript
Scenario: I can change the name of the project using the Edit Project Settings form
Given I have a project "bananas" with 1 todos
When I go to the "bananas" project
And I edit the project name to "cherries"
Then the project title should be "cherries"
@javascript
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
When I go to the "bananas" project
And I edit the project name to "cherries"
Then the project title should be "cherries"
And the project field of the new todo form should contain "cherries"
# Ticket #1789
@javascript
Scenario: I can change the name of the project and it should still allow me to add new actions
Given I have a project "bananas"
When I go to the "bananas" project
And I edit the project name to "cherries"
And I edit the default context to "@pc"
And I submit a new action with description "a new next action"
Then I should see the todo "a new next action"
@javascript
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
When I go to the "bananas" project
And I edit the default context to "@pc"
Then the default context of the new todo form should be "@pc"
# the default context should be prefilled ater submitting a new todo
When I submit a new action with description "test"
Then the default context of the new todo form should be "@pc"
# Ticket #1042
@javascript
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
When I go to the projects page
Then the badge should show 2 # "manage me" and "test"
When I go to the "manage me" project
And I try to edit the project name to "test"
Then I should see "Name already exists"
# Ticket #1042
@javascript
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
When I go to the projects page
Then the badge should show 2 # "manage me" and "test"
When I try to edit the project name of "manage me" to "test"
Then I should see "Name already exists"
@javascript
Scenario: I can add a note to the project
Given I have a project called "test"
When I go to the "test" project
And I add a note "hello I'm testing" to the project
Then I should see one note in the project
@javascript
Scenario: Cancelling adding a note to the project will remove form
Given I have a project called "test"
When I go to the "test" project
And I cancel adding a note to the project
Then the form for adding a note should not be visible
@javascript
Scenario: Long notes in a project are shown cut off
Given I have a project called "test"
When I go to the "test" project
And I add a note "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890TOO LONG" to the project
Then I should not see the note "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890TOO LONG"
And I should see the note "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456"
@javascript
Scenario: Cancelling editing a project will restore project settings
Given I have a project called "test"
When I go to the "test" project
Then I should see the default project settings
When I open the project edit form
Then I should not see the default project settings
When I cancel the project edit form
Then I should see the default project settings
@javascript
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
When I go to the "test" project
Then I should see "todo 1" in the context container for "Context A"
And I should see empty message for deferred todos of project
And I should see empty message for completed todos of project
When I defer "todo 1" for 1 day
Then I should see "todo 1" in the deferred container
And I should not see empty message for deferred todos of project
And I should see empty message for completed todos of project
And I should see empty message for todos of project
@javascript
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
When I go to the "test" project
Then I should see "deferred todo 1" in the deferred container
And I should see empty message for todos of project
And I should not see empty message for deferred todos of project
When I clear the show from date of "deferred todo 1"
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 not see empty message for todos of project
@javascript
Scenario: Making all todos inactive will show empty message
Given I have a project "test" with 1 todos
When I go to the "test" project
And I mark "todo 1" as complete
Then I should see empty message for todos of project
@javascript
Scenario: Making all deferred todos inactive will show empty message
Given I have a project "test" with 1 deferred todos
When I go to the "test" project
And I mark "deferred todo 1" as complete
Then I should see empty message for todos of project
And I should see empty message for deferred todos of project
# Ticket #1043
@javascript
Scenario: I can move a todo out of the current project
Given I have a project "foo" with 2 todos
And I have a project called "bar"
When I go to the "foo" project
And I change the project_name field of "todo 1" to "bar"
Then I should not see the todo "todo 1"
And I should see the todo "todo 2"

View file

@ -1,141 +0,0 @@
Feature: Manage the list of projects
In order to keep track and manage of all my projects
As a Tracks user
I want to manage my list of projects
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And there exists a project "manage me" for user "testuser"
And there exists a project "upgrade jquery" for user "testuser"
And there exists a project "a project name starting with a" for user "testuser"
And I have logged in as "testuser" with password "secret"
Scenario: The list of projects contain all projects
When I go to the projects page
Then I should see "manage me"
And I should see "upgrade jquery"
And I should see "a project name starting with a"
And the badge should show 3
Scenario: Clicking on a project takes me to the project page
When I go to the projects page
And I follow "manage me"
Then I should be on the "manage me" project page
@javascript
Scenario: Editing a project name will update the list
When I go to the projects page
And I edit the project name of "manage me" to "manage him"
Then I should see "manage him"
@javascript
Scenario: Deleting a project will remove it from the list
When I go to the projects page
And I delete project "manage me"
Then I should see that a project named "manage me" is not present
And the badge should show 2
And the project list badge for "active" projects should show 2
@javascript
Scenario: Deleting a project after a edit will remove it from the list
# make sure the js is enabled after an edit and another edit
When I go to the projects page
And I edit the project name of "manage me" to "manage him"
Then I should see a project named "manage him"
When I edit the project name of "manage him" to "manage her"
Then I should see a project named "manage her"
When I delete project "manage her"
Then I should not see a project named "manage her"
And the badge should show 2
And the project list badge for "active" projects should show 2
@javascript
Scenario: Changing project state will move project to other state list
When I go to the projects page
Then the project "manage me" should be in state list "active"
And the project list badge for "active" projects should show 3
When I edit the project state of "manage me" to "hidden"
Then the project "manage me" should not be in state list "active"
And the project "manage me" should be in state list "hidden"
And the project list badge for "active" projects should show 2
And the project list badge for "hidden" projects should show 1
@javascript
Scenario: Dragging a project to change list order of projects
When I go to the projects page
Then the project "manage me" should be above the project "upgrade jquery"
When I drag the project "manage me" below "upgrade jquery"
Then the project "upgrade jquery" should be above the project "manage me"
@javascript
Scenario: Hiding and unhiding the new project form
When I go to the projects page
Then the new project form should be visible
When I follow "Hide form"
Then the new project form should not be visible
When I follow "Create a new project"
Then the new project form should be visible
@javascript
Scenario: Adding a new project
When I go to the projects page
And I submit a new project with name "finish cucumber tests"
Then I should see "finish cucumber tests"
And the badge should show 4
And the project list badge for "active" projects should show 4
@javascript
Scenario: Adding a new project and take me to the project page
When I go to the projects page
And I submit a new project with name "finish cucumber tests" and select take me to the project
Then I should be on the "finish cucumber tests" project page
@javascript
Scenario: Sorting the project alphabetically
When I go to the projects page
Then the project "manage me" should be above the project "a project name starting with a"
When I sort the active list alphabetically
Then the project "a project name starting with a" should be above the project "manage me"
@javascript
Scenario: Sorting the project by number of task
Given I have a project "test" with 2 todos
And I have a project "very busy" with 10 todos
When I go to the projects page
Then the project "test" should be above the project "very busy"
When I sort the active list by number of tasks
Then the project "very busy" should be above the project "test"
@javascript
Scenario: Can add a project with comma in the name
When I go to the projects page
And I submit a new project with name "foo,bar"
Then I should see "foo,bar"
And the badge should show 4
And the project list badge for "active" projects should show 4
@javascript
Scenario: Listing projects with only active actions
Given I have a project "do it now" with 2 active todos
When I go to the projects page
Then the project "do it now" should have 2 actions listed
@javascript
Scenario: Listing projects with both active and deferred actions
Given I have a project "now and later" with 2 active actions and 2 deferred actions
When I go to the projects page
Then the project "now and later" should have 2 actions listed
@javascript
Scenario: Listing projects with only deferred actions
Given I have a project "only later" with 3 deferred actions
When I go to the projects page
Then the project "only later" should have 3 deferred actions listed
@javascript
Scenario: Listing projects with no actions
Given I have a project "all done" with 0 active actions and 0 deferred actions
When I go to the projects page
Then the project "all done" should have 0 actions listed

View file

@ -1,87 +0,0 @@
Feature: Manage recurring todos
In order to manage recurring todos
As a Tracks user
I want to view, edit, add, or remove recurrence patterns of recurring todos
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
And I have a context called "test context"
And I have a recurrence pattern called "run tests"
@javascript
Scenario: Being able to select daily, weekly, monthly and yearly pattern
When I go to the recurring todos page
And I follow "Add a new recurring action"
Then I should see the form for "Daily" recurrence pattern
When I select "Weekly" recurrence pattern
Then I should see the form for "Weekly" recurrence pattern
When I select "Monthly" recurrence pattern
Then I should see the form for "Monthly" recurrence pattern
When I select "Yearly" recurrence pattern
Then I should see the form for "Yearly" recurrence pattern
When I select "Daily" recurrence pattern
Then I should see the form for "Daily" recurrence pattern
@javascript
Scenario: I can mark a recurrence pattern as starred
When I go to the recurring todos page
And I star the pattern "run tests"
Then the pattern "run tests" should be starred
@javascript
Scenario: I can edit a recurrence pattern
When I go to the recurring todos page
And I edit the name of the pattern "run tests" to "report test results"
Then the pattern "report test results" should be in the state list "active"
And I should not see "run tests"
@javascript
Scenario: I can delete a recurrence pattern
When I go to the recurring todos page
And I delete the pattern "run tests"
And I should not see "run tests"
@javascript
Scenario: I can mark a recurrence pattern as done
When I go to the recurring todos page
Then the pattern "run tests" should be in the state list "active"
And the state list "completed" should be empty
When I mark the pattern "run tests" as complete
Then the pattern "run tests" should be in the state list "completed"
And the state list "active" should be empty
@javascript
Scenario: I can reactivate a recurrence pattern
Given I have a completed recurrence pattern "I'm done"
When I go to the recurring todos page
Then the pattern "I'm done" should be in the state list "completed"
When I mark the pattern "I'm done" as active
Then the pattern "I'm done" should be in the state list "active"
And the state list "completed" should be empty
@javascript
Scenario: Following the recurring todo link of a todo takes me to the recurring todos page
When I go to the home page
Then I should see the todo "run tests"
When I follow the recurring todo link of "run tests"
Then I should be on the recurring todos page
@javascript
Scenario: Deleting a recurring todo with ending pattern will show message
When I go to the recurring todos page
And I mark the pattern "run tests" as complete
And I go to the home page
Then I should see "run tests"
When I delete the action "run tests"
Then I should see "There is no next action after the recurring action you just deleted. The recurrence is completed"
@javascript
Scenario: Deleting a recurring todo with active pattern will show new todo
When I go to the home page
Then I should see "run tests"
When I delete the action "run tests"
Then I should see "Action was deleted. Because this action is recurring, a new action was added"
And I should see "run tests" in the context container for "test context"

View file

@ -1,60 +0,0 @@
Feature: Reviewing projects
In order to keep the todos and projects up to date
As a Tracks user
I want to review my projects
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
Scenario: I see stalled projects
Given I have no projects
Given I have a project "stalled_project" with 0 todos
When I go to the review page
Then I see the project "stalled_project" in the "stalled" list
Scenario: I see blocked projects
Given I have no projects
Given I have a project "blocked_project" with 1 deferred todos
When I go to the review page
Then I see the project "blocked_project" in the "blocked" list
Scenario: I see dated projects
Given I have no projects
Given I have an outdated project "dated_project" with 1 todos
When I go to the review page
Then I see the project "dated_project" in the "review" list
Scenario: The review list of projects contains all projects
Given I have no projects
Given I have a project "stalled_project" with 0 todos
Given I have a project "blocked_project" with 1 deferred todos
Given I have an outdated project "dated_project" with 1 todos
When I go to the review page
And the badge should show 5 ## note that stalled and blocked projects are also up-to-date listed
@javascript
Scenario: I can mark a project as reviewed from the projects list page
Given I have a project called "review me"
When I go to the projects page
Then I should see "review me"
When I edit project "review me" and mark the project as reviewed
Then I should be on the projects page
And I should see "review me"
@javascript
Scenario: I can mark a project as reviewed from the project page
Given I have a project called "review me"
When I go to the "review me" project
When I edit project settings and mark the project as reviewed
Then I should be on the "review me" project
@javascript
Scenario: I can mark a project as reviewed from the review page
Given I have an outdated project "review me" with 1 todos
When I go to the review page
Then I should see "review me"
When I edit project "review me" and mark the project as reviewed
Then I should be on the review page

View file

@ -1,81 +0,0 @@
Feature: Show all due actions in a calendar view
As a Tracks user
In order to keep overview of my due todos
I want to manage due todos in a calendar view
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
Scenario: I can search for todos by partial description
Given I have the following todos:
| description | context |
| tester of stuff | @home |
| testing search | @work |
| unrelated stuff | @home |
When I go to the search page
And I search for "test"
Then I should see "tester"
And I should see "testing search"
When I go to the search page
And I search for "stuff"
Then I should see "tester of stuff"
And I should see "unrelated stuff"
@javascript
Scenario: I can edit found todos
Given I have the following todos:
| description | context |
| tester of stuff | @home |
| testing search | @work |
When I go to the search page
And I search for "test"
Then I should see the todo "tester of stuff"
When I star the action "tester of stuff"
Then I should see a starred "tester of stuff"
When I edit the description of "tester of stuff" to "test 1-2-3"
Then I should not see the todo "tester of stuff"
And I should see the todo "test 1-2-3"
When I go to the search page
And I search for "test"
Then I should not see the todo "tester of stuff"
And I should see the todo "test 1-2-3"
@javascript
Scenario: I can delete found todos
Given I have the following todos:
| description | context |
| tester of stuff | @home |
| testing search | @work |
When I go to the search page
And I search for "test"
Then I should see "tester of stuff"
When I delete the action "tester of stuff"
Then I should not see "tester of stuff"
When I go to the search page
And I search for "test"
Then I should not see "tester of stuff"
@javascript
Scenario: I can mark found todos complete and uncomplete
Given I have the following todos:
| description | context |
| tester of stuff | @home |
| testing search | @work |
When I go to the search page
And I search for "test"
Then I should see an active todo "tester of stuff"
When I mark "tester of stuff" as complete
Then I should see a completed todo "tester of stuff"
# the completed todo should show up on the next search too
When I go to the search page
And I search for "test"
Then I should see a completed todo "tester of stuff"
When I mark "tester of stuff" as uncompleted
Then I should see an active todo "tester of stuff"
# the active todo should show up on the next search too
When I go to the search page
And I search for "test"
Then I should see an active todo "tester of stuff"

View file

@ -1,321 +0,0 @@
Feature: Add new next action from every page
In order to quickly add a new next action
As a Tracks user
I want to to be able to add one or more new next actions from every page
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
And I have a context called "test context"
And I have a project "test project"
@javascript
Scenario Outline: I can hide the input form for single next action on a page
When I go to the <page>
Then the single action form should be visible
When I follow "Hide form"
Then the single action form should not be visible
Scenarios:
| page |
| home page |
| tickler page |
| "test project" project |
| context page for "test context" |
| tag page for "starred" |
@javascript
Scenario Outline: I can hide the input form for multiple next actions
When I go to the <page>
Then the single action form should be visible
When I follow "Add multiple next actions"
Then the multiple action form should be visible
When I follow "Hide form"
Then the single action form should not be visible
And the multiple action form should not be visible
Scenarios:
| page |
| home page |
| tickler page |
| "test project" project |
| context page for "test context" |
| tag page for "starred" |
@javascript
Scenario Outline: I can hide the input form and then choose both input forms
When I go to the <page>
Then the single action form should be visible
When I follow "Hide form"
Then the single action form should not be visible
When I follow "Add multiple next actions"
Then the multiple action form should be visible
When I follow "Hide form"
Then the single action form should not be visible
And the multiple action form should not be visible
Scenarios:
| page |
| home page |
| tickler page |
| "test project" project |
| context page for "test context" |
| tag page for "starred" |
@javascript
Scenario Outline: I can switch forms for single next action to multiple next actions
When I go to the <page>
Then the single action form should be visible
When I follow "Add multiple next actions"
Then the single action form should not be visible
And the multiple action form should be visible
When I follow "Add a next action"
Then the single action form should be visible
And the multiple action form should not be visible
Scenarios:
| page |
| home page |
| tickler page |
| "test project" project |
| context page for "test context" |
| tag page for "starred" |
@javascript
Scenario Outline: I can add a todo from several pages
Given I have selected the view for group by <grouping>
When I go to the <page>
And I submit a new action with description "a new next action"
Then I should <see> the todo "a new next action"
Scenarios:
| page | grouping | see |
| home page | context | see |
| home page | project | see |
| tickler page | context | not see |
| tickler page | project | not see |
| "test project" project | context | see |
| "test project" project | project | see |
| context page for "test context" | context | see |
| context page for "test context" | project | see |
| tag page for "starred" | context | see |
| tag page for "starred" | project | see |
@javascript
Scenario Outline: I can add multiple todos from several pages
Given I have a project "testing" with 1 todos
And I have selected the view for group by <grouping>
When I go to the <page>
And I follow "Add multiple next actions"
And I submit multiple actions with using
"""
one new next action
another new next action
"""
Then I should <see> the todo "one new next action"
And I should <see> the todo "another new next action"
And the badge should show <badge>
And the number of actions should be <count>
Scenarios:
| page | see | badge | count | grouping |
| home page | see | 3 | 3 | context |
| home page | see | 3 | 3 | project |
| tickler page | not see | 0 | 3 | context |
| tickler page | not see | 0 | 3 | project |
| "testing" project | see | 3 | 3 | context |
| "testing" project | see | 3 | 3 | project |
| context page for "test context" | see | 2 | 3 | context |
| context page for "test context" | see | 2 | 3 | project |
| tag page for "starred" | see | 2 | 3 | context |
| tag page for "starred" | see | 2 | 3 | project |
@javascript
Scenario: Adding a todo to another project does not show the todo in project view
Given I have a project called "another project"
When I go to the "test project" project
And I submit a new action with description "can you see me?" to project "another project" in the context "test context"
Then I should not see "can you see me?"
When I go to the "another project" project
Then I should see "can you see me?"
@javascript
Scenario: Adding a deferred todo to another project does not show the todo
# scenario for #1146
Given I have a project called "another project"
When I go to the "test project" project
And I submit a deferred new action with description "a new next action" to project "another project" in the context "test context"
Then I should not see the todo "a new next action"
And I submit a deferred new action with description "another new next action" to project "test project" in the context "test context"
Then I should see the todo "another new next action"
@javascript
Scenario Outline: Adding a todo with a new context shows the new context when page groups todos by context
When I go to the <page>
And I submit a new <todo> with description "do at new context" and the tags "starred" in the context "New"
Then a confirmation for adding a new context "New" should be asked
And the container for the context "New" should <visible>
And the badge should show <badge>
Scenarios:
| page | todo | badge | visible |
| home page | action | 1 | be visible |
| tickler page | deferred action | 1 | be visible |
| "test project" project | action | 1 | not be visible |
| context page for "test context" | action | 1 | not be visible |
| tag page for "starred" | action | 1 | be visible |
@javascript
Scenario Outline: Adding a todo with a new project shows the new project when page groups todos by project
And I have selected the view for group by project
When I go to the <page>
And I submit a new <todo> with description "do in new project" to project "New" with tags "starred"
Then the container for the project "New" should <visible>
And the badge should show <badge>
Scenarios:
| page | todo | badge | visible |
| home page | action | 1 | be visible |
| tickler page | deferred action | 1 | be visible |
| "test project" project | action | 1 | not be visible |
| context page for "test context" | action | 1 | not be visible |
| tag page for "starred" | action | 1 | be visible |
@javascript
Scenario Outline: Adding a todo to a hidden project does not show the todo
Given I have a hidden project called "hidden project"
And I have a project called "visible project"
And I have a context called "visible context"
And I have a context called "other context"
And I have selected the view for group by <grouping>
When I go to the <page>
And I submit a new action with description "hidden todo" to project "hidden project" with tags "test" in the context "visible context"
Then I should <see_hidden> the todo "hidden todo"
When I submit a new action with description "visible todo" to project "visible project" with tags "test" in the context "visible context"
Then I should <see_visible> the todo "visible todo"
Scenarios:
| page | grouping | see_hidden | see_visible |
| home page | context | not see | see |
| home page | project | not see | see |
| tickler page | context | not see | not see |
| tickler page | project | not see | not see |
| "visible project" project | project | not see | see |
| "visible project" project | context | not see | see |
| "hidden project" project | project | see | not see |
| "hidden project" project | context | see | not see |
| context page for "visible context" | context | not see | see |
| context page for "visible context" | project | not see | see |
| context page for "other context" | context | not see | not see |
| context page for "other context" | project | not see | not see |
| tag page for "starred" | context | not see | not see |
| tag page for "starred" | project | not see | not see |
| tag page for "test" | context | see | see |
| tag page for "test" | project | see | see |
@javascript
Scenario: Adding a todo to a hidden context from home page does not show the todo
Given I have a context called "visible context"
And I have a hidden context called "hidden context"
When I go to the home page
And I submit a new action with description "a new todo" in the context "visible context"
Then I should see "a new todo"
When I submit a new action with description "another new todo" in the context "hidden context"
Then I should not see "another new todo"
@javascript
Scenario: Adding a todo to a context shows the todo in that context page
Given I have a context called "visible context"
And I have a hidden context called "hidden context"
When I go to the context page for "visible context"
And I submit a new action with description "a new todo" in the context "visible context"
Then I should see "a new todo"
When I go to the context page for "hidden context"
And I submit a new action with description "another new todo" in the context "hidden context"
Then I should see "another new todo"
@javascript
Scenario Outline: Adding a todo to an empty container hides the empty message
Given I have a context called "visible context"
And I have a project called "visible project"
And I have selected the view for group by <grouping>
When I go to the tag page for "test"
Then I should see empty message for todos of tag
When I submit a new action with description "a new todo" to project "visible project" with tags "test" in the context "visible context"
Then I should see "a new todo"
And I should not see empty message for todos of tag
Scenarios:
| grouping |
| context |
| project |
@javascript @wip
Scenario Outline: Adding a dependency to a todo updates the successor
Given I have a <list_type> "test" with 1 todos
When I go to the "test" <list_type>
Then I should see "todo 1"
When I submit a new action with description "a new todo" with a dependency on "todo 1"
Then I should not see "a new todo" in the <list_type> container of "test"
When I expand the dependencies of "todo 1"
Then I should see "a new todo" within the dependencies of "todo 1"
And I should not see empty message for deferred todos of <list_type>
Examples:
| list_type |
| project |
| context |
@javascript
Scenario: Adding a dependency to a todo in another project
Given I have a project "testing" with 1 todos
And I have a project "another project"
When I go to the "another project" project
And I submit a new action with description "a new todo" with a dependency on "todo 1"
Then I should not see "a new todo" in the project container of "another project"
And I should not see empty message for deferred todos of project
@javascript
Scenario Outline: I can add multiple todos in a new project and a new context
Given I have selected the view for group by <grouping>
When I go to the home page
And I follow "Add multiple next actions"
And I fill the multiple actions form with "", "a next project", "@anywhere", "new tag"
And I submit the new multiple actions form with
"""
a
b
c
"""
Then a confirmation for adding a new context "@anywhere" should be asked
Then I should see "@anywhere"
And I should see "a"
And I should see "b"
And I should see "c"
Scenarios:
| grouping |
| project |
| context |
@javascript
Scenario: I need to fill in at least one description and a context
When I go to the home page
And I follow "Add multiple next actions"
And I submit the new multiple actions form with "", "", "", ""
Then I should see "You need to submit at least one next action"
When I submit the new multiple actions form with "one", "", "", ""
Then I should see "Context can't be blank"
When I fill the multiple actions form with "", "a project", "test context", "tag"
And I submit the new multiple actions form with
"""
"""
Then I should see "You need to submit at least one next action"

View file

@ -1,81 +0,0 @@
Feature: Show statistics
In order to see what I have got done
As an user
I want see my statistics
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
Given I have logged in as "testuser" with password "secret"
Scenario: Show statistics with no history
Given I have no todos
When I go to the statistics page
Then I should see "Totals"
And I should see " More statistics will appear here once you have added some actions."
Scenario: Show statistics with history
Given I have 5 todos
And I have 2 deferred todos
And I have 2 completed todos
When I go to the statistics page
And I should see "You have 7 incomplete actions"
And I should see "of which 2 are deferred actions"
And I should see "you have a total of 9 actions"
And I should see "2 of these are completed"
Then I should see "Totals"
And I should see "actions"
And I should see "Contexts"
And I should see "Projects"
And I should see "Tags"
Scenario: Click through to see chart of all actions per month
Given I have 5 todos
When I go to the statistics page
And I click on the chart for actions done in the last 12 months
Then I should see a chart
And I should see "to return to the statistics page"
Scenario: Click through to see all incomplete actions of a week
Given I have 5 todos
And I have 2 deferred todos
When I go to the statistics page
And I click on the chart for running time of all incomplete actions
Then I should see a chart
And I should see "Actions selected from week"
And I should see 7 todos
And I should see "to return to the statistics page"
And I should see "to show the actions from week 0 and further"
Scenario: Click through to see all incomplete visible actions of a week
Given I have 5 todos
And I have 3 deferred todos
When I go to the statistics page
And I click on the chart for running time of all incomplete visible actions
Then I should see a chart
And I should see "Actions selected from week"
And I should see 5 todos
And I should see "to return to the statistics page"
And I should see "to show the actions from week 0 and further"
@javascript
Scenario: I can edit the todos selected from a chart
Given I have 5 todos
When I go to the statistics page
And I click on the chart for running time of all incomplete actions
Then I should see 5 todos
And I should see "todo 1"
When I edit the description of "todo 1" to "foo bar"
Then I should not see the todo "todo 1"
And I should see the todo "foo bar"
@javascript
Scenario: Marking a todo selected from a chart as complete will remove it from the page
Given I have 5 todos
When I go to the statistics page
And I click on the chart for running time of all incomplete actions
Then I should see 5 todos
And I should see "todo 1"
When I mark "todo 1" as complete
Then I should not see the todo "todo 1"

View file

@ -1,59 +0,0 @@
Given /^a template that looks like$/ do |template|
steps %{
Given a file named "template.txt" with:
"""
#{template}
"""
}
end
Given /^a console input that looks like$/ do |input|
steps %{
Given a file named "todo.txt" with:
"""
#{input}
"""
}
end
When /^I execute the template script$/ do
step "I cd to \"../..\""
context_id = @current_user.contexts.first.id
port = Capybara.current_session.server.port
# assumes there is a context with id=1
cli = "ruby doc/tracks_template_cli.rb -c #{context_id} -f tmp/aruba/template.txt"
set_env('GTD_LOGIN','testuser')
set_env('GTD_PASSWORD', 'secret')
set_env('GTD_TODOS_URL', "http://localhost:#{port}/todos.xml")
set_env('GTD_PROJECTS_URL', "http://localhost:#{port}/projects.xml")
set_env('GTD_CONTEXT_URL_PREFIX', "http://localhost:#{port}/contexts/")
set_env("GTD_CONTEXT_URL","http://localhost:#{port}/contexts.xml")
step "I run `#{cli}`"
end
When /^I execute the add-todo script$/ do
step "I cd to \"../..\""
# assumes there is a context and a project
context_id = @current_user.contexts.first.id
project_id = @current_user.projects.first.id
port = Capybara.current_session.server.port
cli = "ruby doc/tracks_cli_client.rb -c #{context_id} -p #{project_id}"
set_env('GTD_LOGIN','testuser')
set_env('GTD_PASSWORD', 'secret')
set_env('GTD_TODOS_URL', "http://localhost:#{port}/todos.xml")
step "I run `#{cli}` interactively"
step "I pipe in the file \"tmp/aruba/todo.txt\""
# it seems aruba does not wait for process to end with interactively run command, but
# continues anyway which will start cleaning up the database while the process is still running
# so wait 2.5 secs for the process to finish
sleep 2.5
end

View file

@ -1,154 +0,0 @@
When(/^I collapse the context container of "([^"]*)"$/) do |context_name|
toggle = page.find(:xpath, toggle_context_container_xpath(find_context(context_name)))
expect(toggle).to be_visible
toggle.click
end
When(/^I collapse the project container of "(.*?)"$/) do |project_name|
toggle = page.find(:xpath, toggle_project_container_xpath(find_project(project_name)))
expect(toggle).to be_visible
toggle.click
end
When /^I toggle all collapsed context containers$/ do
open_view_menu do
click_link 'Toggle collapsed contexts'
end
end
####### Context #######
Then(/^I should (see|not see) the context "([^"]*)"$/) do |visible, context_name|
check_xpath_visibility(visible, context_container_xpath(find_context(context_name)))
end
Then /^I should (see|not see) the container for context "([^"]*)"$/ do |visible, context_name|
step("I should #{visible} the context \"#{context_name}\"")
end
Then /^I should (see|not see) the context container for "([^"]*)"$/ do |visible, context_name|
step "I should #{visible} the context \"#{context_name}\""
end
Then(/^the container for the context "([^"]*)" should (be|not be) visible$/) do |context_name, visible|
mapping = {"be" => "see", "not be" => "not see"}
step "I should #{mapping[visible]} the context \"#{context_name}\""
end
Then /^I should (see|not see) "([^"]*)" in the context container for "([^"]*)"$/ do |visible, todo_description, context_name|
check_xpath_visibility(visible, todo_in_context_container_xpath(find_todo(todo_description), find_context(context_name)))
end
Then(/^I should (see|not see) "([^"]*)" in the context container of "([^"]*)"$/) do |visible, todo_description, context_name|
step "I should #{visible} \"#{todo_description}\" in the context container for \"#{context_name}\""
end
Then /^I should (see|not see) "([^"]*)" in the container for context "([^"]*)"$/ do |visible, todo_description, context_name|
step "I should #{visible} \"#{todo_description}\" in the context container for \"#{context_name}\""
end
####### Deferred #######
Then(/^I should (not see|see) "([^"]*)" in the deferred container$/) do |visible, todo_description|
check_xpath_visibility(visible, todo_in_deferred_container_xpath(find_todo(todo_description)))
end
Then(/^I should (not see|see) "([^"]*)" in the action container$/) do |visible, todo_description|
check_xpath_visibility(visible, todo_in_container_xpath(find_todo(todo_description), @source_view.to_sym))
end
####### Project #######
Then /^I should (see|not see) "([^"]*)" in the project container of "([^"]*)"$/ do |visible, todo_description, project_name|
check_xpath_visibility(visible, todo_in_project_container_xpath(find_todo(todo_description), find_project(project_name)))
end
Then(/^I should (see|not see) "(.*?)" in the container for project "(.*?)"$/) do |visible, todo_description, project_name|
step "I should #{visible} \"#{todo_description}\" in the project container of \"#{project_name}\""
end
Then(/^I should (see|not see) "(.*?)" in the project container for "(.*?)"$/) do |visible, todo_description, project_name|
step "I should #{visible} \"#{todo_description}\" in the project container of \"#{project_name}\""
end
Then(/^I should (see|not see) the project container for "([^"]*)"$/) do |visible, project_name|
check_xpath_visibility(visible, project_container_xpath(find_project(project_name)))
end
Then(/^I should (see|not see) the container for project "(.*?)"$/) do |visible, project_name|
step "I should #{visible} the project container for \"#{project_name}\""
end
Then(/^the container for the project "(.*?)" should (be visible|not be visible)$/) do |project_name, visible|
map = { "be visible" => "see", "not be visible" => "not see"}
step("I should #{map[visible]} the project container for \"#{project_name}\"")
end
####### Completed #######
Then(/^I should (not see|see) "([^"]*)" in the (completed|done today|done this week|done this month) container$/) do |visible, todo_description, container|
id = 'completed_container' if container == 'completed'
id = 'completed_today_container' if container == 'done today'
id = 'completed_rest_of_week_container' if container == 'done this week'
id = 'completed_rest_of_month_container' if container == 'done this month'
css = "div##{id} div#line_todo_#{find_todo(todo_description).id}"
check_css_visibility(visible, css)
end
####### Hidden #######
Then /^I should (not see|see) "([^"]*)" in the hidden container$/ do |visible, todo_description|
xpath = "//div[@id='hidden_container']//div[@id='line_todo_#{find_todo(todo_description).id}']"
check_xpath_visibility(visible, xpath)
end
####### Calendar #######
Then /^I should see "([^"]*)" in the due next month container$/ do |todo_description|
within "div#due_after_this_month_container" do
expect(page).to have_css("div#line_todo_#{find_todo(todo_description).id}")
end
end
####### Recurrence patterns #######
Then /^I should (see|not see) "([^"]*)" in the active recurring todos container$/ do |visibility, recurrence_pattern|
recurrence = @current_user.recurring_todos.where(:description => recurrence_pattern).first
unless recurrence.nil?
xpath = "//div[@id='active_recurring_todos_container']//div[@id='recurring_todo_#{recurrence.id}']"
check_xpath_visibility(visibility, xpath)
else
step "I should #{visibility} \"#{recurrence_pattern}\""
end
end
Then /^I should (see|not see) "([^"]*)" in the completed recurring todos container$/ do |visible, recurrence_pattern|
recurrence = @current_user.todos.where(:description => recurrence_pattern).first
unless recurrence.nil?
xpath = "//div[@id='completed_recurring_todos_container']//div[@id='recurring_todo_#{recurrence.id}']"
check_xpath_visibility(visible, xpath)
else
step "I should #{visible} \"#{recurrence_pattern}\""
end
end
####### Empty message patterns #######
Then /^I should (see|not see) empty message for (done today|done this week|done this month|completed todos|deferred todos|todos) (of done actions|of context|of project|of home|of tag)/ do |visible, state, type|
css = "error: wrong state"
css = "div#c#{@context.id}-empty-d" if state == "todos"
css = "div#no_todos_in_view" if state == "todos" && ["of home", "of tag", "of context", "of project"].include?(type)
css = "div#completed_today_container" if state == "done today"
css = "div#completed_rest_of_week_container" if state == "done this week"
css = "div#completed_rest_of_month_container" if state == "done this month"
css = "div#completed_container-empty-d" if state == "completed todos"
css = "div#deferred_pending_container-empty-d" if state == "deferred todos"
elem = find(css)
expect(elem).to_not be_nil
check_elem_visibility(visible, elem)
end

View file

@ -1,96 +0,0 @@
When /^I delete the context "([^\"]*)"$/ do |context_name|
context = find_context(context_name)
handle_js_confirm do
click_link "delete_context_#{context.id}"
end
expect(get_confirm_text).to eq("Are you sure that you want to delete the context '#{context_name}'? Be aware that this will also delete all (recurring) actions in this context!")
# wait until the context is removed
expect(page).to_not have_css("a#delete_context_#{context.id}")
end
When /^I edit the context to rename it to "([^\"]*)"$/ do |new_name|
find("a#link_edit_context_#{@context.id}").click
wait_for_context_form_to_appear(@context)
within "div.edit-form" do
fill_in "context_name", :with => new_name
click_button "submit_context_#{@context.id}"
end
wait_for_context_form_to_go_away(@context)
end
When(/^I add a new context "([^"]*)"$/) do |context_name|
fill_in "context[name]", :with => context_name
submit_new_context_form
end
When(/^I add a new active context "([^"]*)"$/) do |context_name|
step "I add a new context \"#{context_name}\""
end
When(/^I add a new hidden context "([^"]*)"$/) do |context_name|
fill_in "context[name]", :with => context_name
check "context_state_hide"
submit_new_context_form
end
When(/^I drag context "([^"]*)" above context "([^"]*)"$/) do |context_drag, context_drop|
drag_id = find_context(context_drag).id
drag_index = context_list_find_index(context_drag)
drop_index = context_list_find_index(context_drop)
context_drag_and_drop(drag_id, drop_index-drag_index)
end
When /^I edit the state of context "(.*?)" to closed$/ do |context_name|
context = find_context(context_name)
open_context_edit_form(context)
# change state
within "form#edit_form_context_#{context.id}" do
find("input#context_state_closed").click
click_button "submit_context_#{context.id}"
end
wait_for_context_form_to_go_away(context)
end
Then /^context "([^"]*)" should be above context "([^"]*)"$/ do |context_high, context_low|
sleep 0.2
expect(context_list_find_index(context_high)).to be < context_list_find_index(context_low)
end
Then(/^I should see that a context named "([^"]*)" (is|is not) present$/) do |context_name, present|
is_not = present=="is not" ? "not " : ""
within "div#display_box" do
step "I should #{is_not}see \"#{context_name}\""
end
end
Then /^I should see that the context container for (.*) contexts (is|is not) present$/ do |state, visible|
v = {"is" => "see", "is not" => "not see"}[visible] # map is|is not to see|not see
check_css_visibility(v, "div#list-#{state}-contexts-container" )
end
Then /^I should see the context "([^"]*)" under "([^"]*)"$/ do |context_name, state|
context = find_context(context_name)
check_css_visibility("see", "div#list-contexts-#{state} div#context_#{context.id}")
end
Then /^the new context form should (be|not be) visible$/ do |visible|
v = {"be" => "see", "not be" => "not see"}[visible] # map be|not be to see|not see
check_css_visibility(v, "div#context_new")
end
Then /^the context list badge for ([^"]*) contexts should show (\d+)$/ do |state_name, count|
expect(find("span##{state_name}-contexts-count").text).to eq(count)
end
Then /^I should (see|not see) empty message for (active|hidden|closed) contexts$/ do |visible, state|
check_css_visibility(visible, "div##{state}-contexts-empty-nd")
end

View file

@ -1,74 +0,0 @@
Given /^I have no contexts$/ do
# should probably not be needed as you use this given at the start of a scenario
Context.delete_all
end
Given /^there exists (an active|a hidden|a closed) context called "([^"]*)" for user "([^"]*)"$/ do |state, context_name, login|
user = User.where(:login => login).first
expect(user).to_not be_nil
context_state = {"an active" => "active", "a hidden" => "hidden", "a closed" => "closed"}[state]
@context = user.contexts.where(:name => context_name, :state => context_state).first_or_create
end
Given /^there exists a context called "([^"]*)" for user "([^"]*)"$/ do |context_name, login|
step "there exists an active context called \"#{context_name}\" for user \"#{login}\""
end
Given /^I have a context called "([^\"]*)"$/ do |context_name|
step "there exists an active context called \"#{context_name}\" for user \"#{@current_user.login}\""
end
Given /^I have (an active|a hidden|a closed) context called "([^\"]*)"$/ do |state, context_name|
step "there exists #{state} context called \"#{context_name}\" for user \"#{@current_user.login}\""
end
Given /^I have the following contexts:$/ do |table|
table.hashes.each do |context|
step 'I have a context called "'+context[:context]+'"'
@context.state = (context[:hide] == "true") ? 'hidden' : 'active' unless context[:hide].blank?
# acts_as_list puts the last added context at the top, but we want it
# at the bottom to be consistent with the table in the scenario
@context.move_to_bottom
@context.save!
end
end
Given /^I have the following contexts$/ do |table|
step("I have the following contexts:", table)
end
Given /^I have a context "([^\"]*)" with (\d+) (?:actions|todos)$/ do |context_name, number_of_actions|
context = @current_user.contexts.create!(:name => context_name)
@todos=[]
1.upto number_of_actions.to_i do |i|
@todos << @current_user.todos.create!(:context_id => context.id, :description => "todo #{i}")
end
end
Given /^I have a context "([^\"]*)" with (\d+) deferred (?:actions|todos)$/ do |context_name, number_of_actions|
step "I have a context \"#{context_name}\" with #{number_of_actions} actions"
@todos.each {|todo| todo.description = "deferred "+todo.description; todo.show_from = Time.zone.now + 1.week; todo.save!}
end
When /^I edit the context name in place to be "([^\"]*)"$/ do |new_context_name|
page.find("span#context_name").click
fill_in "value", :with => new_context_name
click_button "Ok"
wait_for_ajax
end
Then /^I should see the context name is "([^\"]*)"$/ do |context_name|
step "I should see \"#{context_name}\""
end
Then /^he should see that a context named "([^\"]*)" (is|is not) present$/ do |context_name, visible|
context = @current_user.contexts.where(:name => context_name).first
if visible == "is"
expect(context).to_not be_nil
css = "div#context_#{context.id} div.context_description a"
expect(page).to have_selector(css, :visible => true)
expect(page.find(:css, css).text).to eq(context_name)
else
expect(page).to_not have_selector("div#context_#{context.id} div.context_description a", :visible => true) if context
end
end

View file

@ -1,117 +0,0 @@
Given /^"([^"]*)" depends on "([^"]*)"$/ do |successor_name, predecessor_name|
successor = Todo.where(:description => successor_name).first
predecessor = Todo.where(:description => predecessor_name).first
successor.add_predecessor(predecessor)
successor.state = "pending"
successor.save!
end
When /^I drag "(.*)" to "(.*)"$/ do |dragged, target|
drag_id = Todo.where(:description => dragged).first.id
drop_id = Todo.where(:description => target).first.id
drag_elem = page.find("div#line_todo_#{drag_id} img.grip")
drop_elem = page.find("div#line_todo_#{drop_id}")
drag_elem.drag_to(drop_elem)
end
When /^I expand the dependencies of "([^\"]*)"$/ do |todo_name|
todo = Todo.where(:description=>todo_name).first
expect(todo).to_not be_nil
expand_img_locator = "//div[@id='line_todo_#{todo.id}']/div/a[@class='show_successors']/img"
page.find(:xpath, expand_img_locator).click
wait_for_animations_to_end
end
When /^I edit the dependency of "([^"]*)" to add "([^"]*)" as predecessor$/ do |todo_description, predecessor_description|
todo = @current_user.todos.where(:description => todo_description).first
expect(todo).to_not be_nil
predecessor = @current_user.todos.where(:description => predecessor_description).first
expect(predecessor).to_not be_nil
open_edit_form_for(todo)
form_css = "form#form_todo_#{todo.id}"
within form_css do
fill_in 'predecessor_input', :with => predecessor_description
end
# in webkit, the autocompleter is not fired after fill_in
page.execute_script %Q{$("#{form_css}").find('input[id$="predecessor_input"]').autocomplete('search')} if Capybara.javascript_driver == :webkit
# click first line
page.find('ul.ui-autocomplete li.ui-state-focus').click
# wait for the new dependency to be added to the list
expect(page).to have_css("li#pred_#{predecessor.id}")
submit_edit_todo_form(todo)
end
When /^I edit the dependency of "([^"]*)" to remove "([^"]*)" as predecessor$/ do |todo_description, predecessor_description|
todo = @current_user.todos.where(:description => todo_description).first
expect(todo).to_not be_nil
predecessor = @current_user.todos.where(:description => predecessor_description).first
expect(predecessor).to_not be_nil
open_edit_form_for(todo)
delete_dep_button = "//form[@id='form_todo_#{todo.id}']//img[@id='delete_dep_#{predecessor.id}']"
page.find(:xpath, delete_dep_button).click
expect(page).to_not have_xpath(delete_dep_button)
submit_edit_todo_form(todo)
wait_for_ajax
wait_for_animations_to_end
end
When /^I edit the dependency of "([^"]*)" to "([^"]*)"$/ do |todo_name, deps|
todo = @dep_todo = @current_user.todos.where(:description => todo_name).first
expect(todo).to_not be_nil
open_edit_form_for(todo)
fill_in "predecessor_list_todo_#{todo.id}", :with => deps
submit_edit_todo_form(todo)
end
Then /^the successors of "(.*)" should include "(.*)"$/ do |parent_name, child_name|
parent = @current_user.todos.where(:description => parent_name).first
expect(parent).to_not be_nil
# wait until the successor is added.
wait_until do
!parent.pending_successors.where(:description => child_name).first.nil?
end
end
Then /^I should see "([^\"]*)" within the dependencies of "([^\"]*)"$/ do |successor_description, todo_description|
todo = @current_user.todos.where(:description => todo_description).first
expect(todo).to_not be_nil
# open successors
within "div#line_todo_#{todo.id}" do
if !find(:css, "div#successors_todo_#{todo.id}").visible?
find(:css, "a.show_successors").click
end
end
step "I should see \"#{successor_description}\" within \"div#line_todo_#{todo.id}\""
end
Then /^I should not see "([^"]*)" within the dependencies of "([^"]*)"$/ do |successor_description, todo_description|
todo = @current_user.todos.where(:description => todo_description).first
expect(todo).to_not be_nil
step "I should not see \"#{successor_description}\" within \"div#line_todo_#{todo.id}\""
end
Then /^I should see that "([^"]*)" does not have dependencies$/ do |todo_description|
todo = @current_user.todos.where(:description => todo_description).first
expect(todo).to_not be_nil
dependencies_icon = "//div[@id='line_todo_#{todo.id}']/div/a[@class='show_successors']/img"
expect(page).to_not have_xpath(dependencies_icon)
end

View file

@ -1,29 +0,0 @@
Then /^I should see a message that you need a context to get feeds for contexts$/ do
step "I should see \"There needs to be at least one context before you can request a feed\""
end
Then /^I should see a message that you need a project to get feeds for projects$/ do
step "I should see \"There needs to be at least one project before you can request a feed\""
end
Then /^I should see feeds for projects$/ do
expect(page).to have_css("select#feed-projects option[value='#{@current_user.projects.first.id}']")
end
Then /^I should see feeds for contexts$/ do
expect(page).to have_css("select#feed-contexts option[value='#{@current_user.contexts.first.id}']")
end
Then /^I should see "([^"]*)" as the selected project$/ do |project_name|
expect(page).to have_css('select#feed-projects option[selected="selected"]')
end
Then /^I should see "([^"]*)" as the selected context$/ do |context_name|
expect(page).to have_css('select#feed-contexts option[selected="selected"]')
end
Then /^I should see feeds for "([^"]*)" in list of "([^"]*)"$/ do |name, list_type|
wait_for_ajax
xpath= "//div[@id='feeds-for-#{list_type}']//strong"
expect(name).to eq(find(:xpath, xpath).text)
end

View file

@ -1,36 +0,0 @@
Given /this is a pending scenario/ do
pending
end
Given(/^I set the locale to "([^"]*)"$/) do |locale|
@locale = locale
end
Given /^I am working on the mobile interface$/ do
@mobile_interface = true
end
Given(/^I have selected the view for group by (project|context)$/) do |grouping|
@group_view_by = grouping
end
Then /the badge should show (.*)/ do |number|
badge = find("span#badge_count").text.to_i
expect(badge).to eq(number.to_i)
end
Then(/^I should see an error flash message saying "([^"]*)"$/) do |message|
xpath = "//div[@id='message_holder']/h4[@id='flash']"
expect(page).to have_xpath(xpath, :visible => true)
text = page.find(:xpath, xpath).text
expect(text).to eq(message)
end
Then /^I should see "([^"]*)" $/ do |text|
step "I should see \"#{text}\""
end
Then /^I should save and open the page$/ do
save_and_open_page
end

View file

@ -1,27 +0,0 @@
Given /^I have logged in as "(.*)" with password "(.*)"$/ do |username, password|
user = User.where(:login => username).first
request_signin_as(user)
@current_user = user
end
When /^I submit the login form as user "([^\"]*)" with password "([^\"]*)"$/ do |username, password|
fill_in 'Login', :with => username
fill_in 'Password', :with => password
uncheck "Stay logged in"
click_button "Sign in"
end
When /^my session expires$/ do
# use expire_session to force expiry of session
js = '$.ajax({type: "GET", url: "/login/expire_session", dataType: "script", async: false});'
page.execute_script(js);
# force check of expiry bypassing timeout
js = '$.ajax({type: "GET", url: "/login/check_expiry", dataType: "script", async: false});'
page.execute_script(js);
sleep 1
end
When /^I log out of Tracks$/ do
step "I go to the logout page"
end

View file

@ -1,4 +0,0 @@
When /^I follow the tag "(.*?)"$/ do |tag_name|
# there could be more than one tag on the page, so use the first
all(:xpath, "//span[@class='tag #{tag_name}']/a")[0].click
end

View file

@ -1,87 +0,0 @@
When /^I add note "([^\"]*)" from the "([^\"]*)" project page$/ do |note, project|
project = Project.where(:name => project).first
project.notes.create!(:user_id => @current_user.id, :body => note)
end
When /^I delete the first note$/ do
title = page.all("div.container h2").first.text
id = title.split(' ').last
handle_js_confirm do
click_link "delete_note_#{id}"
end
expect(get_confirm_text).to eq("Are you sure that you want to delete the note '#{id}'?")
expect(page).to_not have_css("a#delete_note_#{id}")
end
When /^I click the icon next to the note$/ do
click_link "Show note"
end
When /^I edit the first note to "([^"]*)"$/ do |note_body|
title = page.all("div.container h2").first.text
id = title.split(' ').last
click_link "link_edit_note_#{id}"
within "form#edit_form_note_#{id}" do
fill_in "note[body]", :with => note_body
click_button "submit_note_#{id}"
end
end
When(/^I toggle the note of "([^"]*)"$/) do |todo_description|
todo = @current_user.todos.where(:description => todo_description).first
expect(todo).to_not be_nil
xpath = "//div[@id='line_todo_#{todo.id}']/div/a/img"
page.find(:xpath, xpath).click
end
When /^I click Toggle Notes$/ do
open_view_menu do
click_link 'Toggle notes'
end
end
When /^I toggle all notes$/ do
step "I click Toggle Notes"
end
Then /^(.*) notes should be visible$/ do |number|
# count number of project_notes
count = 0
page.all("div.project_notes").each { |node| count += 1 }
expect(count).to eq(number.to_i)
end
Then /^I should see note "([^\"]*)" on the "([^\"]*)" project page$/ do |note, project|
project = Project.where(:name => project).first
visit project_path(project)
step "I should see the note \"#{note}\""
end
Then /^I should see note "([^\"]*)" on the notes page$/ do |note|
visit notes_path
step "I should see the note \"#{note}\""
end
Then /^the first note should disappear$/ do
title = page.find("div.container h2").text
id = title.split(' ').last
note = "div#note_#{id}"
expect(page).to_not have_css(note, :visible=>true)
end
Then /^I should see the note text$/ do
step "I should see the note \"after 50 characters\""
end
Then /^I should not see the note "([^"]*)"$/ do |note_content|
expect(page).to_not have_selector("div", :text => note_content, :visible => true)
end
Then /^I should see the note "([^"]*)"$/ do |note_content|
expect(page.all("div", :text => note_content).first).to be_visible
end

View file

@ -1,3 +0,0 @@
Then /^I should be redirected to (.+?)$/ do |page_name|
step "I should be on #{page_name}"
end

View file

@ -1,15 +0,0 @@
When /^I edit my last name to "([^"]*)"$/ do |last_name|
fill_in "user[last_name]", :with => last_name
click_button "prefs_submit"
end
When /^I set the password and confirmation to "([^"]*)"$/ do |new_password|
step "I set the password to \"#{new_password}\" and confirmation to \"#{new_password}\""
end
When /^I set the password to "([^"]*)" and confirmation to "([^"]*)"$/ do |new_password, new_password_confirmation|
fill_in "user[password]", :with => new_password
fill_in "user[password_confirmation]", :with => new_password_confirmation
click_button "prefs_submit"
end

View file

@ -1,135 +0,0 @@
When /^I delete project "([^"]*)"$/ do |project_name|
project = @current_user.projects.where(:name => project_name).first
expect(project).to_not be_nil
handle_js_confirm do
click_link "delete_project_#{project.id}"
end
expect(get_confirm_text).to eq("Are you sure that you want to delete the project '#{project_name}'?")
expect(page).to_not have_css("a#delete_project_#{project.id}")
end
When /^I drag the project "([^"]*)" below "([^"]*)"$/ do |project_drag, project_drop|
drag_id = @current_user.projects.where(:name => project_drag).first.id
sortable_css = "div.ui-sortable div#container_project_#{drag_id}"
drag_index = project_list_find_index(project_drag)
drop_index = project_list_find_index(project_drop)
page.execute_script "$('#{sortable_css}').simulateDragSortable({move: #{drop_index-drag_index}, handle: '.grip'});"
sleep 0.1 # wait for the js to process the drop
end
When /^I submit a new project with name "([^"]*)"$/ do |project_name|
fill_in "project[name]", :with => project_name
submit_new_project_form
end
When /^I submit a new project with name "([^"]*)" and select take me to the project$/ do |project_name|
fill_in "project[name]", :with => project_name
check "go_to_project"
submit_new_project_form
end
When /^I sort the active list alphabetically$/ do
handle_js_confirm do
within "div#list-active-projects-container" do
click_link "Alphabetically"
end
wait_for_ajax
end
expect(get_confirm_text).to eq("Are you sure that you want to sort these projects alphabetically? This will replace the existing sort order.")
end
When /^I sort the active list by number of tasks$/ do
handle_js_confirm do
within "div#list-active-projects-container" do
click_link "By number of tasks"
end
wait_for_ajax
end
expect(get_confirm_text).to eq("Are you sure that you want to sort these projects by the number of tasks? This will replace the existing sort order.")
end
Then /^I should see that a project named "([^"]*)" is not present$/ do |project_name|
within "div#display_box" do
step "I should not see \"#{project_name}\""
end
end
Then /^I should see that a project named "([^"]*)" is present$/ do |project_name|
within "div#display_box" do
step "I should see \"#{project_name}\""
end
end
Then /^I should see a project named "([^"]*)"$/ do |project_name|
step "I should see that a project named \"#{project_name}\" is present"
end
Then /^I should not see a project named "([^"]*)"$/ do |project_name|
step "I should see that a project named \"#{project_name}\" is not present"
end
Then(/^I should not see the project "(.*?)"$/) do |project_name|
project = @current_user.projects.where(:name => project_name).first
expect(project).to_not be_nil
project_xpath = "//div[@id='project_#{project.id}']"
expect(page).to_not have_xpath(project_xpath)
end
Then /^the project "([^"]*)" should be above the project "([^"]*)"$/ do |project_high, project_low|
expect(project_list_find_index(project_high)).to be < project_list_find_index(project_low)
end
Then /^the project "([^"]*)" should not be in state list "([^"]*)"$/ do |project_name, state_name|
project = @current_user.projects.where(:name => project_name).first
expect(project).to_not be_nil
list_id = @source_view=="review" ? "list-#{state}-projects" : "list-#{state_name}-projects-container"
xpath = "//div[@id='#{list_id}']//div[@id='project_#{project.id}']"
expect(page).to_not have_xpath(xpath)
end
Then /^the project "([^"]*)" should be in state list "([^"]*)"$/ do |project_name, state_name|
project = @current_user.projects.where(:name => project_name).first
expect(project).to_not be_nil
list_id = @source_view=="review" ? "list-#{state_name}-projects" : "list-#{state_name}-projects-container"
xpath = "//div[@id='#{list_id}']//div[@id='project_#{project.id}']"
expect(page).to have_xpath(xpath)
end
Then /^I see the project "([^"]*)" in the "([^"]*)" list$/ do |project_name, state_name|
step "the project \"#{project_name}\" should be in state list \"#{state_name}\""
end
Then /^the project list badge for "([^"]*)" projects should show (\d+)$/ do |state_name, count|
expect(page.find(:xpath, "//span[@id='#{state_name}-projects-count']").text).to eq(count)
end
Then /^the new project form should be visible$/ do
expect(page).to have_css("div#project_new", :visible => true)
end
Then /^the new project form should not be visible$/ do
expect(page).to_not have_css("div#project_new", :visible => true)
end
Then /^the project "([^"]*)" should have (\d+) actions listed$/ do |project_name, count|
project = @current_user.projects.where(:name => project_name).first
expect(project).to_not be_nil
xpath = "//div[@id='list-active-projects-container']//div[@id='project_#{project.id}']"
expect(page.find(:xpath, xpath).text).to eq("#{project.name} (#{count} actions)")
end
Then /^the project "([^"]*)" should have (\d+) deferred actions listed$/ do |project_name, deferred|
project = @current_user.projects.where(:name => project_name).first
expect(project).to_not be_nil
xpath = "//div[@id='list-active-projects-container']//div[@id='project_#{project.id}']"
expect(page.find(:xpath, xpath).text).to eq("#{project.name} (#{deferred} deferred actions)")
end

View file

@ -1,313 +0,0 @@
Given /^I have no projects$/ do
Project.delete_all
end
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"
@project = @current_user.projects.where(:name => project_name).first
@project.last_reviewed = UserTime.new(@current_user).time - @current_user.prefs.review_period.days-1
@project.save
end
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 (\d+) (todo|active todo|deferred todo)s prefixed by "([^\"]*)"$/ do |project_name, num_todos, state, prefix|
@context = @current_user.contexts.where(:name => "Context A").first_or_create
@project = @current_user.projects.where(:name => project_name).first_or_create
# acts_as_list adds at top by default, but that is counter-intuitive when reading scenario's, so reverse this
@project.move_to_bottom
@todos=[]
1.upto num_todos.to_i do |i|
todo = @current_user.todos.create!(
:project_id => @project.id,
:context_id => @context.id,
:description => "#{prefix}#{state} #{i}")
todo.show_from = Time.zone.now + 1.week if state=="deferred todo"
todo.save!
@todos << todo
end
end
Given /^I have a project "([^"]*)" with (\d+) (todos|active todos|deferred todos)$/ do |project_name, num_todos, state|
step "I have a project \"#{project_name}\" with #{num_todos} #{state} prefixed by \"\""
end
Given /^there exists a project (?:|called )"([^"]*)" for user "([^"]*)"$/ do |project_name, user_name|
user = User.where(:login => user_name).first
expect(user).to_not be_nil
@project = user.projects.create!(:name => project_name)
# acts_as_list adds at top by default, but that is counter-intuitive when reading scenario's, so reverse this
@project.move_to_bottom
end
Given /^I have a project (?:|called )"([^"]*)"$/ do |project_name|
@project = @current_user.projects.create!(:name => project_name)
end
Given /^I have a project "([^"]*)" with a default context of "([^"]*)"$/ do |project_name, context_name|
step "I have a project \"#{project_name}\""
context = @current_user.contexts.create!(:name => context_name)
@project.default_context = context
@project.save!
end
Given /^I have the following projects:$/ do |table|
table.hashes.each do |project|
step "I have a project called \"#{project[:project_name]}\""
# 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
@project.move_to_bottom
@project.save!
end
end
Given /^I have a (completed|hidden) project called "([^"]*)"$/ do |state, project_name|
step "I have a project called \"#{project_name}\""
@project.send(state=="completed" ? "complete!" : "hide!")
@project.reload
expect(@project.send(state=="completed" ? "completed?" : "hidden?")).to be true
end
Given /^I have (\d+) completed projects$/ do |number_of_projects|
1.upto number_of_projects.to_i do |i|
step "I have a completed project called \"Project #{i}\""
end
end
Given /^I have one project "([^\"]*)" with no notes$/ do |project_name|
step "I have a project called \"#{project_name}\""
end
Given /^I have two projects with one note each$/ do
step "I have a project \"project A\""
@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
Given /^the default tags for "(.*?)" are "(.*?)"$/ do |project_name, default_tags|
project = @current_user.projects.where(:name => project_name).first
expect(project).to_not be_nil
project.default_tags = default_tags
project.save!
end
When /^I open the project edit form$/ do
click_link "link_edit_project_#{@project.id}"
expect(page).to have_css("button#submit_project_#{@project.id}", :visible => true)
end
When /^I cancel the project edit form$/ do
click_link "cancel_project_#{@project.id}"
expect(page).to_not have_css("submit_project_#{@project.id}")
wait_for_animations_to_end
end
When /^I edit the project description to "([^\"]*)"$/ do |new_description|
edit_project(@project) do
fill_in "project[description]", :with => new_description
end
end
When /^I edit the project name to "([^\"]*)"$/ do |new_title|
edit_project(@project) do
fill_in "project[name]", :with => new_title
end
end
When /^I try to edit the project name to "([^\"]*)"$/ do |new_title|
edit_project_no_wait(@project) do
within "form.edit-project-form" do
fill_in "project[name]", :with => new_title
end
end
end
When /^I edit the default context to "([^"]*)"$/ do |default_context|
edit_project(@project) do
fill_in "project[default_context_name]", :with => default_context
end
end
When /^I edit the project name of "([^"]*)" to "([^"]*)"$/ do |project_current_name, project_new_name|
@project = @current_user.projects.where(:name => project_current_name).first
expect(@project).to_not be_nil
step "I edit the project name to \"#{project_new_name}\""
end
When /^I try to edit the project name of "([^"]*)" to "([^"]*)"$/ do |project_current_name, project_new_name|
@project = @current_user.projects.where(:name => project_current_name).first
expect(@project).to_not be_nil
step "I try to edit the project name to \"#{project_new_name}\""
end
When /^I edit the project name in place to be "([^"]*)"$/ do |new_project_name|
page.find("span#project_name").click
fill_in "value", :with => new_project_name
click_button "Ok"
end
When /^I click to edit the project name in place$/ do
page.find("span#project_name").click
end
When /^I edit the project settings$/ do
expect(@project).to_not be_nil
click_link "link_edit_project_#{@project.id}"
expect(page).to have_xpath("//div[@id='edit_project_#{@project.id}']/form//button[@id='submit_project_#{@project.id}']")
end
When /^I close the project settings$/ do
expect(@project).to_not be_nil
click_link "Cancel"
wait_for_ajax
wait_for_animations_to_end
end
When /^I edit the project state of "([^"]*)" to "([^"]*)"$/ do |project_name, state_name|
project = @current_user.projects.where(:name => project_name).first
expect(project).to_not be_nil
edit_project_settings(project) do
choose "project_state_#{state_name}"
end
end
When /^I edit project "([^"]*)" and mark the project as reviewed$/ do |project_name|
project = @current_user.projects.where(:name => project_name).first
expect(project).to_not be_nil
open_project_edit_form(project)
click_link "reviewed_project_#{project.id}"
end
When /^I edit project settings and mark the project as reviewed$/ do
open_project_edit_form(@project)
click_link "reviewed_project_#{@project.id}"
end
When /^I add a note "([^"]*)" to the project$/ do |note_body|
submit_button = "div.widgets button#submit_note"
click_link "Add a note"
expect(page).to have_css submit_button
fill_in "note[body]", :with => note_body
elem = find(submit_button)
expect(elem).to_not be_nil
elem.click
expect(page).to_not have_css(submit_button, visible: true)
end
When /^I click on the first note icon$/ do
expect(@project).to_not be_nil
@note = @project.notes.first # assume first note is also first on screen
expect(@note).to_not be_nil
click_link "link_note_#{@note.id}"
end
When /^I cancel adding a note to the project$/ do
click_link "Add a note"
fill_in "note[body]", :with => "will not save this"
click_link "neg_edit_form_note"
end
Then /^I edit the default tags to "([^"]*)"$/ do |default_tags|
edit_project(@project) do
fill_in "project[default_tags]", :with => default_tags
end
end
Then /^I should be able to change the project name in place$/ do
# Note that this is not changing the project name
expect(page).to have_css("span#project_name>form>input")
page.find("span#project_name > form > button[type=cancel]").click
expect(page).to_not have_css("span#project_name>form>input")
end
Then /^I should not be able to change the project name in place$/ do
step "I click to edit the project name in place"
expect(page).to_not have_xpath("//span[@id='project_name']/form/input")
end
Then /^the form for adding a note should not be visible$/ do
expect(page).to_not have_css("edit_form_note")
end
Then /^I should go to that note page$/ do
current_path = URI.parse(current_url).path
note_path = note_path(@note)
expect(current_path).to eq(note_path)
end
Then /^I should see one note in the project$/ do
expect(page).to have_xpath("//div[@class='note_wrapper']")
end
Then /^I should see the bold text "([^\"]*)" in the project description$/ do |text_in_bold|
xpath="//div[@class='project_description']/p/strong"
expect(page).to have_xpath(xpath)
bold_text = page.find(:xpath, xpath).text
expect(bold_text).to match(/#{text_in_bold}/)
end
Then /^I should see the italic text "([^\"]*)" in the project description$/ do |text_in_italic|
xpath="//div[@class='project_description']/p/em"
expect(page).to have_xpath(xpath)
italic_text = page.find(:xpath, xpath).text
expect(italic_text).to match(/#{text_in_italic}/)
end
Then /^the project title should be "(.*)"$/ do |title|
expect(page).to have_css("h2#project_name_container span#project_name", text: title, exact: true)
end
Then /^I should see the project name is "([^"]*)"$/ do |project_name|
step "the project title should be \"#{project_name}\""
end
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"
expect(page).to have_css("div.project_settings")
elem = page.find("div.project_settings")
if visible == "see"
expect(elem).to be_visible
expect(elem.text).to match(/#{default_settings}/)
else
expect(elem).to_not be_visible
end
end
Then /^I should have a project called "([^"]*)"$/ do |project_name|
project = @current_user.projects.where(:name => project_name).first
expect(project).to_not be_nil
end
Then /^I should have (\d+) todos? in project "([^"]*)"$/ do |todo_count, project_name|
project = @current_user.projects.where(:name => project_name).first
expect(project).to_not be_nil
expect(project.todos.count).to eq(todo_count.to_i)
end

View file

@ -1,109 +0,0 @@
Given /^I have a recurrence pattern called "([^"]*)"$/ do |pattern_name|
context = @current_user.contexts.first
@recurring_todo = @current_user.recurring_todos.create!(
:description => pattern_name,
:context_id => context.id,
:state => 'active',
:start_from => Time.now - 1.day,
:ends_on => 'no_end_date',
:target => 'due_date',
:recurring_period => 'daily',
:every_other1 => 1,
:show_always => 1,
:created_at => Time.now - 1.day,
:completed_at => nil
)
expect(@recurring_todo.completed?).to be false
@todo = @current_user.todos.create!(
:description => pattern_name,
:context_id => context.id,
:recurring_todo_id => @recurring_todo.id)
end
Given /^I have a completed recurrence pattern "([^"]*)"$/ do |pattern_name|
step "I have a recurrence pattern called \"#{pattern_name}\""
@recurring_todo.toggle_completion!
expect(@recurring_todo.completed?).to be true
end
Given /^I have (\d+) completed recurrence patterns$/ do |number_of_patterns|
1.upto number_of_patterns.to_i do |i|
step "I have a completed recurrence pattern \"Recurring Todo #{i}\""
end
end
When /^I select "([^\"]*)" recurrence pattern$/ do |recurrence_period|
page.find("#recurring_todo_recurring_period_#{recurrence_period.downcase}").click
end
When /^I edit the name of the pattern "([^\"]*)" to "([^\"]*)"$/ do |pattern_name, new_name|
pattern = @current_user.recurring_todos.where(:description => pattern_name).first
expect(pattern).to_not be_nil
click_link "link_edit_recurring_todo_#{pattern.id}"
expect(page).to have_css("input#edit_recurring_todo_description")
fill_in "edit_recurring_todo_description", :with => new_name
page.find("button#recurring_todo_edit_update_button").click
expect(page).to_not have_css("div#edit-recurring-todo", :visible => true)
end
When /^I star the pattern "([^\"]*)"$/ do |pattern_name|
pattern = @current_user.recurring_todos.where(:description => pattern_name).first
expect(pattern).to_not be_nil
click_link "star_icon_#{pattern.id}"
end
When /^I delete the pattern "([^"]*)"$/ do |pattern_name|
pattern = @current_user.recurring_todos.where(:description => pattern_name).first
expect(pattern).to_not be_nil
handle_js_confirm do
click_link "delete_icon_#{pattern.id}"
end
expect(get_confirm_text).to eq("Are you sure that you want to delete the recurring action '#{pattern_name}'?")
expect(page).to_not have_css("#delete_icon_#{pattern.id}")
end
When /^I mark the pattern "([^"]*)" as (complete|active)$/ do |pattern_name, state|
pattern = @current_user.recurring_todos.where(:description => pattern_name).first
expect(pattern).to_not be_nil
expect(pattern.completed?).to be (state != "complete")
page.find("#check_#{pattern.id}").click
wait_for_ajax
wait_for_animations_to_end
end
When /^I follow the recurring todo link of "([^"]*)"$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
page.find(:xpath, "//div[@id='todo_#{todo.id}']//a[@class='recurring_icon']/img").click
sleep 1 # wait for page to load
end
Then /^the state list "([^"]*)" should be empty$/ do |state|
empty_id = "recurring-todos-empty-nd" if state.downcase == "active"
empty_id = "completed-empty-nd" if state.downcase == "completed"
empty_msg = page.find("div##{empty_id}")
expect(empty_msg.visible?).to be true
end
Then /^the pattern "([^\"]*)" should be starred$/ do |pattern_name|
pattern = @current_user.recurring_todos.where(:description => pattern_name).first
expect(pattern).to_not be_nil
expect(page).to have_xpath("//div[@id='recurring_todo_#{pattern.id}']//img[@class='todo_star starred']")
end
Then /^I should see the form for "([^\"]*)" recurrence pattern$/ do |recurrence_period|
expect(page).to have_css("#recurring_#{recurrence_period.downcase}", :visible => true)
end
Then /^the pattern "([^"]*)" should be in the state list "([^"]*)"$/ do |pattern_name, state_name|
pattern = @current_user.recurring_todos.where(:description => pattern_name).first
expect(pattern).to_not be_nil
expect(page).to have_xpath("//div[@id='#{state_name}_recurring_todos_container']//div[@id='recurring_todo_#{pattern.id}']")
end

View file

@ -1,4 +0,0 @@
When /^I search for "([^"]*)"$/ do |search_arg|
fill_in "search", :with => search_arg
click_button "Search"
end

View file

@ -1,15 +0,0 @@
Then /^the single action form should be visible$/ do
expect(page).to have_css("#todo_new_action", :visible => true)
end
Then /^the single action form should not be visible$/ do
expect(page).to_not have_css("#todo_new_action", :visible=>true)
end
Then /^the multiple action form should be visible$/ do
expect(page).to have_css("#todo_multi_add", :visible => true)
end
Then /^the multiple action form should not be visible$/ do
expect(page).to_not have_css("#todo_multi_add", :visible=>true)
end

View file

@ -1,17 +0,0 @@
Given /^public signups are turned (.*)$/ do |state|
case state
when 'on'
SITE_CONFIG['open_signups'] = true
when 'off'
SITE_CONFIG['open_signups'] = false
else
raise "public signups should be either 'on' or 'off'"
end
end
When /^I submit the signup form with username "([^\"]*)", password "([^\"]*)" and confirm with "([^\"]*)"$/ do |username, password, confirm|
fill_in 'Desired login', :with => username
fill_in 'Choose password', :with => password
fill_in 'Confirm password', :with => confirm
click_button "Signup"
end

View file

@ -1,18 +0,0 @@
When /^I click on the chart for actions done in the last 12 months$/ do
# cannot really click the chart which is a swf
visit stats_path + "/actions_done_last_years"
end
Then /^I should see a chart$/ do
expect(page).to have_css("div.open-flash-chart")
end
When /^I click on the chart for running time of all incomplete actions$/ do
# cannot really click the chart which is a swf
visit stats_path + "/show_selected_actions_from_chart/art?index=0"
end
When /^I click on the chart for running time of all incomplete visible actions$/ do
# cannot really click the chart which is a swf
visit stats_path + "/show_selected_actions_from_chart/avrt?index=0"
end

View file

@ -1,369 +0,0 @@
Given /^I have no todos$/ do
Todo.delete_all
end
Given /^I have a todo "([^"]*)" in the context "([^"]*)"$/ do |description, context_name|
context = @current_user.contexts.where(:name => context_name).first_or_create
@todo = @current_user.todos.create!(:context_id => context.id, :description => description)
end
Given /^I have a todo "([^"]*)" in context "([^"]*)" with tags "([^"]*)"$/ do |description, context_name, tag_names|
step "I have a todo \"#{description}\" in the context \"#{context_name}\""
@todo.tag_with(tag_names)
@todo.save!
end
Given(/^I have a todo "([^"]*)" in the context "([^"]*)" in the project "([^"]*)"$/) do |description, context_name, project_name|
step "I have a todo \"#{description}\" in the context \"#{context_name}\""
@project = @current_user.projects.where(:name => project_name).first_or_create
expect(@project).to_not be_nil
@todo.project = @project
@todo.save!
end
Given /^I have a todo "([^"]*)" in the context "([^"]*)" which is due tomorrow$/ do |description, context_name|
context = @current_user.contexts.where(:name => context_name).first_or_create
@todo = @current_user.todos.create!(:context_id => context.id, :description => description)
@todo.due = @todo.created_at + 1.day
@todo.save!
end
Given /^I have (\d+) todos in project "([^"]*)" in context "([^"]*)" with tags "([^"]*)" prefixed by "([^"]*)"$/ do |number_of_todos, project_name, context_name, tag_names, prefix|
@context = find_context(context_name)
@project = find_project(project_name)
@todos = []
number_of_todos.to_i.downto 1 do |i|
todo = @current_user.todos.create!(:context_id => @context.id, :description => "#{prefix}todo #{i}", :project_id => @project.id)
todo.tag_with(tag_names)
todo.save!
@todos << todo
end
end
Given /^I have (\d+) todos in project "([^"]*)" in context "([^"]*)" with tags "([^"]*)"$/ do |number_of_todos, project_name, context_name, tag_names|
step "I have #{number_of_todos} todos in project \"#{project_name}\" in context \"#{context_name}\" with tags \"#{tag_names}\" prefixed by \"\""
end
Given /^I have a todo "([^"]*)"$/ do |description|
step "I have a todo \"#{description}\" in the context \"Context A\""
end
Given /^I have the following todos:$/ do |table|
table.hashes.each do | todo |
step "I have a todo \"#{todo[:description]}\" in the context \"#{todo[:context]}\""
end
end
Given /^I have a todo "([^"]*)" with notes "([^"]*)"$/ do |description, notes|
step "I have a todo \"#{description}\" in the context \"Context A\""
@todo.notes = notes
@todo.save!
end
Given /^I have ([0-9]+) todos$/ do |count|
count.to_i.downto 1 do |i|
step "I have a todo \"todo #{i}\" in the context \"Context A\""
end
end
Given /^I have a todo with description "([^"]*)" in project "([^"]*)" with tags "([^"]*)" in the context "([^"]*)"$/ do |action_description, project_name, tags, context_name|
@context = @current_user.contexts.where(:name => context_name).first_or_create
@project = @current_user.projects.where(:name => project_name).first_or_create
@todo = @current_user.todos.create!(:context_id => @context.id, :project_id => @project.id, :description => action_description)
@todo.tag_with(tags)
@todo.save
end
Given /^I have a todo with description "([^"]*)" in project "([^"]*)" with tags "([^"]*)" in the context "([^"]*)" that is due next week$/ do |action_description, project_name, tags, context_name|
step "I have a todo with description \"#{action_description}\" in project \"#{project_name}\" with tags \"#{tags}\" in the context \"#{context_name}\""
@todo.due = UserTime.new(@current_user).time + 1.week
@todo.save!
end
Given(/^I have a todo "(.*?)" in context "(.*?)" in project "(.*?)" with tags "(.*?)"$/) do |action_description, context_name, project_name, tags|
step "I have a todo with description \"#{action_description}\" in project \"#{project_name}\" with tags \"#{tags}\" in the context \"#{context_name}\""
end
###### DEFERRED TODOS #######
Given /^I have ([0-9]+) deferred todos$/ do |count|
context = @current_user.contexts.create!(:name => "context B")
count.to_i.downto 1 do |i|
todo = @current_user.todos.create!(:context_id => context.id, :description => "todo #{i}")
todo.show_from = UserTime.new(@current_user).time + 1.week
todo.save!
end
end
Given /^I have a deferred todo "([^"]*)" in the context "([^"]*)"$/ do |description, context_name|
step "I have a deferred todo \"#{description}\" in the context \"#{context_name}\" deferred by 7 days"
end
Given /^I have a (?:deferred )todo "([^"]*)" in the context "([^"]*)" deferred by (\d+) day(?:s)?$/ do |description, context_name, deferred_by_days|
context = @current_user.contexts.where(:name => context_name).first_or_create
todo = @current_user.todos.create!(:context_id => context.id, :description => description)
todo.show_from = UserTime.new(@current_user).time + deferred_by_days.to_i.day
todo.save!
end
Given /^I have a deferred todo "([^"]*)"$/ do |description|
step "I have a deferred todo \"#{description}\" in the context \"context B\""
end
Given /^I have a deferred todo "([^"]*)" in context "([^"]*)" with tags "([^"]*)"$/ do |action_description, context_name, tag_list|
step "I have a todo \"#{action_description}\" in context \"#{context_name}\" with tags \"#{tag_list}\""
@todo.show_from = UserTime.new(@current_user).time + 1.week
@todo.save!
end
Given(/^I have a deferred todo "(.*?)" in the context "(.*?)" in the project "(.*?)"$/) do |action_description, context_name, project_name|
step "I have a todo \"#{action_description}\" in the context \"#{context_name}\" in the project \"#{project_name}\""
@todo.show_from = UserTime.new(@current_user).time + 1.week
@todo.save!
end
####### COMPLETED TODOS #######
Given /^I have ([0-9]+) completed todos in project "([^"]*)" in context "([^"]*)"$/ do |count, project_name, context_name|
@context = find_context(context_name)
@project = find_project(project_name)
@todos = []
count.to_i.downto 1 do |i|
@todo = @current_user.todos.create!(:context_id => @context.id, :description => "todo #{i}", :project_id => @project.id)
@todo.complete!
@todos << @todo
end
end
Given /^I have a completed todo "([^"]*)" in project "([^"]*)" in context "([^"]*)"$/ do |action_description, project_name, context_name|
step "I have 1 completed todos in project \"#{project_name}\" in context \"#{context_name}\""
@todos[0].description = action_description
@todos[0].save!
end
Given /^I have (\d+) completed todos in project "([^"]*)" in context "([^"]*)" with tags "([^"]*)"$/ do |count, project_name, context_name, tags|
step "I have #{count} completed todos in project \"#{project_name}\" in context \"#{context_name}\""
@todos.each { |t| t.tag_with(tags); t.save! }
end
Given(/^I have ([0-9]+) completed todos in context "([^"]*)"$/) do |count, context_name|
context = find_context(context_name)
count.to_i.downto 1 do |i|
todo = @current_user.todos.create!(:context_id => context.id, :description => "todo #{i}")
todo.complete!
end
end
Given /^I have ([0-9]+) completed todos$/ do |count|
step "I have a context called \"context D\""
step "I have #{count} completed todos in context \"context D\""
end
Given /^I have ([0-9]+) completed todos with a note$/ do |count|
step "I have #{count} completed todos"
@todos.each { |t| t.notes = "note #{t.id}"; t.save!}
end
Given /^I have ([0-9]+) completed todos with a note in project "([^"]*)" in context "([^"]*)" with tags "([^"]*)"$/ do |count, project_name, context_name, tags|
step "I have #{count} completed todos in project \"#{project_name}\" in context \"#{context_name}\" with tags \"#{tags}\""
@todos.each { |t| t.notes = "note #{t.id}"; t.save! }
end
Given /^I have a completed todo with description "([^"]*)" in project "([^"]*)" with tags "([^"]*)" in the context "([^"]*)"$/ do |action_description, project_name, tags, context_name|
step "I have a todo with description \"#{action_description}\" in project \"#{project_name}\" with tags \"#{tags}\" in the context \"#{context_name}\""
@todo.complete!
end
Given(/^I have a completed todo with description "([^"]*)" in context "(.*?)" completed (\d+) days ago$/) do |action_description, context_name, num_of_days|
step "I have a todo \"#{action_description}\" in the context \"#{context_name}\""
@todo.complete!
@todo.completed_at = Time.zone.now - num_of_days.to_i.days
@todo.save!
@todo.reload
end
####### PROJECT WITH 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}\""
expect(@project).to_not be_nil
todos.hashes.each do |todo|
new_todo = @current_user.todos.create!(
:description => todo[:description],
:context_id => find_context(todo[:context]).id,
:project_id => @project.id,
:notes => todo[:notes])
new_todo.show_from = Time.zone.now+1.week if kind_of_todo=="deferred todos"
new_todo.tag_with(todo[:tags]) unless todo[:tags].nil?
new_todo.complete! if !todo[:completed].nil? && todo[:completed] == 'yes'
new_todo.save!
end
end
####### submitting using sidebar form #######
When /^I submit a new action with description "([^"]*)"$/ do |description|
within "form#todo-form-new-action" do
fill_in "todo[description]", :with => description
end
submit_next_action_form
end
When /^I submit a new action with description "([^"]*)" in the project "(.*?)"$/ do |description, project_name|
within "form#todo-form-new-action" do
fill_in "todo[description]", :with => description
fill_in "project_name", :with => project_name
end
submit_next_action_form
end
When(/^I submit a new action with description "([^"]*)" to project "([^"]*)" with tags "([^"]*)"$/) do |description, project_name, tags|
within "form#todo-form-new-action" do
fill_in "todo[description]", :with => description
fill_in "project_name", :with => project_name
fill_in "tag_list", :with => tags
end
submit_next_action_form
end
When /^I submit a new action with description "([^"]*)" with a dependency on "([^"]*)"$/ do |todo_description, predecessor_description|
predecessor = find_todo(predecessor_description)
within "form#todo-form-new-action" do
fill_in "todo[description]", :with => todo_description
fill_in "predecessor_input", :with => predecessor_description
end
wait_for_auto_complete
click_first_line_of_auto_complete
new_dependency_line = "//li[@id='pred_#{predecessor.id}']"
expect(page).to have_xpath(new_dependency_line, :visible => true)
submit_next_action_form
end
When /^I submit a new action with description "([^"]*)" and the tags "([^"]*)" in the context "([^"]*)"$/ do |description, tags, context_name|
within "form#todo-form-new-action" do
fill_in "todo[description]", :with => description
fill_in "tag_list", :with => tags
# fill_in does not seem to work when the field is prefilled with something. Empty the field first
clear_context_name_from_next_action_form
fill_in "todo_context_name", :with => context_name
end
submit_next_action_form
end
When /^I submit a new action with description "([^"]*)" to project "([^"]*)" with tags "([^"]*)" in the context "([^"]*)"$/ do |description, project_name, tags, context_name|
within "form#todo-form-new-action" do
fill_in "todo[description]", :with => description
clear_project_name_from_next_action_form
clear_context_name_from_next_action_form
fill_in "todo_project_name", :with => project_name
fill_in "todo_context_name", :with => context_name
fill_in "tag_list", :with => tags
end
submit_next_action_form
end
When /^I submit a new action with description "([^"]*)" to project "([^"]*)" in the context "([^"]*)"$/ do |description, project_name, context_name|
step "I submit a new action with description \"#{description}\" to project \"#{project_name}\" with tags \"\" in the context \"#{context_name}\""
end
When /^I submit a new action with description "([^"]*)" in the context "([^"]*)"$/ do |description, context_name|
within "form#todo-form-new-action" do
fill_in "todo[description]", :with => description
clear_context_name_from_next_action_form
fill_in "todo_context_name", :with => context_name
end
submit_next_action_form
end
####### submitting using sidebar form: DEFERRED #######
When(/^I submit a new deferred action with description "([^"]*)"$/) do |description|
fill_in "todo[description]", :with => description
fill_in "todo[show_from]", :with => format_date(UserTime.new(@current_user).time + 1.week)
submit_next_action_form
end
When /^I submit a new deferred action with description "([^"]*)" and the tags "([^"]*)" in the context "([^"]*)"$/ do |description, tags, context_name|
within "form#todo-form-new-action" do
fill_in "todo[description]", :with => description
clear_context_name_from_next_action_form
fill_in "todo_context_name", :with => context_name
fill_in "tag_list", :with => tags
fill_in "todo[show_from]", :with => format_date(UserTime.new(@current_user).time + 1.week)
end
submit_next_action_form
end
When(/^I submit a new deferred action with description "([^"]*)" to project "(.*?)" with tags "([^"]*)"$/) do |description, project_name, tags|
within "form#todo-form-new-action" do
fill_in "todo[description]", :with => description
fill_in "todo_project_name", :with => project_name
fill_in "tag_list", :with => tags
fill_in "todo[show_from]", :with => format_date(UserTime.new(@current_user).time + 1.week)
end
submit_next_action_form
end
When /^I submit a new deferred action with description "([^"]*)" to project "([^"]*)" with tags "([^"]*)" in the context "([^"]*)"$/ do |description, project_name, tags, context_name|
fill_in "todo[description]", :with => description
clear_project_name_from_next_action_form
clear_context_name_from_next_action_form
within "form#todo-form-new-action" do
fill_in "todo_project_name", :with => project_name
fill_in "todo_context_name", :with => context_name
fill_in "tag_list", :with => tags
fill_in "todo[show_from]", :with => format_date(UserTime.new(@current_user).time + 1.week)
end
submit_next_action_form
end
When /^I submit a deferred new action with description "([^"]*)" to project "([^"]*)" in the context "([^"]*)"$/ do |description, project_name, context_name|
step "I submit a new deferred action with description \"#{description}\" to project \"#{project_name}\" with tags \"\" in the context \"#{context_name}\""
end
####### submitting using sidebar form: MULTIPLE ACTIONS #######
When /^I submit multiple actions with using$/ do |multiple_actions|
fill_in "todo[multiple_todos]", :with => multiple_actions
submit_multiple_next_action_form
end
When /^I fill the multiple actions form with "([^"]*)", "([^"]*)", "([^"]*)", "([^"]*)"$/ do |descriptions, project_name, context_name, tags|
fill_in "todo[multiple_todos]", :with => descriptions
fill_in "multi_todo_project_name", :with => project_name
fill_in "multi_todo_context_name", :with => context_name
fill_in "multi_tag_list", :with => tags
end
When /^I submit the new multiple actions form with "([^"]*)", "([^"]*)", "([^"]*)", "([^"]*)"$/ do |descriptions, project_name, context_name, tags|
step "I fill the multiple actions form with \"#{descriptions}\", \"#{project_name}\", \"#{context_name}\", \"#{tags}\""
submit_multiple_next_action_form
end
When /^I submit the new multiple actions form with$/ do |multi_line_descriptions|
fill_in "todo[multiple_todos]", :with => multi_line_descriptions
submit_multiple_next_action_form
end

View file

@ -1,210 +0,0 @@
####### MARK (UN)COMPLETE #######
When /^I mark "([^"]*)" as complete$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
check "mark_complete_#{todo.id}"
wait_for_ajax
wait_for_animations_to_end
end
When /^I mark "([^"]*)" as uncompleted$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
uncheck "mark_complete_#{todo.id}"
wait_for_ajax
wait_for_animations_to_end
end
When /^I mark the completed todo "([^"]*)" active$/ do |action_description|
step "I mark \"#{action_description}\" as uncompleted"
wait_for_ajax
wait_for_animations_to_end
end
####### (UN)STARRING #######
When /^I star the action "([^"]*)"$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
xpath_unstarred = "//div[@id='line_todo_#{todo.id}']//img[@class='todo_star']"
xpath_starred = "//div[@id='line_todo_#{todo.id}']//img[@class='todo_star starred']"
expect(page).to have_xpath(xpath_unstarred)
star_img = "//img[@id='star_img_#{todo.id}']"
page.find(:xpath, star_img).click
wait_for_ajax
wait_for_animations_to_end
expect(page).to have_xpath(xpath_starred)
end
When /^I unstar the action "([^"]*)"$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
xpath_unstarred = "//div[@id='line_todo_#{todo.id}']//img[@class='todo_star']"
xpath_starred = "//div[@id='line_todo_#{todo.id}']//img[@class='todo_star starred']"
expect(page).to have_xpath(xpath_starred)
star_img = "//img[@id='star_img_#{todo.id}']"
page.find(:xpath, star_img).click
expect(page).to have_xpath(xpath_unstarred)
end
####### Editing a todo using Edit Form #######
When /I change the (.*) field of "([^\"]*)" to "([^\"]*)"$/ do |field_name, todo_name, new_value|
todo = find_todo(todo_name)
open_edit_form_for(todo)
within "form.edit_todo_form" do
fill_in "#{field_name}", :with => new_value
# force blur event
execute_javascript("$('form.edit_todo_form input.#{field_name}_todo_#{todo.id}').blur();")
sleep 0.10
end
submit_edit_todo_form(todo)
wait_for_ajax
end
When /^I edit the context of "([^"]*)" to "([^"]*)"$/ do |todo_name, context_new_name|
step "I change the context_name field of \"#{todo_name}\" to \"#{context_new_name}\""
end
When /^I edit the project of "([^"]*)" to "([^"]*)"$/ do |todo_name, project_new_name|
step "I change the project_name field of \"#{todo_name}\" to \"#{project_new_name}\""
end
When /^I edit the description of "([^"]*)" to "([^"]*)"$/ do |action_description, new_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
open_edit_form_for(todo)
within "form.edit_todo_form" do
fill_in "todo_description", :with => new_description
end
submit_edit_todo_form(todo)
end
When /^I try to edit the description of "([^"]*)" to "([^"]*)"$/ do |action_description, new_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
open_edit_form_for(todo)
within "form.edit_todo_form" do
fill_in "todo_description", :with => new_description
end
submit_button_xpath = "//div[@id='edit_todo_#{todo.id}']//button[@id='submit_todo_#{todo.id}']"
page.find(:xpath, submit_button_xpath).click
wait_for_ajax
# do not wait for form to disappear to be able to test failures
end
When /^I edit the due date of "([^"]*)" to "([^"]*)"$/ do |action_description, date|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
open_edit_form_for(todo)
fill_in "due_todo_#{todo.id}", :with => date
close_datepicker
submit_edit_todo_form(todo)
end
When /^I edit the due date of "([^"]*)" to tomorrow$/ do |action_description|
date = format_date(Time.zone.now + 1.day)
step "I edit the due date of \"#{action_description}\" to \"#{date}\""
end
When /^I edit the due date of "([^"]*)" to next month$/ do |action_description|
date = format_date(Time.zone.now + 1.month)
step "I edit the due date of \"#{action_description}\" to \"#{date}\""
end
When /^I clear the due date of "([^"]*)"$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
open_edit_form_for(todo)
# use all()[0] to get the first todo. This is for calendar page where you can have
# de same todo more than once
within all("div#edit_todo_#{todo.id}")[0] do
find("a#due_x_todo_#{todo.id}").click
expect(page).to have_field("due_todo_#{todo.id}", with: "")
end
submit_edit_todo_form(todo)
end
When /^I edit the show from date of "([^"]*)" to next month$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
open_edit_form_for(todo)
fill_in "show_from_todo_#{todo.id}", :with => format_date(todo.created_at + 1.month)
submit_edit_todo_form(todo)
end
When /^I remove the show from date from "([^"]*)"$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
open_edit_form_for(todo)
page.find(:xpath, "//div[@id='edit_todo_#{todo.id}']//a[@id='show_from_x_todo_#{todo.id}']/img").click
submit_edit_todo_form(todo)
end
When /^I clear the show from date of "([^"]*)"$/ do |action_description|
step "I remove the show from date from \"#{action_description}\""
end
When /^I defer "([^"]*)" for 1 day$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
open_submenu_for(todo) do
click_link "defer_1_todo_#{todo.id}"
end
wait_for_ajax
wait_for_animations_to_end
end
When /^I edit the tags of "([^"]*)" to "([^"]*)"$/ do |action_description, tags|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
open_edit_form_for(todo)
within "form#form_todo_#{todo.id}" do
fill_in "tag_list", :with => tags
end
submit_edit_todo_form(todo)
end
When /^I make a project of "([^"]*)"$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
open_submenu_for(todo) do
click_link "to_project_todo_#{todo.id}"
end
expect(page).to have_no_css("div#line_todo_#{todo.id}")
wait_for_ajax
wait_for_animations_to_end
end
####### THEN #######
Then /^I should see an error message$/ do
error_block = "//form/div[@id='edit_error_status']"
expect(page).to have_xpath(error_block)
end

View file

@ -1,167 +0,0 @@
When /^I select the second page$/ do
step "I follow \"2\" within \"div.paginate_header\""
end
####### DELETE #######
When /^I delete the action "([^"]*)"$/ do |action_description|
todo = find_todo(action_description)
handle_js_confirm do
open_submenu_for(todo) do
click_link "delete_todo_#{todo.id}"
end
end
expect(get_confirm_text).to eq("Are you sure that you want to delete the action '#{todo.description}'?")
wait_for_ajax
end
When /^I delete the todo "([^"]*)"$/ do |action_description|
step "I delete the action \"#{action_description}\""
end
####### Notes #######
When /^I open the notes of "([^"]*)"$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
page.find(:xpath, "//div[@id='line_todo_#{todo.id}']/div/a/img").click
expect(page).to have_xpath("//div[@id='notes_todo_#{todo.id}']", :visible=>true)
end
####### THEN #######
Then /^I should see a starred "([^"]*)"$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
xpath_starred = "//div[@id='line_todo_#{todo.id}']//img[@class='todo_star starred']"
expect(page).to have_xpath(xpath_starred)
end
Then /^I should see an unstarred "([^"]*)"$/ do |action_description|
todo = @current_user.todos.where(:description => action_description).first
expect(todo).to_not be_nil
xpath_starred = "//div[@id='line_todo_#{todo.id}']//img[@class='todo_star']"
expect(page).to have_xpath(xpath_starred)
end
Then /^I should see ([0-9]+) todos$/ do |count|
total = page.all("div.item-container").inject(0) { |s, e| s+=1 }
expect(total).to eq(count.to_i)
end
Then /^I should see the todo "([^\"]*)"$/ do |todo_description|
expect(page).to have_xpath("//span[.=\"#{todo_description}\"]", :visible => true)
end
Then /^I should not see the todo "([^\"]*)"$/ do |todo_description|
expect(page).to_not have_xpath("//span[.=\"#{todo_description}\"]", :visible => true)
end
Then /^I should see a completed todo "([^"]*)"$/ do |todo_description|
todo = @current_user.todos.where(:description => todo_description).first
expect(todo).to_not be_nil
# only completed todos have a grey span with the completed_at date
xpath = "//div[@id='line_todo_#{todo.id}']/div/span[@class='grey']"
expect(page).to have_xpath(xpath, :visible=>true)
end
Then /^I should see an active todo "([^"]*)"$/ do |todo_description|
todo = @current_user.todos.where(:description => todo_description).first
expect(todo).to_not be_nil
expect(page).to have_css("div#line_todo_#{todo.id} img.grip", :visible=>true)
end
Then /^the number of actions should be (\d+)$/ do |count|
expect(@current_user.todos.count).to eq(count.to_i)
end
Then /^a confirmation for adding a new context "([^"]*)" should be asked$/ do |context_name|
expect(get_confirm_text).to eq("New context '#{context_name}' will be also created. Are you sure?")
end
Then /^the selected project should be "([^"]*)"$/ do |content|
# Works for mobile. TODO: make it work for both mobile and non-mobile
if content.blank?
expect(page.has_css?("select#todo_project_id option[selected='selected']")).to be false
else
expect(page.find("select#todo_project_id option[selected='selected']").text).to match(/#{content}/)
end
end
Then /^the selected context should be "([^"]*)"$/ do |content|
# Works for mobile. TODO: make it work for both mobile and non-mobile
if content.blank?
expect(page.has_css?("select#todo_context_id option[selected='selected']")).to be false
else
expect(page.find("select#todo_context_id option[selected='selected']").text).to match(/#{content}/)
end
end
Then /^I should see the page selector$/ do
expect(page).to have_xpath(".//a[@class='next_page']")
end
Then /^the page should be "([^"]*)"$/ do |page_number|
expect(page.find(:xpath, ".//div[@class='paginate_header']//em[@class='current']").text).to eq(page_number)
end
Then /^the project field of the new todo form should contain "([^"]*)"$/ do |project_name|
xpath= "//form[@id='todo-form-new-action']/input[@id='todo_project_name']"
expect(page.find(:xpath, xpath).value).to eq(project_name)
end
Then /^the context field of the new todo form should contain "([^"]*)"$/ do |context_name|
xpath= "//form[@id='todo-form-new-action']/input[@id='todo_context_name']"
expect(page.find(:xpath, xpath).value).to eq(context_name)
end
Then /^the default context of the new todo form should be "([^"]*)"$/ do |context_name|
xpath= "//form[@id='todo-form-new-action']/input[@id='todo_context_name']"
expect(context_name).to eq(page.find(:xpath, xpath).value)
end
Then /^the tag field in the new todo form should be empty$/ do
xpath= "//form[@id='todo-form-new-action']/input[@id='tag_list']"
expect(page.find(:xpath, xpath).value).to be_blank
end
Then /^the tag field in the new todo form should be "([^"]*)"$/ do |tag_list|
xpath= "//form[@id='todo-form-new-action']/input[@id='tag_list']"
expect(tag_list).to eq(page.find(:xpath, xpath).value)
end
Then /^the tags of "([^"]*)" should be "([^"]*)"$/ do |todo_description, tag_list|
expect(find_todo(todo_description).tag_list).to eq(tag_list)
end
Then /^I should see "([^"]*)" in the completed section of the mobile site$/ do |desc|
todo = @current_user.todos.where(:description => desc).first
expect(todo).to_not be_nil
xpath = "//div[@id='completed_container']//a[@href='/todos/#{todo.id}.m']"
expect(page).to have_xpath(xpath)
end
Then /^I should (see|not see) the notes of "([^"]*)"$/ do |visible, todo_description|
todo = @current_user.todos.where(:description => todo_description).first
expect(todo).to_not be_nil
expect(page.find("div#notes_todo_#{todo.id}")).send(visible=="see" ? :to : :to_not, be_visible)
end
Then /^I should (see|not see) the empty tickler message$/ do |see|
elem = find("div#no_todos_in_view")
expect(elem).send(see=="see" ? :to : :to_not, be_visible)
end
Then /^I should see the todo "([^"]*)" with project name "([^"]*)"$/ do |todo_description, project_name|
todo = @current_user.todos.where(:description => todo_description).first
expect(todo.project.name).to eq(project_name)
end

View file

@ -1,41 +0,0 @@
Given /^the following user records?$/ do |table|
User.delete_all
table.hashes.each do |hash|
user = FactoryGirl.create(:user, hash)
user.create_preference({:locale => 'en'})
end
end
Given("no users exists") do
User.delete_all
end
When(/^I change my password to "([^"]*)"$/) do |password|
step 'I should be on the change password page'
fill_in "user[password]", :with => password
fill_in "user[password_confirmation]", :with => password
click_button "Change password"
end
When /^I delete the user "([^\"]*)"$/ do |username|
# click "//tr[@id='user-3']//img"
# assert_confirmation "Warning: this will delete user 'john', all their actions, contexts, project and notes. Are you sure that you want to continue?"
user = User.where(:login => username).first
expect(user).to_not be_nil
handle_js_confirm do
page.find(:xpath, "//tr[@id='user-#{user.id}']//img").click
end
expect(get_confirm_text).to eq("Warning: this will delete user '#{user.login}', all their actions, contexts, project and notes. Are you sure that you want to continue?")
expect(page).to_not have_css("tr#user-#{user.id}")
end
Then /^I should see that a user named "([^\"]*)" is not present$/ do |username|
step "I should not see \"#{username} (\""
end
Then "I should be an admin" do
# just check on the presence of the menu item for managing users
step "I should see \"Manage users\""
end

View file

@ -1,185 +0,0 @@
# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
# It is recommended to regenerate this file in the future when you upgrade to a
# newer version of cucumber-rails. Consider adding your own code to a new file
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
# files.
require 'uri'
require 'cgi'
require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths"))
module WithinHelpers
def with_scope(locator)
locator ? within(locator) { yield } : yield
end
end
World(WithinHelpers)
Given /^(?:|I )am on (.+)$/ do |page_name|
visit path_to(page_name)
end
When /^(?:|I )go to (.+)$/ do |page_name|
visit path_to(page_name)
end
When /^(?:|I )press "([^"]*)"(?: within "([^"]*)")?$/ do |button, selector|
with_scope(selector) do
click_button(button)
end
end
When /^(?:|I )follow "([^"]*)"(?: within "([^"]*)")?$/ do |link, selector|
with_scope(selector) do
click_link(link)
end
end
When /^(?:|I )fill in "([^"]*)" with "([^"]*)"(?: within "([^"]*)")?$/ do |field, value, selector|
with_scope(selector) do
fill_in(field, :with => value)
end
end
When /^(?:|I )fill in "([^"]*)" for "([^"]*)"(?: within "([^"]*)")?$/ do |value, field, selector|
with_scope(selector) do
fill_in(field, :with => value)
end
end
# Use this to fill in an entire form with data from a table. Example:
#
# When I fill in the following:
# | Account Number | 5002 |
# | Expiry date | 2009-11-01 |
# | Note | Nice guy |
# | Wants Email? | |
#
# TODO: Add support for checkbox, select og option
# based on naming conventions.
#
When /^(?:|I )fill in the following(?: within "([^"]*)")?:$/ do |selector, fields|
with_scope(selector) do
fields.rows_hash.each do |name, value|
When %{I fill in "#{name}" with "#{value}"}
end
end
end
When /^(?:|I )select "([^"]*)" from "([^"]*)"(?: within "([^"]*)")?$/ do |value, field, selector|
with_scope(selector) do
select(value, :from => field)
end
end
When /^(?:|I )check "([^"]*)"(?: within "([^"]*)")?$/ do |field, selector|
with_scope(selector) do
check(field)
end
end
When /^(?:|I )uncheck "([^"]*)"(?: within "([^"]*)")?$/ do |field, selector|
with_scope(selector) do
uncheck(field)
end
end
When /^(?:|I )choose "([^"]*)"(?: within "([^"]*)")?$/ do |field, selector|
with_scope(selector) do
choose(field)
end
end
When /^(?:|I )attach the file "([^"]*)" to "([^"]*)"(?: within "([^"]*)")?$/ do |path, field, selector|
with_scope(selector) do
attach_file(field, path)
end
end
Then /^(?:|I )should see JSON:$/ do |expected_json|
require 'json'
expected = JSON.pretty_generate(JSON.parse(expected_json))
actual = JSON.pretty_generate(JSON.parse(response.body))
expect(expected).to eq(actual)
end
Then /^(?:|I )should see "([^"]*)"(?: within "([^"]*)")?$/ do |text, selector|
with_scope(selector) do
expect(page).to have_content(text)
end
end
Then /^(?:|I )should see "([^"]*)" before "([^"]*)"$/ do |earlier_content, later_content|
expect(page).to have_content(earlier_content)
expect(page).to have_content(later_content)
expect(page.body.index(earlier_content)).to be < page.body.index(later_content)
end
Then /^(?:|I )should see \/([^\/]*)\/(?: within "([^"]*)")?$/ do |regexp, selector|
regexp = Regexp.new(regexp)
with_scope(selector) do
expect(page).to have_xpath('//*', :text => regexp)
end
end
Then /^(?:|I )should not see "([^"]*)"(?: within "([^"]*)")?$/ do |text, selector|
with_scope(selector) do
expect(page).to have_no_content(text)
end
end
Then /^(?:|I )should not see \/([^\/]*)\/(?: within "([^"]*)")?$/ do |regexp, selector|
regexp = Regexp.new(regexp)
with_scope(selector) do
expect(page).to have_no_xpath('//*', :text => regexp)
end
end
Then /^the "([^"]*)" field(?: within "([^"]*)")? should contain "([^"]*)"$/ do |field, selector, value|
with_scope(selector) do
field = find_field(field)
field_value = (field.tag_name == 'textarea') ? field.text : field.value
expect(field_value).to match(/#{value}/)
end
end
Then /^the "([^"]*)" field(?: within "([^"]*)")? should not contain "([^"]*)"$/ do |field, selector, value|
with_scope(selector) do
field = find_field(field)
field_value = (field.tag_name == 'textarea') ? field.text : field.value
expect(field_value).to_not match(/#{value}/)
end
end
Then /^the "([^"]*)" checkbox(?: within "([^"]*)")? should be checked$/ do |label, selector|
with_scope(selector) do
field_checked = find_field(label)['checked']
expect(field_checked).to be true
end
end
Then /^the "([^"]*)" checkbox(?: within "([^"]*)")? should not be checked$/ do |label, selector|
with_scope(selector) do
field_checked = find_field(label)['checked']
expect(field_checked).to be false
end
end
Then /^(?:|I )should be on (.+)$/ do |page_name|
current_path = URI.parse(current_url).path
expect(current_path).to eq(path_to(page_name))
end
Then /^(?:|I )should have the following query string:$/ do |expected_pairs|
query = URI.parse(current_url).query
actual_params = query ? CGI.parse(query) : {}
expected_params = {}
expected_pairs.rows_hash.each_pair{|k,v| expected_params[k] = v.split(',')}
expect(actual_params).to eq(expected_params)
end
Then /^show me the page$/ do
save_and_open_page
end

View file

@ -1,59 +0,0 @@
# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
# It is recommended to regenerate this file in the future when you upgrade to a
# newer version of cucumber-rails. Consider adding your own code to a new file
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
# files.
require 'cucumber/rails'
require 'aruba/cucumber'
# Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In
# order to ease the transition to Capybara we set the default here. If you'd
# prefer to use XPath just remove this line and adjust any selectors in your
# steps to use the XPath syntax.
Capybara.default_selector = :css
# By default, any exception happening in your Rails application will bubble up
# to Cucumber so that your scenario will fail. This is a different from how
# your application behaves in the production environment, where an error page will
# be rendered instead.
#
# Sometimes we want to override this default behaviour and allow Rails to rescue
# exceptions and display an error page (just like when the app is running in production).
# Typical scenarios where you want to do this is when you test your error pages.
# There are two ways to allow Rails to rescue exceptions:
#
# 1) Tag your scenario (or feature) with @allow-rescue
#
# 2) Set the value below to true. Beware that doing this globally is not
# recommended as it will mask a lot of errors for you!
#
ActionController::Base.allow_rescue = false
# Remove/comment out the lines below if your app doesn't have a database.
# For some databases (like MongoDB and CouchDB) you may need to use :truncation instead.
begin
DatabaseCleaner.strategy = :transaction
rescue NameError
raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
end
# You may also want to configure DatabaseCleaner to use different strategies for certain features and scenarios.
# See the DatabaseCleaner documentation for details. Example:
#
# Before('@no-txn,@selenium,@culerity,@celerity,@javascript') do
# # { :except => [:widgets] } may not do what you expect here
# # as Cucumber::Rails::Database.javascript_strategy overrides
# # this setting.
# DatabaseCleaner.strategy = :truncation
# end
#
# Before('~@no-txn', '~@selenium', '~@culerity', '~@celerity', '~@javascript') do
# DatabaseCleaner.strategy = :transaction
# end
#
# Possible values are :truncation and :transaction
# The :transaction strategy is faster, but might give you threading problems.
# See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature
Cucumber::Rails::Database.javascript_strategy = :truncation

View file

@ -1,23 +0,0 @@
FactoryGirl.define do
factory :user do
sequence(:login) { |n| "testuser#{n}" }
password "secret"
password_confirmation { |user| user.password }
is_admin false
end
factory :context do
sequence(:name) { |n| "testcontext#{n}" }
hide false
created_at Time.now.utc
end
factory :project do
sequence(:name) { |n| "testproject#{n}" }
end
factory :todo do
sequence(:description) { |n| "testtodo#{n}" }
association :context
end
end

View file

@ -1,9 +0,0 @@
AfterStep('@pause') do
print "Press Return to continue..."
STDIN.getc
end
Before('@aruba') do
@aruba_timeout_seconds = 10
# print "\nsetting timeout for aruba to #{@aruba_timeout_seconds}\n"
end

View file

@ -1,2 +0,0 @@
# require 'factory_girl'
# Dir.glob(File.join(File.dirname(__FILE__), 'factories/*.rb')).each {|f| require f }

View file

@ -1,141 +0,0 @@
module NavigationHelpers
# Maps a name to a path. Used by the
#
# When /^I go to (.+)$/ do |page_name|
#
# step definition in web_steps.rb
#
def path_to(page_name)
options = {}
options[:format] = :m if @mobile_interface
options[:locale] = @locale if @locale
options[:_group_view_by] = @group_view_by if @group_view_by
@source_view = nil
case page_name
when /the home\s?page/
@source_view = "todos"
root_path(options)
when /the done page/
@source_view = "done"
done_overview_path(options)
when /the done actions page for context "([^"]*)"/i
@source_view = "done"
context = @current_user.contexts.where(:name => $1).first
done_todos_context_path(context, options)
when /the done actions page for project "([^"]*)"/i
@source_view = "done"
project = @current_user.projects.where(:name => $1).first
done_todos_project_path(project, options)
when /the done actions page for tag "([^"]*)"/i
@source_view = "done"
done_tag_path($1, options)
when /the done actions page/
@source_view = "done"
done_todos_path(options)
when /the all done actions page for context "([^"]*)"/i
@source_view = "done"
context = @current_user.contexts.where(:name => $1).first
all_done_todos_context_path(context, options)
when /the all done actions page for project "([^"]*)"/i
@source_view = "done"
project = @current_user.projects.where(:name => $1).first
all_done_todos_project_path(project, options)
when /the all done actions page for tag "([^"]*)"/i
@source_view = "done"
all_done_tag_path($1, options)
when /the all done actions page/
@source_view = "done"
all_done_todos_path(options)
when /the statistics page/
@source_view = "stats"
stats_path(options)
when /the signup page/
signup_path(options)
when /the login page/
login_path(options)
when /the logout page/
logout_path(options)
when /the notes page/
notes_path(options)
when /the calendar page/
calendar_path(options)
when /the review page/
@source_view = "review"
review_path(options)
when /the contexts page/
@source_view = "context"
contexts_path(options)
when /the projects page/
@source_view = "project"
projects_path(options)
when /the manage users page/
users_path(options)
when /the recurring todos page/
recurring_todos_path(options)
when /the integrations page/
integrations_path(options)
when /the tickler page/
@source_view = "deferred"
tickler_path(options)
when /the export page/
data_path(options)
when /the preference page/
preferences_path(options)
when /the rest api docs page/
rest_api_docs_path(options)
when /the search page/
search_path(options)
when /the starred page/
tag_path("starred", options)
when /the feeds page/
feeds_path(options)
when /the context page for "([^\"]*)" for user "([^\"]*)"/i
@source_view = "context"
@context = User.where(:login => $2).first.contexts.where(:name => $1).first
context_path(@context, options)
when /the context page for "([^\"]*)"/i
@source_view = "context"
@context = @current_user.contexts.where(:name => $1).first
context_path(@context, options)
when /the "([^\"]*)" context/i
@source_view = "context"
@context = @current_user.contexts.where(:name => $1).first
context_path(@context, options)
when /the "([^\"]*)" project for user "([^\"]*)"/i
@source_view = "project"
@project = User.where(:login => $2).first.projects.where(:name => $1).first
project_path(@project, options)
when /the "([^\"]*)" project/i
@source_view = "project"
@project = @current_user.projects.where(:name => $1).first
project_path(@project, options)
when /the tag page for "([^"]*)"/i
@source_view = "tag"
tag_path($1, options)
when /the change password page/
change_password_user_path @current_user
# Add more mappings here.
# Here is an example that pulls values out of the Regexp:
#
# when /^(.*)'s profile page$/i
# user_profile_path(User.where(:login => $1))first.
else
begin
page_name =~ /the (.*) page/
path_components = $1.split(/\s+/)
self.send(path_components.push('path').join('_').to_sym)
rescue Object => e
raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
"Now, go and add a mapping in #{__FILE__}"
end
end
end
end
World(NavigationHelpers)

View file

@ -1,28 +0,0 @@
# commented out because aruba 0.5 conflics
# require 'aruba/cucumber'
require 'capybara/rails'
require 'capybara/cucumber'
require 'capybara/session'
# BUG in this version of cucumber/capybara: require 'cucumber/rails/capybara_javascript_emulation' # Lets you click links with onclick javascript handlers without using @culerity or @javascript
Capybara.default_wait_time = 5
Capybara.javascript_driver = ENV["JS_DRIVER"] ? ENV["JS_DRIVER"].to_sym : :selenium
Capybara.ignore_hidden_elements = false # make find(css) find hidden elements
if Capybara.javascript_driver == :webkit
# require 'capybara/webkit'
end
if Capybara.javascript_driver == :selenium
profile = Selenium::WebDriver::Firefox::Profile.new
profile['intl.accept_languages'] = 'en'
capabilities = Selenium::WebDriver::Remote::Capabilities.firefox
capabilities['elementScrollBehavior'] = 1
Capybara.register_driver :selenium_english do |app|
Capybara::Selenium::Driver.new(app, browser: :firefox, profile: profile, desired_capabilities: capabilities)
end
Capybara.javascript_driver = :selenium_english
end

View file

@ -1,117 +0,0 @@
module TracksFormHelper
def open_edit_form_for(todo)
edit_link = "div#line_todo_#{todo.id} a#icon_edit_todo_#{todo.id}"
# make sure we can open the edit form
expect(page).to have_css(edit_link)
# on calendar page there can be more than 1 occurance of a todo, so we select the first here
all(:css, edit_link)[0].click
wait_for_ajax
wait_for_animations_to_end
end
def open_context_edit_form(context)
# open edit form
page.find("a#link_edit_context_#{context.id}").click
# wait for the form to appear (which included a submit button)
expect(page).to have_css("button#submit_context_#{context.id}", :visible=>true)
end
def submit_form(form_xpath, button_name)
handle_js_confirm do
# on calendar page there can be more than 1 occurance of a todo, so we select the first here
within all(:xpath, form_xpath)[0] do
click_button(button_name)
end
wait_for_ajax
wait_for_animations_to_end
end
end
def submit_multiple_next_action_form
submit_form("//form[@id='todo-form-multi-new-action']", "todo_multi_new_action_submit")
end
def submit_next_action_form
submit_form("//form[@id='todo-form-new-action']", "todo_new_action_submit")
end
def submit_new_context_form
submit_form("//form[@id='context-form']", "context_new_submit")
end
def submit_new_project_form
submit_form("//form[@id='project_form']", "project_new_project_submit")
end
def submit_edit_todo_form (todo)
submit_form("//div[@id='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)
expect(page).to_not have_content("button#submit_todo_#{todo.id}")
end
def wait_for_context_form_to_appear(context)
expect(page).to have_css("button#submit_context_#{context.id}", :visible=>true)
end
def wait_for_context_form_to_go_away(context)
# wait for the form to go away
expect(page).to_not have_css("button#submit_context_#{context.id}", :visible => true)
# wait for the changed context to appear
expect(page).to have_css("a#link_edit_context_#{context.id}", :visible=> true)
end
def open_project_edit_form(project)
click_link "link_edit_project_#{project.id}"
expect(page).to have_css("button#submit_project_#{project.id}")
end
def submit_project_edit_form(project)
page.find("button#submit_project_#{project.id}").click
end
def edit_project_no_wait(project)
open_project_edit_form(project)
yield
submit_project_edit_form(project)
end
def edit_project(project)
open_project_edit_form(project)
within "form#edit_form_project_#{project.id}" do
yield
end
submit_project_edit_form(project)
wait_for_ajax
wait_for_animations_to_end
expect(page).to_not have_css("button#submit_project_#{project.id}", :visible => true)
end
def edit_project_settings(project)
edit_project(project) do
yield
end
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 close_datepicker
within '.ui-datepicker' do
click_button 'Done'
end
end
end

View file

@ -1,47 +0,0 @@
module TracksIdHelper
def toggle_context_container_xpath(context)
"//a[@id='toggle_c#{context.id}']"
end
def toggle_project_container_xpath(project)
"//a[@id='toggle_p#{project.id}']"
end
def context_container_xpath(context)
"//div[@id='c#{context.id}']"
end
def project_container_xpath(project)
id = project.nil? ? "without_project_container" : "p#{project.id}"
"//div[@id='#{id}']"
end
def deferred_container_xpath
"//div[@id='deferred_pending_container']"
end
def todo_line_xpath(todo)
"//div[@id='line_todo_#{todo.id}']"
end
def todo_in_container_xpath(todo, container_type)
id = "//div[@id=\"wrong\"]"
id = context_container_xpath(todo.context) if container_type == :context
id = project_container_xpath(todo.project) if container_type == :project
return "#{id}//div[@id='line_todo_#{todo.id}']"
end
def todo_in_context_container_xpath(todo, context)
"#{context_container_xpath(context)}#{todo_line_xpath(todo)}"
end
def todo_in_project_container_xpath(todo, project)
"#{project_container_xpath(project)}#{todo_line_xpath(todo)}"
end
def todo_in_deferred_container_xpath(todo)
"#{deferred_container_xpath}#{todo_line_xpath(todo)}"
end
end

View file

@ -1,52 +0,0 @@
class SessionBackdoorController < ::ApplicationController
skip_before_filter :login_required
def create
session['user_id'] = params[:user_id]
user = User.find(params[:user_id])
set_current_user(user)
user.remember_me
cookies[:auth_token] = { :value => user.remember_token, :expires => user.remember_token_expires_at }
redirect_to root_path
end
def expire_session
current_user.forget_me if logged_in?
cookies.delete :auth_token
session['user_id'] = nil
reset_session
session['expiry_time'] = Time.now
respond_to do |format|
format.html { render :text => "Session expired for test purposes"}
format.js { render :text => "" }
end
end
end
module TracksLoginHelper
begin
_routes = Rails.application.routes
_routes.disable_clear_and_finalize = true
_routes.clear!
Rails.application.routes_reloader.paths.each{ |path| load(path) }
_routes.draw do
# here you can add any route you want
get "/test_login_backdoor", to: "session_backdoor#create"
get "login/expire_session", to: "session_backdoor#expire_session"
end
ActiveSupport.on_load(:action_controller) { _routes.finalize! }
ensure
_routes.disable_clear_and_finalize = false
end
def request_signin_as(user)
visit "/test_login_backdoor?user_id=#{user.id}"
end
def signin_as(user)
session[:user_id] = user.id
@current_user = user
end
end

View file

@ -1,131 +0,0 @@
module TracksStepHelper
def wait_until(wait_time = Capybara.default_wait_time)
Timeout.timeout(wait_time) do
loop until yield
end
end
def wait_for_animations_to_end
wait_until do
page.evaluate_script('$(":animated").length').zero?
end
end
def wait_for_ajax
wait_until do
page.evaluate_script('jQuery.active').zero?
end
end
def wait_for_auto_complete
expect(page).to have_css("ul.ui-autocomplete li.ui-state-focus", :visible => true)
end
def click_first_line_of_auto_complete
page.find(:css, "ul.ui-autocomplete li.ui-state-focus").click
end
def check_xpath_visibility(visible, xpath)
expect(page).send( (visible=="see" ? :to : :to_not), have_xpath(xpath, :visible => true))
end
def check_css_visibility(visible, css)
expect(page).send( (visible=="see" ? :to : :to_not), have_css(css, :visible => true))
end
def check_elem_visibility(visible, elem)
expect(elem).send( (visible=="see" ? :to : :to_not), be_visible)
end
def find_todo(description)
todo = @current_user.todos.where(:description => description).first
expect(todo).to_not be_nil
return todo
end
def find_context(context_name)
context = @current_user.contexts.where(:name => context_name).first
expect(context).to_not be_nil
return context
end
def find_project(project_name)
project = @current_user.projects.where(:name => project_name).first
expect(project).to_not be_nil
return project
end
def container_list_find_index(container, object)
div_id = "#{container}_#{object.id}"
containers = page.all("div.#{container}").map { |x| x[:id] }
return containers.find_index(div_id)
end
def context_list_find_index(context_name)
return container_list_find_index(:context, find_context(context_name))
end
def project_list_find_index(project_name)
return container_list_find_index(:project, find_project(project_name))
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 context_drag_and_drop(drag_id, delta)
sortable_css = "div.ui-sortable div#container_context_#{drag_id}"
execute_javascript("$('#{sortable_css}').simulateDragSortable({move: #{delta}, handle: '.grip'});")
end
def open_view_menu
view_menu = '#menu_view_link + ul.dropdown-menu'
# click menu
view_menu_link = "#menu_view_link"
expect(page).to have_css(view_menu_link, :visible => true)
page.find(view_menu_link).click
# wait for menu to be visible
view_menu_item = "#menu_view_toggle_contexts"
expect(page).to have_css(view_menu_item)
within view_menu do
yield
end
end
def open_submenu_for(todo)
wait_for_animations_to_end
submenu_css = "#ultodo_#{todo.id}"
execute_javascript "$('#{submenu_css}').parent().showSuperfishUl()"
expect(page).to have_css(submenu_css, visible: true)
submenu = page.first(submenu_css, visible: true)
within submenu do
yield
end
end
def handle_js_confirm(accept=true)
execute_javascript "window.original_confirm_function = window.confirm"
execute_javascript "window.confirmMsg = null"
execute_javascript "window.confirm = function(msg) { window.confirmMsg = msg; return #{!!accept}; }"
yield
ensure
execute_javascript "window.confirm = window.original_confirm_function"
end
def get_confirm_text
page.evaluate_script "window.confirmMsg"
end
def execute_javascript(js)
page.execute_script(js)
end
end

View file

@ -1,4 +0,0 @@
World(TracksLoginHelper)
World(TracksStepHelper)
World(TracksFormHelper)
World(TracksIdHelper)

View file

@ -1,92 +0,0 @@
Feature: Tagging todos
In order to organise my todos in various lists
As a Tracks user
I want to to be able to add or edit one or more tags to todos
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
And I have a context called "@pc"
And I have a project called "hacking tracks"
Scenario: If there are no todos with a tag, the tag page should show an empty message
When I go to the tag page for "starred"
Then I should see "Currently there are no incomplete actions with the tag 'starred'"
@javascript
Scenario: I can remove a tag from a todo from the tag view and the todo will be removed
Given I have a todo "fix tests" in context "@pc" with tags "now"
When I go to the tag page for "now"
Then I should see the todo "fix tests"
When I edit the tags of "fix tests" to "later"
Then I should not see the todo "fix tests"
@javascript
Scenario: I can add a new todo from tag view with that tag and it will be added to the page
When I go to the tag page for "tracks"
And I submit a new action with description "prepare release" and the tags "tracks, release" in the context "@pc"
Then I should see "prepare release" in the context container for "@pc"
@javascript
Scenario: I can add a new todo from tag view with a different tag and it will not be added to the page
When I go to the tag page for "tracks"
And I submit a new action with description "prepare release" and the tags "release, next" in the context "@pc"
Then I should not see the todo "prepare release"
@javascript
Scenario: I can move a tagged todo in tag view to a hidden project and it will move the todo on the page to the hidden container
Given I have a hidden project called "secret"
When I go to the tag page for "tracks"
And I submit a new action with description "prepare release" to project "hacking tracks" with tags "release, tracks" in the context "@pc"
Then I should see "prepare release" in the context container for "@pc"
When I edit the project of "prepare release" to "secret"
Then I should not see "prepare release" in the context container for "@pc"
And I should see "prepare release" in the hidden container
@javascript
Scenario: I can move a tagged todo in tag view to a hidden context and it will move the todo on the page to the hidden container
Given I have a hidden context called "@secret"
When I go to the tag page for "tracks"
And I submit a new action with description "prepare release" and the tags "release, tracks" in the context "@pc"
Then I should see "prepare release" in the context container for "@pc"
When I edit the context of "prepare release" to "@secret"
Then I should not see "prepare release" in the context container for "@pc"
Then I should see "prepare release" in the hidden container
@javascript
Scenario: Completing the last todo from the tag view will show the empty message
Given I have a todo "migrate old scripts" in context "@pc" with tags "starred"
When I go to the tag page for "starred"
Then I should see "migrate old scripts" in the context container for "@pc"
When I mark "migrate old scripts" as complete
Then I should not see the context container for "@pc"
And I should see "Currently there are no incomplete actions with the tag 'starred'"
@javascript
Scenario: Setting default tags for a project will prefill new todo form for that project
When I go to the "hacking tracks" project
Then the tag field in the new todo form should be empty
And I edit the default tags to "tests"
Then the tag field in the new todo form should be "tests"
# also the tag field should be prefilled after reload
When I go to the "hacking tracks" project
Then the tag field in the new todo form should be "tests"
# and the tag field should be prefilled after submitting a new todo
When I submit a new action with description "are my tags prefilled"
Then the tags of "are my tags prefilled" should be "tests"
@javascript
Scenario: Selecting a project with default tags when editing a todo will prefill the tags field
Given I have a todo "tag me" in the context "@pc"
And the default tags for "hacking tracks" are "TagA, TagB"
When I go to the "@pc" context
And I edit the project of "tag me" to "hacking tracks"
Then the tags of "tag me" should be "taga, tagb"
@javascript
Scenario: If there are todos for a tag, when viewing the tag's page, the Tags field for new todos should be defaulted to that tag
Given I have a todo "migrate old scripts" in context "@pc" with tags "starred"
When I go to the tag page for "starred"
Then the tag field in the new todo form should be "starred"

View file

@ -1,109 +0,0 @@
Feature: Manage deferred todos
In order to hide todos that require attention in the future and not now
As a Tracks user
I want to defer these and manage them in a tickler
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And there exists a project "manage me" for user "testuser"
And I have logged in as "testuser" with password "secret"
@javascript
Scenario Outline: I can add a deferred todo and it will show in the tickler
# also adding the first deferred todo will hide the empty message
Given I have a context called "test"
And I have selected the view for group by <grouping>
When I go to the tickler page
Then I should see the empty tickler message
When I submit a new deferred action with description "a new next action"
Then I should see "a new next action"
And I should not see the empty tickler message
Scenarios:
| grouping |
| context |
| project |
@javascript
Scenario Outline: Editing the description of a todo in the tickler updated the todo
Given I have a deferred todo "not yet now"
And I have selected the view for group by <grouping>
When I go to the tickler page
Then I should see "not yet now"
When I edit the description of "not yet now" to "almost"
Then I should not see "not yet now"
And I should see "almost"
Scenarios:
| grouping |
| context |
| project |
@javascript
Scenario Outline: Editing the container of a todo moves it to the new container
Given I have a context called "A"
And I have a context called "B"
And I have a project called "pA"
And I have a project called "pB"
And I have a deferred todo "not yet now" in the context "A" in the project "pA"
And I have selected the view for group by <grouping>
When I go to the tickler page
Then I should see "not yet now" in the <first container>
When I edit the <grouping> of "not yet now" to <new container name>
Then I should see "not yet now" in the <new container>
And I should not see "not yet now" in the <first container>
Scenarios:
| grouping | first container | new container name | new container |
| context | context container for "A" | "B" | context container for "B" |
| project | project container for "pA" | "pB" | project container for "pB" |
@javascript
Scenario Outline: Removing the show from date from a todo removes it from the tickler
Given I have a deferred todo "not yet now"
And I have selected the view for group by <grouping>
When I go to the tickler page
Then I should see "not yet now"
When I remove the show from date from "not yet now"
Then I should not see "not yet now"
And I should see the empty tickler message
When I go to the home page
Then I should see "not yet now"
Scenarios:
| grouping |
| context |
| project |
Scenario: Opening the tickler page shows me all deferred todos
Given I have a deferred todo "not yet now"
And I have a todo "now is a good time"
When I go to the tickler page
Then I should see "not yet now"
And I should not see "now is a good time"
@javascript
Scenario Outline: I can mark an action complete from the tickler
Given I have a deferred todo "not yet now"
And I have selected the view for group by <grouping>
When I go to the tickler page
And I mark "not yet now" as complete
Then I should not see "not yet now"
When I go to the done page
Then I should see "not yet now"
Scenarios:
| grouping |
| context |
| project |
Scenario: Opening the tickler page shows the deferred todos in order
Given I have a deferred todo "show tomorrow" in the context "Context B" deferred by 1 day
And I have a deferred todo "show in a year" in the context "Context B" deferred by 365 days
And I have a deferred todo "show in a week" in the context "Context B" deferred by 7 days
When I go to the tickler page
Then I should see "show tomorrow" before "show in a week"
And I should see "show tomorrow" before "show in a year"
And I should see "show in a week" before "show in a year"

View file

@ -1,113 +0,0 @@
Feature: Toggle the containers
In order to only see the todos relevant on this moment
As a Tracks user
I want to toggle the containers so the todos in that container (context or project) are not shown
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
@javascript
Scenario: I can toggle a context container
Given I have the following contexts
| context | hide |
| @ipad | false |
| @home | false |
| @boss | false |
And I have a project "collapse those contexts" that has the following todos
| description | context |
| test 1 | @ipad |
| test 2 | @home |
| test 3 | @boss |
When I go to the home page
Then I should see "test 1" in the context container for "@ipad"
And I should see "test 2" in the context container for "@home"
And I should see "test 3" in the context container for "@boss"
When I collapse the context container of "@ipad"
Then I should not see the todo "test 1"
And I should see "test 2" in the context container for "@home"
And I should see "test 3" in the context container for "@boss"
When I collapse the context container of "@home"
Then I should not see the todo "test 1"
And I should not see the todo "test 2"
And I should see "test 3" in the context container for "@boss"
When I collapse the context container of "@boss"
Then I should not see the todo "test 1"
And I should not see the todo "test 2"
And I should not see the todo "test 3"
@javascript
Scenario: I can toggle a project container
Given I have the following contexts
| context | hide |
| @ipad | false |
| @home | false |
| @boss | false |
And I have a project "collapse those containers" that has the following todos
| description | context |
| test 1 | @ipad |
| test 2 | @home |
| test 3 | @boss |
And I have selected the view for group by project
When I go to the home page
Then I should see "test 1" in the project container of "collapse those containers"
And I should see "test 2" in the project container of "collapse those containers"
And I should see "test 3" in the project container of "collapse those containers"
When I collapse the project container of "collapse those containers"
Then I should not see the todo "test 1"
And I should not see the todo "test 2"
And I should not see the todo "test 3"
@javascript
Scenario: I can hide all collapsed context containers
Given I have the following contexts
| context | hide |
| @ipad | false |
| @home | false |
| @boss | false |
And I have a project "collapse those contexts" that has the following todos
| description | context |
| test 1 | @ipad |
| test 2 | @home |
| test 3 | @boss |
When I go to the home page
Then I should see "test 1" in the context container for "@ipad"
And I should see "test 2" in the context container for "@home"
And I should see "test 3" in the context container for "@boss"
When I collapse the context container of "@home"
And I collapse the context container of "@boss"
And I collapse the context container of "@ipad"
Then I should not see the todo "test 1"
And I should not see the todo "test 2"
And I should not see the todo "test 3"
When I toggle all collapsed context containers
Then I should not see the context container for "@home"
And I should not see the context container for "@boss"
And I should not see the context container for "@ipad"
@javascript
Scenario: I can hide all collapsed project containers
Given I have the following contexts
| context | hide |
| @ipad | false |
And I have a project "collapse those containers" that has the following todos
| description | context |
| test 1 | @ipad |
And I have a project "collapse those other containers" that has the following todos
| description | context |
| test 2 | @ipad |
And I have selected the view for group by project
When I go to the home page
Then I should see "test 1" in the project container of "collapse those containers"
And I should see "test 2" in the project container of "collapse those other containers"
When I collapse the project container of "collapse those containers"
Then I should not see the todo "test 1"
And I should see the todo "test 2"
When I collapse the project container of "collapse those other containers"
Then I should not see the todo "test 1"
And I should not see the todo "test 2"
When I toggle all collapsed context containers
Then I should not see the project container for "collapse those containers"
Then I should not see the project container for "collapse those other containers"

View file

@ -1,246 +0,0 @@
Feature: Show done
In order to see what I have completed
As an user
I want to see my done todos
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
And I have a context called "@pc"
And I have a project called "test project"
And I have 1 completed todos in project "test project" in context "@pc" with tags "starred"
Scenario: Visit done overview page
When I go to the done page
Then I should see "Last Completed Actions"
And I should see "Last Completed Projects"
And I should see "Last Completed Recurring Actions"
Scenario Outline: Page with actions links to show all completed actions
When I go to the <page>
Then I should see "Completed actions"
And I should see "Show all"
When I follow "Show all"
Then I should be on the <next page>
Scenarios:
| page | next page |
| home page | done actions page |
| context page for "@pc" | done actions page for context "@pc" |
| "test project" project | done actions page for project "test project" |
| tag page for "starred" | done actions page for tag "starred" |
Scenario Outline: I can see all todos completed in the last timeperiod
When I go to the <page>
Then I should see "todo 1"
And I should see "Completed today"
And I should see "Completed in the rest of this week"
And I should see "Completed in the rest of this month"
Scenarios:
| page |
| done actions page |
| done actions page for context "@pc" |
| done actions page for project "test project" |
| done actions page for tag "starred" |
Scenario Outline: I can see all todos completed
When I go to the <page>
And I should see "You can see all completed actions here"
When I follow "here"
Then I should be on the <other page>
Scenarios:
| page | other page |
| done actions page | all done actions page |
| done actions page for project "test project" | all done actions page for project "test project" |
| done actions page for context "@pc" | all done actions page for context "@pc" |
| done actions page for tag "starred" | all done actions page for tag "starred" |
Scenario Outline: I can browse all todos completed by page
Given I have 50 completed todos with a note in project "test project" in context "@pc" with tags "starred"
When I go to the <page>
Then I should see the page selector
When I select the second page
Then I should be on the <page>
And the page should be "2"
Scenarios:
| page |
| all done actions page |
| all done actions page for project "test project" |
| all done actions page for context "@pc" |
| all done actions page for tag "starred" |
Scenario: The projects page shows a link to all completed projects
Given I have a completed project called "finished"
When I go to the projects page
Then I should see "finished"
And I should see "Show all"
When I follow "Show all"
Then I should be on the done projects page
And I should see "finished"
Scenario: I can browse all completed projects by page
Given I have 40 completed projects
When I go to the projects page
Then I should see "10 / 40"
When I follow "Show all"
Then I should see the page selector
And I should see "40 (1-20)"
When I select the second page
Then I should be on the done projects page
And the page should be "2"
Scenario: The recurring todos page shows a link to all completed recurring todos
Given I have a completed recurrence pattern "finished"
When I go to the recurring todos page
Then I should see "finished"
And I should see "Show all"
When I follow "Show all"
Then I should be on the done recurring todos page
And I should see "finished"
Scenario: I can browse all completed recurring todos by page
Given I have 40 completed recurrence patterns
When I go to the recurring todos page
And I follow "Show all"
Then I should see the page selector
And I should see "40 (1-20)"
When I select the second page
Then I should be on the done recurring todos page
And the page should be "2"
@javascript
Scenario: I can toggle a done recurring todo active from done page
Given I have a completed recurrence pattern "test pattern"
When I go to the done recurring todos page
Then I should see "test pattern"
When I mark the pattern "test pattern" as active
Then I should not see "test pattern" in the completed recurring todos container
When I go to the recurring todos page
Then I should see "test pattern" in the active recurring todos container
@javascript
Scenario: I can delete a recurring todo from the done page
Given I have a completed recurrence pattern "test pattern"
When I go to the done recurring todos page
Then I should see "test pattern"
When I delete the pattern "test pattern"
Then I should not see "test pattern" in the completed recurring todos container
When I go to the recurring todos page
Then I should not see "test pattern" in the active recurring todos container
@javascript
Scenario Outline: I can toggle a todo active from the done pages
When I go to the <page>
Then I should see the todo "todo 1"
When I mark the completed todo "todo 1" active
Then I should not see the todo "todo 1"
When I go to the <next page>
Then I should see "todo 1" <where>
Scenarios:
| page | next page | where |
| done actions page | home page | in the context container for "@pc" |
| all done actions page | home page | in the context container for "@pc" |
| done actions page for context "@pc" | context page for "@pc" | |
| done actions page for project "test project" | "test project" project | |
| done actions page for tag "starred" | home page | in the context container for "@pc" |
| all done actions page for context "@pc" | context page for "@pc" | |
| all done actions page for project "test project"| "test project" project | |
| all done actions page for tag "starred" | home page | in the context container for "@pc" |
@javascript
Scenario: Activating the last todo will show empty message
When I go to the done actions page
Then I should see "todo 1" in the done today container
When I mark the completed todo "todo 1" active
Then I should not see the todo "todo 1"
And I should see empty message for done today of done actions
@javascript
Scenario Outline: I can toggle the star of a todo from the done pages
When I go to the <page>
Then I should see a starred "todo 1"
When I unstar the action "todo 1"
Then I should see an unstarred "todo 1"
Scenarios:
| page |
| done actions page |
| all done actions page |
| done actions page for context "@pc" |
| done actions page for project "test project" |
| done actions page for tag "starred" |
| all done actions page for context "@pc" |
| all done actions page for project "test project"|
| all done actions page for tag "starred" |
@javascript
Scenario: I can edit a project to active from the project done page
Given I have a completed project called "completed project"
When I go to the done projects page
Then I should see "completed project"
When I edit the project state of "completed project" to "active"
Then I should not see the project "completed project"
When I go to the projects page
Then I should see "completed project"
Scenario Outline: All pages are internationalized
Given I set the locale to "<locale>"
When I go to the <page>
Then I should not see "translation missing"
Scenarios:
| page | locale |
| done actions page | en |
| all done actions page | en |
| done actions page for context "@pc" | en |
| done actions page for project "test project" | en |
| done actions page for tag "starred" | en |
| all done actions page for context "@pc" | en |
| all done actions page for project "test project"| en |
| all done actions page for tag "starred" | en |
| done actions page | nl |
| all done actions page | nl |
| done actions page for context "@pc" | nl |
| done actions page for project "test project" | nl |
| done actions page for tag "starred" | nl |
| all done actions page for context "@pc" | nl |
| all done actions page for project "test project"| nl |
| all done actions page for tag "starred" | nl |
| done actions page | de |
| all done actions page | de |
| done actions page for context "@pc" | de |
| done actions page for project "test project" | de |
| done actions page for tag "starred" | de |
| all done actions page for context "@pc" | de |
| all done actions page for project "test project"| de |
| all done actions page for tag "starred" | de |
| done actions page | es |
| all done actions page | es |
| done actions page for context "@pc" | es |
| done actions page for project "test project" | es |
| done actions page for tag "starred" | es |
| all done actions page for context "@pc" | es |
| all done actions page for project "test project"| es |
| all done actions page for tag "starred" | es |
| done actions page | fr |
| all done actions page | fr |
| done actions page for context "@pc" | fr |
| done actions page for project "test project" | fr |
| done actions page for tag "starred" | fr |
| all done actions page for context "@pc" | fr |
| all done actions page for project "test project"| fr |
| all done actions page for tag "starred" | fr |
| done actions page | cs |
| all done actions page | cs |
| done actions page for context "@pc" | cs |
| done actions page for project "test project" | cs |
| done actions page for tag "starred" | cs |
| all done actions page for context "@pc" | cs |
| all done actions page for project "test project"| cs |
| all done actions page for tag "starred" | cs |

View file

@ -1,65 +0,0 @@
# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
# It is recommended to regenerate this file in the future when you upgrade to a
# newer version of cucumber-rails. Consider adding your own code to a new file
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
# files.
unless ARGV.any? {|a| a =~ /^gems/} # Don't load anything when running the gems:* tasks
vendored_cucumber_bin = Dir["#{Rails.root}/vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
$LOAD_PATH.unshift(File.dirname(vendored_cucumber_bin) + '/../lib') unless vendored_cucumber_bin.nil?
begin
require 'cucumber/rake/task'
namespace :cucumber do
Cucumber::Rake::Task.new({:ok => 'test:prepare'}, 'Run features that should pass') do |t|
t.binary = vendored_cucumber_bin # If nil, the gem's binary is used.
t.fork = true # You may get faster startup if you set this to false
t.profile = 'default'
end
Cucumber::Rake::Task.new({:wip => 'test:prepare'}, 'Run features that are being worked on') do |t|
t.binary = vendored_cucumber_bin
t.fork = true # You may get faster startup if you set this to false
t.profile = 'wip'
end
Cucumber::Rake::Task.new({:rerun => 'test:prepare'}, 'Record failing features and run only them if any exist') do |t|
t.binary = vendored_cucumber_bin
t.fork = true # You may get faster startup if you set this to false
t.profile = 'rerun'
end
desc 'Run all features'
task :all => [:ok, :wip]
task :statsetup do
require 'rails/code_statistics'
::STATS_DIRECTORIES << %w(Cucumber\ features features) if File.exist?('features')
::CodeStatistics::TEST_TYPES << "Cucumber features" if File.exist?('features')
end
end
desc 'Alias for cucumber:ok'
task :cucumber => 'cucumber:ok'
task :default => :cucumber
task :features => :cucumber do
STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
end
# In case we don't have the generic Rails test:prepare hook, append a no-op task that we can depend upon.
task 'test:prepare' do
end
task :stats => 'cucumber:statsetup'
rescue LoadError
desc 'cucumber rake task not available (cucumber not installed)'
task :cucumber do
abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
end
end
end