annotate test/functional/project_enumerations_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 ec1c49528f36
children 4f746d8966dd fb9a13467253
rev   line source
Chris@119 1 require File.expand_path('../../test_helper', __FILE__)
chris@22 2
chris@22 3 class ProjectEnumerationsControllerTest < ActionController::TestCase
Chris@909 4 fixtures :projects, :trackers, :issue_statuses, :issues,
Chris@909 5 :enumerations, :users, :issue_categories,
Chris@909 6 :projects_trackers,
Chris@909 7 :roles,
Chris@909 8 :member_roles,
Chris@909 9 :members,
Chris@909 10 :enabled_modules,
Chris@909 11 :workflows,
Chris@909 12 :custom_fields, :custom_fields_projects,
Chris@909 13 :custom_fields_trackers, :custom_values,
Chris@909 14 :time_entries
Chris@909 15
Chris@929 16 self.use_transactional_fixtures = false
Chris@929 17
chris@22 18 def setup
chris@22 19 @request.session[:user_id] = nil
chris@22 20 Setting.default_language = 'en'
chris@22 21 end
chris@22 22
chris@22 23 def test_update_to_override_system_activities
chris@22 24 @request.session[:user_id] = 2 # manager
chris@22 25 billable_field = TimeEntryActivityCustomField.find_by_name("Billable")
chris@22 26
chris@22 27 put :update, :project_id => 1, :enumerations => {
chris@22 28 "9"=> {"parent_id"=>"9", "custom_field_values"=>{"7" => "1"}, "active"=>"0"}, # Design, De-activate
chris@22 29 "10"=> {"parent_id"=>"10", "custom_field_values"=>{"7"=>"0"}, "active"=>"1"}, # Development, Change custom value
chris@22 30 "14"=>{"parent_id"=>"14", "custom_field_values"=>{"7"=>"1"}, "active"=>"1"}, # Inactive Activity, Activate with custom value
chris@22 31 "11"=>{"parent_id"=>"11", "custom_field_values"=>{"7"=>"1"}, "active"=>"1"} # QA, no changes
chris@22 32 }
chris@22 33
chris@22 34 assert_response :redirect
chris@37 35 assert_redirected_to '/projects/ecookbook/settings/activities'
chris@22 36
chris@22 37 # Created project specific activities...
chris@22 38 project = Project.find('ecookbook')
chris@22 39
chris@22 40 # ... Design
chris@22 41 design = project.time_entry_activities.find_by_name("Design")
chris@22 42 assert design, "Project activity not found"
chris@22 43
chris@22 44 assert_equal 9, design.parent_id # Relate to the system activity
chris@22 45 assert_not_equal design.parent.id, design.id # Different records
chris@22 46 assert_equal design.parent.name, design.name # Same name
chris@22 47 assert !design.active?
chris@22 48
chris@22 49 # ... Development
chris@22 50 development = project.time_entry_activities.find_by_name("Development")
chris@22 51 assert development, "Project activity not found"
chris@22 52
chris@22 53 assert_equal 10, development.parent_id # Relate to the system activity
chris@22 54 assert_not_equal development.parent.id, development.id # Different records
chris@22 55 assert_equal development.parent.name, development.name # Same name
chris@22 56 assert development.active?
chris@22 57 assert_equal "0", development.custom_value_for(billable_field).value
chris@22 58
chris@22 59 # ... Inactive Activity
chris@22 60 previously_inactive = project.time_entry_activities.find_by_name("Inactive Activity")
chris@22 61 assert previously_inactive, "Project activity not found"
chris@22 62
chris@22 63 assert_equal 14, previously_inactive.parent_id # Relate to the system activity
chris@22 64 assert_not_equal previously_inactive.parent.id, previously_inactive.id # Different records
chris@22 65 assert_equal previously_inactive.parent.name, previously_inactive.name # Same name
chris@22 66 assert previously_inactive.active?
chris@22 67 assert_equal "1", previously_inactive.custom_value_for(billable_field).value
chris@22 68
chris@22 69 # ... QA
chris@22 70 assert_equal nil, project.time_entry_activities.find_by_name("QA"), "Custom QA activity created when it wasn't modified"
chris@22 71 end
chris@22 72
chris@22 73 def test_update_will_update_project_specific_activities
chris@22 74 @request.session[:user_id] = 2 # manager
chris@22 75
chris@22 76 project_activity = TimeEntryActivity.new({
chris@22 77 :name => 'Project Specific',
chris@22 78 :parent => TimeEntryActivity.find(:first),
chris@22 79 :project => Project.find(1),
chris@22 80 :active => true
chris@22 81 })
chris@22 82 assert project_activity.save
chris@22 83 project_activity_two = TimeEntryActivity.new({
chris@22 84 :name => 'Project Specific Two',
chris@22 85 :parent => TimeEntryActivity.find(:last),
chris@22 86 :project => Project.find(1),
chris@22 87 :active => true
chris@22 88 })
chris@22 89 assert project_activity_two.save
chris@22 90
Chris@909 91
chris@22 92 put :update, :project_id => 1, :enumerations => {
chris@22 93 project_activity.id => {"custom_field_values"=>{"7" => "1"}, "active"=>"0"}, # De-activate
chris@22 94 project_activity_two.id => {"custom_field_values"=>{"7" => "1"}, "active"=>"0"} # De-activate
chris@22 95 }
chris@22 96
chris@22 97 assert_response :redirect
chris@37 98 assert_redirected_to '/projects/ecookbook/settings/activities'
chris@22 99
chris@22 100 # Created project specific activities...
chris@22 101 project = Project.find('ecookbook')
chris@22 102 assert_equal 2, project.time_entry_activities.count
chris@22 103
chris@22 104 activity_one = project.time_entry_activities.find_by_name(project_activity.name)
chris@22 105 assert activity_one, "Project activity not found"
chris@22 106 assert_equal project_activity.id, activity_one.id
chris@22 107 assert !activity_one.active?
chris@22 108
chris@22 109 activity_two = project.time_entry_activities.find_by_name(project_activity_two.name)
chris@22 110 assert activity_two, "Project activity not found"
chris@22 111 assert_equal project_activity_two.id, activity_two.id
chris@22 112 assert !activity_two.active?
chris@22 113 end
chris@22 114
chris@22 115 def test_update_when_creating_new_activities_will_convert_existing_data
chris@22 116 assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size
Chris@909 117
chris@22 118 @request.session[:user_id] = 2 # manager
chris@22 119 put :update, :project_id => 1, :enumerations => {
chris@22 120 "9"=> {"parent_id"=>"9", "custom_field_values"=>{"7" => "1"}, "active"=>"0"} # Design, De-activate
chris@22 121 }
chris@22 122 assert_response :redirect
chris@22 123
chris@22 124 # No more TimeEntries using the system activity
chris@22 125 assert_equal 0, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size, "Time Entries still assigned to system activities"
chris@22 126 # All TimeEntries using project activity
chris@22 127 project_specific_activity = TimeEntryActivity.find_by_parent_id_and_project_id(9, 1)
chris@22 128 assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(project_specific_activity.id, 1).size, "No Time Entries assigned to the project activity"
chris@22 129 end
chris@22 130
chris@22 131 def test_update_when_creating_new_activities_will_not_convert_existing_data_if_an_exception_is_raised
chris@22 132 # TODO: Need to cause an exception on create but these tests
chris@22 133 # aren't setup for mocking. Just create a record now so the
chris@22 134 # second one is a dupicate
chris@22 135 parent = TimeEntryActivity.find(9)
chris@22 136 TimeEntryActivity.create!({:name => parent.name, :project_id => 1, :position => parent.position, :active => true})
chris@22 137 TimeEntry.create!({:project_id => 1, :hours => 1.0, :user => User.find(1), :issue_id => 3, :activity_id => 10, :spent_on => '2009-01-01'})
chris@22 138
chris@22 139 assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size
chris@22 140 assert_equal 1, TimeEntry.find_all_by_activity_id_and_project_id(10, 1).size
Chris@909 141
chris@22 142 @request.session[:user_id] = 2 # manager
chris@22 143 put :update, :project_id => 1, :enumerations => {
chris@22 144 "9"=> {"parent_id"=>"9", "custom_field_values"=>{"7" => "1"}, "active"=>"0"}, # Design
chris@22 145 "10"=> {"parent_id"=>"10", "custom_field_values"=>{"7"=>"0"}, "active"=>"1"} # Development, Change custom value
chris@22 146 }
chris@22 147 assert_response :redirect
chris@22 148
chris@22 149 # TimeEntries shouldn't have been reassigned on the failed record
chris@22 150 assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size, "Time Entries are not assigned to system activities"
chris@22 151 # TimeEntries shouldn't have been reassigned on the saved record either
chris@22 152 assert_equal 1, TimeEntry.find_all_by_activity_id_and_project_id(10, 1).size, "Time Entries are not assigned to system activities"
chris@22 153 end
chris@22 154
chris@22 155 def test_destroy
chris@22 156 @request.session[:user_id] = 2 # manager
chris@22 157 project_activity = TimeEntryActivity.new({
chris@22 158 :name => 'Project Specific',
chris@22 159 :parent => TimeEntryActivity.find(:first),
chris@22 160 :project => Project.find(1),
chris@22 161 :active => true
chris@22 162 })
chris@22 163 assert project_activity.save
chris@22 164 project_activity_two = TimeEntryActivity.new({
chris@22 165 :name => 'Project Specific Two',
chris@22 166 :parent => TimeEntryActivity.find(:last),
chris@22 167 :project => Project.find(1),
chris@22 168 :active => true
chris@22 169 })
chris@22 170 assert project_activity_two.save
chris@22 171
chris@22 172 delete :destroy, :project_id => 1
chris@22 173 assert_response :redirect
chris@37 174 assert_redirected_to '/projects/ecookbook/settings/activities'
chris@22 175
chris@22 176 assert_nil TimeEntryActivity.find_by_id(project_activity.id)
chris@22 177 assert_nil TimeEntryActivity.find_by_id(project_activity_two.id)
chris@22 178 end
Chris@909 179
chris@22 180 def test_destroy_should_reassign_time_entries_back_to_the_system_activity
chris@22 181 @request.session[:user_id] = 2 # manager
chris@22 182 project_activity = TimeEntryActivity.new({
chris@22 183 :name => 'Project Specific Design',
chris@22 184 :parent => TimeEntryActivity.find(9),
chris@22 185 :project => Project.find(1),
chris@22 186 :active => true
chris@22 187 })
chris@22 188 assert project_activity.save
chris@22 189 assert TimeEntry.update_all("activity_id = '#{project_activity.id}'", ["project_id = ? AND activity_id = ?", 1, 9])
Chris@119 190 assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(project_activity.id, 1).size
Chris@909 191
chris@22 192 delete :destroy, :project_id => 1
chris@22 193 assert_response :redirect
chris@37 194 assert_redirected_to '/projects/ecookbook/settings/activities'
chris@22 195
chris@22 196 assert_nil TimeEntryActivity.find_by_id(project_activity.id)
chris@22 197 assert_equal 0, TimeEntry.find_all_by_activity_id_and_project_id(project_activity.id, 1).size, "TimeEntries still assigned to project specific activity"
chris@22 198 assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size, "TimeEntries still assigned to project specific activity"
chris@22 199 end
chris@22 200
chris@22 201 end