test: добавить нагрузочные/долгие тесты слоёв 1 и 2 (37 тестов всего)
Deploy drhider / validate (push) Canceled after 0s

This commit is contained in:
“Naeel”
2026-08-25 19:11:29 +03:00
parent 17e6dbd065
commit 52c3eb53f1
3 changed files with 278 additions and 0 deletions
+79
View File
@@ -7,6 +7,7 @@
import os
import sys
import time
# Корень проекта — для импорта пакета upload
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
@@ -227,6 +228,84 @@ def test_upload_refs_pull_failed(monkeypatch):
assert rv.status_code == 502 # все ретраи провалились
def test_session_many_files():
"""Нагрузка: 1000 файлов в одной сессии."""
sid = create_session()
for i in range(1000):
assert add_file(sid, "f%d.txt" % i, b"x" * 10) is True
assert file_count(sid) == 1000
assert len(get_files(sid)) == 1000
def test_concurrent_add_files():
"""Конкурентность: 4 потока добавляют файлы в общую сессию."""
import threading
sid = create_session()
def worker(prefix):
for i in range(50):
add_file(sid, "%s_%d.txt" % (prefix, i), b"data")
threads = [threading.Thread(target=worker, args=("t%d" % t,)) for t in range(4)]
for t in threads:
t.start()
for t in threads:
t.join()
assert file_count(sid) == 200
def test_session_ttl_cleanup():
"""TTL: короткий TTL → сессия очищается фоновым таймером (долгий тест)."""
from upload.backend.session import configure
configure(ttl_seconds=1)
try:
sid = create_session()
assert add_file(sid, "a.txt", b"x") is True
time.sleep(1.5)
assert get_files(sid) is None # таймер удалил сессию
finally:
configure(ttl_seconds=30 * 60)
def test_add_file_session_limit_boundary():
"""Суммарный лимит: граница ровно на MAX_SESSION_BYTES."""
from upload.backend.session import configure
configure(max_session_bytes=1000)
try:
sid = create_session()
assert add_file(sid, "a", b"x" * 500) is True
assert add_file(sid, "b", b"x" * 500) is True # ровно 1000
assert add_file(sid, "c", b"x") is False # 1001 > 1000
assert file_count(sid) == 2
finally:
configure(max_session_bytes=500 * 1024 * 1024)
def test_safe_name_edge_cases():
"""safe_name: граничные случаи."""
assert safe_name("...") == "..."
assert safe_name("a/../b") == ""
assert safe_name("a//b") == "a/b"
assert safe_name(" ") == " "
assert safe_name("договор/файл.pdf") == "договор/файл.pdf"
assert safe_name("C:\\path\\file") == "C:/path/file"
assert safe_name("/abs/path") == "abs/path"
def test_upload_refs_many_files(monkeypatch):
"""Нагрузка: 100 refs → все pull OK, count=100."""
behavior = {}
files = []
for i in range(100):
url = VM_PREFIX + "tok_%d" % i
behavior[url] = {"payload": b"x" * 10}
files.append({"name": "f%d.txt" % i, "size": 10, "url": url})
c = _make_client(behavior, monkeypatch=monkeypatch)
rv = c.post("/api/upload_refs", json={"session": "", "files": files})
assert rv.status_code == 200
assert rv.get_json()["count"] == 100
# ═══════════════════════════════════════════════════════════════════════════
# main (запуск без pytest)
# ═══════════════════════════════════════════════════════════════════════════