comparison test/unit/query_test.rb @ 524:1248a47e81b3 feature_36

Merge from branch "luisf"
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Mon, 25 Jul 2011 14:39:38 +0100
parents cbce1fd3b1b7
children cbb26bc654de
comparison
equal deleted inserted replaced
519:3be6bc3c2a17 524:1248a47e81b3
1 # redMine - project management software 1 # Redmine - project management software
2 # Copyright (C) 2006-2008 Jean-Philippe Lang 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 # 3 #
4 # This program is free software; you can redistribute it and/or 4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License 5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2 6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version. 7 # of the License, or (at your option) any later version.
13 # 13 #
14 # You should have received a copy of the GNU General Public License 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 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. 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 require File.dirname(__FILE__) + '/../test_helper' 18 require File.expand_path('../../test_helper', __FILE__)
19 19
20 class QueryTest < ActiveSupport::TestCase 20 class QueryTest < ActiveSupport::TestCase
21 fixtures :projects, :enabled_modules, :users, :members, :member_roles, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :watchers, :custom_fields, :custom_values, :versions, :queries 21 fixtures :projects, :enabled_modules, :users, :members, :member_roles, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :watchers, :custom_fields, :custom_values, :versions, :queries
22 22
23 def test_custom_fields_for_all_projects_should_be_available_in_global_queries 23 def test_custom_fields_for_all_projects_should_be_available_in_global_queries
187 query.add_filter('subject', '~', ['uNable']) 187 query.add_filter('subject', '~', ['uNable'])
188 assert query.statement.include?("LOWER(#{Issue.table_name}.subject) LIKE '%unable%'") 188 assert query.statement.include?("LOWER(#{Issue.table_name}.subject) LIKE '%unable%'")
189 result = find_issues_with_query(query) 189 result = find_issues_with_query(query)
190 assert result.empty? 190 assert result.empty?
191 result.each {|issue| assert issue.subject.downcase.include?('unable') } 191 result.each {|issue| assert issue.subject.downcase.include?('unable') }
192 end
193
194 def test_range_for_this_week_with_week_starting_on_monday
195 I18n.locale = :fr
196 assert_equal '1', I18n.t(:general_first_day_of_week)
197
198 Date.stubs(:today).returns(Date.parse('2011-04-29'))
199
200 query = Query.new(:project => Project.find(1), :name => '_')
201 query.add_filter('due_date', 'w', [''])
202 assert query.statement.match(/issues\.due_date > '2011-04-24 23:59:59(\.9+)?' AND issues\.due_date <= '2011-05-01 23:59:59(\.9+)?/), "range not found in #{query.statement}"
203 I18n.locale = :en
204 end
205
206 def test_range_for_this_week_with_week_starting_on_sunday
207 I18n.locale = :en
208 assert_equal '7', I18n.t(:general_first_day_of_week)
209
210 Date.stubs(:today).returns(Date.parse('2011-04-29'))
211
212 query = Query.new(:project => Project.find(1), :name => '_')
213 query.add_filter('due_date', 'w', [''])
214 assert query.statement.match(/issues\.due_date > '2011-04-23 23:59:59(\.9+)?' AND issues\.due_date <= '2011-04-30 23:59:59(\.9+)?/), "range not found in #{query.statement}"
192 end 215 end
193 216
194 def test_operator_does_not_contains 217 def test_operator_does_not_contains
195 query = Query.new(:project => Project.find(1), :name => '_') 218 query = Query.new(:project => Project.find(1), :name => '_')
196 query.add_filter('subject', '!~', ['uNable']) 219 query.add_filter('subject', '!~', ['uNable'])
216 assert !result.empty? 239 assert !result.empty?
217 assert_equal((Issue.visible - Issue.watched_by(User.current)).sort_by(&:id).size, result.sort_by(&:id).size) 240 assert_equal((Issue.visible - Issue.watched_by(User.current)).sort_by(&:id).size, result.sort_by(&:id).size)
218 User.current = nil 241 User.current = nil
219 end 242 end
220 243
244 def test_statement_should_be_nil_with_no_filters
245 q = Query.new(:name => '_')
246 q.filters = {}
247
248 assert q.valid?
249 assert_nil q.statement
250 end
251
221 def test_default_columns 252 def test_default_columns
222 q = Query.new 253 q = Query.new
223 assert !q.columns.empty? 254 assert !q.columns.empty?
224 end 255 end
225 256
232 end 263 end
233 264
234 def test_groupable_columns_should_include_custom_fields 265 def test_groupable_columns_should_include_custom_fields
235 q = Query.new 266 q = Query.new
236 assert q.groupable_columns.detect {|c| c.is_a? QueryCustomFieldColumn} 267 assert q.groupable_columns.detect {|c| c.is_a? QueryCustomFieldColumn}
268 end
269
270 def test_grouped_with_valid_column
271 q = Query.new(:group_by => 'status')
272 assert q.grouped?
273 assert_not_nil q.group_by_column
274 assert_equal :status, q.group_by_column.name
275 assert_not_nil q.group_by_statement
276 assert_equal 'status', q.group_by_statement
277 end
278
279 def test_grouped_with_invalid_column
280 q = Query.new(:group_by => 'foo')
281 assert !q.grouped?
282 assert_nil q.group_by_column
283 assert_nil q.group_by_statement
237 end 284 end
238 285
239 def test_default_sort 286 def test_default_sort
240 q = Query.new 287 q = Query.new
241 assert_equal [], q.sort_criteria 288 assert_equal [], q.sort_criteria
380 users = @query.available_filters["assigned_to_id"] 427 users = @query.available_filters["assigned_to_id"]
381 assert_not_nil users 428 assert_not_nil users
382 assert users[:values].map{|u|u[1]}.include?("3") 429 assert users[:values].map{|u|u[1]}.include?("3")
383 end 430 end
384 431
432 should "include visible projects in cross-project view" do
433 projects = @query.available_filters["project_id"]
434 assert_not_nil projects
435 assert projects[:values].map{|u|u[1]}.include?("1")
436 end
437
385 context "'member_of_group' filter" do 438 context "'member_of_group' filter" do
386 should "be present" do 439 should "be present" do
387 assert @query.available_filters.keys.include?("member_of_group") 440 assert @query.available_filters.keys.include?("member_of_group")
388 end 441 end
389 442
460 @query.add_filter('member_of_group', '!*', ['']) 513 @query.add_filter('member_of_group', '!*', [''])
461 514
462 # Users not in a group 515 # Users not in a group
463 assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IS NULL OR #{Issue.table_name}.assigned_to_id NOT IN ('#{@user_in_group.id}','#{@second_user_in_group.id}','#{@user_in_group2.id}')" 516 assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IS NULL OR #{Issue.table_name}.assigned_to_id NOT IN ('#{@user_in_group.id}','#{@second_user_in_group.id}','#{@user_in_group2.id}')"
464 assert_find_issues_with_query_is_successful @query 517 assert_find_issues_with_query_is_successful @query
465
466 end 518 end
467 519
468 should "search assigned to any group member (all)" do 520 should "search assigned to any group member (all)" do
469 @query = Query.new(:name => '_') 521 @query = Query.new(:name => '_')
470 @query.add_filter('member_of_group', '*', ['']) 522 @query.add_filter('member_of_group', '*', [''])
471 523
472 # Only users in a group 524 # Only users in a group
473 assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@user_in_group.id}','#{@second_user_in_group.id}','#{@user_in_group2.id}')" 525 assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@user_in_group.id}','#{@second_user_in_group.id}','#{@user_in_group2.id}')"
474 assert_find_issues_with_query_is_successful @query 526 assert_find_issues_with_query_is_successful @query
475 527 end
528
529 should "return an empty set with = empty group" do
530 @empty_group = Group.generate!
531 @query = Query.new(:name => '_')
532 @query.add_filter('member_of_group', '=', [@empty_group.id.to_s])
533
534 assert_equal [], find_issues_with_query(@query)
535 end
536
537 should "return issues with ! empty group" do
538 @empty_group = Group.generate!
539 @query = Query.new(:name => '_')
540 @query.add_filter('member_of_group', '!', [@empty_group.id.to_s])
541
542 assert_find_issues_with_query_is_successful @query
476 end 543 end
477 end 544 end
478 545
479 context "with 'assigned_to_role' filter" do 546 context "with 'assigned_to_role' filter" do
480 setup do 547 setup do
516 @query.add_filter('assigned_to_role', '*', ['']) 583 @query.add_filter('assigned_to_role', '*', [''])
517 584
518 assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@developer.id}','#{@boss.id}')" 585 assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@developer.id}','#{@boss.id}')"
519 assert_find_issues_with_query_is_successful @query 586 assert_find_issues_with_query_is_successful @query
520 end 587 end
588
589 should "return an empty set with empty role" do
590 @empty_role = Role.generate!
591 @query = Query.new(:name => '_')
592 @query.add_filter('assigned_to_role', '=', [@empty_role.id.to_s])
593
594 assert_equal [], find_issues_with_query(@query)
595 end
596
597 should "return issues with ! empty role" do
598 @empty_role = Role.generate!
599 @query = Query.new(:name => '_')
600 @query.add_filter('member_of_group', '!', [@empty_role.id.to_s])
601
602 assert_find_issues_with_query_is_successful @query
603 end
521 end 604 end
522 end 605 end
523 606
524 end 607 end