comparison test/integration/api_test/memberships_test.rb @ 1464:261b3d9a4903 redmine-2.4

Update to Redmine 2.4 branch rev 12663
author Chris Cannam
date Tue, 14 Jan 2014 14:37:42 +0000
parents 433d4f72a19b
children e248c7af89ec
comparison
equal deleted inserted replaced
1296:038ba2d95de8 1464:261b3d9a4903
1 # Redmine - project management software 1 # Redmine - project management software
2 # Copyright (C) 2006-2012 Jean-Philippe Lang 2 # Copyright (C) 2006-2013 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 "POST /projects/:project_id/memberships.xml should create the membership" do
84 context "xml" do 77 assert_difference 'Member.count' do
85 should "create membership" do 78 post '/projects/1/memberships.xml', {:membership => {:user_id => 7, :role_ids => [2,3]}}, credentials('jsmith')
86 assert_difference 'Member.count' do
87 post '/projects/1/memberships.xml', {:membership => {:user_id => 7, :role_ids => [2,3]}}, credentials('jsmith')
88 79
89 assert_response :created 80 assert_response :created
90 end
91 end
92
93 should "return errors on failure" do
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 81 end
104 end 82 end
105 83
106 context "/memberships/:id" do 84 test "POST /projects/:project_id/memberships.xml with invalid parameters should return errors" do
107 context "GET" do 85 assert_no_difference 'Member.count' do
108 context "xml" do 86 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 87
112 assert_response :success 88 assert_response :unprocessable_entity
113 assert_equal 'application/xml', @response.content_type 89 assert_equal 'application/xml', @response.content_type
114 assert_tag :tag => 'membership', 90 assert_tag 'errors', :child => {:tag => 'error', :content => "Principal can't be blank"}
91 end
92 end
93
94 test "GET /memberships/:id.xml should return the membership" do
95 get '/memberships/2.xml', {}, credentials('jsmith')
96
97 assert_response :success
98 assert_equal 'application/xml', @response.content_type
99 assert_tag :tag => 'membership',
100 :child => {
101 :tag => 'id',
102 :content => '2',
103 :sibling => {
104 :tag => 'user',
105 :attributes => {:id => '3', :name => 'Dave Lopper'},
106 :sibling => {
107 :tag => 'roles',
115 :child => { 108 :child => {
116 :tag => 'id', 109 :tag => 'role',
117 :content => '2', 110 :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 } 111 }
130 end 112 }
131 end 113 }
114 }
115 end
132 116
133 context "json" do 117 test "GET /memberships/:id.json should return the membership" do
134 should "return the membership" do 118 get '/memberships/2.json', {}, credentials('jsmith')
135 get '/memberships/2.json', {}, credentials('jsmith')
136 119
137 assert_response :success 120 assert_response :success
138 assert_equal 'application/json', @response.content_type 121 assert_equal 'application/json', @response.content_type
139 json = ActiveSupport::JSON.decode(response.body) 122 json = ActiveSupport::JSON.decode(response.body)
140 assert_equal( 123 assert_equal(
141 {"membership" => { 124 {"membership" => {
142 "id" => 2, 125 "id" => 2,
143 "project" => {"name"=>"eCookbook", "id"=>1}, 126 "project" => {"name"=>"eCookbook", "id"=>1},
144 "roles" => [{"name"=>"Developer", "id"=>2}], 127 "roles" => [{"name"=>"Developer", "id"=>2}],
145 "user" => {"name"=>"Dave Lopper", "id"=>3}} 128 "user" => {"name"=>"Dave Lopper", "id"=>3}}
146 }, 129 },
147 json) 130 json)
148 end 131 end
149 end 132
133 test "PUT /memberships/:id.xml should update the membership" do
134 assert_not_equal [1,2], Member.find(2).role_ids.sort
135 assert_no_difference 'Member.count' do
136 put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [1,2]}}, credentials('jsmith')
137
138 assert_response :ok
139 assert_equal '', @response.body
150 end 140 end
141 member = Member.find(2)
142 assert_equal [1,2], member.role_ids.sort
143 end
151 144
152 context "PUT" do 145 test "PUT /memberships/:id.xml with invalid parameters should return errors" do
153 context "xml" do 146 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 147
159 assert_response :ok 148 assert_response :unprocessable_entity
160 assert_equal '', @response.body 149 assert_equal 'application/xml', @response.content_type
161 end 150 assert_tag 'errors', :child => {:tag => 'error', :content => /member_roles is invalid/}
162 member = Member.find(2) 151 end
163 assert_equal [1,2], member.role_ids.sort
164 end
165 152
166 should "return errors on failure" do 153 test "DELETE /memberships/:id.xml should destroy the membership" do
167 put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [99]}}, credentials('jsmith') 154 assert_difference 'Member.count', -1 do
155 delete '/memberships/2.xml', {}, credentials('jsmith')
168 156
169 assert_response :unprocessable_entity 157 assert_response :ok
170 assert_equal 'application/xml', @response.content_type 158 assert_equal '', @response.body
171 assert_tag 'errors', :child => {:tag => 'error', :content => /member_roles is invalid/}
172 end
173 end
174 end 159 end
160 assert_nil Member.find_by_id(2)
161 end
175 162
176 context "DELETE" do 163 test "DELETE /memberships/:id.xml should respond with 422 on failure" do
177 context "xml" do 164 assert_no_difference 'Member.count' do
178 should "destroy membership" do 165 # A membership with an inherited role can't be deleted
179 assert_difference 'Member.count', -1 do 166 Member.find(2).member_roles.first.update_attribute :inherited_from, 99
180 delete '/memberships/2.xml', {}, credentials('jsmith') 167 delete '/memberships/2.xml', {}, credentials('jsmith')
181 168
182 assert_response :ok 169 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 170 end
199 end 171 end
200 end 172 end