eva-agent/tests/test_wiki_fetch.py
Andrey Epifancev 3597495a6a Команда wiki_fetch (#1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 05:17:49 +04:00

94 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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