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.

queries_controller_test.rb 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. # Redmine - project management software
  2. # Copyright (C) 2006-2015 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 QueriesControllerTest < ActionController::TestCase
  19. fixtures :projects, :users, :members, :member_roles, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values, :queries, :enabled_modules
  20. def setup
  21. User.current = nil
  22. end
  23. def test_index
  24. get :index
  25. # HTML response not implemented
  26. assert_response 406
  27. end
  28. def test_new_project_query
  29. @request.session[:user_id] = 2
  30. get :new, :project_id => 1
  31. assert_response :success
  32. assert_template 'new'
  33. assert_select 'input[name=?][value="0"][checked=checked]', 'query[visibility]'
  34. assert_select 'input[name=query_is_for_all][type=checkbox]:not([checked]):not([disabled])'
  35. assert_select 'select[name=?]', 'c[]' do
  36. assert_select 'option[value=tracker]'
  37. assert_select 'option[value=subject]'
  38. end
  39. end
  40. def test_new_global_query
  41. @request.session[:user_id] = 2
  42. get :new
  43. assert_response :success
  44. assert_template 'new'
  45. assert_select 'input[name=?]', 'query[visibility]', 0
  46. assert_select 'input[name=query_is_for_all][type=checkbox][checked]:not([disabled])'
  47. end
  48. def test_new_on_invalid_project
  49. @request.session[:user_id] = 2
  50. get :new, :project_id => 'invalid'
  51. assert_response 404
  52. end
  53. def test_create_project_public_query
  54. @request.session[:user_id] = 2
  55. post :create,
  56. :project_id => 'ecookbook',
  57. :default_columns => '1',
  58. :f => ["status_id", "assigned_to_id"],
  59. :op => {"assigned_to_id" => "=", "status_id" => "o"},
  60. :v => { "assigned_to_id" => ["1"], "status_id" => ["1"]},
  61. :query => {"name" => "test_new_project_public_query", "visibility" => "2"}
  62. q = Query.find_by_name('test_new_project_public_query')
  63. assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q
  64. assert q.is_public?
  65. assert q.has_default_columns?
  66. assert q.valid?
  67. end
  68. def test_create_project_private_query
  69. @request.session[:user_id] = 3
  70. post :create,
  71. :project_id => 'ecookbook',
  72. :default_columns => '1',
  73. :fields => ["status_id", "assigned_to_id"],
  74. :operators => {"assigned_to_id" => "=", "status_id" => "o"},
  75. :values => { "assigned_to_id" => ["1"], "status_id" => ["1"]},
  76. :query => {"name" => "test_new_project_private_query", "visibility" => "0"}
  77. q = Query.find_by_name('test_new_project_private_query')
  78. assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q
  79. assert !q.is_public?
  80. assert q.has_default_columns?
  81. assert q.valid?
  82. end
  83. def test_create_project_roles_query
  84. @request.session[:user_id] = 2
  85. post :create,
  86. :project_id => 'ecookbook',
  87. :default_columns => '1',
  88. :fields => ["status_id", "assigned_to_id"],
  89. :operators => {"assigned_to_id" => "=", "status_id" => "o"},
  90. :values => { "assigned_to_id" => ["1"], "status_id" => ["1"]},
  91. :query => {"name" => "test_create_project_roles_query", "visibility" => "1", "role_ids" => ["1", "2", ""]}
  92. q = Query.find_by_name('test_create_project_roles_query')
  93. assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q
  94. assert_equal Query::VISIBILITY_ROLES, q.visibility
  95. assert_equal [1, 2], q.roles.ids.sort
  96. end
  97. def test_create_global_private_query_with_custom_columns
  98. @request.session[:user_id] = 3
  99. post :create,
  100. :fields => ["status_id", "assigned_to_id"],
  101. :operators => {"assigned_to_id" => "=", "status_id" => "o"},
  102. :values => { "assigned_to_id" => ["me"], "status_id" => ["1"]},
  103. :query => {"name" => "test_new_global_private_query", "visibility" => "0"},
  104. :c => ["", "tracker", "subject", "priority", "category"]
  105. q = Query.find_by_name('test_new_global_private_query')
  106. assert_redirected_to :controller => 'issues', :action => 'index', :project_id => nil, :query_id => q
  107. assert !q.is_public?
  108. assert !q.has_default_columns?
  109. assert_equal [:id, :tracker, :subject, :priority, :category], q.columns.collect {|c| c.name}
  110. assert q.valid?
  111. end
  112. def test_create_global_query_with_custom_filters
  113. @request.session[:user_id] = 3
  114. post :create,
  115. :fields => ["assigned_to_id"],
  116. :operators => {"assigned_to_id" => "="},
  117. :values => { "assigned_to_id" => ["me"]},
  118. :query => {"name" => "test_new_global_query"}
  119. q = Query.find_by_name('test_new_global_query')
  120. assert_redirected_to :controller => 'issues', :action => 'index', :project_id => nil, :query_id => q
  121. assert !q.is_public?
  122. assert !q.has_filter?(:status_id)
  123. assert_equal ['assigned_to_id'], q.filters.keys
  124. assert q.valid?
  125. end
  126. def test_create_with_sort
  127. @request.session[:user_id] = 1
  128. post :create,
  129. :default_columns => '1',
  130. :operators => {"status_id" => "o"},
  131. :values => {"status_id" => ["1"]},
  132. :query => {:name => "test_new_with_sort",
  133. :visibility => "2",
  134. :sort_criteria => {"0" => ["due_date", "desc"], "1" => ["tracker", ""]}}
  135. query = Query.find_by_name("test_new_with_sort")
  136. assert_not_nil query
  137. assert_equal [['due_date', 'desc'], ['tracker', 'asc']], query.sort_criteria
  138. end
  139. def test_create_with_failure
  140. @request.session[:user_id] = 2
  141. assert_no_difference '::Query.count' do
  142. post :create, :project_id => 'ecookbook', :query => {:name => ''}
  143. end
  144. assert_response :success
  145. assert_template 'new'
  146. assert_select 'input[name=?]', 'query[name]'
  147. end
  148. def test_create_global_query_from_gantt
  149. @request.session[:user_id] = 1
  150. assert_difference 'IssueQuery.count' do
  151. post :create,
  152. :gantt => 1,
  153. :operators => {"status_id" => "o"},
  154. :values => {"status_id" => ["1"]},
  155. :query => {:name => "test_create_from_gantt",
  156. :draw_relations => '1',
  157. :draw_progress_line => '1'}
  158. assert_response 302
  159. end
  160. query = IssueQuery.order('id DESC').first
  161. assert_redirected_to "/issues/gantt?query_id=#{query.id}"
  162. assert_equal true, query.draw_relations
  163. assert_equal true, query.draw_progress_line
  164. end
  165. def test_create_project_query_from_gantt
  166. @request.session[:user_id] = 1
  167. assert_difference 'IssueQuery.count' do
  168. post :create,
  169. :project_id => 'ecookbook',
  170. :gantt => 1,
  171. :operators => {"status_id" => "o"},
  172. :values => {"status_id" => ["1"]},
  173. :query => {:name => "test_create_from_gantt",
  174. :draw_relations => '0',
  175. :draw_progress_line => '0'}
  176. assert_response 302
  177. end
  178. query = IssueQuery.order('id DESC').first
  179. assert_redirected_to "/projects/ecookbook/issues/gantt?query_id=#{query.id}"
  180. assert_equal false, query.draw_relations
  181. assert_equal false, query.draw_progress_line
  182. end
  183. def test_create_project_public_query_should_force_private_without_manage_public_queries_permission
  184. @request.session[:user_id] = 3
  185. query = new_record(Query) do
  186. post :create,
  187. :project_id => 'ecookbook',
  188. :query => {"name" => "name", "visibility" => "2"}
  189. assert_response 302
  190. end
  191. assert_not_nil query.project
  192. assert_equal Query::VISIBILITY_PRIVATE, query.visibility
  193. end
  194. def test_create_global_public_query_should_force_private_without_manage_public_queries_permission
  195. @request.session[:user_id] = 3
  196. query = new_record(Query) do
  197. post :create,
  198. :project_id => 'ecookbook', :query_is_for_all => '1',
  199. :query => {"name" => "name", "visibility" => "2"}
  200. assert_response 302
  201. end
  202. assert_nil query.project
  203. assert_equal Query::VISIBILITY_PRIVATE, query.visibility
  204. end
  205. def test_create_project_public_query_with_manage_public_queries_permission
  206. @request.session[:user_id] = 2
  207. query = new_record(Query) do
  208. post :create,
  209. :project_id => 'ecookbook',
  210. :query => {"name" => "name", "visibility" => "2"}
  211. assert_response 302
  212. end
  213. assert_not_nil query.project
  214. assert_equal Query::VISIBILITY_PUBLIC, query.visibility
  215. end
  216. def test_create_global_public_query_should_force_private_with_manage_public_queries_permission
  217. @request.session[:user_id] = 2
  218. query = new_record(Query) do
  219. post :create,
  220. :project_id => 'ecookbook', :query_is_for_all => '1',
  221. :query => {"name" => "name", "visibility" => "2"}
  222. assert_response 302
  223. end
  224. assert_nil query.project
  225. assert_equal Query::VISIBILITY_PRIVATE, query.visibility
  226. end
  227. def test_create_global_public_query_by_admin
  228. @request.session[:user_id] = 1
  229. query = new_record(Query) do
  230. post :create,
  231. :project_id => 'ecookbook', :query_is_for_all => '1',
  232. :query => {"name" => "name", "visibility" => "2"}
  233. assert_response 302
  234. end
  235. assert_nil query.project
  236. assert_equal Query::VISIBILITY_PUBLIC, query.visibility
  237. end
  238. def test_edit_global_public_query
  239. @request.session[:user_id] = 1
  240. get :edit, :id => 4
  241. assert_response :success
  242. assert_template 'edit'
  243. assert_select 'input[name=?][value="2"][checked=checked]', 'query[visibility]'
  244. assert_select 'input[name=query_is_for_all][type=checkbox][checked=checked]'
  245. end
  246. def test_edit_global_private_query
  247. @request.session[:user_id] = 3
  248. get :edit, :id => 3
  249. assert_response :success
  250. assert_template 'edit'
  251. assert_select 'input[name=?]', 'query[visibility]', 0
  252. assert_select 'input[name=query_is_for_all][type=checkbox][checked=checked]'
  253. end
  254. def test_edit_project_private_query
  255. @request.session[:user_id] = 3
  256. get :edit, :id => 2
  257. assert_response :success
  258. assert_template 'edit'
  259. assert_select 'input[name=?]', 'query[visibility]', 0
  260. assert_select 'input[name=query_is_for_all][type=checkbox]:not([checked])'
  261. end
  262. def test_edit_project_public_query
  263. @request.session[:user_id] = 2
  264. get :edit, :id => 1
  265. assert_response :success
  266. assert_template 'edit'
  267. assert_select 'input[name=?][value="2"][checked=checked]', 'query[visibility]'
  268. assert_select 'input[name=query_is_for_all][type=checkbox]:not([checked])'
  269. end
  270. def test_edit_sort_criteria
  271. @request.session[:user_id] = 1
  272. get :edit, :id => 5
  273. assert_response :success
  274. assert_template 'edit'
  275. assert_select 'select[name=?]', 'query[sort_criteria][0][]' do
  276. assert_select 'option[value=priority][selected=selected]'
  277. assert_select 'option[value=desc][selected=selected]'
  278. end
  279. end
  280. def test_edit_invalid_query
  281. @request.session[:user_id] = 2
  282. get :edit, :id => 99
  283. assert_response 404
  284. end
  285. def test_udpate_global_private_query
  286. @request.session[:user_id] = 3
  287. put :update,
  288. :id => 3,
  289. :default_columns => '1',
  290. :fields => ["status_id", "assigned_to_id"],
  291. :operators => {"assigned_to_id" => "=", "status_id" => "o"},
  292. :values => { "assigned_to_id" => ["me"], "status_id" => ["1"]},
  293. :query => {"name" => "test_edit_global_private_query", "visibility" => "2"}
  294. assert_redirected_to :controller => 'issues', :action => 'index', :query_id => 3
  295. q = Query.find_by_name('test_edit_global_private_query')
  296. assert !q.is_public?
  297. assert q.has_default_columns?
  298. assert q.valid?
  299. end
  300. def test_update_global_public_query
  301. @request.session[:user_id] = 1
  302. put :update,
  303. :id => 4,
  304. :default_columns => '1',
  305. :fields => ["status_id", "assigned_to_id"],
  306. :operators => {"assigned_to_id" => "=", "status_id" => "o"},
  307. :values => { "assigned_to_id" => ["1"], "status_id" => ["1"]},
  308. :query => {"name" => "test_edit_global_public_query", "visibility" => "2"}
  309. assert_redirected_to :controller => 'issues', :action => 'index', :query_id => 4
  310. q = Query.find_by_name('test_edit_global_public_query')
  311. assert q.is_public?
  312. assert q.has_default_columns?
  313. assert q.valid?
  314. end
  315. def test_update_with_failure
  316. @request.session[:user_id] = 1
  317. put :update, :id => 4, :query => {:name => ''}
  318. assert_response :success
  319. assert_template 'edit'
  320. end
  321. def test_destroy
  322. @request.session[:user_id] = 2
  323. delete :destroy, :id => 1
  324. assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :set_filter => 1, :query_id => nil
  325. assert_nil Query.find_by_id(1)
  326. end
  327. def test_backslash_should_be_escaped_in_filters
  328. @request.session[:user_id] = 2
  329. get :new, :subject => 'foo/bar'
  330. assert_response :success
  331. assert_template 'new'
  332. assert_include 'addFilter("subject", "=", ["foo\/bar"]);', response.body
  333. end
  334. end