@@ -561,6 +561,63 class Redmine::ApiTest::IssuesTest < Redmine::ApiTest::Base | |||||
561 | assert_response :success |
|
561 | assert_response :success | |
562 | end |
|
562 | end | |
563 |
|
563 | |||
|
564 | def test_create_issue_with_multiple_uploaded_files_as_xml | |||
|
565 | token1 = xml_upload('File content 1', credentials('jsmith')) | |||
|
566 | token2 = xml_upload('File content 2', credentials('jsmith')) | |||
|
567 | ||||
|
568 | payload = <<-XML | |||
|
569 | <?xml version="1.0" encoding="UTF-8" ?> | |||
|
570 | <issue> | |||
|
571 | <project_id>1</project_id> | |||
|
572 | <tracker_id>1</tracker_id> | |||
|
573 | <subject>Issue with multiple attachments</subject> | |||
|
574 | <uploads type="array"> | |||
|
575 | <upload> | |||
|
576 | <token>#{token1}</token> | |||
|
577 | <filename>test1.txt</filename> | |||
|
578 | </upload> | |||
|
579 | <upload> | |||
|
580 | <token>#{token2}</token> | |||
|
581 | <filename>test1.txt</filename> | |||
|
582 | </upload> | |||
|
583 | </uploads> | |||
|
584 | </issue> | |||
|
585 | XML | |||
|
586 | ||||
|
587 | assert_difference 'Issue.count' do | |||
|
588 | post '/issues.xml', payload, {"CONTENT_TYPE" => 'application/xml'}.merge(credentials('jsmith')) | |||
|
589 | assert_response :created | |||
|
590 | end | |||
|
591 | issue = Issue.order('id DESC').first | |||
|
592 | assert_equal 2, issue.attachments.count | |||
|
593 | end | |||
|
594 | ||||
|
595 | def test_create_issue_with_multiple_uploaded_files_as_json | |||
|
596 | token1 = json_upload('File content 1', credentials('jsmith')) | |||
|
597 | token2 = json_upload('File content 2', credentials('jsmith')) | |||
|
598 | ||||
|
599 | payload = <<-JSON | |||
|
600 | { | |||
|
601 | "issue": { | |||
|
602 | "project_id": "1", | |||
|
603 | "tracker_id": "1", | |||
|
604 | "subject": "Issue with multiple attachments", | |||
|
605 | "uploads": [ | |||
|
606 | {"token": "#{token1}", "filename": "test1.txt"}, | |||
|
607 | {"token": "#{token2}", "filename": "test2.txt"} | |||
|
608 | ] | |||
|
609 | } | |||
|
610 | } | |||
|
611 | JSON | |||
|
612 | ||||
|
613 | assert_difference 'Issue.count' do | |||
|
614 | post '/issues.json', payload, {"CONTENT_TYPE" => 'application/json'}.merge(credentials('jsmith')) | |||
|
615 | assert_response :created | |||
|
616 | end | |||
|
617 | issue = Issue.order('id DESC').first | |||
|
618 | assert_equal 2, issue.attachments.count | |||
|
619 | end | |||
|
620 | ||||
564 | def test_update_issue_with_uploaded_file |
|
621 | def test_update_issue_with_uploaded_file | |
565 | set_tmp_attachments_directory |
|
622 | set_tmp_attachments_directory | |
566 | # upload the file |
|
623 | # upload the file |
@@ -271,6 +271,45 module Redmine | |||||
271 | def teardown |
|
271 | def teardown | |
272 | Setting.rest_api_enabled = '0' |
|
272 | Setting.rest_api_enabled = '0' | |
273 | end |
|
273 | end | |
|
274 | ||||
|
275 | # Uploads content using the XML API and returns the attachment token | |||
|
276 | def xml_upload(content, credentials) | |||
|
277 | upload('xml', content, credentials) | |||
|
278 | end | |||
|
279 | ||||
|
280 | # Uploads content using the JSON API and returns the attachment token | |||
|
281 | def json_upload(content, credentials) | |||
|
282 | upload('json', content, credentials) | |||
|
283 | end | |||
|
284 | ||||
|
285 | def upload(format, content, credentials) | |||
|
286 | set_tmp_attachments_directory | |||
|
287 | assert_difference 'Attachment.count' do | |||
|
288 | post "/uploads.#{format}", content, {"CONTENT_TYPE" => 'application/octet-stream'}.merge(credentials) | |||
|
289 | assert_response :created | |||
|
290 | end | |||
|
291 | data = response_data | |||
|
292 | assert_kind_of Hash, data['upload'] | |||
|
293 | token = data['upload']['token'] | |||
|
294 | assert_not_nil token | |||
|
295 | token | |||
|
296 | end | |||
|
297 | ||||
|
298 | # Parses the response body based on its content type | |||
|
299 | def response_data | |||
|
300 | unless response.content_type.to_s =~ /^application\/(.+)/ | |||
|
301 | raise "Unexpected response type: #{response.content_type}" | |||
|
302 | end | |||
|
303 | format = $1 | |||
|
304 | case format | |||
|
305 | when 'xml' | |||
|
306 | Hash.from_xml(response.body) | |||
|
307 | when 'json' | |||
|
308 | ActiveSupport::JSON.decode(response.body) | |||
|
309 | else | |||
|
310 | raise "Unknown response format: #{format}" | |||
|
311 | end | |||
|
312 | end | |||
274 | end |
|
313 | end | |
275 |
|
314 | |||
276 | class Routing < Redmine::RoutingTest |
|
315 | class Routing < Redmine::RoutingTest |
General Comments 0
You need to be logged in to leave comments.
Login now