Mercurial > hg > soundsoftware-site
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 |