feat: обновления парсеров, тестов и миграций
Some checks failed
CI/CD Pipeline / Run Tests (push) Failing after 37s
CI/CD Pipeline / Code Quality Checks (push) Failing after 43s
CI/CD Pipeline / Build & Push Images (push) Has been skipped
CI/CD Pipeline / Deploy (dev) (push) Has been skipped
CI/CD Pipeline / Deploy (prod) (push) Has been skipped
CI/CD Pipeline / Code Quality Checks (pull_request) Failing after 0s
CI/CD Pipeline / Run Tests (pull_request) Failing after 0s
CI/CD Pipeline / Build & Push Images (pull_request) Has been skipped
CI/CD Pipeline / Deploy (dev) (pull_request) Has been skipped
CI/CD Pipeline / Deploy (prod) (pull_request) Has been skipped

- Обновлены клиенты парсеров (checko, fns, minpromtorg, proverki, zakupki)
- Добавлены новые миграции для моделей
- Расширено покрытие тестами
- Обновлены конфигурации и настройки проекта
- Добавлены утилиты для тестирования

Co-Authored-By: Warp <agent@warp.dev>
This commit is contained in:
2026-02-10 10:17:47 +01:00
parent 975d019ba5
commit ee95628a0a
59 changed files with 7292 additions and 2876 deletions

View File

@@ -3,7 +3,7 @@
from io import StringIO
from apps.core.management.commands.base import BaseAppCommand
from django.core.management.base import CommandError
from django.core.management.base import CommandError, OutputWrapper
from django.test import TestCase
@@ -18,6 +18,23 @@ class TestCommand(BaseAppCommand):
return "Success"
class TransactionCommand(BaseAppCommand):
"""Команда для тестов транзакций и dry-run."""
use_transaction = True
def execute_command(self, *args, **options):
from apps.core.models import BackgroundJob
BackgroundJob.objects.create(
task_id=options.get("task_id", "tx-task"),
task_name="test.command",
)
if options.get("fail"):
raise ValueError("tx error")
return "OK"
class BaseAppCommandTest(TestCase):
"""Тесты для BaseAppCommand."""
@@ -73,6 +90,14 @@ class BaseAppCommandTest(TestCase):
result = cmd.confirm("Continue?")
self.assertTrue(result)
def test_confirm_with_input_func(self):
cmd = BaseAppCommand()
cmd.stdout = OutputWrapper(StringIO())
cmd.dry_run = False
cmd.silent = True
cmd.input_func = lambda: "y"
self.assertTrue(cmd.confirm("Proceed?"))
def test_abort_raises_command_error(self):
"""Тест прерывания команды."""
cmd = BaseAppCommand()
@@ -90,3 +115,51 @@ class BaseAppCommandTest(TestCase):
pass # Операция
# Не должно падать
def test_handle_success(self):
cmd = TestCommand()
cmd.stdout = StringIO()
cmd.stderr = StringIO()
result = cmd.handle()
self.assertEqual(result, "Success")
def test_handle_raises_command_error(self):
cmd = TestCommand()
cmd.stdout = StringIO()
cmd.stderr = StringIO()
with self.assertRaises(CommandError):
cmd.handle(fail=True)
def test_handle_dry_run_rolls_back(self):
cmd = TransactionCommand()
cmd.stdout = StringIO()
cmd.stderr = StringIO()
cmd.handle(dry_run=True, silent=True)
from apps.core.models import BackgroundJob
self.assertEqual(BackgroundJob.objects.count(), 0)
def test_handle_transaction_persists(self):
cmd = TransactionCommand()
cmd.stdout = StringIO()
cmd.stderr = StringIO()
cmd.handle(dry_run=False, silent=True, task_id="persist-task")
from apps.core.models import BackgroundJob
self.assertTrue(
BackgroundJob.objects.filter(task_id="persist-task").exists()
)
def test_progress_iter_without_total(self):
cmd = BaseAppCommand()
cmd.stdout = StringIO()
cmd.silent = True
def generator():
for idx in range(3):
yield idx
result = list(cmd.progress_iter(generator(), "Iter"))
self.assertEqual(result, [0, 1, 2])