test: добавить нагрузочные/долгие тесты слоёв 1 и 2 (37 тестов всего)
Deploy drhider / validate (push) Canceled after 0s
Deploy drhider / validate (push) Canceled after 0s
This commit is contained in:
@@ -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)
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
|
||||
Reference in New Issue
Block a user