forked from extern/httpie-cli
Test suite cleanup
This commit is contained in:
parent
5e87a2d7e5
commit
56afd1adb9
@ -2,7 +2,7 @@
|
|||||||
Tests for the provided defaults regarding HTTP method, and --json vs. --form.
|
Tests for the provided defaults regarding HTTP method, and --json vs. --form.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
from utils import TestEnvironment, http, HTTP_OK, no_content_type
|
from utils import TestEnvironment, http, HTTP_OK
|
||||||
from fixtures import FILE_PATH
|
from fixtures import FILE_PATH
|
||||||
|
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ class TestAutoContentTypeAndAcceptHeaders:
|
|||||||
r = http('GET', httpbin.url + '/headers')
|
r = http('GET', httpbin.url + '/headers')
|
||||||
assert HTTP_OK in r
|
assert HTTP_OK in r
|
||||||
assert r.json['headers']['Accept'] == '*/*'
|
assert r.json['headers']['Accept'] == '*/*'
|
||||||
assert no_content_type(r.json['headers'])
|
assert 'Content-Type' not in r.json['headers']
|
||||||
|
|
||||||
def test_POST_no_data_no_auto_headers(self, httpbin):
|
def test_POST_no_data_no_auto_headers(self, httpbin):
|
||||||
# JSON headers shouldn't be automatically set for POST with no data.
|
# JSON headers shouldn't be automatically set for POST with no data.
|
||||||
|
@ -7,8 +7,7 @@ from tempfile import gettempdir
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from httpie.plugins.builtin import HTTPBasicAuth
|
from httpie.plugins.builtin import HTTPBasicAuth
|
||||||
from utils import TestEnvironment, mk_config_dir, http, HTTP_OK, \
|
from utils import TestEnvironment, mk_config_dir, http, HTTP_OK
|
||||||
no_content_type
|
|
||||||
from fixtures import UNICODE
|
from fixtures import UNICODE
|
||||||
|
|
||||||
|
|
||||||
@ -126,7 +125,7 @@ class TestSession(SessionTestBase):
|
|||||||
r2 = http('--session=test', 'GET', httpbin.url + '/get',
|
r2 = http('--session=test', 'GET', httpbin.url + '/get',
|
||||||
env=self.env())
|
env=self.env())
|
||||||
assert HTTP_OK in r2
|
assert HTTP_OK in r2
|
||||||
assert no_content_type(r2.json['headers'])
|
assert 'Content-Type' not in r2.json['headers']
|
||||||
assert 'If-Unmodified-Since' not in r2.json['headers']
|
assert 'If-Unmodified-Since' not in r2.json['headers']
|
||||||
|
|
||||||
def test_session_by_path(self, httpbin):
|
def test_session_by_path(self, httpbin):
|
||||||
@ -158,8 +157,8 @@ class TestSession(SessionTestBase):
|
|||||||
assert HTTP_OK in r2
|
assert HTTP_OK in r2
|
||||||
|
|
||||||
# FIXME: Authorization *sometimes* is not present on Python3
|
# FIXME: Authorization *sometimes* is not present on Python3
|
||||||
assert (r2.json['headers']['Authorization']
|
assert (r2.json['headers']['Authorization'] ==
|
||||||
== HTTPBasicAuth.make_header(u'test', UNICODE))
|
HTTPBasicAuth.make_header(u'test', UNICODE))
|
||||||
# httpbin doesn't interpret utf8 headers
|
# httpbin doesn't interpret utf8 headers
|
||||||
assert UNICODE in r2
|
assert UNICODE in r2
|
||||||
|
|
||||||
|
149
tests/utils.py
149
tests/utils.py
@ -1,7 +1,5 @@
|
|||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
"""Utilities used by HTTPie tests.
|
"""Utilities for HTTPie test suite."""
|
||||||
|
|
||||||
"""
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
@ -15,8 +13,6 @@ from httpie.compat import bytes, str
|
|||||||
|
|
||||||
|
|
||||||
TESTS_ROOT = os.path.abspath(os.path.dirname(__file__))
|
TESTS_ROOT = os.path.abspath(os.path.dirname(__file__))
|
||||||
|
|
||||||
|
|
||||||
CRLF = '\r\n'
|
CRLF = '\r\n'
|
||||||
COLOR = '\x1b['
|
COLOR = '\x1b['
|
||||||
HTTP_OK = '200 OK'
|
HTTP_OK = '200 OK'
|
||||||
@ -27,14 +23,9 @@ HTTP_OK_COLOR = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def no_content_type(headers):
|
def mk_config_dir():
|
||||||
return (
|
dirname = tempfile.mkdtemp(prefix='httpie_config_')
|
||||||
'Content-Type' not in headers or
|
return dirname
|
||||||
# We need to do also this because of this issue:
|
|
||||||
# <https://github.com/kevin1024/pytest-httpbin/issues/5>
|
|
||||||
# TODO: remove this function once the issue is if fixed
|
|
||||||
headers['Content-Type'] == 'text/plain'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def add_auth(url, auth):
|
def add_auth(url, auth):
|
||||||
@ -43,10 +34,7 @@ def add_auth(url, auth):
|
|||||||
|
|
||||||
|
|
||||||
class TestEnvironment(Environment):
|
class TestEnvironment(Environment):
|
||||||
"""
|
"""Environment subclass with reasonable defaults for testing."""
|
||||||
Environment subclass with reasonable defaults suitable for testing.
|
|
||||||
|
|
||||||
"""
|
|
||||||
colors = 0
|
colors = 0
|
||||||
stdin_isatty = True,
|
stdin_isatty = True,
|
||||||
stdout_isatty = True
|
stdout_isatty = True
|
||||||
@ -86,6 +74,67 @@ class TestEnvironment(Environment):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class BaseCLIResponse(object):
|
||||||
|
"""
|
||||||
|
Represents the result of simulated `$ http' invocation via `http()`.
|
||||||
|
|
||||||
|
Holds and provides access to:
|
||||||
|
|
||||||
|
- stdout output: print(self)
|
||||||
|
- stderr output: print(self.stderr)
|
||||||
|
- exit_status output: print(self.exit_status)
|
||||||
|
|
||||||
|
"""
|
||||||
|
stderr = None
|
||||||
|
json = None
|
||||||
|
exit_status = None
|
||||||
|
|
||||||
|
|
||||||
|
class BytesCLIResponse(bytes, BaseCLIResponse):
|
||||||
|
"""
|
||||||
|
Used as a fallback when a StrCLIResponse cannot be used.
|
||||||
|
|
||||||
|
E.g. when the output contains binary data or when it is colorized.
|
||||||
|
|
||||||
|
`.json` will always be None.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class StrCLIResponse(str, BaseCLIResponse):
|
||||||
|
|
||||||
|
@property
|
||||||
|
def json(self):
|
||||||
|
"""
|
||||||
|
Return deserialized JSON body, if one included in the output
|
||||||
|
and is parseable.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if not hasattr(self, '_json'):
|
||||||
|
self._json = None
|
||||||
|
# De-serialize JSON body if possible.
|
||||||
|
if COLOR in self:
|
||||||
|
# Colorized output cannot be parsed.
|
||||||
|
pass
|
||||||
|
elif self.strip().startswith('{'):
|
||||||
|
# Looks like JSON body.
|
||||||
|
self._json = json.loads(self)
|
||||||
|
elif (self.count('Content-Type:') == 1 and
|
||||||
|
'application/json' in self):
|
||||||
|
# Looks like a whole JSON HTTP message,
|
||||||
|
# try to extract its body.
|
||||||
|
try:
|
||||||
|
j = self.strip()[self.strip().rindex('\r\n\r\n'):]
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
self._json = json.loads(j)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
return self._json
|
||||||
|
|
||||||
|
|
||||||
def http(*args, **kwargs):
|
def http(*args, **kwargs):
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
"""
|
"""
|
||||||
@ -187,69 +236,3 @@ def http(*args, **kwargs):
|
|||||||
stdout.close()
|
stdout.close()
|
||||||
stderr.close()
|
stderr.close()
|
||||||
env.cleanup()
|
env.cleanup()
|
||||||
|
|
||||||
|
|
||||||
class BaseCLIResponse(object):
|
|
||||||
"""
|
|
||||||
Represents the result of simulated `$ http' invocation via `http()`.
|
|
||||||
|
|
||||||
Holds and provides access to:
|
|
||||||
|
|
||||||
- stdout output: print(self)
|
|
||||||
- stderr output: print(self.stderr)
|
|
||||||
- exit_status output: print(self.exit_status)
|
|
||||||
|
|
||||||
"""
|
|
||||||
stderr = None
|
|
||||||
json = None
|
|
||||||
exit_status = None
|
|
||||||
|
|
||||||
|
|
||||||
class BytesCLIResponse(bytes, BaseCLIResponse):
|
|
||||||
"""
|
|
||||||
Used as a fallback when a StrCLIResponse cannot be used.
|
|
||||||
|
|
||||||
E.g. when the output contains binary data or when it is colorized.
|
|
||||||
|
|
||||||
`.json` will always be None.
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class StrCLIResponse(str, BaseCLIResponse):
|
|
||||||
|
|
||||||
@property
|
|
||||||
def json(self):
|
|
||||||
"""
|
|
||||||
Return deserialized JSON body, if one included in the output
|
|
||||||
and is parseable.
|
|
||||||
|
|
||||||
"""
|
|
||||||
if not hasattr(self, '_json'):
|
|
||||||
self._json = None
|
|
||||||
# De-serialize JSON body if possible.
|
|
||||||
if COLOR in self:
|
|
||||||
# Colorized output cannot be parsed.
|
|
||||||
pass
|
|
||||||
elif self.strip().startswith('{'):
|
|
||||||
# Looks like JSON body.
|
|
||||||
self._json = json.loads(self)
|
|
||||||
elif (self.count('Content-Type:') == 1 and
|
|
||||||
'application/json' in self):
|
|
||||||
# Looks like a whole JSON HTTP message,
|
|
||||||
# try to extract its body.
|
|
||||||
try:
|
|
||||||
j = self.strip()[self.strip().rindex('\r\n\r\n'):]
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
self._json = json.loads(j)
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
return self._json
|
|
||||||
|
|
||||||
|
|
||||||
def mk_config_dir():
|
|
||||||
dirname = tempfile.mkdtemp(prefix='httpie_config_')
|
|
||||||
return dirname
|
|
||||||
|
Loading…
Reference in New Issue
Block a user