mirror of
https://github.com/httpie/cli.git
synced 2025-06-24 19:41:23 +02:00
Added a simple download test.
This commit is contained in:
parent
5a1177d57e
commit
cfa7199f0b
@ -157,6 +157,7 @@ class Download(object):
|
|||||||
self._output_file = output_file
|
self._output_file = output_file
|
||||||
self._resume = resume
|
self._resume = resume
|
||||||
self._resumed_from = 0
|
self._resumed_from = 0
|
||||||
|
self._finished = False
|
||||||
|
|
||||||
self._progress = Progress()
|
self._progress = Progress()
|
||||||
self._progress_reporter = ProgressReporter(
|
self._progress_reporter = ProgressReporter(
|
||||||
@ -256,8 +257,8 @@ class Download(object):
|
|||||||
return stream, self._output_file
|
return stream, self._output_file
|
||||||
|
|
||||||
def finish(self):
|
def finish(self):
|
||||||
assert not self._output_file.closed
|
assert not self._finished
|
||||||
self._output_file.close()
|
self._finished = True
|
||||||
self._progress.finished()
|
self._progress.finished()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -351,12 +352,16 @@ class ProgressReporter(object):
|
|||||||
speed = 0
|
speed = 0
|
||||||
|
|
||||||
if not self.progress.total_size:
|
if not self.progress.total_size:
|
||||||
template = PROGRESS_NO_CONTENT_LENGTH
|
self._status_line = PROGRESS_NO_CONTENT_LENGTH.format(
|
||||||
percentage = None
|
downloaded=humanize_bytes(downloaded),
|
||||||
eta = None
|
speed=humanize_bytes(speed),
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
template = PROGRESS
|
try:
|
||||||
percentage = downloaded / self.progress.total_size * 100
|
percentage = downloaded / self.progress.total_size * 100
|
||||||
|
except ZeroDivisionError:
|
||||||
|
percentage = 0
|
||||||
|
|
||||||
if not speed:
|
if not speed:
|
||||||
eta = '-:--:--'
|
eta = '-:--:--'
|
||||||
else:
|
else:
|
||||||
@ -365,12 +370,12 @@ class ProgressReporter(object):
|
|||||||
m, s = divmod(s, 60)
|
m, s = divmod(s, 60)
|
||||||
eta = '{}:{:0>2}:{:0>2}'.format(h, m, s)
|
eta = '{}:{:0>2}:{:0>2}'.format(h, m, s)
|
||||||
|
|
||||||
self._status_line = template.format(
|
self._status_line = PROGRESS.format(
|
||||||
percentage=percentage,
|
percentage=percentage,
|
||||||
downloaded=humanize_bytes(downloaded),
|
downloaded=humanize_bytes(downloaded),
|
||||||
speed=humanize_bytes(speed),
|
speed=humanize_bytes(speed),
|
||||||
eta=eta,
|
eta=eta,
|
||||||
)
|
)
|
||||||
|
|
||||||
self._prev_time = now
|
self._prev_time = now
|
||||||
self._prev_bytes = downloaded
|
self._prev_bytes = downloaded
|
||||||
|
@ -27,6 +27,7 @@ import argparse
|
|||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
import shutil
|
import shutil
|
||||||
|
import time
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from urllib.request import urlopen
|
from urllib.request import urlopen
|
||||||
@ -69,7 +70,7 @@ from httpie.downloads import (
|
|||||||
filename_from_content_disposition,
|
filename_from_content_disposition,
|
||||||
filename_from_url,
|
filename_from_url,
|
||||||
get_unique_filename,
|
get_unique_filename,
|
||||||
ContentRangeError
|
ContentRangeError,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -189,20 +190,25 @@ def http(*args, **kwargs):
|
|||||||
if not env:
|
if not env:
|
||||||
env = kwargs['env'] = TestEnvironment()
|
env = kwargs['env'] = TestEnvironment()
|
||||||
|
|
||||||
|
stdout = env.stdout
|
||||||
|
stderr = env.stderr
|
||||||
try:
|
try:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
exit_status = main(args=['--traceback'] + list(args), **kwargs)
|
exit_status = main(args=['--traceback'] + list(args), **kwargs)
|
||||||
|
if '--download' in args:
|
||||||
|
# Let the progress reporter thread finish.
|
||||||
|
time.sleep(.5)
|
||||||
except Exception:
|
except Exception:
|
||||||
sys.stderr.write(env.stderr.read())
|
sys.stderr.write(stderr.read())
|
||||||
raise
|
raise
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
exit_status = ExitStatus.ERROR
|
exit_status = ExitStatus.ERROR
|
||||||
|
|
||||||
env.stdout.seek(0)
|
stdout.seek(0)
|
||||||
env.stderr.seek(0)
|
stderr.seek(0)
|
||||||
|
|
||||||
output = env.stdout.read()
|
output = stdout.read()
|
||||||
try:
|
try:
|
||||||
r = StrResponse(output.decode('utf8'))
|
r = StrResponse(output.decode('utf8'))
|
||||||
except UnicodeDecodeError:
|
except UnicodeDecodeError:
|
||||||
@ -224,14 +230,14 @@ def http(*args, **kwargs):
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
r.stderr = env.stderr.read()
|
r.stderr = stderr.read()
|
||||||
r.exit_status = exit_status
|
r.exit_status = exit_status
|
||||||
|
|
||||||
return r
|
return r
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
env.stdout.close()
|
stdout.close()
|
||||||
env.stderr.close()
|
stderr.close()
|
||||||
|
|
||||||
|
|
||||||
class BaseTestCase(unittest.TestCase):
|
class BaseTestCase(unittest.TestCase):
|
||||||
@ -1521,7 +1527,22 @@ class DownloadUtilsTest(BaseTestCase):
|
|||||||
|
|
||||||
class DownloadTest(BaseTestCase):
|
class DownloadTest(BaseTestCase):
|
||||||
# TODO: Download tests.
|
# TODO: Download tests.
|
||||||
pass
|
|
||||||
|
def test_download(self):
|
||||||
|
url = httpbin('/robots.txt')
|
||||||
|
body = urlopen(url).read().decode()
|
||||||
|
r = http(
|
||||||
|
'--download',
|
||||||
|
url,
|
||||||
|
env=TestEnvironment(
|
||||||
|
stdin_isatty=True,
|
||||||
|
stdout_isatty=False
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.assertIn('Downloading', r.stderr)
|
||||||
|
self.assertIn('[K', r.stderr)
|
||||||
|
self.assertIn('Done', r.stderr)
|
||||||
|
self.assertEqual(body, r)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
Loading…
x
Reference in New Issue
Block a user