forked from tus/tus-py-client
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_async_uploader.py
140 lines (112 loc) · 4.81 KB
/
test_async_uploader.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import io
import unittest
from unittest import mock
import asyncio
from aioresponses import aioresponses, CallbackResult
import responses
import pytest
from tusclient import exceptions, client
class AsyncUploaderTest(unittest.TestCase):
@responses.activate
def setUp(self):
self.client = client.TusClient('http://tusd.tusdemo.net/files/')
self.url = 'http://tusd.tusdemo.net/files/15acd89eabdf5738ffc'
responses.add(responses.HEAD, self.url,
adding_headers={"upload-offset": "0"})
self.loop = asyncio.new_event_loop()
self.async_uploader = self.client.async_uploader(
'./LICENSE', url=self.url)
def tearDown(self):
self.loop.stop()
def _validate_request(self, url, **kwargs):
self.assertEqual(self.url, str(url))
req_headers = kwargs['headers']
self.assertEqual(req_headers.get('Tus-Resumable'), '1.0.0')
body = kwargs['data']
with open('./LICENSE', 'rb') as stream:
expected_content = stream.read()
self.assertEqual(expected_content, body)
response_headers = {
'upload-offset': str(self.async_uploader.offset + self.async_uploader.get_request_length())}
return CallbackResult(status=204, headers=response_headers)
def test_upload_chunk(self):
with aioresponses() as resps:
resps.patch(self.url, callback=self._validate_request)
request_length = self.async_uploader.get_request_length()
self.loop.run_until_complete(self.async_uploader.upload_chunk())
self.assertEqual(self.async_uploader.offset, request_length)
def test_upload_chunk_with_creation(self):
with aioresponses() as resps:
resps.post(
self.client.url, status=201,
headers={
"location": f"{self.client.url}hello"
}
)
resps.patch(
f"{self.client.url}hello",
headers={
"upload-offset": "5"
}
)
uploader = self.client.async_uploader(
file_stream=io.BytesIO(b"hello")
)
self.loop.run_until_complete(uploader.upload_chunk())
self.assertEqual(uploader.url, f"{self.client.url}hello")
def test_upload(self):
with aioresponses() as resps:
resps.patch(self.url, callback=self._validate_request)
self.loop.run_until_complete(self.async_uploader.upload())
self.assertEqual(self.async_uploader.offset,
self.async_uploader.get_file_size())
def test_upload_empty(self):
with aioresponses() as resps:
resps.post(
self.client.url, status=200,
headers={
"upload-offset": "0",
"location": f"{self.client.url}this-is-not-used"
}
)
resps.patch(
f"{self.client.url}this-is-not-used",
exception=ValueError(
"PATCH request not allowed for empty file"
)
)
# Upload an empty file
async_uploader = self.client.async_uploader(
file_stream=io.BytesIO(b"")
)
self.loop.run_until_complete(async_uploader.upload())
# Upload URL being set means the POST request was sent and the empty
# file was uploaded without a single PATCH request.
self.assertTrue(async_uploader.url)
def test_upload_retry(self):
num_of_retries = 3
self.async_uploader.retries = num_of_retries
self.async_uploader.retry_delay = 3
with aioresponses() as resps:
resps.patch(self.url, status=00)
self.assertEqual(self.async_uploader._retried, 0)
with pytest.raises(exceptions.TusCommunicationError):
self.loop.run_until_complete(
self.async_uploader.upload_chunk())
self.assertEqual(self.async_uploader._retried, num_of_retries)
def test_upload_verify_tls_cert(self):
self.async_uploader.verify_tls_cert = False
with aioresponses() as resps:
ssl = None
def validate_verify_tls_cert(url, **kwargs):
nonlocal ssl
ssl = kwargs['ssl']
response_headers = {
'upload-offset': str(self.async_uploader.offset + self.async_uploader.get_request_length())
}
return CallbackResult(status=204, headers=response_headers)
resps.patch(
self.url, status=204, callback=validate_verify_tls_cert
)
self.loop.run_until_complete(self.async_uploader.upload())
self.assertEqual(ssl, False)