chris@37
|
1 # Redmine - project management software
|
Chris@909
|
2 # Copyright (C) 2006-2011 Jean-Philippe Lang
|
chris@37
|
3 #
|
chris@37
|
4 # This program is free software; you can redistribute it and/or
|
chris@37
|
5 # modify it under the terms of the GNU General Public License
|
chris@37
|
6 # as published by the Free Software Foundation; either version 2
|
chris@37
|
7 # of the License, or (at your option) any later version.
|
Chris@909
|
8 #
|
chris@37
|
9 # This program is distributed in the hope that it will be useful,
|
chris@37
|
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
chris@37
|
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
chris@37
|
12 # GNU General Public License for more details.
|
Chris@909
|
13 #
|
chris@37
|
14 # You should have received a copy of the GNU General Public License
|
chris@37
|
15 # along with this program; if not, write to the Free Software
|
chris@37
|
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
chris@37
|
17
|
Chris@119
|
18 require File.expand_path('../../../test_helper', __FILE__)
|
chris@37
|
19
|
chris@37
|
20 class ApiTest::IssuesTest < ActionController::IntegrationTest
|
chris@37
|
21 fixtures :projects,
|
chris@37
|
22 :users,
|
chris@37
|
23 :roles,
|
chris@37
|
24 :members,
|
chris@37
|
25 :member_roles,
|
chris@37
|
26 :issues,
|
chris@37
|
27 :issue_statuses,
|
chris@37
|
28 :versions,
|
chris@37
|
29 :trackers,
|
chris@37
|
30 :projects_trackers,
|
chris@37
|
31 :issue_categories,
|
chris@37
|
32 :enabled_modules,
|
chris@37
|
33 :enumerations,
|
chris@37
|
34 :attachments,
|
chris@37
|
35 :workflows,
|
chris@37
|
36 :custom_fields,
|
chris@37
|
37 :custom_values,
|
chris@37
|
38 :custom_fields_projects,
|
chris@37
|
39 :custom_fields_trackers,
|
chris@37
|
40 :time_entries,
|
chris@37
|
41 :journals,
|
chris@37
|
42 :journal_details,
|
Chris@909
|
43 :queries,
|
Chris@909
|
44 :attachments
|
chris@37
|
45
|
chris@37
|
46 def setup
|
chris@37
|
47 Setting.rest_api_enabled = '1'
|
chris@37
|
48 end
|
chris@37
|
49
|
Chris@909
|
50 context "/issues" do
|
Chris@119
|
51 # Use a private project to make sure auth is really working and not just
|
Chris@119
|
52 # only showing public issues.
|
chris@37
|
53 should_allow_api_authentication(:get, "/projects/private-child/issues.xml")
|
Chris@909
|
54
|
Chris@119
|
55 should "contain metadata" do
|
Chris@119
|
56 get '/issues.xml'
|
Chris@909
|
57
|
Chris@119
|
58 assert_tag :tag => 'issues',
|
Chris@119
|
59 :attributes => {
|
Chris@119
|
60 :type => 'array',
|
Chris@119
|
61 :total_count => assigns(:issue_count),
|
Chris@119
|
62 :limit => 25,
|
Chris@119
|
63 :offset => 0
|
Chris@119
|
64 }
|
Chris@119
|
65 end
|
Chris@909
|
66
|
Chris@119
|
67 context "with offset and limit" do
|
Chris@119
|
68 should "use the params" do
|
Chris@119
|
69 get '/issues.xml?offset=2&limit=3'
|
Chris@909
|
70
|
Chris@119
|
71 assert_equal 3, assigns(:limit)
|
Chris@119
|
72 assert_equal 2, assigns(:offset)
|
Chris@119
|
73 assert_tag :tag => 'issues', :children => {:count => 3, :only => {:tag => 'issue'}}
|
Chris@119
|
74 end
|
Chris@119
|
75 end
|
Chris@119
|
76
|
Chris@119
|
77 context "with nometa param" do
|
Chris@119
|
78 should "not contain metadata" do
|
Chris@119
|
79 get '/issues.xml?nometa=1'
|
Chris@909
|
80
|
Chris@119
|
81 assert_tag :tag => 'issues',
|
Chris@119
|
82 :attributes => {
|
Chris@119
|
83 :type => 'array',
|
Chris@119
|
84 :total_count => nil,
|
Chris@119
|
85 :limit => nil,
|
Chris@119
|
86 :offset => nil
|
Chris@119
|
87 }
|
Chris@119
|
88 end
|
Chris@119
|
89 end
|
Chris@119
|
90
|
Chris@119
|
91 context "with nometa header" do
|
Chris@119
|
92 should "not contain metadata" do
|
Chris@119
|
93 get '/issues.xml', {}, {'X-Redmine-Nometa' => '1'}
|
Chris@909
|
94
|
Chris@119
|
95 assert_tag :tag => 'issues',
|
Chris@119
|
96 :attributes => {
|
Chris@119
|
97 :type => 'array',
|
Chris@119
|
98 :total_count => nil,
|
Chris@119
|
99 :limit => nil,
|
Chris@119
|
100 :offset => nil
|
Chris@119
|
101 }
|
Chris@119
|
102 end
|
Chris@119
|
103 end
|
Chris@909
|
104
|
Chris@909
|
105 context "with relations" do
|
Chris@909
|
106 should "display relations" do
|
Chris@909
|
107 get '/issues.xml?include=relations'
|
Chris@909
|
108
|
Chris@909
|
109 assert_response :success
|
Chris@909
|
110 assert_equal 'application/xml', @response.content_type
|
Chris@909
|
111 assert_tag 'relations',
|
Chris@909
|
112 :parent => {:tag => 'issue', :child => {:tag => 'id', :content => '3'}},
|
Chris@909
|
113 :children => {:count => 1},
|
Chris@909
|
114 :child => {
|
Chris@909
|
115 :tag => 'relation',
|
Chris@909
|
116 :attributes => {:id => '2', :issue_id => '2', :issue_to_id => '3', :relation_type => 'relates'}
|
Chris@909
|
117 }
|
Chris@909
|
118 assert_tag 'relations',
|
Chris@909
|
119 :parent => {:tag => 'issue', :child => {:tag => 'id', :content => '1'}},
|
Chris@909
|
120 :children => {:count => 0}
|
Chris@909
|
121 end
|
Chris@909
|
122 end
|
Chris@909
|
123
|
Chris@909
|
124 context "with invalid query params" do
|
Chris@909
|
125 should "return errors" do
|
Chris@909
|
126 get '/issues.xml', {:f => ['start_date'], :op => {:start_date => '='}}
|
Chris@909
|
127
|
Chris@909
|
128 assert_response :unprocessable_entity
|
Chris@909
|
129 assert_equal 'application/xml', @response.content_type
|
Chris@909
|
130 assert_tag 'errors', :child => {:tag => 'error', :content => "Start date can't be blank"}
|
Chris@909
|
131 end
|
Chris@909
|
132 end
|
Chris@909
|
133
|
Chris@909
|
134 context "with custom field filter" do
|
Chris@909
|
135 should "show only issues with the custom field value" do
|
Chris@909
|
136 get '/issues.xml', { :set_filter => 1, :f => ['cf_1'], :op => {:cf_1 => '='}, :v => {:cf_1 => ['MySQL']}}
|
Chris@909
|
137
|
Chris@909
|
138 expected_ids = Issue.visible.all(
|
Chris@909
|
139 :include => :custom_values,
|
Chris@909
|
140 :conditions => {:custom_values => {:custom_field_id => 1, :value => 'MySQL'}}).map(&:id)
|
Chris@909
|
141
|
Chris@909
|
142 assert_select 'issues > issue > id', :count => expected_ids.count do |ids|
|
Chris@909
|
143 ids.each { |id| assert expected_ids.delete(id.children.first.content.to_i) }
|
Chris@909
|
144 end
|
Chris@909
|
145 end
|
Chris@909
|
146 end
|
Chris@909
|
147
|
Chris@909
|
148 context "with custom field filter (shorthand method)" do
|
Chris@909
|
149 should "show only issues with the custom field value" do
|
Chris@909
|
150 get '/issues.xml', { :cf_1 => 'MySQL' }
|
Chris@909
|
151
|
Chris@909
|
152 expected_ids = Issue.visible.all(
|
Chris@909
|
153 :include => :custom_values,
|
Chris@909
|
154 :conditions => {:custom_values => {:custom_field_id => 1, :value => 'MySQL'}}).map(&:id)
|
Chris@909
|
155
|
Chris@909
|
156 assert_select 'issues > issue > id', :count => expected_ids.count do |ids|
|
Chris@909
|
157 ids.each { |id| assert expected_ids.delete(id.children.first.content.to_i) }
|
Chris@909
|
158 end
|
Chris@909
|
159 end
|
Chris@909
|
160 end
|
chris@37
|
161 end
|
chris@37
|
162
|
chris@37
|
163 context "/index.json" do
|
chris@37
|
164 should_allow_api_authentication(:get, "/projects/private-child/issues.json")
|
chris@37
|
165 end
|
chris@37
|
166
|
chris@37
|
167 context "/index.xml with filter" do
|
chris@37
|
168 should "show only issues with the status_id" do
|
chris@37
|
169 get '/issues.xml?status_id=5'
|
Chris@909
|
170
|
Chris@909
|
171 expected_ids = Issue.visible.all(:conditions => {:status_id => 5}).map(&:id)
|
Chris@909
|
172
|
Chris@909
|
173 assert_select 'issues > issue > id', :count => expected_ids.count do |ids|
|
Chris@909
|
174 ids.each { |id| assert expected_ids.delete(id.children.first.content.to_i) }
|
Chris@909
|
175 end
|
chris@37
|
176 end
|
chris@37
|
177 end
|
chris@37
|
178
|
chris@37
|
179 context "/index.json with filter" do
|
chris@37
|
180 should "show only issues with the status_id" do
|
chris@37
|
181 get '/issues.json?status_id=5'
|
chris@37
|
182
|
chris@37
|
183 json = ActiveSupport::JSON.decode(response.body)
|
Chris@119
|
184 status_ids_used = json['issues'].collect {|j| j['status']['id'] }
|
chris@37
|
185 assert_equal 3, status_ids_used.length
|
chris@37
|
186 assert status_ids_used.all? {|id| id == 5 }
|
chris@37
|
187 end
|
chris@37
|
188
|
chris@37
|
189 end
|
chris@37
|
190
|
chris@37
|
191 # Issue 6 is on a private project
|
chris@37
|
192 context "/issues/6.xml" do
|
chris@37
|
193 should_allow_api_authentication(:get, "/issues/6.xml")
|
chris@37
|
194 end
|
chris@37
|
195
|
chris@37
|
196 context "/issues/6.json" do
|
chris@37
|
197 should_allow_api_authentication(:get, "/issues/6.json")
|
chris@37
|
198 end
|
Chris@909
|
199
|
Chris@119
|
200 context "GET /issues/:id" do
|
Chris@119
|
201 context "with journals" do
|
Chris@119
|
202 context ".xml" do
|
Chris@119
|
203 should "display journals" do
|
Chris@119
|
204 get '/issues/1.xml?include=journals'
|
Chris@909
|
205
|
Chris@119
|
206 assert_tag :tag => 'issue',
|
Chris@119
|
207 :child => {
|
Chris@119
|
208 :tag => 'journals',
|
Chris@119
|
209 :attributes => { :type => 'array' },
|
Chris@119
|
210 :child => {
|
Chris@119
|
211 :tag => 'journal',
|
Chris@119
|
212 :attributes => { :id => '1'},
|
Chris@119
|
213 :child => {
|
Chris@119
|
214 :tag => 'details',
|
Chris@119
|
215 :attributes => { :type => 'array' },
|
Chris@119
|
216 :child => {
|
Chris@119
|
217 :tag => 'detail',
|
Chris@119
|
218 :attributes => { :name => 'status_id' },
|
Chris@119
|
219 :child => {
|
Chris@119
|
220 :tag => 'old_value',
|
Chris@119
|
221 :content => '1',
|
Chris@119
|
222 :sibling => {
|
Chris@119
|
223 :tag => 'new_value',
|
Chris@119
|
224 :content => '2'
|
Chris@119
|
225 }
|
Chris@119
|
226 }
|
Chris@119
|
227 }
|
Chris@119
|
228 }
|
Chris@119
|
229 }
|
Chris@119
|
230 }
|
Chris@119
|
231 end
|
Chris@119
|
232 end
|
Chris@119
|
233 end
|
Chris@909
|
234
|
Chris@119
|
235 context "with custom fields" do
|
Chris@119
|
236 context ".xml" do
|
Chris@119
|
237 should "display custom fields" do
|
Chris@119
|
238 get '/issues/3.xml'
|
Chris@909
|
239
|
Chris@909
|
240 assert_tag :tag => 'issue',
|
Chris@119
|
241 :child => {
|
Chris@119
|
242 :tag => 'custom_fields',
|
Chris@119
|
243 :attributes => { :type => 'array' },
|
Chris@119
|
244 :child => {
|
Chris@119
|
245 :tag => 'custom_field',
|
Chris@119
|
246 :attributes => { :id => '1'},
|
Chris@119
|
247 :child => {
|
Chris@119
|
248 :tag => 'value',
|
Chris@119
|
249 :content => 'MySQL'
|
Chris@119
|
250 }
|
Chris@119
|
251 }
|
Chris@119
|
252 }
|
Chris@909
|
253
|
Chris@119
|
254 assert_nothing_raised do
|
Chris@119
|
255 Hash.from_xml(response.body).to_xml
|
Chris@119
|
256 end
|
Chris@119
|
257 end
|
Chris@119
|
258 end
|
Chris@119
|
259 end
|
Chris@909
|
260
|
Chris@909
|
261 context "with attachments" do
|
Chris@909
|
262 context ".xml" do
|
Chris@909
|
263 should "display attachments" do
|
Chris@909
|
264 get '/issues/3.xml?include=attachments'
|
Chris@909
|
265
|
Chris@909
|
266 assert_tag :tag => 'issue',
|
Chris@909
|
267 :child => {
|
Chris@909
|
268 :tag => 'attachments',
|
Chris@909
|
269 :children => {:count => 5},
|
Chris@909
|
270 :child => {
|
Chris@909
|
271 :tag => 'attachment',
|
Chris@909
|
272 :child => {
|
Chris@909
|
273 :tag => 'filename',
|
Chris@909
|
274 :content => 'source.rb',
|
Chris@909
|
275 :sibling => {
|
Chris@909
|
276 :tag => 'content_url',
|
Chris@909
|
277 :content => 'http://www.example.com/attachments/download/4/source.rb'
|
Chris@909
|
278 }
|
Chris@909
|
279 }
|
Chris@909
|
280 }
|
Chris@909
|
281 }
|
Chris@909
|
282 end
|
Chris@909
|
283 end
|
Chris@909
|
284 end
|
Chris@909
|
285
|
Chris@119
|
286 context "with subtasks" do
|
Chris@119
|
287 setup do
|
Chris@119
|
288 @c1 = Issue.generate!(:status_id => 1, :subject => "child c1", :tracker_id => 1, :project_id => 1, :parent_issue_id => 1)
|
Chris@119
|
289 @c2 = Issue.generate!(:status_id => 1, :subject => "child c2", :tracker_id => 1, :project_id => 1, :parent_issue_id => 1)
|
Chris@119
|
290 @c3 = Issue.generate!(:status_id => 1, :subject => "child c3", :tracker_id => 1, :project_id => 1, :parent_issue_id => @c1.id)
|
Chris@119
|
291 end
|
Chris@909
|
292
|
Chris@119
|
293 context ".xml" do
|
Chris@119
|
294 should "display children" do
|
Chris@119
|
295 get '/issues/1.xml?include=children'
|
Chris@909
|
296
|
Chris@909
|
297 assert_tag :tag => 'issue',
|
Chris@119
|
298 :child => {
|
Chris@119
|
299 :tag => 'children',
|
Chris@119
|
300 :children => {:count => 2},
|
Chris@119
|
301 :child => {
|
Chris@119
|
302 :tag => 'issue',
|
Chris@119
|
303 :attributes => {:id => @c1.id.to_s},
|
Chris@119
|
304 :child => {
|
Chris@119
|
305 :tag => 'subject',
|
Chris@119
|
306 :content => 'child c1',
|
Chris@119
|
307 :sibling => {
|
Chris@119
|
308 :tag => 'children',
|
Chris@119
|
309 :children => {:count => 1},
|
Chris@119
|
310 :child => {
|
Chris@119
|
311 :tag => 'issue',
|
Chris@119
|
312 :attributes => {:id => @c3.id.to_s}
|
Chris@119
|
313 }
|
Chris@119
|
314 }
|
Chris@119
|
315 }
|
Chris@119
|
316 }
|
Chris@119
|
317 }
|
Chris@119
|
318 end
|
Chris@909
|
319
|
Chris@119
|
320 context ".json" do
|
Chris@119
|
321 should "display children" do
|
Chris@119
|
322 get '/issues/1.json?include=children'
|
Chris@909
|
323
|
Chris@119
|
324 json = ActiveSupport::JSON.decode(response.body)
|
Chris@119
|
325 assert_equal([
|
Chris@119
|
326 {
|
Chris@119
|
327 'id' => @c1.id, 'subject' => 'child c1', 'tracker' => {'id' => 1, 'name' => 'Bug'},
|
Chris@119
|
328 'children' => [{ 'id' => @c3.id, 'subject' => 'child c3', 'tracker' => {'id' => 1, 'name' => 'Bug'} }]
|
Chris@119
|
329 },
|
Chris@119
|
330 { 'id' => @c2.id, 'subject' => 'child c2', 'tracker' => {'id' => 1, 'name' => 'Bug'} }
|
Chris@119
|
331 ],
|
Chris@119
|
332 json['issue']['children'])
|
Chris@119
|
333 end
|
Chris@119
|
334 end
|
Chris@119
|
335 end
|
Chris@119
|
336 end
|
Chris@119
|
337 end
|
chris@37
|
338
|
chris@37
|
339 context "POST /issues.xml" do
|
chris@37
|
340 should_allow_api_authentication(:post,
|
chris@37
|
341 '/issues.xml',
|
chris@37
|
342 {:issue => {:project_id => 1, :subject => 'API test', :tracker_id => 2, :status_id => 3}},
|
chris@37
|
343 {:success_code => :created})
|
chris@37
|
344
|
chris@37
|
345 should "create an issue with the attributes" do
|
chris@37
|
346 assert_difference('Issue.count') do
|
chris@37
|
347 post '/issues.xml', {:issue => {:project_id => 1, :subject => 'API test', :tracker_id => 2, :status_id => 3}}, :authorization => credentials('jsmith')
|
chris@37
|
348 end
|
Chris@909
|
349
|
chris@37
|
350 issue = Issue.first(:order => 'id DESC')
|
chris@37
|
351 assert_equal 1, issue.project_id
|
chris@37
|
352 assert_equal 2, issue.tracker_id
|
chris@37
|
353 assert_equal 3, issue.status_id
|
chris@37
|
354 assert_equal 'API test', issue.subject
|
Chris@909
|
355
|
chris@37
|
356 assert_response :created
|
chris@37
|
357 assert_equal 'application/xml', @response.content_type
|
chris@37
|
358 assert_tag 'issue', :child => {:tag => 'id', :content => issue.id.to_s}
|
chris@37
|
359 end
|
chris@37
|
360 end
|
Chris@909
|
361
|
chris@37
|
362 context "POST /issues.xml with failure" do
|
chris@37
|
363 should "have an errors tag" do
|
chris@37
|
364 assert_no_difference('Issue.count') do
|
chris@37
|
365 post '/issues.xml', {:issue => {:project_id => 1}}, :authorization => credentials('jsmith')
|
chris@37
|
366 end
|
chris@37
|
367
|
chris@37
|
368 assert_tag :errors, :child => {:tag => 'error', :content => "Subject can't be blank"}
|
chris@37
|
369 end
|
chris@37
|
370 end
|
chris@37
|
371
|
chris@37
|
372 context "POST /issues.json" do
|
chris@37
|
373 should_allow_api_authentication(:post,
|
chris@37
|
374 '/issues.json',
|
chris@37
|
375 {:issue => {:project_id => 1, :subject => 'API test', :tracker_id => 2, :status_id => 3}},
|
chris@37
|
376 {:success_code => :created})
|
chris@37
|
377
|
chris@37
|
378 should "create an issue with the attributes" do
|
chris@37
|
379 assert_difference('Issue.count') do
|
chris@37
|
380 post '/issues.json', {:issue => {:project_id => 1, :subject => 'API test', :tracker_id => 2, :status_id => 3}}, :authorization => credentials('jsmith')
|
chris@37
|
381 end
|
Chris@909
|
382
|
chris@37
|
383 issue = Issue.first(:order => 'id DESC')
|
chris@37
|
384 assert_equal 1, issue.project_id
|
chris@37
|
385 assert_equal 2, issue.tracker_id
|
chris@37
|
386 assert_equal 3, issue.status_id
|
chris@37
|
387 assert_equal 'API test', issue.subject
|
chris@37
|
388 end
|
Chris@909
|
389
|
chris@37
|
390 end
|
Chris@909
|
391
|
chris@37
|
392 context "POST /issues.json with failure" do
|
chris@37
|
393 should "have an errors element" do
|
chris@37
|
394 assert_no_difference('Issue.count') do
|
chris@37
|
395 post '/issues.json', {:issue => {:project_id => 1}}, :authorization => credentials('jsmith')
|
chris@37
|
396 end
|
chris@37
|
397
|
chris@37
|
398 json = ActiveSupport::JSON.decode(response.body)
|
Chris@119
|
399 assert json['errors'].include?(['subject', "can't be blank"])
|
chris@37
|
400 end
|
chris@37
|
401 end
|
chris@37
|
402
|
chris@37
|
403 # Issue 6 is on a private project
|
chris@37
|
404 context "PUT /issues/6.xml" do
|
chris@37
|
405 setup do
|
chris@37
|
406 @parameters = {:issue => {:subject => 'API update', :notes => 'A new note'}}
|
chris@37
|
407 @headers = { :authorization => credentials('jsmith') }
|
chris@37
|
408 end
|
Chris@909
|
409
|
chris@37
|
410 should_allow_api_authentication(:put,
|
chris@37
|
411 '/issues/6.xml',
|
chris@37
|
412 {:issue => {:subject => 'API update', :notes => 'A new note'}},
|
chris@37
|
413 {:success_code => :ok})
|
chris@37
|
414
|
chris@37
|
415 should "not create a new issue" do
|
chris@37
|
416 assert_no_difference('Issue.count') do
|
chris@37
|
417 put '/issues/6.xml', @parameters, @headers
|
chris@37
|
418 end
|
chris@37
|
419 end
|
chris@37
|
420
|
chris@37
|
421 should "create a new journal" do
|
chris@37
|
422 assert_difference('Journal.count') do
|
chris@37
|
423 put '/issues/6.xml', @parameters, @headers
|
chris@37
|
424 end
|
chris@37
|
425 end
|
chris@37
|
426
|
chris@37
|
427 should "add the note to the journal" do
|
chris@37
|
428 put '/issues/6.xml', @parameters, @headers
|
Chris@909
|
429
|
chris@37
|
430 journal = Journal.last
|
chris@37
|
431 assert_equal "A new note", journal.notes
|
chris@37
|
432 end
|
chris@37
|
433
|
chris@37
|
434 should "update the issue" do
|
chris@37
|
435 put '/issues/6.xml', @parameters, @headers
|
Chris@909
|
436
|
chris@37
|
437 issue = Issue.find(6)
|
chris@37
|
438 assert_equal "API update", issue.subject
|
chris@37
|
439 end
|
Chris@909
|
440
|
chris@37
|
441 end
|
Chris@909
|
442
|
Chris@119
|
443 context "PUT /issues/3.xml with custom fields" do
|
Chris@119
|
444 setup do
|
Chris@119
|
445 @parameters = {:issue => {:custom_fields => [{'id' => '1', 'value' => 'PostgreSQL' }, {'id' => '2', 'value' => '150'}]}}
|
Chris@119
|
446 @headers = { :authorization => credentials('jsmith') }
|
Chris@119
|
447 end
|
Chris@909
|
448
|
Chris@119
|
449 should "update custom fields" do
|
Chris@119
|
450 assert_no_difference('Issue.count') do
|
Chris@119
|
451 put '/issues/3.xml', @parameters, @headers
|
Chris@119
|
452 end
|
Chris@909
|
453
|
Chris@119
|
454 issue = Issue.find(3)
|
Chris@119
|
455 assert_equal '150', issue.custom_value_for(2).value
|
Chris@119
|
456 assert_equal 'PostgreSQL', issue.custom_value_for(1).value
|
Chris@119
|
457 end
|
Chris@119
|
458 end
|
Chris@909
|
459
|
chris@37
|
460 context "PUT /issues/6.xml with failed update" do
|
chris@37
|
461 setup do
|
chris@37
|
462 @parameters = {:issue => {:subject => ''}}
|
chris@37
|
463 @headers = { :authorization => credentials('jsmith') }
|
chris@37
|
464 end
|
chris@37
|
465
|
chris@37
|
466 should "not create a new issue" do
|
chris@37
|
467 assert_no_difference('Issue.count') do
|
chris@37
|
468 put '/issues/6.xml', @parameters, @headers
|
chris@37
|
469 end
|
chris@37
|
470 end
|
chris@37
|
471
|
chris@37
|
472 should "not create a new journal" do
|
chris@37
|
473 assert_no_difference('Journal.count') do
|
chris@37
|
474 put '/issues/6.xml', @parameters, @headers
|
chris@37
|
475 end
|
chris@37
|
476 end
|
chris@37
|
477
|
chris@37
|
478 should "have an errors tag" do
|
chris@37
|
479 put '/issues/6.xml', @parameters, @headers
|
chris@37
|
480
|
chris@37
|
481 assert_tag :errors, :child => {:tag => 'error', :content => "Subject can't be blank"}
|
chris@37
|
482 end
|
chris@37
|
483 end
|
chris@37
|
484
|
chris@37
|
485 context "PUT /issues/6.json" do
|
chris@37
|
486 setup do
|
chris@37
|
487 @parameters = {:issue => {:subject => 'API update', :notes => 'A new note'}}
|
chris@37
|
488 @headers = { :authorization => credentials('jsmith') }
|
chris@37
|
489 end
|
Chris@909
|
490
|
chris@37
|
491 should_allow_api_authentication(:put,
|
chris@37
|
492 '/issues/6.json',
|
chris@37
|
493 {:issue => {:subject => 'API update', :notes => 'A new note'}},
|
chris@37
|
494 {:success_code => :ok})
|
chris@37
|
495
|
chris@37
|
496 should "not create a new issue" do
|
chris@37
|
497 assert_no_difference('Issue.count') do
|
chris@37
|
498 put '/issues/6.json', @parameters, @headers
|
chris@37
|
499 end
|
chris@37
|
500 end
|
chris@37
|
501
|
chris@37
|
502 should "create a new journal" do
|
chris@37
|
503 assert_difference('Journal.count') do
|
chris@37
|
504 put '/issues/6.json', @parameters, @headers
|
chris@37
|
505 end
|
chris@37
|
506 end
|
chris@37
|
507
|
chris@37
|
508 should "add the note to the journal" do
|
chris@37
|
509 put '/issues/6.json', @parameters, @headers
|
Chris@909
|
510
|
chris@37
|
511 journal = Journal.last
|
chris@37
|
512 assert_equal "A new note", journal.notes
|
chris@37
|
513 end
|
chris@37
|
514
|
chris@37
|
515 should "update the issue" do
|
chris@37
|
516 put '/issues/6.json', @parameters, @headers
|
Chris@909
|
517
|
chris@37
|
518 issue = Issue.find(6)
|
chris@37
|
519 assert_equal "API update", issue.subject
|
chris@37
|
520 end
|
Chris@909
|
521
|
chris@37
|
522 end
|
Chris@909
|
523
|
chris@37
|
524 context "PUT /issues/6.json with failed update" do
|
chris@37
|
525 setup do
|
chris@37
|
526 @parameters = {:issue => {:subject => ''}}
|
chris@37
|
527 @headers = { :authorization => credentials('jsmith') }
|
chris@37
|
528 end
|
chris@37
|
529
|
chris@37
|
530 should "not create a new issue" do
|
chris@37
|
531 assert_no_difference('Issue.count') do
|
chris@37
|
532 put '/issues/6.json', @parameters, @headers
|
chris@37
|
533 end
|
chris@37
|
534 end
|
chris@37
|
535
|
chris@37
|
536 should "not create a new journal" do
|
chris@37
|
537 assert_no_difference('Journal.count') do
|
chris@37
|
538 put '/issues/6.json', @parameters, @headers
|
chris@37
|
539 end
|
chris@37
|
540 end
|
chris@37
|
541
|
chris@37
|
542 should "have an errors attribute" do
|
chris@37
|
543 put '/issues/6.json', @parameters, @headers
|
chris@37
|
544
|
chris@37
|
545 json = ActiveSupport::JSON.decode(response.body)
|
Chris@119
|
546 assert json['errors'].include?(['subject', "can't be blank"])
|
chris@37
|
547 end
|
chris@37
|
548 end
|
chris@37
|
549
|
chris@37
|
550 context "DELETE /issues/1.xml" do
|
chris@37
|
551 should_allow_api_authentication(:delete,
|
chris@37
|
552 '/issues/6.xml',
|
chris@37
|
553 {},
|
chris@37
|
554 {:success_code => :ok})
|
chris@37
|
555
|
chris@37
|
556 should "delete the issue" do
|
chris@37
|
557 assert_difference('Issue.count',-1) do
|
chris@37
|
558 delete '/issues/6.xml', {}, :authorization => credentials('jsmith')
|
chris@37
|
559 end
|
Chris@909
|
560
|
chris@37
|
561 assert_nil Issue.find_by_id(6)
|
chris@37
|
562 end
|
chris@37
|
563 end
|
chris@37
|
564
|
chris@37
|
565 context "DELETE /issues/1.json" do
|
chris@37
|
566 should_allow_api_authentication(:delete,
|
chris@37
|
567 '/issues/6.json',
|
chris@37
|
568 {},
|
chris@37
|
569 {:success_code => :ok})
|
chris@37
|
570
|
chris@37
|
571 should "delete the issue" do
|
chris@37
|
572 assert_difference('Issue.count',-1) do
|
chris@37
|
573 delete '/issues/6.json', {}, :authorization => credentials('jsmith')
|
chris@37
|
574 end
|
Chris@909
|
575
|
chris@37
|
576 assert_nil Issue.find_by_id(6)
|
chris@37
|
577 end
|
chris@37
|
578 end
|
chris@37
|
579
|
chris@37
|
580 def credentials(user, password=nil)
|
chris@37
|
581 ActionController::HttpAuthentication::Basic.encode_credentials(user, password || user)
|
chris@37
|
582 end
|
chris@37
|
583 end
|