2014-04-24 14:07:31 +02:00
|
|
|
import os
|
|
|
|
|
2014-04-24 17:08:40 +02:00
|
|
|
import pytest
|
|
|
|
|
2019-08-31 15:17:10 +02:00
|
|
|
from httpie.cli.exceptions import ParseError
|
2020-01-23 15:54:43 +01:00
|
|
|
from httpie.status import ExitStatus
|
2017-12-28 18:17:48 +01:00
|
|
|
from utils import MockEnvironment, http, HTTP_OK
|
2014-04-28 11:29:41 +02:00
|
|
|
from fixtures import FILE_PATH_ARG, FILE_PATH, FILE_CONTENT
|
2014-04-24 14:07:31 +02:00
|
|
|
|
|
|
|
|
2014-04-25 11:39:59 +02:00
|
|
|
class TestMultipartFormDataFileUpload:
|
2014-06-28 16:35:57 +02:00
|
|
|
|
|
|
|
def test_non_existent_file_raises_parse_error(self, httpbin):
|
2014-04-24 17:08:40 +02:00
|
|
|
with pytest.raises(ParseError):
|
2014-06-28 16:35:57 +02:00
|
|
|
http('--form',
|
|
|
|
'POST', httpbin.url + '/post', 'foo@/__does_not_exist__')
|
2014-04-24 14:07:31 +02:00
|
|
|
|
2014-06-28 16:35:57 +02:00
|
|
|
def test_upload_ok(self, httpbin):
|
|
|
|
r = http('--form', '--verbose', 'POST', httpbin.url + '/post',
|
2014-04-24 15:48:01 +02:00
|
|
|
'test-file@%s' % FILE_PATH_ARG, 'foo=bar')
|
2014-04-24 14:58:15 +02:00
|
|
|
assert HTTP_OK in r
|
|
|
|
assert 'Content-Disposition: form-data; name="foo"' in r
|
|
|
|
assert 'Content-Disposition: form-data; name="test-file";' \
|
|
|
|
' filename="%s"' % os.path.basename(FILE_PATH) in r
|
2014-06-28 16:35:57 +02:00
|
|
|
assert FILE_CONTENT in r
|
2014-04-24 14:58:15 +02:00
|
|
|
assert '"foo": "bar"' in r
|
2016-02-28 08:45:45 +01:00
|
|
|
assert 'Content-Type: text/plain' in r
|
2014-04-24 14:07:31 +02:00
|
|
|
|
2014-10-20 14:40:55 +02:00
|
|
|
def test_upload_multiple_fields_with_the_same_name(self, httpbin):
|
|
|
|
r = http('--form', '--verbose', 'POST', httpbin.url + '/post',
|
|
|
|
'test-file@%s' % FILE_PATH_ARG,
|
|
|
|
'test-file@%s' % FILE_PATH_ARG)
|
|
|
|
assert HTTP_OK in r
|
|
|
|
assert r.count('Content-Disposition: form-data; name="test-file";'
|
2015-10-22 19:32:16 +02:00
|
|
|
' filename="%s"' % os.path.basename(FILE_PATH)) == 2
|
2014-10-20 14:40:55 +02:00
|
|
|
# Should be 4, but is 3 because httpbin
|
|
|
|
# doesn't seem to support filed field lists
|
|
|
|
assert r.count(FILE_CONTENT) in [3, 4]
|
2016-02-28 08:45:45 +01:00
|
|
|
assert r.count('Content-Type: text/plain') == 2
|
2014-10-20 14:40:55 +02:00
|
|
|
|
2014-04-24 14:07:31 +02:00
|
|
|
|
2014-04-25 11:39:59 +02:00
|
|
|
class TestRequestBodyFromFilePath:
|
2014-04-24 14:07:31 +02:00
|
|
|
"""
|
|
|
|
`http URL @file'
|
|
|
|
|
|
|
|
"""
|
2014-04-24 15:48:01 +02:00
|
|
|
|
2014-06-28 16:35:57 +02:00
|
|
|
def test_request_body_from_file_by_path(self, httpbin):
|
|
|
|
r = http('--verbose',
|
|
|
|
'POST', httpbin.url + '/post', '@' + FILE_PATH_ARG)
|
2014-04-24 14:58:15 +02:00
|
|
|
assert HTTP_OK in r
|
2014-04-26 17:53:01 +02:00
|
|
|
assert FILE_CONTENT in r, r
|
2014-04-24 14:58:15 +02:00
|
|
|
assert '"Content-Type": "text/plain"' in r
|
2014-04-24 14:07:31 +02:00
|
|
|
|
2014-06-28 16:35:57 +02:00
|
|
|
def test_request_body_from_file_by_path_with_explicit_content_type(
|
|
|
|
self, httpbin):
|
|
|
|
r = http('--verbose',
|
|
|
|
'POST', httpbin.url + '/post', '@' + FILE_PATH_ARG,
|
|
|
|
'Content-Type:text/plain; charset=utf8')
|
2014-04-24 14:58:15 +02:00
|
|
|
assert HTTP_OK in r
|
|
|
|
assert FILE_CONTENT in r
|
2014-06-28 16:35:57 +02:00
|
|
|
assert 'Content-Type: text/plain; charset=utf8' in r
|
2014-04-24 14:07:31 +02:00
|
|
|
|
2014-06-28 16:35:57 +02:00
|
|
|
def test_request_body_from_file_by_path_no_field_name_allowed(
|
|
|
|
self, httpbin):
|
2017-12-28 18:17:48 +01:00
|
|
|
env = MockEnvironment(stdin_isatty=True)
|
2014-06-28 16:35:57 +02:00
|
|
|
r = http('POST', httpbin.url + '/post', 'field-name@' + FILE_PATH_ARG,
|
2019-09-03 17:14:39 +02:00
|
|
|
env=env, tolerate_error_exit_status=True)
|
2014-04-24 14:58:15 +02:00
|
|
|
assert 'perhaps you meant --form?' in r.stderr
|
2014-04-24 14:07:31 +02:00
|
|
|
|
2014-06-28 16:35:57 +02:00
|
|
|
def test_request_body_from_file_by_path_no_data_items_allowed(
|
|
|
|
self, httpbin):
|
2017-12-28 18:17:48 +01:00
|
|
|
env = MockEnvironment(stdin_isatty=False)
|
2019-09-03 17:14:39 +02:00
|
|
|
r = http(
|
|
|
|
'POST',
|
|
|
|
httpbin.url + '/post',
|
|
|
|
'@' + FILE_PATH_ARG, 'foo=bar',
|
|
|
|
env=env,
|
|
|
|
tolerate_error_exit_status=True,
|
|
|
|
)
|
2020-01-23 15:54:43 +01:00
|
|
|
assert r.exit_status == ExitStatus.ERROR
|
2014-04-24 14:58:15 +02:00
|
|
|
assert 'cannot be mixed' in r.stderr
|