annotate test/functional/search_controller_test.rb @ 1480:75fd8eace091 issue_556

Close obsolete branch issue_556
author Chris Cannam
date Sat, 13 Jul 2013 15:26:30 +0100
parents 433d4f72a19b
children 622f24f53b42
rev   line source
Chris@119 1 require File.expand_path('../../test_helper', __FILE__)
Chris@0 2 require 'search_controller'
Chris@0 3
Chris@0 4 # Re-raise errors caught by the controller.
Chris@0 5 class SearchController; def rescue_action(e) raise e end; end
Chris@0 6
Chris@0 7 class SearchControllerTest < ActionController::TestCase
Chris@0 8 fixtures :projects, :enabled_modules, :roles, :users, :members, :member_roles,
Chris@1115 9 :issues, :trackers, :issue_statuses, :enumerations,
Chris@0 10 :custom_fields, :custom_values,
Chris@0 11 :repositories, :changesets
Chris@441 12
Chris@0 13 def setup
Chris@0 14 @controller = SearchController.new
Chris@0 15 @request = ActionController::TestRequest.new
Chris@0 16 @response = ActionController::TestResponse.new
Chris@0 17 User.current = nil
Chris@0 18 end
Chris@441 19
Chris@0 20 def test_search_for_projects
Chris@0 21 get :index
Chris@0 22 assert_response :success
Chris@0 23 assert_template 'index'
Chris@0 24
Chris@0 25 get :index, :q => "cook"
Chris@0 26 assert_response :success
Chris@0 27 assert_template 'index'
Chris@0 28 assert assigns(:results).include?(Project.find(1))
Chris@0 29 end
Chris@441 30
Chris@0 31 def test_search_all_projects
Chris@507 32 get :index, :q => 'recipe subproject commit', :all_words => ''
Chris@0 33 assert_response :success
Chris@0 34 assert_template 'index'
Chris@441 35
Chris@0 36 assert assigns(:results).include?(Issue.find(2))
Chris@0 37 assert assigns(:results).include?(Issue.find(5))
Chris@0 38 assert assigns(:results).include?(Changeset.find(101))
Chris@0 39 assert_tag :dt, :attributes => { :class => /issue/ },
Chris@0 40 :child => { :tag => 'a', :content => /Add ingredients categories/ },
Chris@0 41 :sibling => { :tag => 'dd', :content => /should be classified by categories/ }
Chris@441 42
Chris@0 43 assert assigns(:results_by_type).is_a?(Hash)
Chris@0 44 assert_equal 5, assigns(:results_by_type)['changesets']
Chris@0 45 assert_tag :a, :content => 'Changesets (5)'
Chris@0 46 end
Chris@441 47
Chris@0 48 def test_search_issues
Chris@0 49 get :index, :q => 'issue', :issues => 1
Chris@0 50 assert_response :success
Chris@0 51 assert_template 'index'
Chris@441 52
Chris@507 53 assert_equal true, assigns(:all_words)
Chris@507 54 assert_equal false, assigns(:titles_only)
Chris@0 55 assert assigns(:results).include?(Issue.find(8))
Chris@0 56 assert assigns(:results).include?(Issue.find(5))
Chris@0 57 assert_tag :dt, :attributes => { :class => /issue closed/ },
Chris@0 58 :child => { :tag => 'a', :content => /Closed/ }
Chris@0 59 end
Chris@441 60
Chris@1115 61 def test_search_issues_should_search_notes
Chris@1115 62 Journal.create!(:journalized => Issue.find(2), :notes => 'Issue notes with searchkeyword')
Chris@1115 63
Chris@1115 64 get :index, :q => 'searchkeyword', :issues => 1
Chris@1115 65 assert_response :success
Chris@1115 66 assert_include Issue.find(2), assigns(:results)
Chris@1115 67 end
Chris@1115 68
Chris@1115 69 def test_search_issues_with_multiple_matches_in_journals_should_return_issue_once
Chris@1115 70 Journal.create!(:journalized => Issue.find(2), :notes => 'Issue notes with searchkeyword')
Chris@1115 71 Journal.create!(:journalized => Issue.find(2), :notes => 'Issue notes with searchkeyword')
Chris@1115 72
Chris@1115 73 get :index, :q => 'searchkeyword', :issues => 1
Chris@1115 74 assert_response :success
Chris@1115 75 assert_include Issue.find(2), assigns(:results)
Chris@1115 76 assert_equal 1, assigns(:results).size
Chris@1115 77 end
Chris@1115 78
Chris@1115 79 def test_search_issues_should_search_private_notes_with_permission_only
Chris@1115 80 Journal.create!(:journalized => Issue.find(2), :notes => 'Private notes with searchkeyword', :private_notes => true)
Chris@1115 81 @request.session[:user_id] = 2
Chris@1115 82
Chris@1115 83 Role.find(1).add_permission! :view_private_notes
Chris@1115 84 get :index, :q => 'searchkeyword', :issues => 1
Chris@1115 85 assert_response :success
Chris@1115 86 assert_include Issue.find(2), assigns(:results)
Chris@1115 87
Chris@1115 88 Role.find(1).remove_permission! :view_private_notes
Chris@1115 89 get :index, :q => 'searchkeyword', :issues => 1
Chris@1115 90 assert_response :success
Chris@1115 91 assert_not_include Issue.find(2), assigns(:results)
Chris@1115 92 end
Chris@1115 93
Chris@1115 94 def test_search_all_projects_with_scope_param
Chris@1115 95 get :index, :q => 'issue', :scope => 'all'
Chris@1115 96 assert_response :success
Chris@1115 97 assert_template 'index'
Chris@1115 98 assert assigns(:results).present?
Chris@1115 99 end
Chris@1115 100
Chris@1115 101 def test_search_my_projects
Chris@1115 102 @request.session[:user_id] = 2
Chris@1115 103 get :index, :id => 1, :q => 'recipe subproject', :scope => 'my_projects', :all_words => ''
Chris@1115 104 assert_response :success
Chris@1115 105 assert_template 'index'
Chris@1115 106 assert assigns(:results).include?(Issue.find(1))
Chris@1115 107 assert !assigns(:results).include?(Issue.find(5))
Chris@1115 108 end
Chris@1115 109
Chris@1115 110 def test_search_my_projects_without_memberships
Chris@1115 111 # anonymous user has no memberships
Chris@1115 112 get :index, :id => 1, :q => 'recipe subproject', :scope => 'my_projects', :all_words => ''
Chris@1115 113 assert_response :success
Chris@1115 114 assert_template 'index'
Chris@1115 115 assert assigns(:results).empty?
Chris@1115 116 end
Chris@1115 117
Chris@0 118 def test_search_project_and_subprojects
Chris@507 119 get :index, :id => 1, :q => 'recipe subproject', :scope => 'subprojects', :all_words => ''
Chris@0 120 assert_response :success
Chris@0 121 assert_template 'index'
Chris@0 122 assert assigns(:results).include?(Issue.find(1))
Chris@0 123 assert assigns(:results).include?(Issue.find(5))
Chris@0 124 end
Chris@0 125
Chris@0 126 def test_search_without_searchable_custom_fields
Chris@0 127 CustomField.update_all "searchable = #{ActiveRecord::Base.connection.quoted_false}"
Chris@441 128
Chris@0 129 get :index, :id => 1
Chris@0 130 assert_response :success
Chris@0 131 assert_template 'index'
Chris@0 132 assert_not_nil assigns(:project)
Chris@441 133
Chris@0 134 get :index, :id => 1, :q => "can"
Chris@0 135 assert_response :success
Chris@0 136 assert_template 'index'
Chris@0 137 end
Chris@441 138
Chris@0 139 def test_search_with_searchable_custom_fields
Chris@0 140 get :index, :id => 1, :q => "stringforcustomfield"
Chris@0 141 assert_response :success
Chris@0 142 results = assigns(:results)
Chris@0 143 assert_not_nil results
Chris@0 144 assert_equal 1, results.size
Chris@119 145 assert results.include?(Issue.find(7))
Chris@0 146 end
Chris@441 147
Chris@0 148 def test_search_all_words
Chris@0 149 # 'all words' is on by default
Chris@507 150 get :index, :id => 1, :q => 'recipe updating saving', :all_words => '1'
Chris@507 151 assert_equal true, assigns(:all_words)
Chris@0 152 results = assigns(:results)
Chris@0 153 assert_not_nil results
Chris@0 154 assert_equal 1, results.size
Chris@0 155 assert results.include?(Issue.find(3))
Chris@0 156 end
Chris@441 157
Chris@0 158 def test_search_one_of_the_words
Chris@507 159 get :index, :id => 1, :q => 'recipe updating saving', :all_words => ''
Chris@507 160 assert_equal false, assigns(:all_words)
Chris@0 161 results = assigns(:results)
Chris@0 162 assert_not_nil results
Chris@0 163 assert_equal 3, results.size
Chris@0 164 assert results.include?(Issue.find(3))
Chris@0 165 end
Chris@0 166
Chris@0 167 def test_search_titles_only_without_result
Chris@507 168 get :index, :id => 1, :q => 'recipe updating saving', :titles_only => '1'
Chris@0 169 results = assigns(:results)
Chris@0 170 assert_not_nil results
Chris@0 171 assert_equal 0, results.size
Chris@0 172 end
Chris@0 173
Chris@0 174 def test_search_titles_only
Chris@507 175 get :index, :id => 1, :q => 'recipe', :titles_only => '1'
Chris@507 176 assert_equal true, assigns(:titles_only)
Chris@0 177 results = assigns(:results)
Chris@0 178 assert_not_nil results
Chris@0 179 assert_equal 2, results.size
Chris@0 180 end
Chris@441 181
Chris@507 182 def test_search_content
Chris@507 183 Issue.update_all("description = 'This is a searchkeywordinthecontent'", "id=1")
Chris@909 184
Chris@507 185 get :index, :id => 1, :q => 'searchkeywordinthecontent', :titles_only => ''
Chris@507 186 assert_equal false, assigns(:titles_only)
Chris@507 187 results = assigns(:results)
Chris@507 188 assert_not_nil results
Chris@507 189 assert_equal 1, results.size
Chris@507 190 end
Chris@507 191
Chris@1115 192 def test_search_with_offset
Chris@1115 193 get :index, :q => 'coo', :offset => '20080806073000'
Chris@1115 194 assert_response :success
Chris@1115 195 results = assigns(:results)
Chris@1115 196 assert results.any?
Chris@1115 197 assert results.map(&:event_datetime).max < '20080806T073000'.to_time
Chris@1115 198 end
Chris@1115 199
Chris@1115 200 def test_search_previous_with_offset
Chris@1115 201 get :index, :q => 'coo', :offset => '20080806073000', :previous => '1'
Chris@1115 202 assert_response :success
Chris@1115 203 results = assigns(:results)
Chris@1115 204 assert results.any?
Chris@1115 205 assert results.map(&:event_datetime).min >= '20080806T073000'.to_time
Chris@1115 206 end
Chris@1115 207
Chris@0 208 def test_search_with_invalid_project_id
Chris@0 209 get :index, :id => 195, :q => 'recipe'
Chris@0 210 assert_response 404
Chris@0 211 assert_nil assigns(:results)
Chris@0 212 end
Chris@0 213
Chris@0 214 def test_quick_jump_to_issue
Chris@0 215 # issue of a public project
Chris@0 216 get :index, :q => "3"
chris@37 217 assert_redirected_to '/issues/3'
Chris@441 218
Chris@0 219 # issue of a private project
Chris@0 220 get :index, :q => "4"
Chris@0 221 assert_response :success
Chris@0 222 assert_template 'index'
Chris@0 223 end
Chris@0 224
Chris@0 225 def test_large_integer
Chris@0 226 get :index, :q => '4615713488'
Chris@0 227 assert_response :success
Chris@0 228 assert_template 'index'
Chris@0 229 end
Chris@441 230
Chris@0 231 def test_tokens_with_quotes
Chris@0 232 get :index, :id => 1, :q => '"good bye" hello "bye bye"'
Chris@0 233 assert_equal ["good bye", "hello", "bye bye"], assigns(:tokens)
Chris@0 234 end
Chris@1115 235
Chris@1115 236 def test_results_should_be_escaped_once
Chris@1115 237 assert Issue.find(1).update_attributes(:subject => '<subject> escaped_once', :description => '<description> escaped_once')
Chris@1115 238 get :index, :q => 'escaped_once'
Chris@1115 239 assert_response :success
Chris@1115 240 assert_select '#search-results' do
Chris@1115 241 assert_select 'dt.issue a', :text => /&lt;subject&gt;/
Chris@1115 242 assert_select 'dd', :text => /&lt;description&gt;/
Chris@1115 243 end
Chris@1115 244 end
Chris@1115 245
Chris@1115 246 def test_keywords_should_be_highlighted
Chris@1115 247 assert Issue.find(1).update_attributes(:subject => 'subject highlighted', :description => 'description highlighted')
Chris@1115 248 get :index, :q => 'highlighted'
Chris@1115 249 assert_response :success
Chris@1115 250 assert_select '#search-results' do
Chris@1115 251 assert_select 'dt.issue a span.highlight', :text => 'highlighted'
Chris@1115 252 assert_select 'dd span.highlight', :text => 'highlighted'
Chris@1115 253 end
Chris@1115 254 end
Chris@0 255 end