Role based custom queries (#1019).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11994 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Vendored
+9
-9
@@ -3,7 +3,7 @@ queries_001:
|
||||
id: 1
|
||||
type: IssueQuery
|
||||
project_id: 1
|
||||
is_public: true
|
||||
visibility: 2
|
||||
name: Multiple custom fields query
|
||||
filters: |
|
||||
---
|
||||
@@ -26,7 +26,7 @@ queries_002:
|
||||
id: 2
|
||||
type: IssueQuery
|
||||
project_id: 1
|
||||
is_public: false
|
||||
visibility: 0
|
||||
name: Private query for cookbook
|
||||
filters: |
|
||||
---
|
||||
@@ -45,7 +45,7 @@ queries_003:
|
||||
id: 3
|
||||
type: IssueQuery
|
||||
project_id:
|
||||
is_public: false
|
||||
visibility: 0
|
||||
name: Private query for all projects
|
||||
filters: |
|
||||
---
|
||||
@@ -60,7 +60,7 @@ queries_004:
|
||||
id: 4
|
||||
type: IssueQuery
|
||||
project_id:
|
||||
is_public: true
|
||||
visibility: 2
|
||||
name: Public query for all projects
|
||||
filters: |
|
||||
---
|
||||
@@ -75,7 +75,7 @@ queries_005:
|
||||
id: 5
|
||||
type: IssueQuery
|
||||
project_id:
|
||||
is_public: true
|
||||
visibility: 2
|
||||
name: Open issues by priority and tracker
|
||||
filters: |
|
||||
---
|
||||
@@ -96,7 +96,7 @@ queries_006:
|
||||
id: 6
|
||||
type: IssueQuery
|
||||
project_id:
|
||||
is_public: true
|
||||
visibility: 2
|
||||
name: Open issues grouped by tracker
|
||||
filters: |
|
||||
---
|
||||
@@ -116,7 +116,7 @@ queries_007:
|
||||
id: 7
|
||||
type: IssueQuery
|
||||
project_id: 2
|
||||
is_public: true
|
||||
visibility: 2
|
||||
name: Public query for project 2
|
||||
filters: |
|
||||
---
|
||||
@@ -131,7 +131,7 @@ queries_008:
|
||||
id: 8
|
||||
type: IssueQuery
|
||||
project_id: 2
|
||||
is_public: false
|
||||
visibility: 0
|
||||
name: Private query for project 2
|
||||
filters: |
|
||||
---
|
||||
@@ -146,7 +146,7 @@ queries_009:
|
||||
id: 9
|
||||
type: IssueQuery
|
||||
project_id:
|
||||
is_public: true
|
||||
visibility: 2
|
||||
name: Open issues grouped by list custom field
|
||||
filters: |
|
||||
---
|
||||
|
||||
@@ -34,7 +34,7 @@ class CalendarsControllerTest < ActionController::TestCase
|
||||
end
|
||||
|
||||
def test_show_should_run_custom_queries
|
||||
@query = IssueQuery.create!(:name => 'Calendar', :is_public => true)
|
||||
@query = IssueQuery.create!(:name => 'Calendar', :visibility => IssueQuery::VISIBILITY_PUBLIC)
|
||||
|
||||
get :show, :query_id => @query.id
|
||||
assert_response :success
|
||||
|
||||
@@ -327,7 +327,7 @@ class IssuesControllerTest < ActionController::TestCase
|
||||
end
|
||||
|
||||
def test_index_with_cross_project_query_in_session_should_show_project_issues
|
||||
q = IssueQuery.create!(:name => "test", :user_id => 2, :is_public => false, :project => nil)
|
||||
q = IssueQuery.create!(:name => "test", :user_id => 2, :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => nil)
|
||||
@request.session[:query] = {:id => q.id, :project_id => 1}
|
||||
|
||||
with_settings :display_subprojects_issues => '0' do
|
||||
@@ -341,7 +341,7 @@ class IssuesControllerTest < ActionController::TestCase
|
||||
end
|
||||
|
||||
def test_private_query_should_not_be_available_to_other_users
|
||||
q = IssueQuery.create!(:name => "private", :user => User.find(2), :is_public => false, :project => nil)
|
||||
q = IssueQuery.create!(:name => "private", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => nil)
|
||||
@request.session[:user_id] = 3
|
||||
|
||||
get :index, :query_id => q.id
|
||||
@@ -349,7 +349,7 @@ class IssuesControllerTest < ActionController::TestCase
|
||||
end
|
||||
|
||||
def test_private_query_should_be_available_to_its_user
|
||||
q = IssueQuery.create!(:name => "private", :user => User.find(2), :is_public => false, :project => nil)
|
||||
q = IssueQuery.create!(:name => "private", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => nil)
|
||||
@request.session[:user_id] = 2
|
||||
|
||||
get :index, :query_id => q.id
|
||||
@@ -357,7 +357,7 @@ class IssuesControllerTest < ActionController::TestCase
|
||||
end
|
||||
|
||||
def test_public_query_should_be_available_to_other_users
|
||||
q = IssueQuery.create!(:name => "private", :user => User.find(2), :is_public => true, :project => nil)
|
||||
q = IssueQuery.create!(:name => "private", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => nil)
|
||||
@request.session[:user_id] = 3
|
||||
|
||||
get :index, :query_id => q.id
|
||||
@@ -1151,7 +1151,7 @@ class IssuesControllerTest < ActionController::TestCase
|
||||
end
|
||||
|
||||
def test_show_should_display_prev_next_links_with_saved_query_in_session
|
||||
query = IssueQuery.create!(:name => 'test', :is_public => true, :user_id => 1,
|
||||
query = IssueQuery.create!(:name => 'test', :visibility => IssueQuery::VISIBILITY_PUBLIC, :user_id => 1,
|
||||
:filters => {'status_id' => {:values => ['5'], :operator => '='}},
|
||||
:sort_criteria => [['id', 'asc']])
|
||||
@request.session[:query] = {:id => query.id, :project_id => nil}
|
||||
@@ -1243,7 +1243,7 @@ class IssuesControllerTest < ActionController::TestCase
|
||||
CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3')
|
||||
CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '')
|
||||
|
||||
query = IssueQuery.create!(:name => 'test', :is_public => true, :user_id => 1, :filters => {},
|
||||
query = IssueQuery.create!(:name => 'test', :visibility => IssueQuery::VISIBILITY_PUBLIC, :user_id => 1, :filters => {},
|
||||
:sort_criteria => [["cf_#{cf.id}", 'asc'], ['id', 'asc']])
|
||||
@request.session[:query] = {:id => query.id, :project_id => nil}
|
||||
|
||||
|
||||
@@ -35,9 +35,7 @@ class QueriesControllerTest < ActionController::TestCase
|
||||
get :new, :project_id => 1
|
||||
assert_response :success
|
||||
assert_template 'new'
|
||||
assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||||
:name => 'query[is_public]',
|
||||
:checked => nil }
|
||||
assert_select 'input[name=?][value=0][checked=checked]', 'query[visibility]'
|
||||
assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||||
:name => 'query_is_for_all',
|
||||
:checked => nil,
|
||||
@@ -53,8 +51,7 @@ class QueriesControllerTest < ActionController::TestCase
|
||||
get :new
|
||||
assert_response :success
|
||||
assert_template 'new'
|
||||
assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||||
:name => 'query[is_public]' }
|
||||
assert_select 'input[name=?]', 'query[visibility]', 0
|
||||
assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||||
:name => 'query_is_for_all',
|
||||
:checked => 'checked',
|
||||
@@ -75,7 +72,7 @@ class QueriesControllerTest < ActionController::TestCase
|
||||
:f => ["status_id", "assigned_to_id"],
|
||||
:op => {"assigned_to_id" => "=", "status_id" => "o"},
|
||||
:v => { "assigned_to_id" => ["1"], "status_id" => ["1"]},
|
||||
:query => {"name" => "test_new_project_public_query", "is_public" => "1"}
|
||||
:query => {"name" => "test_new_project_public_query", "visibility" => "2"}
|
||||
|
||||
q = Query.find_by_name('test_new_project_public_query')
|
||||
assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q
|
||||
@@ -92,7 +89,7 @@ class QueriesControllerTest < ActionController::TestCase
|
||||
:fields => ["status_id", "assigned_to_id"],
|
||||
:operators => {"assigned_to_id" => "=", "status_id" => "o"},
|
||||
:values => { "assigned_to_id" => ["1"], "status_id" => ["1"]},
|
||||
:query => {"name" => "test_new_project_private_query", "is_public" => "1"}
|
||||
:query => {"name" => "test_new_project_private_query", "visibility" => "2"}
|
||||
|
||||
q = Query.find_by_name('test_new_project_private_query')
|
||||
assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q
|
||||
@@ -107,7 +104,7 @@ class QueriesControllerTest < ActionController::TestCase
|
||||
:fields => ["status_id", "assigned_to_id"],
|
||||
:operators => {"assigned_to_id" => "=", "status_id" => "o"},
|
||||
:values => { "assigned_to_id" => ["me"], "status_id" => ["1"]},
|
||||
:query => {"name" => "test_new_global_private_query", "is_public" => "1"},
|
||||
:query => {"name" => "test_new_global_private_query", "visibility" => "2"},
|
||||
:c => ["", "tracker", "subject", "priority", "category"]
|
||||
|
||||
q = Query.find_by_name('test_new_global_private_query')
|
||||
@@ -140,7 +137,7 @@ class QueriesControllerTest < ActionController::TestCase
|
||||
:operators => {"status_id" => "o"},
|
||||
:values => {"status_id" => ["1"]},
|
||||
:query => {:name => "test_new_with_sort",
|
||||
:is_public => "1",
|
||||
:visibility => "2",
|
||||
:sort_criteria => {"0" => ["due_date", "desc"], "1" => ["tracker", ""]}}
|
||||
|
||||
query = Query.find_by_name("test_new_with_sort")
|
||||
@@ -163,9 +160,7 @@ class QueriesControllerTest < ActionController::TestCase
|
||||
get :edit, :id => 4
|
||||
assert_response :success
|
||||
assert_template 'edit'
|
||||
assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||||
:name => 'query[is_public]',
|
||||
:checked => 'checked' }
|
||||
assert_select 'input[name=?][value=2][checked=checked]', 'query[visibility]'
|
||||
assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||||
:name => 'query_is_for_all',
|
||||
:checked => 'checked',
|
||||
@@ -177,8 +172,7 @@ class QueriesControllerTest < ActionController::TestCase
|
||||
get :edit, :id => 3
|
||||
assert_response :success
|
||||
assert_template 'edit'
|
||||
assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||||
:name => 'query[is_public]' }
|
||||
assert_select 'input[name=?]', 'query[visibility]', 0
|
||||
assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||||
:name => 'query_is_for_all',
|
||||
:checked => 'checked',
|
||||
@@ -190,8 +184,7 @@ class QueriesControllerTest < ActionController::TestCase
|
||||
get :edit, :id => 2
|
||||
assert_response :success
|
||||
assert_template 'edit'
|
||||
assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||||
:name => 'query[is_public]' }
|
||||
assert_select 'input[name=?]', 'query[visibility]', 0
|
||||
assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||||
:name => 'query_is_for_all',
|
||||
:checked => nil,
|
||||
@@ -203,10 +196,7 @@ class QueriesControllerTest < ActionController::TestCase
|
||||
get :edit, :id => 1
|
||||
assert_response :success
|
||||
assert_template 'edit'
|
||||
assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||||
:name => 'query[is_public]',
|
||||
:checked => 'checked'
|
||||
}
|
||||
assert_select 'input[name=?][value=2][checked=checked]', 'query[visibility]'
|
||||
assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||||
:name => 'query_is_for_all',
|
||||
:checked => nil,
|
||||
@@ -240,7 +230,7 @@ class QueriesControllerTest < ActionController::TestCase
|
||||
:fields => ["status_id", "assigned_to_id"],
|
||||
:operators => {"assigned_to_id" => "=", "status_id" => "o"},
|
||||
:values => { "assigned_to_id" => ["me"], "status_id" => ["1"]},
|
||||
:query => {"name" => "test_edit_global_private_query", "is_public" => "1"}
|
||||
:query => {"name" => "test_edit_global_private_query", "visibility" => "2"}
|
||||
|
||||
assert_redirected_to :controller => 'issues', :action => 'index', :query_id => 3
|
||||
q = Query.find_by_name('test_edit_global_private_query')
|
||||
@@ -257,7 +247,7 @@ class QueriesControllerTest < ActionController::TestCase
|
||||
:fields => ["status_id", "assigned_to_id"],
|
||||
:operators => {"assigned_to_id" => "=", "status_id" => "o"},
|
||||
:values => { "assigned_to_id" => ["1"], "status_id" => ["1"]},
|
||||
:query => {"name" => "test_edit_global_public_query", "is_public" => "1"}
|
||||
:query => {"name" => "test_edit_global_public_query", "visibility" => "2"}
|
||||
|
||||
assert_redirected_to :controller => 'issues', :action => 'index', :query_id => 4
|
||||
q = Query.find_by_name('test_edit_global_public_query')
|
||||
|
||||
@@ -28,6 +28,24 @@ class QueryTest < ActiveSupport::TestCase
|
||||
:projects_trackers,
|
||||
:custom_fields_trackers
|
||||
|
||||
def test_query_with_roles_visibility_should_validate_roles
|
||||
set_language_if_valid 'en'
|
||||
query = IssueQuery.new(:name => 'Query', :visibility => IssueQuery::VISIBILITY_ROLES)
|
||||
assert !query.save
|
||||
assert_include "Roles can't be blank", query.errors.full_messages
|
||||
query.role_ids = [1, 2]
|
||||
assert query.save
|
||||
end
|
||||
|
||||
def test_changing_roles_visibility_should_clear_roles
|
||||
query = IssueQuery.create!(:name => 'Query', :visibility => IssueQuery::VISIBILITY_ROLES, :role_ids => [1, 2])
|
||||
assert_equal 2, query.roles.count
|
||||
|
||||
query.visibility = IssueQuery::VISIBILITY_PUBLIC
|
||||
query.save!
|
||||
assert_equal 0, query.roles.count
|
||||
end
|
||||
|
||||
def test_available_filters_should_be_ordered
|
||||
set_language_if_valid 'en'
|
||||
query = IssueQuery.new
|
||||
@@ -1089,6 +1107,54 @@ class QueryTest < ActiveSupport::TestCase
|
||||
assert !query_ids.include?(7), 'public query on private project was visible'
|
||||
end
|
||||
|
||||
def test_query_with_public_visibility_should_be_visible_to_anyone
|
||||
q = IssueQuery.create!(:name => 'Query', :visibility => IssueQuery::VISIBILITY_PUBLIC)
|
||||
|
||||
assert q.visible?(User.anonymous)
|
||||
assert IssueQuery.visible(User.anonymous).find_by_id(q.id)
|
||||
|
||||
assert q.visible?(User.find(7))
|
||||
assert IssueQuery.visible(User.find(7)).find_by_id(q.id)
|
||||
|
||||
assert q.visible?(User.find(2))
|
||||
assert IssueQuery.visible(User.find(2)).find_by_id(q.id)
|
||||
|
||||
assert q.visible?(User.find(1))
|
||||
assert IssueQuery.visible(User.find(1)).find_by_id(q.id)
|
||||
end
|
||||
|
||||
def test_query_with_roles_visibility_should_be_visible_to_user_with_role
|
||||
q = IssueQuery.create!(:name => 'Query', :visibility => IssueQuery::VISIBILITY_ROLES, :role_ids => [1,2])
|
||||
|
||||
assert !q.visible?(User.anonymous)
|
||||
assert_nil IssueQuery.visible(User.anonymous).find_by_id(q.id)
|
||||
|
||||
assert !q.visible?(User.find(7))
|
||||
assert_nil IssueQuery.visible(User.find(7)).find_by_id(q.id)
|
||||
|
||||
assert q.visible?(User.find(2))
|
||||
assert IssueQuery.visible(User.find(2)).find_by_id(q.id)
|
||||
|
||||
assert q.visible?(User.find(1))
|
||||
assert IssueQuery.visible(User.find(1)).find_by_id(q.id)
|
||||
end
|
||||
|
||||
def test_query_with_private_visibility_should_be_visible_to_owner
|
||||
q = IssueQuery.create!(:name => 'Query', :visibility => IssueQuery::VISIBILITY_PRIVATE, :user => User.find(7))
|
||||
|
||||
assert !q.visible?(User.anonymous)
|
||||
assert_nil IssueQuery.visible(User.anonymous).find_by_id(q.id)
|
||||
|
||||
assert q.visible?(User.find(7))
|
||||
assert IssueQuery.visible(User.find(7)).find_by_id(q.id)
|
||||
|
||||
assert !q.visible?(User.find(2))
|
||||
assert_nil IssueQuery.visible(User.find(2)).find_by_id(q.id)
|
||||
|
||||
assert q.visible?(User.find(1))
|
||||
assert_nil IssueQuery.visible(User.find(1)).find_by_id(q.id)
|
||||
end
|
||||
|
||||
test "#available_filters should include users of visible projects in cross-project view" do
|
||||
users = IssueQuery.new.available_filters["assigned_to_id"]
|
||||
assert_not_nil users
|
||||
|
||||
@@ -291,7 +291,7 @@ class UserTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
def test_destroy_should_delete_private_queries
|
||||
query = Query.new(:name => 'foo', :is_public => false)
|
||||
query = Query.new(:name => 'foo', :visibility => Query::VISIBILITY_PRIVATE)
|
||||
query.project_id = 1
|
||||
query.user_id = 2
|
||||
query.save!
|
||||
@@ -302,7 +302,7 @@ class UserTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
def test_destroy_should_update_public_queries
|
||||
query = Query.new(:name => 'foo', :is_public => true)
|
||||
query = Query.new(:name => 'foo', :visibility => Query::VISIBILITY_PUBLIC)
|
||||
query.project_id = 1
|
||||
query.user_id = 2
|
||||
query.save!
|
||||
|
||||
Reference in New Issue
Block a user