94 lines
3.6 KiB
Python
94 lines
3.6 KiB
Python
import hashlib
|
||
import os
|
||
import unittest
|
||
|
||
from _common import SETTINGS, agent, eva_cfg, no_sleep
|
||
from fake_eva import FakeEva
|
||
from fake_hub import FakeHub
|
||
|
||
MB = 1024 * 1024
|
||
TOO_BIG = "файл больше 10 МБ — откройте в Eva"
|
||
|
||
|
||
class WikiFetchTest(unittest.TestCase):
|
||
def setUp(self):
|
||
self.eva = FakeEva()
|
||
self.hub = FakeHub(SETTINGS)
|
||
self.addCleanup(self.eva.stop)
|
||
self.addCleanup(self.hub.stop)
|
||
cfg = eva_cfg(self.eva.base_url, hub_url=self.hub.base_url, hub_token=self.hub.token)
|
||
client = agent.EvaClient(cfg)
|
||
client.sleep = no_sleep
|
||
self.ex = agent.Executor(client, agent.HubClient(cfg), dict(SETTINGS))
|
||
|
||
def fetch(self, url):
|
||
return self.ex.run({"id": 1, "type": "wiki_fetch", "params": {"attachment_id": 7, "url": url}})
|
||
|
||
def file_url(self, path="/files/a.bin"):
|
||
return self.eva.base_url + path
|
||
|
||
def test_fetch_ok(self):
|
||
data = os.urandom(300 * 1024)
|
||
self.eva.add_file("/files/a.bin", data)
|
||
out = self.fetch(self.file_url())
|
||
self.assertEqual(out["status"], "done", out)
|
||
self.assertEqual(out["result"]["size"], 307200)
|
||
self.assertEqual(out["result"]["file"], hashlib.sha256(data).hexdigest())
|
||
self.assertEqual(self.hub.files[out["result"]["file"]], data)
|
||
self.assertEqual(self.eva.requests[0]["auth"], "Bearer " + self.eva.token)
|
||
|
||
def test_fetch_foreign_host(self):
|
||
out = self.fetch("http://127.0.0.1:1/files/a.bin")
|
||
self.assertEqual(out["status"], "failed")
|
||
self.assertIn("чужой хост", out["error"])
|
||
self.assertEqual(self.eva.requests, [])
|
||
self.assertEqual(self.hub.uploaded, [])
|
||
|
||
def test_fetch_too_big_header(self):
|
||
self.eva.add_file("/files/a.bin", b"x" * 1024, length=11 * MB) # заявлено 11 МБ, тело не дойдёт
|
||
out = self.fetch(self.file_url())
|
||
self.assertEqual(out["status"], "failed")
|
||
self.assertEqual(out["error"], TOO_BIG)
|
||
self.assertEqual(self.hub.uploaded, [])
|
||
|
||
def test_fetch_too_big_streaming(self):
|
||
self.eva.add_file("/files/a.bin", b"x" * (10 * MB + 1), length=False)
|
||
out = self.fetch(self.file_url())
|
||
self.assertEqual(out["status"], "failed")
|
||
self.assertEqual(out["error"], TOO_BIG)
|
||
self.assertEqual(self.hub.uploaded, [])
|
||
|
||
def test_fetch_exactly_limit(self):
|
||
self.eva.add_file("/files/a.bin", b"x" * (10 * MB))
|
||
out = self.fetch(self.file_url())
|
||
self.assertEqual(out["status"], "done", out)
|
||
self.assertEqual(out["result"]["size"], 10 * MB)
|
||
|
||
def test_fetch_404(self):
|
||
out = self.fetch(self.file_url("/files/none.bin"))
|
||
self.assertEqual(out["status"], "failed")
|
||
self.assertEqual(out["error"], "файл не найден в Eva")
|
||
|
||
def test_fetch_empty_file(self):
|
||
self.eva.add_file("/files/a.bin", b"")
|
||
out = self.fetch(self.file_url())
|
||
self.assertEqual(out["status"], "done", out)
|
||
self.assertEqual(out["result"]["size"], 0)
|
||
self.assertEqual(self.hub.files[out["result"]["file"]], b"")
|
||
|
||
def test_fetch_hub_error_is_hub_error(self):
|
||
self.eva.add_file("/files/a.bin", b"abc")
|
||
self.hub.reject_files = (500, {"error": "boom"})
|
||
out = self.fetch(self.file_url())
|
||
self.assertEqual(out["status"], "failed")
|
||
self.assertTrue(out["error"].startswith("хаб:"), out)
|
||
self.assertTrue(out["retryable"])
|
||
|
||
def test_fetch_no_url(self):
|
||
out = self.ex.run({"id": 1, "type": "wiki_fetch", "params": {"attachment_id": 7}})
|
||
self.assertEqual(out["status"], "failed")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
unittest.main()
|