annotate .svn/pristine/ca/ca9a94f4269bc05500b823a9f42b210c9322360b.svn-base @ 1384:b51b5ae3734c luisf

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