You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

time_entry_query_test.rb 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. # Redmine - project management software
  2. # Copyright (C) 2006-2017 Jean-Philippe Lang
  3. #
  4. # This program is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU General Public License
  6. # as published by the Free Software Foundation; either version 2
  7. # of the License, or (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. # GNU General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU General Public License
  15. # along with this program; if not, write to the Free Software
  16. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  17. require File.expand_path('../../test_helper', __FILE__)
  18. class TimeEntryQueryTest < ActiveSupport::TestCase
  19. fixtures :issues, :projects, :users,
  20. :members, :roles, :member_roles,
  21. :trackers, :issue_statuses,
  22. :projects_trackers,
  23. :journals, :journal_details,
  24. :issue_categories, :enumerations,
  25. :groups_users,
  26. :enabled_modules,
  27. :custom_fields, :custom_fields_trackers, :custom_fields_projects
  28. def setup
  29. User.current = nil
  30. end
  31. def test_filter_values_without_project_should_be_arrays
  32. q = TimeEntryQuery.new
  33. assert_nil q.project
  34. q.available_filters.each do |name, filter|
  35. values = filter.values
  36. assert (values.nil? || values.is_a?(Array)),
  37. "#values for #{name} filter returned a #{values.class.name}"
  38. end
  39. end
  40. def test_filter_values_with_project_should_be_arrays
  41. q = TimeEntryQuery.new(:project => Project.find(1))
  42. assert_not_nil q.project
  43. q.available_filters.each do |name, filter|
  44. values = filter.values
  45. assert (values.nil? || values.is_a?(Array)),
  46. "#values for #{name} filter returned a #{values.class.name}"
  47. end
  48. end
  49. def test_cross_project_activity_filter_should_propose_non_active_activities
  50. activity = TimeEntryActivity.create!(:name => 'Disabled', :active => false)
  51. assert !activity.active?
  52. query = TimeEntryQuery.new(:name => '_')
  53. assert options = query.available_filters['activity_id']
  54. assert values = options[:values]
  55. assert_include ["Disabled", activity.id.to_s], values
  56. end
  57. def test_activity_filter_should_consider_system_and_project_activities
  58. TimeEntry.delete_all
  59. system = TimeEntryActivity.create!(:name => 'Foo')
  60. TimeEntry.generate!(:activity => system, :hours => 1.0)
  61. override = TimeEntryActivity.create!(:name => 'Foo', :parent_id => system.id, :project_id => 1)
  62. other = TimeEntryActivity.create!(:name => 'Bar')
  63. TimeEntry.generate!(:activity => override, :hours => 2.0)
  64. TimeEntry.generate!(:activity => other, :hours => 4.0)
  65. with_current_user User.find(2) do
  66. query = TimeEntryQuery.new(:name => '_')
  67. query.add_filter('activity_id', '=', [system.id.to_s])
  68. assert_equal 3.0, query.results_scope.sum(:hours)
  69. query = TimeEntryQuery.new(:name => '_')
  70. query.add_filter('activity_id', '!', [system.id.to_s])
  71. assert_equal 4.0, query.results_scope.sum(:hours)
  72. end
  73. end
  74. def test_project_query_should_include_project_issue_custom_fields_only_as_filters
  75. global = IssueCustomField.generate!(:is_for_all => true, :is_filter => true)
  76. field_on_project = IssueCustomField.generate!(:is_for_all => false, :project_ids => [3], :is_filter => true)
  77. field_not_on_project = IssueCustomField.generate!(:is_for_all => false, :project_ids => [1,2], :is_filter => true)
  78. query = TimeEntryQuery.new(:project => Project.find(3))
  79. assert_include "issue.cf_#{global.id}", query.available_filters.keys
  80. assert_include "issue.cf_#{field_on_project.id}", query.available_filters.keys
  81. assert_not_include "issue.cf_#{field_not_on_project.id}", query.available_filters.keys
  82. end
  83. def test_project_query_should_include_project_issue_custom_fields_only_as_columns
  84. global = IssueCustomField.generate!(:is_for_all => true, :is_filter => true)
  85. field_on_project = IssueCustomField.generate!(:is_for_all => false, :project_ids => [3], :is_filter => true)
  86. field_not_on_project = IssueCustomField.generate!(:is_for_all => false, :project_ids => [1,2], :is_filter => true)
  87. query = TimeEntryQuery.new(:project => Project.find(3))
  88. assert_include "issue.cf_#{global.id}", query.available_columns.map(&:name).map(&:to_s)
  89. assert_include "issue.cf_#{field_on_project.id}", query.available_columns.map(&:name).map(&:to_s)
  90. assert_not_include "issue.cf_#{field_not_on_project.id}", query.available_columns.map(&:name).map(&:to_s)
  91. end
  92. def test_issue_category_filter_should_not_be_available_in_global_queries
  93. query = TimeEntryQuery.new(:project => nil, :name => '_')
  94. assert !query.available_filters.has_key?('issue.category_id')
  95. end
  96. def test_project_status_filter_should_be_available_in_global_queries
  97. query = TimeEntryQuery.new(:project => nil, :name => '_')
  98. assert query.available_filters.has_key?('project.status')
  99. end
  100. def test_project_status_filter_should_be_available_when_project_has_subprojects
  101. query = TimeEntryQuery.new(:project => Project.find(1), :name => '_')
  102. assert query.available_filters.has_key?('project.status')
  103. end
  104. def test_project_status_filter_should_not_be_available_when_project_is_leaf
  105. query = TimeEntryQuery.new(:project => Project.find(2), :name => '_')
  106. assert !query.available_filters.has_key?('project.status')
  107. end
  108. end