mirror of
https://github.com/TracksApp/tracks.git
synced 2025-12-31 14:28:49 +01:00
253 lines
9 KiB
Ruby
Executable file
253 lines
9 KiB
Ruby
Executable file
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
|
require 'stats_controller'
|
|
|
|
# Re-raise errors caught by the controller.
|
|
class StatsController; def rescue_action(e) raise e end; end
|
|
|
|
class StatsControllerTest < ActionController::TestCase
|
|
fixtures :users, :preferences, :projects, :contexts, :todos, :recurring_todos, :recurring_todos, :tags, :taggings
|
|
|
|
def setup
|
|
@controller = StatsController.new
|
|
@request = ActionController::TestRequest.new
|
|
@response = ActionController::TestResponse.new
|
|
end
|
|
|
|
def test_get_index_when_not_logged_in
|
|
get :index
|
|
assert_redirected_to :controller => 'login', :action => 'login'
|
|
end
|
|
|
|
def test_get_index
|
|
login_as(:admin_user)
|
|
get :index
|
|
assert_response :success
|
|
end
|
|
|
|
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
|
|
}.each do |action|
|
|
get action
|
|
assert_response :success
|
|
assert_template "stats/"+action
|
|
end
|
|
end
|
|
|
|
def test_totals
|
|
login_as(:admin_user)
|
|
get :index
|
|
assert_response :success
|
|
assert_equal 4, assigns['tags_count']
|
|
assert_equal 2, assigns['unique_tags_count']
|
|
assert_equal 2.week.ago.utc.at_midnight, assigns['first_action'].created_at.utc.at_midnight
|
|
end
|
|
|
|
def test_downdrill
|
|
login_as(:admin_user)
|
|
|
|
# drill down without parameters
|
|
get :show_selected_actions_from_chart
|
|
assert_response :not_found
|
|
assert_template nil
|
|
|
|
# get week 0-1 for actions visible running
|
|
get :show_selected_actions_from_chart, :id => 'avrt', :index => 0
|
|
assert_response :success
|
|
assert_template "stats/show_selection_from_chart"
|
|
|
|
# get week 0 and further for actions visible running
|
|
get :show_selected_actions_from_chart, :id => 'avrt_end', :index => 0
|
|
assert_response :success
|
|
assert_template "stats/show_selection_from_chart"
|
|
|
|
# get week 0-1 for actions running
|
|
get :show_selected_actions_from_chart, :id => 'art', :index => 0
|
|
assert_response :success
|
|
assert_template "stats/show_selection_from_chart"
|
|
|
|
# get week 0 and further for actions running
|
|
get :show_selected_actions_from_chart, :id => 'art_end', :index => 0
|
|
assert_response :success
|
|
assert_template "stats/show_selection_from_chart"
|
|
end
|
|
|
|
def test_stats_render_when_tasks_have_no_taggings
|
|
login_as(:admin_user)
|
|
|
|
# using the default fixtures, todos have tags
|
|
get :index
|
|
assert_response :success
|
|
|
|
# clear taggings table and render again
|
|
Tagging.delete_all
|
|
get :index
|
|
assert_response :success
|
|
end
|
|
|
|
def test_actions_done_last12months_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_last12months_data
|
|
assert_response :success
|
|
|
|
# Then the todos for the chart should be retrieved
|
|
assert_not_nil assigns['actions_done_last12months']
|
|
assert_not_nil assigns['actions_created_last12months']
|
|
assert_equal 7, assigns['actions_created_last12months'].count, "very old todo should not be retrieved"
|
|
|
|
# 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"
|
|
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"
|
|
|
|
# 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'][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"
|
|
|
|
# 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"
|
|
|
|
# And totals should be calculated
|
|
assert_equal 2, assigns['max'], "max of created or completed todos"
|
|
end
|
|
|
|
def test_actions_done_lastyears_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_lastyears_data
|
|
assert_response :success
|
|
|
|
# only tests difference with actions_done_last_12months_data
|
|
|
|
# Then the count of months should be calculated
|
|
assert_equal 24, assigns['month_count']
|
|
|
|
# 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]
|
|
end
|
|
|
|
def test_actions_completion_time_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_completion_time_data
|
|
assert_response :success
|
|
|
|
# do not test stuff already implicitly tested in other tests
|
|
|
|
assert_equal 104, assigns['max_weeks'], "two years is 104 weeks"
|
|
end
|
|
|
|
def test_actions_running_time_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
|
|
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"
|
|
end
|
|
|
|
def test_actions_visible_running_time_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_visible_running_time_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
|
|
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"
|
|
end
|
|
|
|
private
|
|
|
|
def given_todos_for_stats
|
|
# Given two todos created today
|
|
@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)
|
|
# And a todo created two months ago
|
|
@todo_month2 = create_completed_todo_in_past(2.months+1.day, 2.months+2.days)
|
|
# 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)
|
|
# And a todo created over a year ago
|
|
@todo_year = create_completed_todo_in_past(2.years+1.day, 2.years+2.day)
|
|
end
|
|
|
|
def create_todo_in_past(creation_time_in_past)
|
|
todo = @current_user.todos.create!(:description => "created #{creation_time_in_past} ago", :context => contexts(:office))
|
|
todo.created_at = Time.zone.now - creation_time_in_past
|
|
todo.save!
|
|
return todo
|
|
end
|
|
|
|
def create_completed_todo_in_past(creation_time_in_past, completed_time_in_past)
|
|
todo = @current_user.todos.create!(:description => "created #{creation_time_in_past} ago", :context => contexts(:office))
|
|
todo.complete!
|
|
todo.completed_at = Time.zone.now - completed_time_in_past
|
|
todo.created_at = Time.zone.now - creation_time_in_past
|
|
todo.save!
|
|
return todo
|
|
end
|
|
|
|
end
|