diff test/unit/query_test.rb @ 22:40f7cfd4df19

* Update to SVN trunk rev 4173
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Fri, 24 Sep 2010 14:06:04 +0100
parents 1d32c0a0efbf
children 94944d00e43c
line wrap: on
line diff
--- a/test/unit/query_test.rb	Wed Aug 25 16:30:24 2010 +0100
+++ b/test/unit/query_test.rb	Fri Sep 24 14:06:04 2010 +0100
@@ -48,6 +48,16 @@
       :conditions => query.statement
   end
 
+  def assert_find_issues_with_query_is_successful(query)
+    assert_nothing_raised do
+      find_issues_with_query(query)
+    end
+  end
+
+  def assert_query_statement_includes(query, condition)
+    assert query.statement.include?(condition), "Query statement condition not found in: #{query.statement}"
+  end
+
   def test_query_should_allow_shared_versions_for_a_project_query
     subproject_version = Version.find(4)
     query = Query.new(:project => Project.find(1), :name => '_')
@@ -362,11 +372,153 @@
   end
 
   context "#available_filters" do
+    setup do
+      @query = Query.new(:name => "_")
+    end
+    
     should "include users of visible projects in cross-project view" do
-      query = Query.new(:name => "_")
-      users = query.available_filters["assigned_to_id"]
+      users = @query.available_filters["assigned_to_id"]
       assert_not_nil users
       assert users[:values].map{|u|u[1]}.include?("3")
     end
+
+    context "'member_of_group' filter" do
+      should "be present" do
+        assert @query.available_filters.keys.include?("member_of_group")
+      end
+      
+      should "be an optional list" do
+        assert_equal :list_optional, @query.available_filters["member_of_group"][:type]
+      end
+      
+      should "have a list of the groups as values" do
+        Group.destroy_all # No fixtures
+        group1 = Group.generate!.reload
+        group2 = Group.generate!.reload
+
+        expected_group_list = [
+                               [group1.name, group1.id],
+                               [group2.name, group2.id]
+                              ]
+        assert_equal expected_group_list.sort, @query.available_filters["member_of_group"][:values].sort
+      end
+
+    end
+
+    context "'assigned_to_role' filter" do
+      should "be present" do
+        assert @query.available_filters.keys.include?("assigned_to_role")
+      end
+      
+      should "be an optional list" do
+        assert_equal :list_optional, @query.available_filters["assigned_to_role"][:type]
+      end
+      
+      should "have a list of the Roles as values" do
+        assert @query.available_filters["assigned_to_role"][:values].include?(['Manager',1])
+        assert @query.available_filters["assigned_to_role"][:values].include?(['Developer',2])
+        assert @query.available_filters["assigned_to_role"][:values].include?(['Reporter',3])
+      end
+
+      should "not include the built in Roles as values" do
+        assert ! @query.available_filters["assigned_to_role"][:values].include?(['Non member',4])
+        assert ! @query.available_filters["assigned_to_role"][:values].include?(['Anonymous',5])
+      end
+
+    end
+
   end
+
+  context "#statement" do
+    context "with 'member_of_group' filter" do
+      setup do
+        Group.destroy_all # No fixtures
+        @user_in_group = User.generate!
+        @second_user_in_group = User.generate!
+        @user_in_group2 = User.generate!
+        @user_not_in_group = User.generate!
+        
+        @group = Group.generate!.reload
+        @group.users << @user_in_group
+        @group.users << @second_user_in_group
+        
+        @group2 = Group.generate!.reload
+        @group2.users << @user_in_group2
+        
+      end
+      
+      should "search assigned to for users in the group" do
+        @query = Query.new(:name => '_')
+        @query.add_filter('member_of_group', '=', [@group.id.to_s])
+
+        assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@user_in_group.id}','#{@second_user_in_group.id}')"
+        assert_find_issues_with_query_is_successful @query
+      end
+
+      should "search not assigned to any group member (none)" do
+        @query = Query.new(:name => '_')
+        @query.add_filter('member_of_group', '!*', [''])
+
+        # Users not in a group
+        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}')"
+        assert_find_issues_with_query_is_successful @query
+
+      end
+
+      should "search assigned to any group member (all)" do
+        @query = Query.new(:name => '_')
+        @query.add_filter('member_of_group', '*', [''])
+
+        # Only users in a group
+        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}')"
+        assert_find_issues_with_query_is_successful @query
+
+      end
+    end
+
+    context "with 'assigned_to_role' filter" do
+      setup do
+        # No fixtures
+        MemberRole.delete_all
+        Member.delete_all
+        Role.delete_all
+        
+        @manager_role = Role.generate!(:name => 'Manager')
+        @developer_role = Role.generate!(:name => 'Developer')
+
+        @project = Project.generate!
+        @manager = User.generate!
+        @developer = User.generate!
+        @boss = User.generate!
+        User.add_to_project(@manager, @project, @manager_role)
+        User.add_to_project(@developer, @project, @developer_role)
+        User.add_to_project(@boss, @project, [@manager_role, @developer_role])
+      end
+      
+      should "search assigned to for users with the Role" do
+        @query = Query.new(:name => '_')
+        @query.add_filter('assigned_to_role', '=', [@manager_role.id.to_s])
+
+        assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@boss.id}')"
+        assert_find_issues_with_query_is_successful @query
+      end
+
+      should "search assigned to for users not assigned to any Role (none)" do
+        @query = Query.new(:name => '_')
+        @query.add_filter('assigned_to_role', '!*', [''])
+
+        assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IS NULL OR #{Issue.table_name}.assigned_to_id NOT IN ('#{@manager.id}','#{@developer.id}','#{@boss.id}')"
+        assert_find_issues_with_query_is_successful @query
+      end
+
+      should "search assigned to for users assigned to any Role (all)" do
+        @query = Query.new(:name => '_')
+        @query.add_filter('assigned_to_role', '*', [''])
+
+        assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@developer.id}','#{@boss.id}')"
+        assert_find_issues_with_query_is_successful @query
+      end
+    end
+  end
+  
 end