further refactoring and more tests

This commit is contained in:
Reinier Balt 2011-12-09 17:17:42 +01:00
parent 2349bee535
commit b948cc48b2
7 changed files with 256 additions and 217 deletions

View file

@ -26,17 +26,18 @@ class StatsControllerTest < ActionController::TestCase
def test_get_charts
login_as(:admin_user)
%w{ actions_done_last30days_data
actions_done_last12months_data
actions_completion_time_data
actions_visible_running_time_data
actions_running_time_data
actions_day_of_week_all_data
actions_day_of_week_30days_data
actions_time_of_day_all_data
actions_time_of_day_30days_data
context_total_actions_data
context_running_actions_data
%w{
actions_done_last30days_data
actions_done_last12months_data
actions_completion_time_data
actions_visible_running_time_data
actions_running_time_data
actions_day_of_week_all_data
actions_day_of_week_30days_data
actions_time_of_day_all_data
actions_time_of_day_30days_data
context_total_actions_data
context_running_actions_data
}.each do |action|
get action
assert_response :success
@ -113,28 +114,51 @@ class StatsControllerTest < ActionController::TestCase
# 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 1, assigns['actions_created_last12months_array'][1], "there should be one todo in previous month"
assert_equal 1, assigns['actions_created_last12months_array'][2], "there should be one todo in two month ago"
# these test use relative dates. It will go wrong when the data is [1-8] of the month :-(
# FIXME: make testdata not relative of today to avoid crossing end_of_month
too_early = Time.zone.now.day <= 8 ? 1 : 0
assert_equal 1-too_early, assigns['actions_created_last12months_array'][1], "there should be one todo in previous month"
assert_equal 1+too_early, assigns['actions_created_last12months_array'][2], "there should be one todo in two month ago"
assert_equal 1, assigns['actions_created_last12months_array'][3], "there should be one todo in three month ago"
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_done_last12months_array'][2], "there should be one completed todo in last three months"
assert_equal 1, assigns['actions_done_last12months_array'][4], "there should be one completed todo in last four months"
assert_equal 1, assigns['actions_done_last12months_array'][1], "there should be one completed todo one-two months 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_done_last12months_array'][4], "there should be one completed todo four-five months ago"
# And they should be averaged over three months
assert_equal 1/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 1.0, assigns['actions_created_avg_last12months_array'][1], "one every month"
assert_equal 4/3.0, assigns['actions_created_avg_last12months_array'][2], "two in fourth 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"
# And the current month should be interpolated
fraction = Time.zone.now.day.to_f / Time.zone.now.end_of_month.day.to_f
assert_equal (2*fraction+2)/3.0, assigns['interpolated_actions_created_this_month'], "two this month and one in the last two months"
assert_equal 1/3.0, assigns['interpolated_actions_done_this_month'], "none this month and one in 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
assert_equal 2, assigns['max'], "max of created or completed todos"
assert_equal 2, assigns['max'], "max of created or completed todos in one month"
end
def test_actions_done_last30days_data
login_as(:admin_user)
@current_user = User.find(users(:admin_user).id)
@current_user.todos.delete_all
given_todos_for_stats
# When I get the chart data
get :actions_done_last30days_data
assert_response :success
# only tests relevant differences with actions_done_last_12months_data
assert_equal 31, assigns['actions_done_last30days_array'].size, "30 complete days plus 1 for the current day"
assert_equal 2, assigns['max'], "two actions created on one day is max"
end
def test_actions_done_lastyears_data
@ -151,11 +175,11 @@ class StatsControllerTest < ActionController::TestCase
# only tests difference with actions_done_last_12months_data
# Then the count of months should be calculated
assert_equal 24, assigns['month_count']
assert_equal 27, assigns['month_count'], "two years and three months of last todo"
# And the last two months are corrected
assert_equal 0.5, assigns['actions_done_avg_last_months_hash'][23]
assert_equal 1.0, assigns['actions_done_avg_last_months_hash'][24]
assert_equal 2/3.0, assigns['actions_done_avg_last_months_array'][23]
assert_equal 2/3.0, assigns['actions_done_avg_last_months_array'][24]
end
def test_actions_completion_time_data
@ -170,8 +194,11 @@ class StatsControllerTest < ActionController::TestCase
assert_response :success
# do not test stuff already implicitly tested in other tests
assert_equal 104, assigns['max_weeks'], "two years is 104 weeks"
assert_equal 104, assigns['max_weeks'], "two years is 104 weeks (for completed_at)"
assert_equal 3, assigns['max_actions'], "3 completed within one week"
assert_equal 11, assigns['actions_completion_time_array'].size, "there should be 10 weeks of data + 1 for the rest"
assert_equal 1, assigns['actions_completion_time_array'][10], "there is one completed todo after the 10 weeks cut_off"
assert_equal 100.0, assigns['cumm_percent_done'][10], "cummulative percentage should add up to 100%"
end
def test_actions_running_time_data
@ -186,8 +213,11 @@ class StatsControllerTest < ActionController::TestCase
assert_response :success
# do not test stuff already implicitly tested in other tests
assert_equal 17, assigns['max_weeks'], "there are action in the first 17 weeks of this year"
assert_equal 17, assigns['max_weeks'], "there are actions in the first 17 weeks of this year"
assert_equal 2, assigns['max_actions'], "2 actions running long together"
assert_equal 18, assigns['actions_running_time_array'].size, "there should be 17 weeks ( < cut_off) of data + 1 for the rest"
assert_equal 1, assigns['actions_running_time_array'][17], "there is one running todos in week 17 and zero after 17 weeks ( < cut off; ) "
assert_equal 100.0, assigns['cumm_percent_done'][17], "cummulative percentage should add up to 100%"
end
def test_actions_visible_running_time_data
@ -196,22 +226,51 @@ class StatsControllerTest < ActionController::TestCase
@current_user.todos.delete_all
given_todos_for_stats
# Given todo1 is deferred (i.e. not visible)
@todo_today1.show_from = Time.zone.now + 1.week
@todo_today1.save
# When I get the chart data
get :actions_visible_running_time_data
assert_response :success
# do not test stuff already implicitly tested in other tests
assert_equal 17, assigns['max_weeks'], "there are actions in the first 17 weeks of this year"
assert_equal 1, assigns['max_actions'], "1 action running long; 1 is deferred"
assert_equal 1, assigns['actions_running_time_array'][0], "there is one running todos and one deferred todo created in week 1"
assert_equal 18, assigns['actions_running_time_array'].size, "there should be 17 weeks ( < cut_off) of data + 1 for the rest"
assert_equal 1, assigns['actions_running_time_array'][17], "there is one running todos in week 17 and zero after 17 weeks ( < cut off; ) "
assert_equal 100.0, assigns['cumm_percent_done'][17], "cummulative percentage should add up to 100%"
end
def test_context_total_actions_data
login_as(:admin_user)
@current_user = User.find(users(:admin_user).id)
@current_user.todos.delete_all
given_todos_for_stats
# When I get the chart data
get :actions_running_time_data
get :context_total_actions_data
assert_response :success
# do not test stuff already implicitly tested in other tests
assert_equal 17, assigns['max_weeks'], "there are action in the first 17 weeks of this year"
assert_equal 9, assigns['sum'], "Nine todos in 1 context"
assert_equal 1, assigns['actions_per_context'].size
# Given 10 more todos in 10 different contexts
1.upto(10) do |i|
context = @current_user.contexts.create!(:name => "context #{i}")
@current_user.todos.create!(:description => "created today with new context #{i}", :context => context)
end
# When I get the chart data
get :context_total_actions_data
assert_response :success
assert_equal 19, assigns['sum'], "added 10 todos"
assert_equal 10, assigns['actions_per_context'].size, "pie slices limited to max 10"
assert_equal 2, assigns['actions_per_context'][9]['total'], "pie slices limited to max 10; last pie contains sum of rest"
assert_equal "(others)", assigns['actions_per_context'][9]['name'], "pie slices limited to max 10; last slice contains label for others"
end
private
@ -221,17 +280,18 @@ class StatsControllerTest < ActionController::TestCase
@todo_today1 = @current_user.todos.create!(:description => "created today1", :context => contexts(:office))
@todo_today2 = @current_user.todos.create!(:description => "created today2", :context => contexts(:office))
# And a todo created a month ago
@todo_month1 = create_todo_in_past(1.month+1.day)
@todo_month1 = create_completed_todo_in_past(1.month+1.weeks+1.day, 1.month+1.day)
# And a todo created two months ago
@todo_month2 = create_completed_todo_in_past(2.months+1.day, 2.months+2.days)
@todo_month2 = create_completed_todo_in_past(2.months+2.days, 2.months+1.day)
# And a todo created three months ago
@todo_month3 = create_todo_in_past(3.months+1.day)
# And a todo created four months ago
@todo_month4 = create_todo_in_past(4.months+1.day)
# And a todo created four months ago
@todo_month5 = create_completed_todo_in_past(4.months+1.day, 4.months+2.days)
@todo_month5 = create_completed_todo_in_past(4.months+2.days, 4.months+1.day)
# And a todo created over a year ago
@todo_year = create_completed_todo_in_past(2.years+1.day, 2.years+2.day)
@todo_year1 = create_completed_todo_in_past(2.years+2.days, 2.years+1.day)
@todo_year2 = create_completed_todo_in_past(2.years+3.months, 2.years+1.day)
end
def create_todo_in_past(creation_time_in_past)
@ -250,4 +310,21 @@ class StatsControllerTest < ActionController::TestCase
return todo
end
# assumes date1 > date2
def difference_in_days(date1, date2)
return ((date1.at_midnight-date2.at_midnight)/(60*60*24)).to_i
end
# assumes date1 > date2
def difference_in_weeks(date1, date2)
return difference_in_days(date1, date2) / 7
end
# assumes date1 > date2
def difference_in_months(date1, date2)
diff = (date1.year - date2.year)*12 + (date1.month - date2.month)
return diff-1 if date1.day - date2.day < 0 # correct for incomplete months
return diff
end
end