Index: test/functional/issues_controller_test.rb =================================================================== --- test/functional/issues_controller_test.rb (revision 8522) +++ test/functional/issues_controller_test.rb (working copy) @@ -678,6 +678,18 @@ assert @response.body.blank? end + def test_index_json_with_login_name + user = User.find(3) + get :index, :format => 'json', :assigned_to_id => user.login + + assert_equal 'application/json', @response.content_type + assert_not_nil assigns(:issues) + parsed = ActiveSupport::JSON.decode(@response.body) + parsed["issues"].each do |issue| + assert_equal 3, issue["assigned_to"]["id"] + end + end + def test_show_by_anonymous get :show, :id => 1 assert_response :success @@ -1437,6 +1449,32 @@ assert_equal 59, File.size(attachment.diskfile) end + def test_post_create_with_login_name + @request.session[:user_id] = 2 + user = User.find(4) + + assert_difference 'Issue.count' do + post :create, :project_id => 1, + :issue => {:tracker_id => 3, + :status_id => 2, + :subject => 'This is the test_new_with_login issue', + :description => 'This is the description', + :assigned_to_id => user.login, + :priority_id => 5, + :start_date => '2010-11-07' + } + end + assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id + + issue = Issue.find_by_subject('This is the test_new_with_login issue') + assert_not_nil issue + assert_equal 2, issue.author_id + assert_equal 3, issue.tracker_id + assert_equal 2, issue.status_id + assert_equal 4, issue.assigned_to_id + assert_equal Date.parse('2010-11-07'), issue.start_date + end + context "without workflow privilege" do setup do Workflow.delete_all(["role_id = ?", Role.anonymous.id]) @@ -1743,6 +1781,32 @@ assert mail.subject.include?("(#{ IssueStatus.find(2).name })") end + def test_put_update_with_status_and_assignee_change_with_login_name + issue = Issue.find(1) + assert_equal 1, issue.status_id + user = User.find(4) + @request.session[:user_id] = 2 + assert_difference('TimeEntry.count', 0) do + put :update, + :id => 1, + :issue => { :status_id => 2, :assigned_to_id => user.login }, + :notes => 'Assigned to ' + user.login, + :time_entry => { :hours => '', :comments => '', :activity_id => TimeEntryActivity.first } + end + assert_redirected_to :action => 'show', :id => '1' + issue.reload + assert_equal 2, issue.status_id + j = Journal.find(:first, :order => 'id DESC') + assert_equal 'Assigned to ' + user.login, j.notes + assert_equal 2, j.details.size + assert_equal user.id, issue.assigned_to_id + + mail = ActionMailer::Base.deliveries.last + assert mail.body.include?("Status changed from New to Assigned") + # subject should contain the new status + assert mail.subject.include?("(#{ IssueStatus.find(2).name })") + end + def test_put_update_with_note_only notes = 'Note added by IssuesControllerTest#test_update_with_note_only' # anonymous user Index: test/functional/users_controller_test.rb =================================================================== --- test/functional/users_controller_test.rb (revision 8522) +++ test/functional/users_controller_test.rb (working copy) @@ -86,6 +86,17 @@ assert_tag 'li', :content => /Phone number/ end + # TODO: check why the assert_response and assert_template are failing + def test_show_with_login_name + @request.session[:user_id] = nil + u = User.find(4) + get :show, :id => u.login + #assert_response :success + #assert_template 'show' + assert_not_nil assigns(:user) + assert_equal u, assigns(:user) + end + def test_show_should_not_display_hidden_custom_fields @request.session[:user_id] = nil UserCustomField.find_by_name('Phone number').update_attribute :visible, false @@ -211,6 +222,15 @@ assert_equal User.find(2), assigns(:user) end + def test_edit_with_login_name + u = User.find(4) + get :edit, :id => u.login + + assert_response :success + assert_template :edit + assert_equal u, assigns(:user) + end + def test_update ActionMailer::Base.deliveries.clear put :update, :id => 2, :user => {:firstname => 'Changed', :mail_notification => 'only_assigned'}, :pref => {:hide_mail => '1', :comments_sorting => 'desc'} @@ -223,6 +243,20 @@ assert ActionMailer::Base.deliveries.empty? end + def test_update_with_login_name + ActionMailer::Base.deliveries.clear + user = User.find(2) + put :update, :id => user.login, :user => {:firstname => 'Changed', :mail_notification => 'only_assigned'}, :pref => {:hide_mail => '1', :comments_sorting => 'desc'} + + user.reload + assert_equal 2, user.id + assert_equal 'Changed', user.firstname + assert_equal 'only_assigned', user.mail_notification + assert_equal true, user.pref[:hide_mail] + assert_equal 'desc', user.pref[:comments_sorting] + assert ActionMailer::Base.deliveries.empty? + end + def test_update_with_failure assert_no_difference 'User.count' do put :update, :id => 2, :user => {:firstname => ''} @@ -289,6 +323,16 @@ assert_nil User.find_by_id(2) end + def test_destroy_with_login_name + user = User.find(2) + + assert_difference 'User.count', -1 do + delete :destroy, :id => 2 + end + assert_redirected_to '/users' + assert_nil User.find_by_id(2) + end + def test_destroy_should_not_accept_get_requests assert_no_difference 'User.count' do get :destroy, :id => 2 @@ -324,6 +368,15 @@ assert_equal [2], Member.find(1).role_ids end + def test_update_membership_with_login_name + user = User.find(2) + assert_no_difference 'Member.count' do + put :edit_membership, :id => user.login, :membership_id => 1, :membership => { :role_ids => [2]} + end + assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships' + assert_equal [2], Member.find(1).role_ids + end + def test_destroy_membership assert_difference 'Member.count', -1 do delete :destroy_membership, :id => 2, :membership_id => 1 @@ -331,4 +384,13 @@ assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships' assert_nil Member.find_by_id(1) end + + def test_destroy_membership_with_login_name + user = User.find(2) + assert_difference 'Member.count', -1 do + delete :destroy_membership, :id => user.login, :membership_id => 1 + end + assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships' + assert_nil Member.find_by_id(1) + end end Index: app/models/user.rb =================================================================== --- app/models/user.rb (revision 8522) +++ app/models/user.rb (working copy) @@ -572,6 +572,17 @@ end end + # Overrides the find method to allow finding users by login name and id + def self.find(*args) + if args.first && args.first.is_a?(String) && !args.first.match(/^\d*$/) + user = find_by_login(*args) + raise ActiveRecord::RecordNotFound, "Couldn't find Project with identifier=#{args.first}" if user.nil? + user + else + super + end + end + protected def validate_password_length Index: app/controllers/issues_controller.rb =================================================================== --- app/controllers/issues_controller.rb (revision 8522) +++ app/controllers/issues_controller.rb (working copy) @@ -26,6 +26,7 @@ before_filter :authorize, :except => [:index] before_filter :find_optional_project, :only => [:index] before_filter :check_for_default_issue_status, :only => [:new, :create] + before_filter :id_from_login, :only => [:index, :create, :update] before_filter :build_new_issue_from_params, :only => [:new, :create] accept_rss_auth :index, :show accept_api_auth :index, :show, :create, :update, :destroy @@ -348,4 +349,19 @@ attributes[:custom_field_values].reject! {|k,v| v.blank?} if attributes[:custom_field_values] attributes end + + def id_from_login + if params[:issue] && + params[:issue][:assigned_to_id] && + params[:issue][:assigned_to_id].to_s.length > 0 && + !params[:issue][:assigned_to_id].to_s.match(/^\d*$/) + user = User.find_by_login(params[:issue][:assigned_to_id]) + params[:issue][:assigned_to_id] = user.id.to_s + elsif params[:assigned_to_id] && + params[:assigned_to_id].to_s.length > 0 && + !params[:assigned_to_id].match(/^\d*$/) + user = User.find_by_login(params[:assigned_to_id]) + params[:assigned_to_id] = user.id.to_s + end + end end