comparison .svn/pristine/3e/3e2401296aa57bb537864ac16aaa5ce36ba06138.svn-base @ 1298:4f746d8966dd redmine_2.3_integration

Merge from redmine-2.3 branch to create new branch redmine-2.3-integration
author Chris Cannam
date Fri, 14 Jun 2013 09:28:30 +0100
parents 622f24f53b42
children
comparison
equal deleted inserted replaced
1297:0a574315af3e 1298:4f746d8966dd
1 # Redmine - project management software
2 # Copyright (C) 2006-2013 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
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.
17
18 require File.expand_path('../../../test_helper', __FILE__)
19
20 class Redmine::ApiTest::MembershipsTest < Redmine::ApiTest::Base
21 fixtures :projects, :users, :roles, :members, :member_roles
22
23 def setup
24 Setting.rest_api_enabled = '1'
25 end
26
27 context "/projects/:project_id/memberships" do
28 context "GET" do
29 context "xml" do
30 should "return memberships" do
31 get '/projects/1/memberships.xml', {}, credentials('jsmith')
32
33 assert_response :success
34 assert_equal 'application/xml', @response.content_type
35 assert_tag :tag => 'memberships',
36 :attributes => {:type => 'array'},
37 :child => {
38 :tag => 'membership',
39 :child => {
40 :tag => 'id',
41 :content => '2',
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 }
54 }
55 end
56 end
57
58 context "json" do
59 should "return memberships" do
60 get '/projects/1/memberships.json', {}, credentials('jsmith')
61
62 assert_response :success
63 assert_equal 'application/json', @response.content_type
64 json = ActiveSupport::JSON.decode(response.body)
65 assert_equal({
66 "memberships" =>
67 [{"id"=>1,
68 "project" => {"name"=>"eCookbook", "id"=>1},
69 "roles" => [{"name"=>"Manager", "id"=>1}],
70 "user" => {"name"=>"John Smith", "id"=>2}},
71 {"id"=>2,
72 "project" => {"name"=>"eCookbook", "id"=>1},
73 "roles" => [{"name"=>"Developer", "id"=>2}],
74 "user" => {"name"=>"Dave Lopper", "id"=>3}}],
75 "limit" => 25,
76 "total_count" => 2,
77 "offset" => 0},
78 json)
79 end
80 end
81 end
82
83 context "POST" do
84 context "xml" do
85 should "create membership" do
86 assert_difference 'Member.count' do
87 post '/projects/1/memberships.xml', {:membership => {:user_id => 7, :role_ids => [2,3]}}, credentials('jsmith')
88
89 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
104 end
105
106 context "/memberships/:id" do
107 context "GET" do
108 context "xml" do
109 should "return the membership" do
110 get '/memberships/2.xml', {}, credentials('jsmith')
111
112 assert_response :success
113 assert_equal 'application/xml', @response.content_type
114 assert_tag :tag => 'membership',
115 :child => {
116 :tag => 'id',
117 :content => '2',
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 }
130 end
131 end
132
133 context "json" do
134 should "return the membership" do
135 get '/memberships/2.json', {}, credentials('jsmith')
136
137 assert_response :success
138 assert_equal 'application/json', @response.content_type
139 json = ActiveSupport::JSON.decode(response.body)
140 assert_equal(
141 {"membership" => {
142 "id" => 2,
143 "project" => {"name"=>"eCookbook", "id"=>1},
144 "roles" => [{"name"=>"Developer", "id"=>2}],
145 "user" => {"name"=>"Dave Lopper", "id"=>3}}
146 },
147 json)
148 end
149 end
150 end
151
152 context "PUT" do
153 context "xml" do
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
159 assert_response :ok
160 assert_equal '', @response.body
161 end
162 member = Member.find(2)
163 assert_equal [1,2], member.role_ids.sort
164 end
165
166 should "return errors on failure" do
167 put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [99]}}, credentials('jsmith')
168
169 assert_response :unprocessable_entity
170 assert_equal 'application/xml', @response.content_type
171 assert_tag 'errors', :child => {:tag => 'error', :content => /member_roles is invalid/}
172 end
173 end
174 end
175
176 context "DELETE" do
177 context "xml" do
178 should "destroy membership" do
179 assert_difference 'Member.count', -1 do
180 delete '/memberships/2.xml', {}, credentials('jsmith')
181
182 assert_response :ok
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
199 end
200 end