Added a simple download test.

This commit is contained in:
Jakub Roztocil 2013-04-13 15:34:31 -03:00
parent 5a1177d57e
commit cfa7199f0b
2 changed files with 48 additions and 22 deletions

View File

@ -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

View File

@ -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__':