##// END OF EJS Templates
Prevent projects tests from deleting fixture files....
Jean-Philippe Lang -
r7732:1341dd564b51
parent child
Show More
@@ -1,261 +1,262
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2011 Jean-Philippe Lang
2 # Copyright (C) 2006-2011 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.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
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
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::ProjectsTest < ActionController::IntegrationTest
20 class ApiTest::ProjectsTest < ActionController::IntegrationTest
21 fixtures :projects, :versions, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details,
21 fixtures :projects, :versions, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details,
22 :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages,
22 :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages,
23 :attachments, :custom_fields, :custom_values, :time_entries
23 :attachments, :custom_fields, :custom_values, :time_entries
24
24
25 def setup
25 def setup
26 Setting.rest_api_enabled = '1'
26 Setting.rest_api_enabled = '1'
27 set_tmp_attachments_directory
27 end
28 end
28
29
29 context "GET /projects" do
30 context "GET /projects" do
30 context ".xml" do
31 context ".xml" do
31 should "return projects" do
32 should "return projects" do
32 get '/projects.xml'
33 get '/projects.xml'
33 assert_response :success
34 assert_response :success
34 assert_equal 'application/xml', @response.content_type
35 assert_equal 'application/xml', @response.content_type
35
36
36 assert_tag :tag => 'projects',
37 assert_tag :tag => 'projects',
37 :child => {:tag => 'project', :child => {:tag => 'id', :content => '1'}}
38 :child => {:tag => 'project', :child => {:tag => 'id', :content => '1'}}
38 end
39 end
39 end
40 end
40
41
41 context ".json" do
42 context ".json" do
42 should "return projects" do
43 should "return projects" do
43 get '/projects.json'
44 get '/projects.json'
44 assert_response :success
45 assert_response :success
45 assert_equal 'application/json', @response.content_type
46 assert_equal 'application/json', @response.content_type
46
47
47 json = ActiveSupport::JSON.decode(response.body)
48 json = ActiveSupport::JSON.decode(response.body)
48 assert_kind_of Hash, json
49 assert_kind_of Hash, json
49 assert_kind_of Array, json['projects']
50 assert_kind_of Array, json['projects']
50 assert_kind_of Hash, json['projects'].first
51 assert_kind_of Hash, json['projects'].first
51 assert json['projects'].first.has_key?('id')
52 assert json['projects'].first.has_key?('id')
52 end
53 end
53 end
54 end
54 end
55 end
55
56
56 context "GET /projects/:id" do
57 context "GET /projects/:id" do
57 context ".xml" do
58 context ".xml" do
58 # TODO: A private project is needed because should_allow_api_authentication
59 # TODO: A private project is needed because should_allow_api_authentication
59 # actually tests that authentication is *required*, not just allowed
60 # actually tests that authentication is *required*, not just allowed
60 should_allow_api_authentication(:get, "/projects/2.xml")
61 should_allow_api_authentication(:get, "/projects/2.xml")
61
62
62 should "return requested project" do
63 should "return requested project" do
63 get '/projects/1.xml'
64 get '/projects/1.xml'
64 assert_response :success
65 assert_response :success
65 assert_equal 'application/xml', @response.content_type
66 assert_equal 'application/xml', @response.content_type
66
67
67 assert_tag :tag => 'project',
68 assert_tag :tag => 'project',
68 :child => {:tag => 'id', :content => '1'}
69 :child => {:tag => 'id', :content => '1'}
69 assert_tag :tag => 'custom_field',
70 assert_tag :tag => 'custom_field',
70 :attributes => {:name => 'Development status'}, :content => 'Stable'
71 :attributes => {:name => 'Development status'}, :content => 'Stable'
71 end
72 end
72
73
73 context "with hidden custom fields" do
74 context "with hidden custom fields" do
74 setup do
75 setup do
75 ProjectCustomField.find_by_name('Development status').update_attribute :visible, false
76 ProjectCustomField.find_by_name('Development status').update_attribute :visible, false
76 end
77 end
77
78
78 should "not display hidden custom fields" do
79 should "not display hidden custom fields" do
79 get '/projects/1.xml'
80 get '/projects/1.xml'
80 assert_response :success
81 assert_response :success
81 assert_equal 'application/xml', @response.content_type
82 assert_equal 'application/xml', @response.content_type
82
83
83 assert_no_tag 'custom_field',
84 assert_no_tag 'custom_field',
84 :attributes => {:name => 'Development status'}
85 :attributes => {:name => 'Development status'}
85 end
86 end
86 end
87 end
87 end
88 end
88
89
89 context ".json" do
90 context ".json" do
90 should_allow_api_authentication(:get, "/projects/2.json")
91 should_allow_api_authentication(:get, "/projects/2.json")
91
92
92 should "return requested project" do
93 should "return requested project" do
93 get '/projects/1.json'
94 get '/projects/1.json'
94
95
95 json = ActiveSupport::JSON.decode(response.body)
96 json = ActiveSupport::JSON.decode(response.body)
96 assert_kind_of Hash, json
97 assert_kind_of Hash, json
97 assert_kind_of Hash, json['project']
98 assert_kind_of Hash, json['project']
98 assert_equal 1, json['project']['id']
99 assert_equal 1, json['project']['id']
99 end
100 end
100 end
101 end
101 end
102 end
102
103
103 context "POST /projects" do
104 context "POST /projects" do
104 context "with valid parameters" do
105 context "with valid parameters" do
105 setup do
106 setup do
106 Setting.default_projects_modules = ['issue_tracking', 'repository']
107 Setting.default_projects_modules = ['issue_tracking', 'repository']
107 @parameters = {:project => {:name => 'API test', :identifier => 'api-test'}}
108 @parameters = {:project => {:name => 'API test', :identifier => 'api-test'}}
108 end
109 end
109
110
110 context ".xml" do
111 context ".xml" do
111 should_allow_api_authentication(:post,
112 should_allow_api_authentication(:post,
112 '/projects.xml',
113 '/projects.xml',
113 {:project => {:name => 'API test', :identifier => 'api-test'}},
114 {:project => {:name => 'API test', :identifier => 'api-test'}},
114 {:success_code => :created})
115 {:success_code => :created})
115
116
116
117
117 should "create a project with the attributes" do
118 should "create a project with the attributes" do
118 assert_difference('Project.count') do
119 assert_difference('Project.count') do
119 post '/projects.xml', @parameters, :authorization => credentials('admin')
120 post '/projects.xml', @parameters, :authorization => credentials('admin')
120 end
121 end
121
122
122 project = Project.first(:order => 'id DESC')
123 project = Project.first(:order => 'id DESC')
123 assert_equal 'API test', project.name
124 assert_equal 'API test', project.name
124 assert_equal 'api-test', project.identifier
125 assert_equal 'api-test', project.identifier
125 assert_equal ['issue_tracking', 'repository'], project.enabled_module_names.sort
126 assert_equal ['issue_tracking', 'repository'], project.enabled_module_names.sort
126 assert_equal Tracker.all.size, project.trackers.size
127 assert_equal Tracker.all.size, project.trackers.size
127
128
128 assert_response :created
129 assert_response :created
129 assert_equal 'application/xml', @response.content_type
130 assert_equal 'application/xml', @response.content_type
130 assert_tag 'project', :child => {:tag => 'id', :content => project.id.to_s}
131 assert_tag 'project', :child => {:tag => 'id', :content => project.id.to_s}
131 end
132 end
132
133
133 should "accept enabled_module_names attribute" do
134 should "accept enabled_module_names attribute" do
134 @parameters[:project].merge!({:enabled_module_names => ['issue_tracking', 'news', 'time_tracking']})
135 @parameters[:project].merge!({:enabled_module_names => ['issue_tracking', 'news', 'time_tracking']})
135
136
136 assert_difference('Project.count') do
137 assert_difference('Project.count') do
137 post '/projects.xml', @parameters, :authorization => credentials('admin')
138 post '/projects.xml', @parameters, :authorization => credentials('admin')
138 end
139 end
139
140
140 project = Project.first(:order => 'id DESC')
141 project = Project.first(:order => 'id DESC')
141 assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort
142 assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort
142 end
143 end
143
144
144 should "accept tracker_ids attribute" do
145 should "accept tracker_ids attribute" do
145 @parameters[:project].merge!({:tracker_ids => [1, 3]})
146 @parameters[:project].merge!({:tracker_ids => [1, 3]})
146
147
147 assert_difference('Project.count') do
148 assert_difference('Project.count') do
148 post '/projects.xml', @parameters, :authorization => credentials('admin')
149 post '/projects.xml', @parameters, :authorization => credentials('admin')
149 end
150 end
150
151
151 project = Project.first(:order => 'id DESC')
152 project = Project.first(:order => 'id DESC')
152 assert_equal [1, 3], project.trackers.map(&:id).sort
153 assert_equal [1, 3], project.trackers.map(&:id).sort
153 end
154 end
154 end
155 end
155 end
156 end
156
157
157 context "with invalid parameters" do
158 context "with invalid parameters" do
158 setup do
159 setup do
159 @parameters = {:project => {:name => 'API test'}}
160 @parameters = {:project => {:name => 'API test'}}
160 end
161 end
161
162
162 context ".xml" do
163 context ".xml" do
163 should "return errors" do
164 should "return errors" do
164 assert_no_difference('Project.count') do
165 assert_no_difference('Project.count') do
165 post '/projects.xml', @parameters, :authorization => credentials('admin')
166 post '/projects.xml', @parameters, :authorization => credentials('admin')
166 end
167 end
167
168
168 assert_response :unprocessable_entity
169 assert_response :unprocessable_entity
169 assert_equal 'application/xml', @response.content_type
170 assert_equal 'application/xml', @response.content_type
170 assert_tag 'errors', :child => {:tag => 'error', :content => "Identifier can't be blank"}
171 assert_tag 'errors', :child => {:tag => 'error', :content => "Identifier can't be blank"}
171 end
172 end
172 end
173 end
173 end
174 end
174 end
175 end
175
176
176 context "PUT /projects/:id" do
177 context "PUT /projects/:id" do
177 context "with valid parameters" do
178 context "with valid parameters" do
178 setup do
179 setup do
179 @parameters = {:project => {:name => 'API update'}}
180 @parameters = {:project => {:name => 'API update'}}
180 end
181 end
181
182
182 context ".xml" do
183 context ".xml" do
183 should_allow_api_authentication(:put,
184 should_allow_api_authentication(:put,
184 '/projects/2.xml',
185 '/projects/2.xml',
185 {:project => {:name => 'API update'}},
186 {:project => {:name => 'API update'}},
186 {:success_code => :ok})
187 {:success_code => :ok})
187
188
188 should "update the project" do
189 should "update the project" do
189 assert_no_difference 'Project.count' do
190 assert_no_difference 'Project.count' do
190 put '/projects/2.xml', @parameters, :authorization => credentials('jsmith')
191 put '/projects/2.xml', @parameters, :authorization => credentials('jsmith')
191 end
192 end
192 assert_response :ok
193 assert_response :ok
193 assert_equal 'application/xml', @response.content_type
194 assert_equal 'application/xml', @response.content_type
194 project = Project.find(2)
195 project = Project.find(2)
195 assert_equal 'API update', project.name
196 assert_equal 'API update', project.name
196 end
197 end
197
198
198 should "accept enabled_module_names attribute" do
199 should "accept enabled_module_names attribute" do
199 @parameters[:project].merge!({:enabled_module_names => ['issue_tracking', 'news', 'time_tracking']})
200 @parameters[:project].merge!({:enabled_module_names => ['issue_tracking', 'news', 'time_tracking']})
200
201
201 assert_no_difference 'Project.count' do
202 assert_no_difference 'Project.count' do
202 put '/projects/2.xml', @parameters, :authorization => credentials('admin')
203 put '/projects/2.xml', @parameters, :authorization => credentials('admin')
203 end
204 end
204 assert_response :ok
205 assert_response :ok
205 project = Project.find(2)
206 project = Project.find(2)
206 assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort
207 assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort
207 end
208 end
208
209
209 should "accept tracker_ids attribute" do
210 should "accept tracker_ids attribute" do
210 @parameters[:project].merge!({:tracker_ids => [1, 3]})
211 @parameters[:project].merge!({:tracker_ids => [1, 3]})
211
212
212 assert_no_difference 'Project.count' do
213 assert_no_difference 'Project.count' do
213 put '/projects/2.xml', @parameters, :authorization => credentials('admin')
214 put '/projects/2.xml', @parameters, :authorization => credentials('admin')
214 end
215 end
215 assert_response :ok
216 assert_response :ok
216 project = Project.find(2)
217 project = Project.find(2)
217 assert_equal [1, 3], project.trackers.map(&:id).sort
218 assert_equal [1, 3], project.trackers.map(&:id).sort
218 end
219 end
219 end
220 end
220 end
221 end
221
222
222 context "with invalid parameters" do
223 context "with invalid parameters" do
223 setup do
224 setup do
224 @parameters = {:project => {:name => ''}}
225 @parameters = {:project => {:name => ''}}
225 end
226 end
226
227
227 context ".xml" do
228 context ".xml" do
228 should "return errors" do
229 should "return errors" do
229 assert_no_difference('Project.count') do
230 assert_no_difference('Project.count') do
230 put '/projects/2.xml', @parameters, :authorization => credentials('admin')
231 put '/projects/2.xml', @parameters, :authorization => credentials('admin')
231 end
232 end
232
233
233 assert_response :unprocessable_entity
234 assert_response :unprocessable_entity
234 assert_equal 'application/xml', @response.content_type
235 assert_equal 'application/xml', @response.content_type
235 assert_tag 'errors', :child => {:tag => 'error', :content => "Name can't be blank"}
236 assert_tag 'errors', :child => {:tag => 'error', :content => "Name can't be blank"}
236 end
237 end
237 end
238 end
238 end
239 end
239 end
240 end
240
241
241 context "DELETE /projects/:id" do
242 context "DELETE /projects/:id" do
242 context ".xml" do
243 context ".xml" do
243 should_allow_api_authentication(:delete,
244 should_allow_api_authentication(:delete,
244 '/projects/2.xml',
245 '/projects/2.xml',
245 {},
246 {},
246 {:success_code => :ok})
247 {:success_code => :ok})
247
248
248 should "delete the project" do
249 should "delete the project" do
249 assert_difference('Project.count',-1) do
250 assert_difference('Project.count',-1) do
250 delete '/projects/2.xml', {}, :authorization => credentials('admin')
251 delete '/projects/2.xml', {}, :authorization => credentials('admin')
251 end
252 end
252 assert_response :ok
253 assert_response :ok
253 assert_nil Project.find_by_id(2)
254 assert_nil Project.find_by_id(2)
254 end
255 end
255 end
256 end
256 end
257 end
257
258
258 def credentials(user, password=nil)
259 def credentials(user, password=nil)
259 ActionController::HttpAuthentication::Basic.encode_credentials(user, password || user)
260 ActionController::HttpAuthentication::Basic.encode_credentials(user, password || user)
260 end
261 end
261 end
262 end
General Comments 0
You need to be logged in to leave comments. Login now