##// END OF EJS Templates
Strip issue id when adding a relation....
Jean-Philippe Lang -
r9250:12b71ebc8e9d
parent child
Show More
@@ -1,95 +1,95
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class IssueRelationsController < ApplicationController
19 19 before_filter :find_issue, :find_project_from_association, :authorize, :only => [:index, :create]
20 20 before_filter :find_relation, :except => [:index, :create]
21 21
22 22 accept_api_auth :index, :show, :create, :destroy
23 23
24 24 def index
25 25 @relations = @issue.relations
26 26
27 27 respond_to do |format|
28 28 format.html { render :nothing => true }
29 29 format.api
30 30 end
31 31 end
32 32
33 33 def show
34 34 raise Unauthorized unless @relation.visible?
35 35
36 36 respond_to do |format|
37 37 format.html { render :nothing => true }
38 38 format.api
39 39 end
40 40 end
41 41
42 42 def create
43 43 @relation = IssueRelation.new(params[:relation])
44 44 @relation.issue_from = @issue
45 if params[:relation] && m = params[:relation][:issue_to_id].to_s.match(/^#?(\d+)$/)
45 if params[:relation] && m = params[:relation][:issue_to_id].to_s.strip.match(/^#?(\d+)$/)
46 46 @relation.issue_to = Issue.visible.find_by_id(m[1].to_i)
47 47 end
48 48 saved = @relation.save
49 49
50 50 respond_to do |format|
51 51 format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
52 52 format.js do
53 53 @relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? }
54 54 render :update do |page|
55 55 page.replace_html "relations", :partial => 'issues/relations'
56 56 if @relation.errors.empty?
57 57 page << "$('relation_delay').value = ''"
58 58 page << "$('relation_issue_to_id').value = ''"
59 59 end
60 60 end
61 61 end
62 62 format.api {
63 63 if saved
64 64 render :action => 'show', :status => :created, :location => relation_url(@relation)
65 65 else
66 66 render_validation_errors(@relation)
67 67 end
68 68 }
69 69 end
70 70 end
71 71
72 72 def destroy
73 73 raise Unauthorized unless @relation.deletable?
74 74 @relation.destroy
75 75
76 76 respond_to do |format|
77 77 format.html { redirect_to issue_path } # TODO : does this really work since @issue is always nil? What is it useful to?
78 78 format.js { render(:update) {|page| page.remove "relation-#{@relation.id}"} }
79 79 format.api { head :ok }
80 80 end
81 81 end
82 82
83 83 private
84 84 def find_issue
85 85 @issue = @object = Issue.find(params[:issue_id])
86 86 rescue ActiveRecord::RecordNotFound
87 87 render_404
88 88 end
89 89
90 90 def find_relation
91 91 @relation = IssueRelation.find(params[:id])
92 92 rescue ActiveRecord::RecordNotFound
93 93 render_404
94 94 end
95 95 end
@@ -1,116 +1,126
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../test_helper', __FILE__)
19 19 require 'issue_relations_controller'
20 20
21 21 # Re-raise errors caught by the controller.
22 22 class IssueRelationsController; def rescue_action(e) raise e end; end
23 23
24 24
25 25 class IssueRelationsControllerTest < ActionController::TestCase
26 26 fixtures :projects,
27 27 :users,
28 28 :roles,
29 29 :members,
30 30 :member_roles,
31 31 :issues,
32 32 :issue_statuses,
33 33 :issue_relations,
34 34 :enabled_modules,
35 35 :enumerations,
36 36 :trackers
37 37
38 38 def setup
39 39 @controller = IssueRelationsController.new
40 40 @request = ActionController::TestRequest.new
41 41 @response = ActionController::TestResponse.new
42 42 User.current = nil
43 43 end
44 44
45 45 def test_create
46 46 assert_difference 'IssueRelation.count' do
47 47 @request.session[:user_id] = 3
48 48 post :create, :issue_id => 1,
49 49 :relation => {:issue_to_id => '2', :relation_type => 'relates', :delay => ''}
50 50 end
51 51 end
52 52
53 53 def test_create_xhr
54 54 assert_difference 'IssueRelation.count' do
55 55 @request.session[:user_id] = 3
56 56 xhr :post, :create,
57 57 :issue_id => 3,
58 58 :relation => {:issue_to_id => '1', :relation_type => 'relates', :delay => ''}
59 59 assert_select_rjs 'relations' do
60 60 assert_select 'table', 1
61 61 assert_select 'tr', 2 # relations
62 62 end
63 63 end
64 64 end
65 65
66 66 def test_create_should_accept_id_with_hash
67 67 assert_difference 'IssueRelation.count' do
68 68 @request.session[:user_id] = 3
69 69 post :create, :issue_id => 1,
70 70 :relation => {:issue_to_id => '#2', :relation_type => 'relates', :delay => ''}
71 71 end
72 72 end
73 73
74 def test_create_should_strip_id
75 assert_difference 'IssueRelation.count' do
76 @request.session[:user_id] = 3
77 post :create, :issue_id => 1,
78 :relation => {:issue_to_id => ' 2 ', :relation_type => 'relates', :delay => ''}
79 end
80 relation = IssueRelation.first(:order => 'id DESC')
81 assert_equal 2, relation.issue_to_id
82 end
83
74 84 def test_create_should_not_break_with_non_numerical_id
75 85 assert_no_difference 'IssueRelation.count' do
76 86 assert_nothing_raised do
77 87 @request.session[:user_id] = 3
78 88 post :create, :issue_id => 1,
79 89 :relation => {:issue_to_id => 'foo', :relation_type => 'relates', :delay => ''}
80 90 end
81 91 end
82 92 end
83 93
84 94 def test_should_create_relations_with_visible_issues_only
85 95 Setting.cross_project_issue_relations = '1'
86 96 assert_nil Issue.visible(User.find(3)).find_by_id(4)
87 97
88 98 assert_no_difference 'IssueRelation.count' do
89 99 @request.session[:user_id] = 3
90 100 post :create, :issue_id => 1,
91 101 :relation => {:issue_to_id => '4', :relation_type => 'relates', :delay => ''}
92 102 end
93 103 end
94 104
95 105 should "prevent relation creation when there's a circular dependency"
96 106
97 107 def test_destroy
98 108 assert_difference 'IssueRelation.count', -1 do
99 109 @request.session[:user_id] = 3
100 110 delete :destroy, :id => '2'
101 111 end
102 112 end
103 113
104 114 def test_destroy_xhr
105 115 IssueRelation.create!(:relation_type => IssueRelation::TYPE_RELATES) do |r|
106 116 r.issue_from_id = 3
107 117 r.issue_to_id = 1
108 118 end
109 119
110 120 assert_difference 'IssueRelation.count', -1 do
111 121 @request.session[:user_id] = 3
112 122 xhr :delete, :destroy, :id => '2'
113 123 assert_select_rjs :remove, 'relation-2'
114 124 end
115 125 end
116 126 end
General Comments 0
You need to be logged in to leave comments. Login now