fix regressions and use timecop to fix time in tests. Thanks Dan and Hans!

This commit is contained in:
Reinier Balt 2013-01-06 16:01:53 +01:00
parent 4b7bd1c414
commit 7eccf79ab6
7 changed files with 78 additions and 79 deletions

View file

@ -27,8 +27,7 @@ group :assets do
gem 'coffee-rails' gem 'coffee-rails'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes # See https://github.com/sstephenson/execjs#readme for more supported runtimes
gem 'therubyracer', :platform => :ruby gem 'therubyracer', :platform => :ruby, :require => "v8"
gem "libv8"
gem 'uglifier' gem 'uglifier'
end end
@ -58,6 +57,7 @@ group :test do
gem "database_cleaner" gem "database_cleaner"
gem "aruba" gem "aruba"
gem "simplecov" gem "simplecov"
gem "timecop"
# Note that > 2.14 has problems, see: # Note that > 2.14 has problems, see:
# https://code.google.com/p/selenium/issues/detail?id=3075 # https://code.google.com/p/selenium/issues/detail?id=3075

View file

@ -9,13 +9,13 @@ GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
RedCloth (4.2.9) RedCloth (4.2.9)
aasm (3.0.14) aasm (3.0.15)
actionmailer (3.2.9) actionmailer (3.2.10)
actionpack (= 3.2.9) actionpack (= 3.2.10)
mail (~> 2.4.4) mail (~> 2.4.4)
actionpack (3.2.9) actionpack (3.2.10)
activemodel (= 3.2.9) activemodel (= 3.2.10)
activesupport (= 3.2.9) activesupport (= 3.2.10)
builder (~> 3.0.0) builder (~> 3.0.0)
erubis (~> 2.7.0) erubis (~> 2.7.0)
journey (~> 1.0.4) journey (~> 1.0.4)
@ -23,18 +23,18 @@ GEM
rack-cache (~> 1.2) rack-cache (~> 1.2)
rack-test (~> 0.6.1) rack-test (~> 0.6.1)
sprockets (~> 2.2.1) sprockets (~> 2.2.1)
activemodel (3.2.9) activemodel (3.2.10)
activesupport (= 3.2.9) activesupport (= 3.2.10)
builder (~> 3.0.0) builder (~> 3.0.0)
activerecord (3.2.9) activerecord (3.2.10)
activemodel (= 3.2.9) activemodel (= 3.2.10)
activesupport (= 3.2.9) activesupport (= 3.2.10)
arel (~> 3.0.2) arel (~> 3.0.2)
tzinfo (~> 0.3.29) tzinfo (~> 0.3.29)
activeresource (3.2.9) activeresource (3.2.10)
activemodel (= 3.2.9) activemodel (= 3.2.10)
activesupport (= 3.2.9) activesupport (= 3.2.10)
activesupport (3.2.9) activesupport (3.2.10)
i18n (~> 0.6) i18n (~> 0.6)
multi_json (~> 1.0) multi_json (~> 1.0)
acts_as_list (0.1.9) acts_as_list (0.1.9)
@ -47,9 +47,9 @@ GEM
bcrypt-ruby (3.0.1) bcrypt-ruby (3.0.1)
bluecloth (2.2.0) bluecloth (2.2.0)
builder (3.0.4) builder (3.0.4)
bullet (4.2.0) bullet (4.3.0)
uniform_notifier uniform_notifier
capybara (2.0.1) capybara (2.0.2)
mime-types (>= 1.16) mime-types (>= 1.16)
nokogiri (>= 1.3.3) nokogiri (>= 1.3.3)
rack (>= 1.0.0) rack (>= 1.0.0)
@ -100,8 +100,8 @@ GEM
jquery-rails (2.1.4) jquery-rails (2.1.4)
railties (>= 3.0, < 5.0) railties (>= 3.0, < 5.0)
thor (>= 0.14, < 2.0) thor (>= 0.14, < 2.0)
json (1.7.5) json (1.7.6)
libv8 (3.11.8.4) libv8 (3.11.8.9)
libwebsocket (0.1.7.1) libwebsocket (0.1.7.1)
addressable addressable
websocket websocket
@ -126,19 +126,19 @@ GEM
rack rack
rack-test (0.6.2) rack-test (0.6.2)
rack (>= 1.0) rack (>= 1.0)
rails (3.2.9) rails (3.2.10)
actionmailer (= 3.2.9) actionmailer (= 3.2.10)
actionpack (= 3.2.9) actionpack (= 3.2.10)
activerecord (= 3.2.9) activerecord (= 3.2.10)
activeresource (= 3.2.9) activeresource (= 3.2.10)
activesupport (= 3.2.9) activesupport (= 3.2.10)
bundler (~> 1.0) bundler (~> 1.0)
railties (= 3.2.9) railties (= 3.2.10)
rails_autolink (1.0.9) rails_autolink (1.0.9)
rails (~> 3.1) rails (~> 3.1)
railties (3.2.9) railties (3.2.10)
actionpack (= 3.2.9) actionpack (= 3.2.10)
activesupport (= 3.2.9) activesupport (= 3.2.10)
rack-ssl (~> 1.3.2) rack-ssl (~> 1.3.2)
rake (>= 0.8.7) rake (>= 0.8.7)
rdoc (~> 3.4) rdoc (~> 3.4)
@ -152,7 +152,7 @@ GEM
rubyzip (0.9.9) rubyzip (0.9.9)
sanitize (2.0.3) sanitize (2.0.3)
nokogiri (>= 1.4.4, < 1.6) nokogiri (>= 1.4.4, < 1.6)
sass (3.2.4) sass (3.2.5)
sass-rails (3.2.5) sass-rails (3.2.5)
railties (~> 3.2.0) railties (~> 3.2.0)
sass (>= 3.1.10) sass (>= 3.1.10)
@ -175,10 +175,12 @@ GEM
swf_fu (2.0.3) swf_fu (2.0.3)
coffee-script coffee-script
rails (>= 3.1) rails (>= 3.1)
therubyracer (0.11.0) therubyracer (0.11.1)
libv8 (~> 3.11.8.7)
ref ref
thor (0.16.0) thor (0.16.0)
tilt (1.3.3) tilt (1.3.3)
timecop (0.5.7)
tolk (1.3.4) tolk (1.3.4)
will_paginate will_paginate
ya2yaml (~> 0.26) ya2yaml (~> 0.26)
@ -189,7 +191,7 @@ GEM
uglifier (1.3.0) uglifier (1.3.0)
execjs (>= 0.3.0) execjs (>= 0.3.0)
multi_json (~> 1.0, >= 1.0.2) multi_json (~> 1.0, >= 1.0.2)
uniform_notifier (1.1.0) uniform_notifier (1.1.1)
websocket (1.0.6) websocket (1.0.6)
will_paginate (3.0.3) will_paginate (3.0.3)
xpath (1.0.0) xpath (1.0.0)
@ -216,7 +218,6 @@ DEPENDENCIES
formatize formatize
htmlentities htmlentities
jquery-rails jquery-rails
libv8
mongrel (>= 1.2.0.pre2) mongrel (>= 1.2.0.pre2)
mysql2 mysql2
rack-mini-profiler rack-mini-profiler
@ -229,6 +230,7 @@ DEPENDENCIES
sqlite3 sqlite3
swf_fu swf_fu
therubyracer therubyracer
timecop
tolk tolk
uglifier uglifier
will_paginate will_paginate

View file

@ -104,7 +104,7 @@ class StatsController < ApplicationController
@actions_completion_time = current_user.todos.completed.select("completed_at, created_at").reorder("completed_at DESC" ) @actions_completion_time = current_user.todos.completed.select("completed_at, created_at").reorder("completed_at DESC" )
# convert to array and fill in non-existing weeks with 0 # convert to array and fill in non-existing weeks with 0
@max_weeks = difference_in_weeks(@today, @actions_completion_time.last.completed_at) @max_weeks = @actions_completion_time.last ? difference_in_weeks(@today, @actions_completion_time.last.completed_at) : 1
@actions_completed_per_week_array = convert_to_weeks_running_array(@actions_completion_time, @max_weeks+1) @actions_completed_per_week_array = convert_to_weeks_running_array(@actions_completion_time, @max_weeks+1)
# stop the chart after 10 weeks # stop the chart after 10 weeks

View file

@ -129,7 +129,7 @@ module TracksStepHelper
start_time = Time.now start_time = Time.now
page.evaluate_script('jQuery.isReady&&jQuery.active==0').class.should_not eql(String) page.evaluate_script('jQuery.isReady&&jQuery.active==0').class.should_not eql(String)
until(page.evaluate_script('jQuery.isReady&&jQuery.active==0') || (start_time + 5.seconds) < Time.now) until(page.evaluate_script('jQuery.isReady&&jQuery.active==0') || (start_time + 5.seconds) < Time.now)
sleep 1 sleep 0.25
end end
end end

View file

@ -90,7 +90,7 @@ Feature: Show done
When I follow "Show all" When I follow "Show all"
Then I should see the page selector Then I should see the page selector
And I should see "40 (1-20)" And I should see "40 (1-20)"
When I follow "2" When I select the second page
Then I should be on the done projects page Then I should be on the done projects page
And the page should be "2" And the page should be "2"
@ -109,7 +109,7 @@ Feature: Show done
And I follow "Show all" And I follow "Show all"
Then I should see the page selector Then I should see the page selector
And I should see "40 (1-20)" And I should see "40 (1-20)"
When I follow "2" When I select the second page
Then I should be on the done recurring todos page Then I should be on the done recurring todos page
And the page should be "2" And the page should be "2"

View file

@ -10,7 +10,7 @@ class DoneTodos
end end
def self.done_this_week(todos, includes = {:include => Todo::DEFAULT_INCLUDES}) def self.done_this_week(todos, includes = {:include => Todo::DEFAULT_INCLUDES})
done_between(todos, Time.zone.now.beginning_of_day, Time.zone.now.beginning_of_week) done_between(todos, includes, Time.zone.now.beginning_of_day, Time.zone.now.beginning_of_week)
end end
def self.done_this_month(todos, includes = {:include => Todo::DEFAULT_INCLUDES}) def self.done_this_month(todos, includes = {:include => Todo::DEFAULT_INCLUDES})

View file

@ -89,6 +89,7 @@ class StatsControllerTest < ActionController::TestCase
end end
def test_actions_done_last12months_data def test_actions_done_last12months_data
Timecop.travel(Time.local(2013, 1, 15)) do
login_as(:admin_user) login_as(:admin_user)
@current_user = User.find(users(:admin_user).id) @current_user = User.find(users(:admin_user).id)
@current_user.todos.delete_all @current_user.todos.delete_all
@ -107,35 +108,31 @@ class StatsControllerTest < ActionController::TestCase
# And they should be totalled in a hash # And they should be totalled in a hash
assert_equal 2, assigns['actions_created_last12months_array'][0], "there should be two todos in current month" assert_equal 2, assigns['actions_created_last12months_array'][0], "there should be two todos in current month"
# these test use relative dates. It will go wrong when the data is [1-8] of the month :-( assert_equal 1, assigns['actions_created_last12months_array'][1], "there should be one todo in previous month"
# in this case we need to check for a month further (i.e. too_early==1) assert_equal 1, assigns['actions_created_last12months_array'][2], "there should be one todo in two month ago"
# FIXME: make testdata not relative of today to avoid crossing end_of_month assert_equal 1, assigns['actions_created_last12months_array'][3], "there should be one todo in three month ago"
too_early = Time.zone.now.day <= 8 ? 1 : 0 assert_equal 2, assigns['actions_created_last12months_array'][4], "there should be two todos (1 created & 1 done) in four month ago"
assert_equal 1, assigns['actions_created_last12months_array'][1+too_early], "there should be one todo in previous month" assert_equal 1, assigns['actions_done_last12months_array'][1], "there should be one completed todo one-two months ago"
assert_equal 1, assigns['actions_created_last12months_array'][2+too_early], "there should be one todo in two month ago" assert_equal 1, assigns['actions_done_last12months_array'][2], "there should be one completed todo two-three months ago"
assert_equal 1, assigns['actions_created_last12months_array'][3+too_early], "there should be one todo in three month ago" assert_equal 1, assigns['actions_done_last12months_array'][4], "there should be one completed todo four-five months ago"
assert_equal 2, assigns['actions_created_last12months_array'][4+too_early], "there should be two todos (1 created & 1 done) in four month ago"
assert_equal 1, assigns['actions_done_last12months_array'][1+too_early], "there should be one completed todo one-two months ago"
assert_equal 1, assigns['actions_done_last12months_array'][2+too_early], "there should be one completed todo two-three months ago"
assert_equal 1, assigns['actions_done_last12months_array'][4+too_early], "there should be one completed todo four-five months ago"
# And they should be averaged over three months # And they should be averaged over three months
assert_equal 2/3.0, assigns['actions_done_avg_last12months_array'][1], "fourth month should be excluded" assert_equal 2/3.0, assigns['actions_done_avg_last12months_array'][1], "fourth month should be excluded"
assert_equal 2/3.0, assigns['actions_done_avg_last12months_array'][2], "fourth month should be included" assert_equal 2/3.0, assigns['actions_done_avg_last12months_array'][2], "fourth month should be included"
assert_equal (3-too_early)/3.0, assigns['actions_created_avg_last12months_array'][1], "one every month" assert_equal (3)/3.0, assigns['actions_created_avg_last12months_array'][1], "one every month"
assert_equal (4-too_early)/3.0, assigns['actions_created_avg_last12months_array'][2], "two in fourth month" assert_equal (4)/3.0, assigns['actions_created_avg_last12months_array'][2], "two in fourth month"
# And the current month should be interpolated # And the current month should be interpolated
fraction = Time.zone.now.day.to_f / Time.zone.now.end_of_month.day.to_f fraction = Time.zone.now.day.to_f / Time.zone.now.end_of_month.day.to_f
assert_equal (2*(1/fraction)+2-too_early)/3.0, assigns['interpolated_actions_created_this_month'], "two this month and one in the last two months" assert_equal (2*(1/fraction)+2)/3.0, assigns['interpolated_actions_created_this_month'], "two this month and one in the last two months"
assert_equal (2-too_early)/3.0, assigns['interpolated_actions_done_this_month'], "none this month and one two the last two months" assert_equal (2)/3.0, assigns['interpolated_actions_done_this_month'], "none this month and one two the last two months"
# And totals should be calculated # And totals should be calculated
assert_equal 2, assigns['max'], "max of created or completed todos in one month" assert_equal 2, assigns['max'], "max of created or completed todos in one month"
end end
end
def test_actions_done_last30days_data def test_actions_done_last30days_data
login_as(:admin_user) login_as(:admin_user)