mirror of
https://github.com/httpie/cli.git
synced 2025-01-05 22:53:32 +02:00
Tests
This commit is contained in:
parent
cfa7199f0b
commit
6c3b983c18
@ -848,7 +848,7 @@ is being saved to a file.
|
||||
Vary: Accept-Encoding
|
||||
|
||||
Downloading 494.89 kB to "jkbr-httpie-0.4.1-33-gfc4f70a.tar.gz"
|
||||
/ 104.00 kB 21.01% 47.55 kB/s 0:00:08 ETA
|
||||
/ 21.01% 104.00 kB 47.55 kB/s 0:00:08 ETA
|
||||
|
||||
|
||||
If not provided via ``--output, -o``, the output filename will be determined
|
||||
@ -1257,6 +1257,5 @@ Changelog
|
||||
.. _0.4.0: https://github.com/jkbr/httpie/compare/0.3.0...0.4.0
|
||||
.. _0.4.1: https://github.com/jkbr/httpie/compare/0.4.0...0.4.1
|
||||
.. _0.5.0-alpha: https://github.com/jkbr/httpie/compare/0.4.0...master
|
||||
.. _stable version: https://github.com/jkbr/httpie/tree/0.3.0#readme
|
||||
.. _AUTHORS.rst: https://github.com/jkbr/httpie/blob/master/AUTHORS.rst
|
||||
.. _LICENSE: https://github.com/jkbr/httpie/blob/master/LICENSE
|
||||
|
@ -22,8 +22,8 @@ PARTIAL_CONTENT = 206
|
||||
|
||||
CLEAR_LINE = '\r\033[K'
|
||||
PROGRESS = (
|
||||
'{downloaded: >10}'
|
||||
' {percentage: 6.2f}%'
|
||||
'{percentage: 6.2f}%'
|
||||
' {downloaded: >10}'
|
||||
' {speed: >10}/s'
|
||||
' {eta: >8} ETA'
|
||||
)
|
||||
@ -48,6 +48,9 @@ def parse_content_range(content_range, resumed_from):
|
||||
:return: total size of the response body when fully downloaded.
|
||||
|
||||
"""
|
||||
if content_range is None:
|
||||
raise ContentRangeError('Missing Content-Range')
|
||||
|
||||
pattern = (
|
||||
'^bytes (?P<first_byte_pos>\d+)-(?P<last_byte_pos>\d+)'
|
||||
'/(\*|(?P<instance_length>\d+))$'
|
||||
@ -203,10 +206,10 @@ class Download(object):
|
||||
|
||||
if self._output_file:
|
||||
if self._resume and response.status_code == PARTIAL_CONTENT:
|
||||
content_range = response.headers.get('Content-Range')
|
||||
if content_range:
|
||||
total_size = parse_content_range(
|
||||
content_range, self._resumed_from)
|
||||
total_size = parse_content_range(
|
||||
response.headers.get('Content-Range'),
|
||||
self._resumed_from
|
||||
)
|
||||
|
||||
else:
|
||||
self._resumed_from = 0
|
||||
@ -264,7 +267,7 @@ class Download(object):
|
||||
@property
|
||||
def interrupted(self):
|
||||
return (
|
||||
self._output_file.closed
|
||||
self._finished
|
||||
and self._progress.total_size
|
||||
and self._progress.total_size != self._progress.downloaded
|
||||
)
|
||||
@ -321,13 +324,12 @@ class ProgressReporter(object):
|
||||
"""
|
||||
self.progress = progress
|
||||
self.output = output
|
||||
self._prev_bytes = 0
|
||||
self._prev_time = time()
|
||||
self._spinner_pos = 0
|
||||
self._tick = tick
|
||||
self._update_interval = update_interval
|
||||
self._spinner_pos = 0
|
||||
self._status_line = ''
|
||||
super(ProgressReporter, self).__init__()
|
||||
self._prev_bytes = 0
|
||||
self._prev_time = time()
|
||||
|
||||
def report(self):
|
||||
if self.progress.has_finished:
|
||||
@ -389,15 +391,13 @@ class ProgressReporter(object):
|
||||
)
|
||||
self.output.flush()
|
||||
|
||||
self._spinner_pos = (
|
||||
self._spinner_pos + 1
|
||||
if self._spinner_pos + 1 != len(SPINNER)
|
||||
else 0
|
||||
)
|
||||
self._spinner_pos = (self._spinner_pos + 1
|
||||
if self._spinner_pos + 1 != len(SPINNER)
|
||||
else 0)
|
||||
|
||||
def sum_up(self):
|
||||
actually_downloaded = (
|
||||
self.progress.downloaded - self.progress.resumed_from)
|
||||
actually_downloaded = (self.progress.downloaded
|
||||
- self.progress.resumed_from)
|
||||
time_taken = self.progress.time_finished - self.progress.time_started
|
||||
|
||||
self.output.write(CLEAR_LINE)
|
||||
|
@ -37,7 +37,7 @@ def humanize_bytes(n, precision=2):
|
||||
]
|
||||
|
||||
if n == 1:
|
||||
return '1 byte'
|
||||
return '1 B'
|
||||
|
||||
for factor, suffix in abbrevs:
|
||||
if n >= factor:
|
||||
|
2
requirements-dev.txt
Normal file
2
requirements-dev.txt
Normal file
@ -0,0 +1,2 @@
|
||||
httpbin
|
||||
docutils
|
@ -19,6 +19,7 @@ To make it run faster and offline you can::
|
||||
HTTPBIN_URL=http://localhost:5000 tox
|
||||
|
||||
"""
|
||||
from io import BytesIO
|
||||
import subprocess
|
||||
import os
|
||||
import sys
|
||||
@ -28,6 +29,7 @@ import tempfile
|
||||
import unittest
|
||||
import shutil
|
||||
import time
|
||||
from requests.structures import CaseInsensitiveDict
|
||||
|
||||
try:
|
||||
from urllib.request import urlopen
|
||||
@ -71,6 +73,7 @@ from httpie.downloads import (
|
||||
filename_from_url,
|
||||
get_unique_filename,
|
||||
ContentRangeError,
|
||||
Download,
|
||||
)
|
||||
|
||||
|
||||
@ -1452,6 +1455,9 @@ class DownloadUtilsTest(BaseTestCase):
|
||||
self.assertEqual(parse('bytes 100-199/200', 100), 200)
|
||||
self.assertEqual(parse('bytes 100-199/*', 100), 200)
|
||||
|
||||
# missing
|
||||
self.assertRaises(ContentRangeError, parse, None, 100)
|
||||
|
||||
# syntax error
|
||||
self.assertRaises(ContentRangeError, parse, 'beers 100-199/*', 100)
|
||||
|
||||
@ -1525,10 +1531,19 @@ class DownloadUtilsTest(BaseTestCase):
|
||||
)
|
||||
|
||||
|
||||
class Response(object):
|
||||
|
||||
# noinspection PyDefaultArgument
|
||||
def __init__(self, url, headers={}, status_code=200):
|
||||
self.url = url
|
||||
self.headers = CaseInsensitiveDict(headers)
|
||||
self.status_code = status_code
|
||||
|
||||
|
||||
class DownloadTest(BaseTestCase):
|
||||
# TODO: Download tests.
|
||||
|
||||
def test_download(self):
|
||||
def test_actual_download(self):
|
||||
url = httpbin('/robots.txt')
|
||||
body = urlopen(url).read().decode()
|
||||
r = http(
|
||||
@ -1544,6 +1559,37 @@ class DownloadTest(BaseTestCase):
|
||||
self.assertIn('Done', r.stderr)
|
||||
self.assertEqual(body, r)
|
||||
|
||||
def test_download_no_Content_Length(self):
|
||||
download = Download(output_file=open(os.devnull, 'w'))
|
||||
download.start(Response(url=httpbin('/')))
|
||||
download._on_progress(b'12345')
|
||||
download.finish()
|
||||
self.assertFalse(download.interrupted)
|
||||
|
||||
def test_download_with_Content_Length(self):
|
||||
download = Download(
|
||||
output_file=open(os.devnull, 'w'),
|
||||
progress_file=BytesIO(),
|
||||
)
|
||||
download.start(Response(
|
||||
url=httpbin('/'),
|
||||
headers={'Content-Length': 5}
|
||||
))
|
||||
download._on_progress(b'12345')
|
||||
time.sleep(1.5)
|
||||
download.finish()
|
||||
self.assertFalse(download.interrupted)
|
||||
|
||||
def test_download_interrupted(self):
|
||||
download = Download(output_file=open(os.devnull, 'w'))
|
||||
download.start(Response(
|
||||
url=httpbin('/'),
|
||||
headers={'Content-Length': 5}
|
||||
))
|
||||
download._on_progress(b'1234')
|
||||
download.finish()
|
||||
self.assertTrue(download.interrupted)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
Loading…
Reference in New Issue
Block a user