add cucumber for integration testing and add a feature for statistics

refactor some stuff to support testing statistisc
This commit is contained in:
Reinier Balt 2009-04-13 22:26:20 +02:00
parent 058079a0a7
commit 43440eaf33
11 changed files with 286 additions and 5 deletions

View file

@ -8,12 +8,11 @@ Of those <%= @contexts.count(:conditions => ["hide = ?", false])%> are visible c
<%= @contexts.count(:conditions => ["hide = ?", true]) %> are hidden contexts
<% unless @actions.empty? -%>
<p>You have <%= @actions.count(:conditions => "completed_at IS NULL") %> incomplete actions of which
<%= @actions.count(:conditions => "completed_at IS NULL AND NOT show_from IS NULL") %> are
deferred actions. </p>
<p>You have <%= @actions.count(:conditions => "completed_at IS NULL") %> incomplete actions
of which <%= @actions.count(:conditions => "completed_at IS NULL AND NOT show_from IS NULL") %> are deferred actions. </p>
<p>Since your first action on <%= format_date(@first_action.created_at) %> you have
a total of <%= @actions.count %> actions.
<p>Since your first action on <%= format_date(@first_action.created_at) %>
you have a total of <%= @actions.count %> actions.
<%= @actions.count(:conditions => "NOT completed_at IS NULL") %> of these are completed.
<p>You have <%= @tags_count-%> tags placed on actions. Of those tags,

View file

@ -65,6 +65,7 @@ ActionController::Routing::Routes.draw do |map|
map.preferences 'preferences', :controller => 'preferences', :action => 'index'
map.integrations 'integrations', :controller => 'integrations', :action => 'index'
map.stats 'stats', :controller => 'stats', :action => 'index'
map.search_plugin '/integrations/search_plugin.xml', :controller => 'integrations', :action => 'search_plugin', :format => 'xml'
map.resources :recurring_todos,

View file

@ -0,0 +1,59 @@
Feature Show statistics
In order to see what I have got done
As an user
I want see my statistic
Scenario: Show statistics with no history
Given I am logged in
And 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 am logged in
And 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 am logged in
And 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 am logged in
And 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 am logged in
And 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 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"

View file

@ -0,0 +1,9 @@
Given /^I am logged in$/ do
@current_user = User.create!(:login => "testuser", :password => "secret", :password_confirmation => "secret")
@current_user.create_preference
visit login_path
fill_in "login", :with => "testuser"
fill_in "password", :with => "secret"
click_button "Sign in"
response.body.should =~ /Login successful/m
end

View file

@ -0,0 +1,13 @@
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
response.body.should =~ /open-flash-chart/m
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

View file

@ -0,0 +1,31 @@
Given /^I have no todos$/ do
Todo.delete_all
end
Given /^I have ([0-9]+) todos$/ do |count|
context = @current_user.contexts.create!(:name => "context A")
count.to_i.downto 1 do |i|
@current_user.todos.create!(:context_id => context.id, :description => "todo #{i}")
end
end
Given /^I have ([0-9]+) deferred todos$/ do |count|
context = @current_user.contexts.create!(:name => "context B")
count.to_i.downto 1 do |i|
@current_user.todos.create!(:context_id => context.id, :description => "todo #{i}", :show_from => @current_user.time + 1.week)
end
end
Given /^I have ([0-9]+) completed todos$/ do |count|
context = @current_user.contexts.create!(:name => "context C")
count.to_i.downto 1 do |i|
todo = @current_user.todos.create!(:context_id => context.id, :description => "todo #{i}")
todo.complete!
end
end
Then /^I should see ([0-9]+) todos$/ do |count|
count.to_i.downto 1 do |i|
match_xpath "div["
end
end

View file

@ -0,0 +1,107 @@
require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths"))
# Commonly used webrat steps
# http://github.com/brynary/webrat
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 "([^\"]*)"$/ do |button|
click_button(button)
end
When /^I follow "([^\"]*)"$/ do |link|
click_link(link)
end
When /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
fill_in(field, :with => value)
end
When /^I select "([^\"]*)" from "([^\"]*)"$/ do |value, field|
select(value, :from => field)
end
# Use this step in conjunction with Rail's datetime_select helper. For example:
# When I select "December 25, 2008 10:00" as the date and time
When /^I select "([^\"]*)" as the date and time$/ do |time|
select_datetime(time)
end
# Use this step when using multiple datetime_select helpers on a page or
# you want to specify which datetime to select. Given the following view:
# <%= f.label :preferred %><br />
# <%= f.datetime_select :preferred %>
# <%= f.label :alternative %><br />
# <%= f.datetime_select :alternative %>
# The following steps would fill out the form:
# When I select "November 23, 2004 11:20" as the "Preferred" data and time
# And I select "November 25, 2004 10:30" as the "Alternative" data and time
When /^I select "([^\"]*)" as the "([^\"]*)" date and time$/ do |datetime, datetime_label|
select_datetime(datetime, :from => datetime_label)
end
# Use this step in conjunction with Rail's time_select helper. For example:
# When I select "2:20PM" as the time
# Note: Rail's default time helper provides 24-hour time-- not 12 hour time. Webrat
# will convert the 2:20PM to 14:20 and then select it.
When /^I select "([^\"]*)" as the time$/ do |time|
select_time(time)
end
# Use this step when using multiple time_select helpers on a page or you want to
# specify the name of the time on the form. For example:
# When I select "7:30AM" as the "Gym" time
When /^I select "([^\"]*)" as the "([^\"]*)" time$/ do |time, time_label|
select_time(time, :from => time_label)
end
# Use this step in conjunction with Rail's date_select helper. For example:
# When I select "February 20, 1981" as the date
When /^I select "([^\"]*)" as the date$/ do |date|
select_date(date)
end
# Use this step when using multiple date_select helpers on one page or
# you want to specify the name of the date on the form. For example:
# When I select "April 26, 1982" as the "Date of Birth" date
When /^I select "([^\"]*)" as the "([^\"]*)" date$/ do |date, date_label|
select_date(date, :from => date_label)
end
When /^I check "([^\"]*)"$/ do |field|
check(field)
end
When /^I uncheck "([^\"]*)"$/ do |field|
uncheck(field)
end
When /^I choose "([^\"]*)"$/ do |field|
choose(field)
end
When /^I attach the file at "([^\"]*)" to "([^\"]*)"$/ do |path, field|
attach_file(field, path)
end
Then /^I should see "([^\"]*)"$/ do |text|
response.should contain(text)
end
Then /^I should not see "([^\"]*)"$/ do |text|
response.should_not contain(text)
end
Then /^the "([^\"]*)" checkbox should be checked$/ do |label|
field_labeled(label).should be_checked
end
Then /^I should be on (.+)$/ do |page_name|
URI.parse(current_url).path.should == path_to(page_name)
end

17
features/support/env.rb Normal file
View file

@ -0,0 +1,17 @@
# Sets up the Rails environment for Cucumber
ENV["RAILS_ENV"] ||= "test"
require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
require 'cucumber/rails/world'
require 'cucumber/formatter/unicode' # Comment out this line if you don't want Cucumber Unicode support
Cucumber::Rails.use_transactional_fixtures
Cucumber::Rails.bypass_rescue # Comment out this line if you want Rails own error handling
# (e.g. rescue_action_in_public / rescue_responses / rescue_from)
require 'webrat'
Webrat.configure do |config|
config.mode = :rails
end
require 'cucumber/rails/rspec'
require 'webrat/core/matchers'

22
features/support/paths.rb Normal file
View file

@ -0,0 +1,22 @@
module NavigationHelpers
def path_to(page_name)
case page_name
when /the homepage/
root_path
when /the statistics page/
stats_path
# Add more page name => path mappings here
else
raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
"Now, go and add a mapping in features/support/paths.rb"
end
end
end
World do |world|
world.extend NavigationHelpers
world
end

15
lib/tasks/cucumber.rake Normal file
View file

@ -0,0 +1,15 @@
$LOAD_PATH.unshift(RAILS_ROOT + '/vendor/plugins/cucumber/lib') if File.directory?(RAILS_ROOT + '/vendor/plugins/cucumber/lib')
begin
require 'cucumber/rake/task'
Cucumber::Rake::Task.new(:features) do |t|
t.cucumber_opts = "--format pretty"
end
task :features => 'db:test:prepare'
rescue LoadError
desc 'Cucumber rake task not available'
task :features do
abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
end
end

8
script/cucumber Normal file
View file

@ -0,0 +1,8 @@
#!/usr/bin/env ruby
begin
load File.expand_path(File.dirname(__FILE__) + "/../vendor/plugins/cucumber/bin/cucumber")
rescue LoadError => e
raise unless e.to_s =~ /cucumber/
require "rubygems"
load File.join(Gem.bindir, "cucumber")
end