- Add Model Mixins: TimestampMixin, SoftDeleteMixin, AuditMixin, etc. - Add Base Services: BaseService, BulkOperationsMixin, QueryOptimizerMixin - Add Base ViewSets with bulk operations - Add BackgroundJob model for Celery task tracking - Add BaseAppCommand for management commands - Add permissions, pagination, filters, cache, logging - Migrate tests to factory_boy + faker - Add CHANGELOG.md - 297 tests passing
93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
"""Тесты для базового класса management commands."""
|
||
|
||
from io import StringIO
|
||
|
||
from apps.core.management.commands.base import BaseAppCommand
|
||
from django.core.management.base import CommandError
|
||
from django.test import TestCase
|
||
|
||
|
||
class TestCommand(BaseAppCommand):
|
||
"""Тестовая команда для проверки BaseAppCommand."""
|
||
|
||
help = "Test command"
|
||
|
||
def execute_command(self, *args, **options):
|
||
if options.get("fail"):
|
||
raise ValueError("Test error")
|
||
return "Success"
|
||
|
||
|
||
class BaseAppCommandTest(TestCase):
|
||
"""Тесты для BaseAppCommand."""
|
||
|
||
def test_base_command_has_dry_run_argument(self):
|
||
"""Проверка наличия аргумента --dry-run."""
|
||
cmd = BaseAppCommand()
|
||
parser = cmd.create_parser("manage.py", "test")
|
||
# Парсер должен принимать --dry-run
|
||
args = parser.parse_args(["--dry-run"])
|
||
self.assertTrue(args.dry_run)
|
||
|
||
def test_base_command_has_silent_argument(self):
|
||
"""Проверка наличия аргумента --silent."""
|
||
cmd = BaseAppCommand()
|
||
parser = cmd.create_parser("manage.py", "test")
|
||
args = parser.parse_args(["--silent"])
|
||
self.assertTrue(args.silent)
|
||
|
||
def test_log_methods_exist(self):
|
||
"""Проверка наличия методов логирования."""
|
||
cmd = BaseAppCommand()
|
||
cmd.stdout = StringIO()
|
||
cmd.stderr = StringIO()
|
||
cmd.silent = False
|
||
cmd.verbosity = 2
|
||
|
||
# Методы должны существовать и не падать
|
||
cmd.log_info("Test info")
|
||
cmd.log_success("Test success")
|
||
cmd.log_warning("Test warning")
|
||
cmd.log_error("Test error")
|
||
cmd.log_debug("Test debug")
|
||
|
||
def test_progress_iter(self):
|
||
"""Тест итератора с прогрессом."""
|
||
cmd = BaseAppCommand()
|
||
cmd.stdout = StringIO()
|
||
cmd.silent = True # Без вывода
|
||
|
||
items = list(range(10))
|
||
result = list(cmd.progress_iter(items, "Processing"))
|
||
|
||
self.assertEqual(result, items)
|
||
|
||
def test_confirm_in_dry_run(self):
|
||
"""Тест подтверждения в dry-run режиме."""
|
||
cmd = BaseAppCommand()
|
||
cmd.stdout = StringIO()
|
||
cmd.dry_run = True
|
||
cmd.silent = False
|
||
|
||
# В dry-run confirm всегда возвращает True
|
||
result = cmd.confirm("Continue?")
|
||
self.assertTrue(result)
|
||
|
||
def test_abort_raises_command_error(self):
|
||
"""Тест прерывания команды."""
|
||
cmd = BaseAppCommand()
|
||
|
||
with self.assertRaises(CommandError):
|
||
cmd.abort("Test abort")
|
||
|
||
def test_timed_operation(self):
|
||
"""Тест контекстного менеджера для измерения времени."""
|
||
cmd = BaseAppCommand()
|
||
cmd.stdout = StringIO()
|
||
cmd.verbosity = 2
|
||
|
||
with cmd.timed_operation("Test operation"):
|
||
pass # Операция
|
||
|
||
# Не должно падать
|