comparison test/integration/api_test/memberships_test.rb @ 1526:404aa68d4227

Merge from live branch
author Chris Cannam
date Thu, 11 Sep 2014 12:46:20 +0100
parents dffacf8a6908
children
comparison
equal deleted inserted replaced
1493:a5f2bdf3b486 1526:404aa68d4227
1 # Redmine - project management software 1 # Redmine - project management software
2 # Copyright (C) 2006-2012 Jean-Philippe Lang 2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 # 3 #
4 # This program is free software; you can redistribute it and/or 4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License 5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2 6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version. 7 # of the License, or (at your option) any later version.
15 # along with this program; if not, write to the Free Software 15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 require File.expand_path('../../../test_helper', __FILE__) 18 require File.expand_path('../../../test_helper', __FILE__)
19 19
20 class ApiTest::MembershipsTest < ActionController::IntegrationTest 20 class Redmine::ApiTest::MembershipsTest < Redmine::ApiTest::Base
21 fixtures :projects, :users, :roles, :members, :member_roles 21 fixtures :projects, :users, :roles, :members, :member_roles
22 22
23 def setup 23 def setup
24 Setting.rest_api_enabled = '1' 24 Setting.rest_api_enabled = '1'
25 end 25 end
26 26
27 context "/projects/:project_id/memberships" do 27 test "GET /projects/:project_id/memberships.xml should return memberships" do
28 context "GET" do 28 get '/projects/1/memberships.xml', {}, credentials('jsmith')
29 context "xml" do
30 should "return memberships" do
31 get '/projects/1/memberships.xml', {}, credentials('jsmith')
32 29
33 assert_response :success 30 assert_response :success
34 assert_equal 'application/xml', @response.content_type 31 assert_equal 'application/xml', @response.content_type
35 assert_tag :tag => 'memberships', 32 assert_tag :tag => 'memberships',
36 :attributes => {:type => 'array'}, 33 :attributes => {:type => 'array'},
37 :child => { 34 :child => {
38 :tag => 'membership', 35 :tag => 'membership',
36 :child => {
37 :tag => 'id',
38 :content => '2',
39 :sibling => {
40 :tag => 'user',
41 :attributes => {:id => '3', :name => 'Dave Lopper'},
42 :sibling => {
43 :tag => 'roles',
39 :child => { 44 :child => {
40 :tag => 'id', 45 :tag => 'role',
41 :content => '2', 46 :attributes => {:id => '2', :name => 'Developer'}
42 :sibling => {
43 :tag => 'user',
44 :attributes => {:id => '3', :name => 'Dave Lopper'},
45 :sibling => {
46 :tag => 'roles',
47 :child => {
48 :tag => 'role',
49 :attributes => {:id => '2', :name => 'Developer'}
50 }
51 }
52 }
53 } 47 }
54 } 48 }
55 end 49 }
56 end 50 }
51 }
52 end
57 53
58 context "json" do 54 test "GET /projects/:project_id/memberships.json should return memberships" do
59 should "return memberships" do 55 get '/projects/1/memberships.json', {}, credentials('jsmith')
60 get '/projects/1/memberships.json', {}, credentials('jsmith')
61 56
62 assert_response :success 57 assert_response :success
63 assert_equal 'application/json', @response.content_type 58 assert_equal 'application/json', @response.content_type
64 json = ActiveSupport::JSON.decode(response.body) 59 json = ActiveSupport::JSON.decode(response.body)
65 assert_equal({ 60 assert_equal({
66 "memberships" => 61 "memberships" =>
67 [{"id"=>1, 62 [{"id"=>1,
68 "project" => {"name"=>"eCookbook", "id"=>1}, 63 "project" => {"name"=>"eCookbook", "id"=>1},
69 "roles" => [{"name"=>"Manager", "id"=>1}], 64 "roles" => [{"name"=>"Manager", "id"=>1}],
70 "user" => {"name"=>"John Smith", "id"=>2}}, 65 "user" => {"name"=>"John Smith", "id"=>2}},
71 {"id"=>2, 66 {"id"=>2,
72 "project" => {"name"=>"eCookbook", "id"=>1}, 67 "project" => {"name"=>"eCookbook", "id"=>1},
73 "roles" => [{"name"=>"Developer", "id"=>2}], 68 "roles" => [{"name"=>"Developer", "id"=>2}],
74 "user" => {"name"=>"Dave Lopper", "id"=>3}}], 69 "user" => {"name"=>"Dave Lopper", "id"=>3}}],
75 "limit" => 25, 70 "limit" => 25,
76 "total_count" => 2, 71 "total_count" => 2,
77 "offset" => 0}, 72 "offset" => 0},
78 json) 73 json)
79 end 74 end
80 end
81 end
82 75
83 context "POST" do 76 test "GET /projects/:project_id/memberships.xml should succeed for closed project" do
84 context "xml" do 77 project = Project.find(1)
85 should "create membership" do 78 project.close
86 assert_difference 'Member.count' do 79 assert !project.reload.active?
87 post '/projects/1/memberships.xml', {:membership => {:user_id => 7, :role_ids => [2,3]}}, credentials('jsmith') 80 get '/projects/1/memberships.json', {}, credentials('jsmith')
81 assert_response :success
82 end
88 83
89 assert_response :created 84 test "POST /projects/:project_id/memberships.xml should create the membership" do
90 end 85 assert_difference 'Member.count' do
91 end 86 post '/projects/1/memberships.xml', {:membership => {:user_id => 7, :role_ids => [2,3]}}, credentials('jsmith')
92 87
93 should "return errors on failure" do 88 assert_response :created
94 assert_no_difference 'Member.count' do
95 post '/projects/1/memberships.xml', {:membership => {:role_ids => [2,3]}}, credentials('jsmith')
96
97 assert_response :unprocessable_entity
98 assert_equal 'application/xml', @response.content_type
99 assert_tag 'errors', :child => {:tag => 'error', :content => "Principal can't be blank"}
100 end
101 end
102 end
103 end 89 end
104 end 90 end
105 91
106 context "/memberships/:id" do 92 test "POST /projects/:project_id/memberships.xml with invalid parameters should return errors" do
107 context "GET" do 93 assert_no_difference 'Member.count' do
108 context "xml" do 94 post '/projects/1/memberships.xml', {:membership => {:role_ids => [2,3]}}, credentials('jsmith')
109 should "return the membership" do
110 get '/memberships/2.xml', {}, credentials('jsmith')
111 95
112 assert_response :success 96 assert_response :unprocessable_entity
113 assert_equal 'application/xml', @response.content_type 97 assert_equal 'application/xml', @response.content_type
114 assert_tag :tag => 'membership', 98 assert_tag 'errors', :child => {:tag => 'error', :content => "Principal can't be blank"}
99 end
100 end
101
102 test "GET /memberships/:id.xml should return the membership" do
103 get '/memberships/2.xml', {}, credentials('jsmith')
104
105 assert_response :success
106 assert_equal 'application/xml', @response.content_type
107 assert_tag :tag => 'membership',
108 :child => {
109 :tag => 'id',
110 :content => '2',
111 :sibling => {
112 :tag => 'user',
113 :attributes => {:id => '3', :name => 'Dave Lopper'},
114 :sibling => {
115 :tag => 'roles',
115 :child => { 116 :child => {
116 :tag => 'id', 117 :tag => 'role',
117 :content => '2', 118 :attributes => {:id => '2', :name => 'Developer'}
118 :sibling => {
119 :tag => 'user',
120 :attributes => {:id => '3', :name => 'Dave Lopper'},
121 :sibling => {
122 :tag => 'roles',
123 :child => {
124 :tag => 'role',
125 :attributes => {:id => '2', :name => 'Developer'}
126 }
127 }
128 }
129 } 119 }
130 end 120 }
131 end 121 }
122 }
123 end
132 124
133 context "json" do 125 test "GET /memberships/:id.json should return the membership" do
134 should "return the membership" do 126 get '/memberships/2.json', {}, credentials('jsmith')
135 get '/memberships/2.json', {}, credentials('jsmith')
136 127
137 assert_response :success 128 assert_response :success
138 assert_equal 'application/json', @response.content_type 129 assert_equal 'application/json', @response.content_type
139 json = ActiveSupport::JSON.decode(response.body) 130 json = ActiveSupport::JSON.decode(response.body)
140 assert_equal( 131 assert_equal(
141 {"membership" => { 132 {"membership" => {
142 "id" => 2, 133 "id" => 2,
143 "project" => {"name"=>"eCookbook", "id"=>1}, 134 "project" => {"name"=>"eCookbook", "id"=>1},
144 "roles" => [{"name"=>"Developer", "id"=>2}], 135 "roles" => [{"name"=>"Developer", "id"=>2}],
145 "user" => {"name"=>"Dave Lopper", "id"=>3}} 136 "user" => {"name"=>"Dave Lopper", "id"=>3}}
146 }, 137 },
147 json) 138 json)
148 end 139 end
149 end 140
141 test "PUT /memberships/:id.xml should update the membership" do
142 assert_not_equal [1,2], Member.find(2).role_ids.sort
143 assert_no_difference 'Member.count' do
144 put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [1,2]}}, credentials('jsmith')
145
146 assert_response :ok
147 assert_equal '', @response.body
150 end 148 end
149 member = Member.find(2)
150 assert_equal [1,2], member.role_ids.sort
151 end
151 152
152 context "PUT" do 153 test "PUT /memberships/:id.xml with invalid parameters should return errors" do
153 context "xml" do 154 put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [99]}}, credentials('jsmith')
154 should "update membership" do
155 assert_not_equal [1,2], Member.find(2).role_ids.sort
156 assert_no_difference 'Member.count' do
157 put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [1,2]}}, credentials('jsmith')
158 155
159 assert_response :ok 156 assert_response :unprocessable_entity
160 assert_equal '', @response.body 157 assert_equal 'application/xml', @response.content_type
161 end 158 assert_tag 'errors', :child => {:tag => 'error', :content => /member_roles is invalid/}
162 member = Member.find(2) 159 end
163 assert_equal [1,2], member.role_ids.sort
164 end
165 160
166 should "return errors on failure" do 161 test "DELETE /memberships/:id.xml should destroy the membership" do
167 put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [99]}}, credentials('jsmith') 162 assert_difference 'Member.count', -1 do
163 delete '/memberships/2.xml', {}, credentials('jsmith')
168 164
169 assert_response :unprocessable_entity 165 assert_response :ok
170 assert_equal 'application/xml', @response.content_type 166 assert_equal '', @response.body
171 assert_tag 'errors', :child => {:tag => 'error', :content => /member_roles is invalid/}
172 end
173 end
174 end 167 end
168 assert_nil Member.find_by_id(2)
169 end
175 170
176 context "DELETE" do 171 test "DELETE /memberships/:id.xml should respond with 422 on failure" do
177 context "xml" do 172 assert_no_difference 'Member.count' do
178 should "destroy membership" do 173 # A membership with an inherited role can't be deleted
179 assert_difference 'Member.count', -1 do 174 Member.find(2).member_roles.first.update_attribute :inherited_from, 99
180 delete '/memberships/2.xml', {}, credentials('jsmith') 175 delete '/memberships/2.xml', {}, credentials('jsmith')
181 176
182 assert_response :ok 177 assert_response :unprocessable_entity
183 assert_equal '', @response.body
184 end
185 assert_nil Member.find_by_id(2)
186 end
187
188 should "respond with 422 on failure" do
189 assert_no_difference 'Member.count' do
190 # A membership with an inherited role can't be deleted
191 Member.find(2).member_roles.first.update_attribute :inherited_from, 99
192 delete '/memberships/2.xml', {}, credentials('jsmith')
193
194 assert_response :unprocessable_entity
195 end
196 end
197 end
198 end 178 end
199 end 179 end
200 end 180 end