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()