annotate test/functional/projects_controller_test.rb @ 1082:997f6d7738f7 bug_531

In repo controller entry action, show the page for the file even if it's binary (so user still has access to history etc links). This makes it possible to use the entry action as the default when a file is clicked on
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Thu, 22 Nov 2012 18:04:17 +0000
parents cbb26bc654de
children 433d4f72a19b
rev   line source
Chris@0 1 # Redmine - project management software
Chris@441 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
Chris@0 3 #
Chris@0 4 # This program is free software; you can redistribute it and/or
Chris@0 5 # modify it under the terms of the GNU General Public License
Chris@0 6 # as published by the Free Software Foundation; either version 2
Chris@0 7 # of the License, or (at your option) any later version.
Chris@441 8 #
Chris@0 9 # This program is distributed in the hope that it will be useful,
Chris@0 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 # GNU General Public License for more details.
Chris@441 13 #
Chris@0 14 # You should have received a copy of the GNU General Public License
Chris@0 15 # along with this program; if not, write to the Free Software
Chris@0 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Chris@0 17
Chris@119 18 require File.expand_path('../../test_helper', __FILE__)
Chris@0 19 require 'projects_controller'
Chris@0 20
Chris@0 21 # Re-raise errors caught by the controller.
Chris@0 22 class ProjectsController; def rescue_action(e) raise e end; end
Chris@0 23
Chris@0 24 class ProjectsControllerTest < ActionController::TestCase
Chris@0 25 fixtures :projects, :versions, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details,
Chris@0 26 :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages,
Chris@0 27 :attachments, :custom_fields, :custom_values, :time_entries
Chris@0 28
Chris@0 29 def setup
Chris@0 30 @controller = ProjectsController.new
Chris@0 31 @request = ActionController::TestRequest.new
Chris@0 32 @response = ActionController::TestResponse.new
Chris@0 33 @request.session[:user_id] = nil
Chris@0 34 Setting.default_language = 'en'
Chris@0 35 end
Chris@441 36
Chris@0 37 def test_index
Chris@0 38 get :index
Chris@0 39 assert_response :success
Chris@0 40 assert_template 'index'
Chris@0 41 assert_not_nil assigns(:projects)
Chris@441 42
Chris@0 43 assert_tag :ul, :child => {:tag => 'li',
Chris@0 44 :descendant => {:tag => 'a', :content => 'eCookbook'},
Chris@0 45 :child => { :tag => 'ul',
Chris@0 46 :descendant => { :tag => 'a',
Chris@0 47 :content => 'Child of private child'
Chris@0 48 }
Chris@0 49 }
Chris@0 50 }
Chris@441 51
Chris@0 52 assert_no_tag :a, :content => /Private child of eCookbook/
Chris@0 53 end
Chris@441 54
Chris@0 55 def test_index_atom
Chris@0 56 get :index, :format => 'atom'
Chris@0 57 assert_response :success
Chris@909 58 assert_template 'common/feed.atom'
Chris@0 59 assert_select 'feed>title', :text => 'Redmine: Latest projects'
Chris@441 60 assert_select 'feed>entry', :count => Project.count(:conditions => Project.visible_condition(User.current))
Chris@0 61 end
Chris@441 62
Chris@0 63 context "#index" do
Chris@0 64 context "by non-admin user with view_time_entries permission" do
Chris@0 65 setup do
Chris@0 66 @request.session[:user_id] = 3
Chris@0 67 end
Chris@0 68 should "show overall spent time link" do
Chris@0 69 get :index
Chris@0 70 assert_template 'index'
Chris@0 71 assert_tag :a, :attributes => {:href => '/time_entries'}
Chris@0 72 end
Chris@0 73 end
Chris@441 74
Chris@0 75 context "by non-admin user without view_time_entries permission" do
Chris@0 76 setup do
Chris@0 77 Role.find(2).remove_permission! :view_time_entries
Chris@0 78 Role.non_member.remove_permission! :view_time_entries
Chris@0 79 Role.anonymous.remove_permission! :view_time_entries
Chris@0 80 @request.session[:user_id] = 3
Chris@0 81 end
Chris@0 82 should "not show overall spent time link" do
Chris@0 83 get :index
Chris@0 84 assert_template 'index'
Chris@0 85 assert_no_tag :a, :attributes => {:href => '/time_entries'}
Chris@0 86 end
Chris@441 87 end
Chris@0 88 end
Chris@441 89
chris@22 90 context "#new" do
Chris@0 91 context "by admin user" do
Chris@0 92 setup do
Chris@0 93 @request.session[:user_id] = 1
Chris@0 94 end
Chris@441 95
Chris@0 96 should "accept get" do
chris@22 97 get :new
Chris@0 98 assert_response :success
chris@22 99 assert_template 'new'
chris@22 100 end
chris@22 101
chris@22 102 end
chris@22 103
chris@22 104 context "by non-admin user with add_project permission" do
chris@22 105 setup do
chris@22 106 Role.non_member.add_permission! :add_project
chris@22 107 @request.session[:user_id] = 9
chris@22 108 end
chris@22 109
chris@22 110 should "accept get" do
chris@22 111 get :new
chris@22 112 assert_response :success
chris@22 113 assert_template 'new'
chris@22 114 assert_no_tag :select, :attributes => {:name => 'project[parent_id]'}
chris@22 115 end
chris@22 116 end
chris@22 117
chris@22 118 context "by non-admin user with add_subprojects permission" do
chris@22 119 setup do
chris@22 120 Role.find(1).remove_permission! :add_project
chris@22 121 Role.find(1).add_permission! :add_subprojects
chris@22 122 @request.session[:user_id] = 2
Chris@0 123 end
Chris@441 124
chris@22 125 should "accept get" do
chris@22 126 get :new, :parent_id => 'ecookbook'
chris@22 127 assert_response :success
chris@22 128 assert_template 'new'
chris@22 129 # parent project selected
chris@22 130 assert_tag :select, :attributes => {:name => 'project[parent_id]'},
chris@22 131 :child => {:tag => 'option', :attributes => {:value => '1', :selected => 'selected'}}
chris@22 132 # no empty value
chris@22 133 assert_no_tag :select, :attributes => {:name => 'project[parent_id]'},
chris@22 134 :child => {:tag => 'option', :attributes => {:value => ''}}
chris@22 135 end
chris@22 136 end
Chris@441 137
chris@22 138 end
chris@22 139
chris@22 140 context "POST :create" do
chris@22 141 context "by admin user" do
chris@22 142 setup do
chris@22 143 @request.session[:user_id] = 1
chris@22 144 end
Chris@441 145
chris@22 146 should "create a new project" do
Chris@119 147 post :create,
Chris@119 148 :project => {
Chris@441 149 :name => "blog",
Chris@119 150 :description => "weblog",
Chris@119 151 :homepage => 'http://weblog',
Chris@119 152 :identifier => "blog",
Chris@119 153 :is_public => 1,
Chris@119 154 :custom_field_values => { '3' => 'Beta' },
Chris@119 155 :tracker_ids => ['1', '3'],
Chris@119 156 # an issue custom field that is not for all project
Chris@119 157 :issue_custom_field_ids => ['9'],
Chris@119 158 :enabled_module_names => ['issue_tracking', 'news', 'repository']
Chris@119 159 }
Chris@0 160 assert_redirected_to '/projects/blog/settings'
Chris@441 161
Chris@0 162 project = Project.find_by_name('blog')
Chris@0 163 assert_kind_of Project, project
Chris@119 164 assert project.active?
Chris@441 165 assert_equal 'weblog', project.description
Chris@119 166 assert_equal 'http://weblog', project.homepage
Chris@0 167 assert_equal true, project.is_public?
Chris@0 168 assert_nil project.parent
Chris@119 169 assert_equal 'Beta', project.custom_value_for(3).value
Chris@119 170 assert_equal [1, 3], project.trackers.map(&:id).sort
Chris@119 171 assert_equal ['issue_tracking', 'news', 'repository'], project.enabled_module_names.sort
Chris@119 172 assert project.issue_custom_fields.include?(IssueCustomField.find(9))
Chris@0 173 end
Chris@441 174
chris@22 175 should "create a new subproject" do
Chris@441 176 post :create, :project => { :name => "blog",
Chris@0 177 :description => "weblog",
Chris@0 178 :identifier => "blog",
Chris@0 179 :is_public => 1,
Chris@0 180 :custom_field_values => { '3' => 'Beta' },
Chris@0 181 :parent_id => 1
Chris@0 182 }
Chris@0 183 assert_redirected_to '/projects/blog/settings'
Chris@441 184
Chris@0 185 project = Project.find_by_name('blog')
Chris@0 186 assert_kind_of Project, project
Chris@0 187 assert_equal Project.find(1), project.parent
Chris@0 188 end
Chris@909 189
Chris@909 190 should "continue" do
Chris@909 191 assert_difference 'Project.count' do
Chris@909 192 post :create, :project => {:name => "blog", :identifier => "blog"}, :continue => 'Create and continue'
Chris@909 193 end
Chris@909 194 assert_redirected_to '/projects/new?'
Chris@909 195 end
Chris@0 196 end
Chris@441 197
Chris@0 198 context "by non-admin user with add_project permission" do
Chris@0 199 setup do
Chris@0 200 Role.non_member.add_permission! :add_project
Chris@0 201 @request.session[:user_id] = 9
Chris@0 202 end
Chris@441 203
chris@22 204 should "accept create a Project" do
Chris@441 205 post :create, :project => { :name => "blog",
Chris@0 206 :description => "weblog",
Chris@0 207 :identifier => "blog",
Chris@0 208 :is_public => 1,
Chris@119 209 :custom_field_values => { '3' => 'Beta' },
Chris@119 210 :tracker_ids => ['1', '3'],
Chris@119 211 :enabled_module_names => ['issue_tracking', 'news', 'repository']
Chris@0 212 }
Chris@441 213
Chris@0 214 assert_redirected_to '/projects/blog/settings'
Chris@441 215
Chris@0 216 project = Project.find_by_name('blog')
Chris@0 217 assert_kind_of Project, project
Chris@441 218 assert_equal 'weblog', project.description
Chris@0 219 assert_equal true, project.is_public?
Chris@119 220 assert_equal [1, 3], project.trackers.map(&:id).sort
Chris@119 221 assert_equal ['issue_tracking', 'news', 'repository'], project.enabled_module_names.sort
Chris@441 222
Chris@0 223 # User should be added as a project member
Chris@0 224 assert User.find(9).member_of?(project)
Chris@0 225 assert_equal 1, project.members.size
Chris@0 226 end
Chris@441 227
Chris@0 228 should "fail with parent_id" do
Chris@0 229 assert_no_difference 'Project.count' do
Chris@441 230 post :create, :project => { :name => "blog",
Chris@0 231 :description => "weblog",
Chris@0 232 :identifier => "blog",
Chris@0 233 :is_public => 1,
Chris@0 234 :custom_field_values => { '3' => 'Beta' },
Chris@0 235 :parent_id => 1
Chris@0 236 }
Chris@0 237 end
Chris@0 238 assert_response :success
Chris@0 239 project = assigns(:project)
Chris@0 240 assert_kind_of Project, project
Chris@909 241 assert_not_nil project.errors[:parent_id]
Chris@0 242 end
Chris@0 243 end
Chris@441 244
Chris@0 245 context "by non-admin user with add_subprojects permission" do
Chris@0 246 setup do
Chris@0 247 Role.find(1).remove_permission! :add_project
Chris@0 248 Role.find(1).add_permission! :add_subprojects
Chris@0 249 @request.session[:user_id] = 2
Chris@0 250 end
Chris@441 251
chris@22 252 should "create a project with a parent_id" do
Chris@441 253 post :create, :project => { :name => "blog",
Chris@0 254 :description => "weblog",
Chris@0 255 :identifier => "blog",
Chris@0 256 :is_public => 1,
Chris@0 257 :custom_field_values => { '3' => 'Beta' },
Chris@0 258 :parent_id => 1
Chris@0 259 }
Chris@0 260 assert_redirected_to '/projects/blog/settings'
Chris@0 261 project = Project.find_by_name('blog')
Chris@0 262 end
Chris@441 263
Chris@0 264 should "fail without parent_id" do
Chris@0 265 assert_no_difference 'Project.count' do
Chris@441 266 post :create, :project => { :name => "blog",
Chris@0 267 :description => "weblog",
Chris@0 268 :identifier => "blog",
Chris@0 269 :is_public => 1,
Chris@0 270 :custom_field_values => { '3' => 'Beta' }
Chris@0 271 }
Chris@0 272 end
Chris@0 273 assert_response :success
Chris@0 274 project = assigns(:project)
Chris@0 275 assert_kind_of Project, project
Chris@909 276 assert_not_nil project.errors[:parent_id]
Chris@0 277 end
Chris@441 278
Chris@0 279 should "fail with unauthorized parent_id" do
Chris@0 280 assert !User.find(2).member_of?(Project.find(6))
Chris@0 281 assert_no_difference 'Project.count' do
Chris@441 282 post :create, :project => { :name => "blog",
Chris@0 283 :description => "weblog",
Chris@0 284 :identifier => "blog",
Chris@0 285 :is_public => 1,
Chris@0 286 :custom_field_values => { '3' => 'Beta' },
Chris@0 287 :parent_id => 6
Chris@0 288 }
Chris@0 289 end
Chris@0 290 assert_response :success
Chris@0 291 project = assigns(:project)
Chris@0 292 assert_kind_of Project, project
Chris@909 293 assert_not_nil project.errors[:parent_id]
Chris@0 294 end
Chris@0 295 end
Chris@0 296 end
Chris@441 297
Chris@441 298 def test_create_should_preserve_modules_on_validation_failure
Chris@441 299 with_settings :default_projects_modules => ['issue_tracking', 'repository'] do
Chris@441 300 @request.session[:user_id] = 1
Chris@441 301 assert_no_difference 'Project.count' do
Chris@441 302 post :create, :project => {
Chris@441 303 :name => "blog",
Chris@441 304 :identifier => "",
Chris@441 305 :enabled_module_names => %w(issue_tracking news)
Chris@441 306 }
Chris@441 307 end
Chris@441 308 assert_response :success
Chris@441 309 project = assigns(:project)
Chris@441 310 assert_equal %w(issue_tracking news), project.enabled_module_names.sort
Chris@441 311 end
Chris@441 312 end
Chris@441 313
Chris@119 314 def test_create_should_not_accept_get
Chris@119 315 @request.session[:user_id] = 1
Chris@119 316 get :create
Chris@119 317 assert_response :method_not_allowed
Chris@119 318 end
Chris@441 319
Chris@0 320 def test_show_by_id
Chris@0 321 get :show, :id => 1
Chris@0 322 assert_response :success
Chris@0 323 assert_template 'show'
Chris@0 324 assert_not_nil assigns(:project)
Chris@0 325 end
Chris@0 326
Chris@0 327 def test_show_by_identifier
Chris@0 328 get :show, :id => 'ecookbook'
Chris@0 329 assert_response :success
Chris@0 330 assert_template 'show'
Chris@0 331 assert_not_nil assigns(:project)
Chris@0 332 assert_equal Project.find_by_identifier('ecookbook'), assigns(:project)
Chris@441 333
chris@37 334 assert_tag 'li', :content => /Development status/
chris@37 335 end
chris@37 336
chris@37 337 def test_show_should_not_display_hidden_custom_fields
chris@37 338 ProjectCustomField.find_by_name('Development status').update_attribute :visible, false
chris@37 339 get :show, :id => 'ecookbook'
chris@37 340 assert_response :success
chris@37 341 assert_template 'show'
chris@37 342 assert_not_nil assigns(:project)
Chris@441 343
chris@37 344 assert_no_tag 'li', :content => /Development status/
Chris@0 345 end
Chris@441 346
Chris@0 347 def test_show_should_not_fail_when_custom_values_are_nil
Chris@0 348 project = Project.find_by_identifier('ecookbook')
Chris@0 349 project.custom_values.first.update_attribute(:value, nil)
Chris@0 350 get :show, :id => 'ecookbook'
Chris@0 351 assert_response :success
Chris@0 352 assert_template 'show'
Chris@0 353 assert_not_nil assigns(:project)
Chris@0 354 assert_equal Project.find_by_identifier('ecookbook'), assigns(:project)
Chris@0 355 end
Chris@441 356
chris@37 357 def show_archived_project_should_be_denied
chris@37 358 project = Project.find_by_identifier('ecookbook')
chris@37 359 project.archive!
Chris@441 360
chris@37 361 get :show, :id => 'ecookbook'
chris@37 362 assert_response 403
chris@37 363 assert_nil assigns(:project)
chris@37 364 assert_tag :tag => 'p', :content => /archived/
chris@37 365 end
Chris@441 366
Chris@0 367 def test_private_subprojects_hidden
Chris@0 368 get :show, :id => 'ecookbook'
Chris@0 369 assert_response :success
Chris@0 370 assert_template 'show'
Chris@0 371 assert_no_tag :tag => 'a', :content => /Private child/
Chris@0 372 end
Chris@0 373
Chris@0 374 def test_private_subprojects_visible
Chris@0 375 @request.session[:user_id] = 2 # manager who is a member of the private subproject
Chris@0 376 get :show, :id => 'ecookbook'
Chris@0 377 assert_response :success
Chris@0 378 assert_template 'show'
Chris@0 379 assert_tag :tag => 'a', :content => /Private child/
Chris@0 380 end
Chris@441 381
Chris@0 382 def test_settings
Chris@0 383 @request.session[:user_id] = 2 # manager
Chris@0 384 get :settings, :id => 1
Chris@0 385 assert_response :success
Chris@0 386 assert_template 'settings'
Chris@0 387 end
Chris@441 388
chris@22 389 def test_update
Chris@0 390 @request.session[:user_id] = 2 # manager
chris@22 391 post :update, :id => 1, :project => {:name => 'Test changed name',
Chris@0 392 :issue_custom_field_ids => ['']}
chris@37 393 assert_redirected_to '/projects/ecookbook/settings'
Chris@0 394 project = Project.find(1)
Chris@0 395 assert_equal 'Test changed name', project.name
Chris@0 396 end
Chris@119 397
Chris@119 398 def test_modules
Chris@119 399 @request.session[:user_id] = 2
Chris@119 400 Project.find(1).enabled_module_names = ['issue_tracking', 'news']
Chris@441 401
Chris@119 402 post :modules, :id => 1, :enabled_module_names => ['issue_tracking', 'repository', 'documents']
Chris@119 403 assert_redirected_to '/projects/ecookbook/settings/modules'
Chris@119 404 assert_equal ['documents', 'issue_tracking', 'repository'], Project.find(1).enabled_module_names.sort
Chris@119 405 end
Chris@119 406
Chris@119 407 def test_modules_should_not_allow_get
Chris@119 408 @request.session[:user_id] = 1
Chris@119 409 get :modules, :id => 1
Chris@119 410 assert_response :method_not_allowed
Chris@119 411 end
Chris@441 412
Chris@0 413 def test_get_destroy
Chris@0 414 @request.session[:user_id] = 1 # admin
Chris@0 415 get :destroy, :id => 1
Chris@0 416 assert_response :success
Chris@0 417 assert_template 'destroy'
Chris@0 418 assert_not_nil Project.find_by_id(1)
Chris@0 419 end
Chris@0 420
Chris@0 421 def test_post_destroy
Chris@0 422 @request.session[:user_id] = 1 # admin
Chris@0 423 post :destroy, :id => 1, :confirm => 1
chris@37 424 assert_redirected_to '/admin/projects'
Chris@0 425 assert_nil Project.find_by_id(1)
Chris@0 426 end
Chris@441 427
Chris@0 428 def test_archive
Chris@0 429 @request.session[:user_id] = 1 # admin
Chris@0 430 post :archive, :id => 1
chris@37 431 assert_redirected_to '/admin/projects'
Chris@0 432 assert !Project.find(1).active?
Chris@0 433 end
Chris@441 434
Chris@0 435 def test_unarchive
Chris@0 436 @request.session[:user_id] = 1 # admin
Chris@0 437 Project.find(1).archive
Chris@0 438 post :unarchive, :id => 1
chris@37 439 assert_redirected_to '/admin/projects'
Chris@0 440 assert Project.find(1).active?
Chris@0 441 end
Chris@441 442
Chris@0 443 def test_project_breadcrumbs_should_be_limited_to_3_ancestors
Chris@0 444 CustomField.delete_all
Chris@0 445 parent = nil
Chris@0 446 6.times do |i|
Chris@0 447 p = Project.create!(:name => "Breadcrumbs #{i}", :identifier => "breadcrumbs-#{i}")
Chris@0 448 p.set_parent!(parent)
Chris@0 449 get :show, :id => p
Chris@0 450 assert_tag :h1, :parent => { :attributes => {:id => 'header'}},
Chris@0 451 :children => { :count => [i, 3].min,
Chris@0 452 :only => { :tag => 'a' } }
Chris@441 453
Chris@0 454 parent = p
Chris@0 455 end
Chris@0 456 end
Chris@0 457
Chris@441 458 def test_get_copy
Chris@0 459 @request.session[:user_id] = 1 # admin
Chris@0 460 get :copy, :id => 1
Chris@0 461 assert_response :success
Chris@0 462 assert_template 'copy'
Chris@0 463 assert assigns(:project)
Chris@0 464 assert_equal Project.find(1).description, assigns(:project).description
Chris@0 465 assert_nil assigns(:project).id
Chris@441 466
Chris@441 467 assert_tag :tag => 'input',
Chris@441 468 :attributes => {:name => 'project[enabled_module_names][]', :value => 'issue_tracking'}
Chris@0 469 end
Chris@0 470
Chris@441 471 def test_get_copy_without_project
Chris@0 472 @request.session[:user_id] = 1 # admin
Chris@0 473 get :copy
Chris@0 474 assert_response :redirect
Chris@0 475 assert_redirected_to :controller => 'admin', :action => 'projects'
Chris@0 476 end
Chris@0 477
Chris@441 478 def test_post_copy_should_copy_requested_items
Chris@441 479 @request.session[:user_id] = 1 # admin
Chris@441 480 CustomField.delete_all
chris@37 481
Chris@441 482 assert_difference 'Project.count' do
Chris@441 483 post :copy, :id => 1,
Chris@441 484 :project => {
Chris@441 485 :name => 'Copy',
Chris@441 486 :identifier => 'unique-copy',
Chris@441 487 :tracker_ids => ['1', '2', '3', ''],
Chris@441 488 :enabled_module_names => %w(issue_tracking time_tracking)
Chris@441 489 },
Chris@441 490 :only => %w(issues versions)
chris@37 491 end
Chris@441 492 project = Project.find('unique-copy')
Chris@441 493 source = Project.find(1)
Chris@441 494 assert_equal %w(issue_tracking time_tracking), project.enabled_module_names.sort
Chris@441 495
Chris@441 496 assert_equal source.versions.count, project.versions.count, "All versions were not copied"
Chris@441 497 # issues assigned to a closed version won't be copied
Chris@441 498 assert_equal source.issues.select {|i| i.fixed_version.nil? || i.fixed_version.open?}.size,
Chris@441 499 project.issues.count, "All issues were not copied"
Chris@441 500 assert_equal 0, project.members.count
Chris@441 501 end
Chris@441 502
Chris@441 503 def test_post_copy_should_redirect_to_settings_when_successful
Chris@441 504 @request.session[:user_id] = 1 # admin
Chris@441 505 post :copy, :id => 1, :project => {:name => 'Copy', :identifier => 'unique-copy'}
Chris@441 506 assert_response :redirect
Chris@441 507 assert_redirected_to :controller => 'projects', :action => 'settings', :id => 'unique-copy'
chris@37 508 end
chris@37 509
Chris@0 510 def test_jump_should_redirect_to_active_tab
Chris@0 511 get :show, :id => 1, :jump => 'issues'
chris@37 512 assert_redirected_to '/projects/ecookbook/issues'
Chris@0 513 end
Chris@441 514
Chris@0 515 def test_jump_should_not_redirect_to_inactive_tab
Chris@0 516 get :show, :id => 3, :jump => 'documents'
Chris@0 517 assert_response :success
Chris@0 518 assert_template 'show'
Chris@0 519 end
Chris@441 520
Chris@0 521 def test_jump_should_not_redirect_to_unknown_tab
Chris@0 522 get :show, :id => 3, :jump => 'foobar'
Chris@0 523 assert_response :success
Chris@0 524 assert_template 'show'
Chris@0 525 end
Chris@0 526
Chris@0 527 # A hook that is manually registered later
Chris@0 528 class ProjectBasedTemplate < Redmine::Hook::ViewListener
Chris@0 529 def view_layouts_base_html_head(context)
Chris@0 530 # Adds a project stylesheet
Chris@0 531 stylesheet_link_tag(context[:project].identifier) if context[:project]
Chris@0 532 end
Chris@0 533 end
Chris@0 534 # Don't use this hook now
Chris@0 535 Redmine::Hook.clear_listeners
Chris@441 536
Chris@0 537 def test_hook_response
Chris@0 538 Redmine::Hook.add_listener(ProjectBasedTemplate)
Chris@0 539 get :show, :id => 1
Chris@0 540 assert_tag :tag => 'link', :attributes => {:href => '/stylesheets/ecookbook.css'},
Chris@0 541 :parent => {:tag => 'head'}
Chris@441 542
Chris@0 543 Redmine::Hook.clear_listeners
Chris@0 544 end
Chris@0 545 end