/
liquid-g
/
liquid-code
Обзор
Документация
Войти
/
liquid-g
/
liquid-code
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop-0.4
tests/unit/commands/test_make_controller.py
309 строк
10 KB
User
0.4.12 - Event Dispatcher / Subscriber и улучшения на русском языке
06 июл 2026, 15:23
06 июл 2026, 15:23
65223a0
Код
Авторство
О чём код?
"""Тесты команды make:controller.""" import pytest import argparse import os from unittest.mock import patch, MagicMock from liquidcode.commands.make.controller import ( run as controller_run, configure_parser as controller_configure, _check_route_conflict, ) class TestControllerConfigureParser: """Тесты configure_parser.""" def test_configure_parser(self): """Настройка парсера аргументов.""" parser = MagicMock() subparser = MagicMock() parser.add_subparsers.return_value = {"make:controller": subparser} controller_configure(subparser) # Проверяем, что добавлены аргументы assert subparser.add_argument.call_count > 0 class TestControllerRun: """Тесты функции run.""" def test_run_interactive(self): """Интерактивный режим.""" with patch("builtins.input", return_value="User"): args = argparse.Namespace( name=None, route=None, directory="src/Controller", force=False, no_interactive=False, no_view=False, prefix=None, ) controller_run(args) # Cleanup user_file = "src/Controller/UserController.py" if os.path.exists(user_file): os.remove(user_file) view_file = "templates/User.html.j2" if os.path.exists(view_file): os.remove(view_file) controller_dir = "src/Controller" if os.path.exists(controller_dir): try: os.rmdir(controller_dir) except OSError: pass def test_run_interactive_empty_name(self): """Интерактивный режим с пустым именем.""" with patch("builtins.input", return_value=""): args = argparse.Namespace( name=None, route=None, directory="src/Controller", force=False, no_interactive=False, no_view=False, prefix=None, ) with patch("builtins.print") as mock_print: controller_run(args) mock_print.assert_any_call("[ERROR] Имя не может быть пустым") def test_run_with_name(self): """Режим с переданным именем.""" args = argparse.Namespace( name="Product", route=None, directory="src/Controller", force=False, no_interactive=True, no_view=False, prefix=None, ) controller_run(args) # Cleanup product_file = "src/Controller/ProductController.py" if os.path.exists(product_file): os.remove(product_file) view_file = "templates/Product.html.j2" if os.path.exists(view_file): os.remove(view_file) controller_dir = "src/Controller" if os.path.exists(controller_dir): try: os.rmdir(controller_dir) except OSError: pass def test_run_with_route(self): """Режим с кастомным маршрутом.""" args = argparse.Namespace( name="User", route="/accounts", directory="src/Controller", force=False, no_interactive=True, no_view=False, prefix=None, ) controller_run(args) # Cleanup user_file = "src/Controller/UserController.py" if os.path.exists(user_file): os.remove(user_file) view_file = "templates/User.html.j2" if os.path.exists(view_file): os.remove(view_file) controller_dir = "src/Controller" if os.path.exists(controller_dir): try: os.rmdir(controller_dir) except OSError: pass def test_run_with_no_view(self): """Режим без создания шаблона (--no-view).""" args = argparse.Namespace( name="User", route=None, directory="src/Controller", force=False, no_interactive=True, no_view=True, prefix=None, ) controller_run(args) # Проверяем, что контроллер создан user_file = "src/Controller/UserController.py" assert os.path.exists(user_file) # Проверяем, что шаблон НЕ создан view_file = "templates/User.html.j2" assert not os.path.exists(view_file) # Cleanup if os.path.exists(user_file): os.remove(user_file) controller_dir = "src/Controller" if os.path.exists(controller_dir): try: os.rmdir(controller_dir) except OSError: pass def test_run_with_route_conflict(self): """Режим с конфликтом маршрута.""" # Создаем контроллер с маршрутом /users os.makedirs("src/Controller", exist_ok=True) with open("src/Controller/OtherController.py", "w") as f: f.write(""" from liquidcode import route from liquidcode.contracts import Request from liquidcode.http import HttpResponse class OtherController: @route('/users') def index(self, request: Request) -> HttpResponse: return HttpResponse({'message': 'Other'}) """) args = argparse.Namespace( name="User", route="/users", directory="src/Controller", force=False, no_interactive=True, no_view=False, prefix=None, ) with patch("builtins.print") as mock_print: controller_run(args) mock_print.assert_any_call( "[ERROR] Маршрут '/users' уже занят другим контроллером." ) # Cleanup other_file = "src/Controller/OtherController.py" if os.path.exists(other_file): os.remove(other_file) controller_dir = "src/Controller" if os.path.exists(controller_dir): try: os.rmdir(controller_dir) except OSError: pass def test_run_with_route_conflict_force(self): """Режим с конфликтом маршрута и --force.""" # Создаем контроллер с маршрутом /users os.makedirs("src/Controller", exist_ok=True) with open("src/Controller/OtherController.py", "w") as f: f.write(""" from liquidcode import route from liquidcode.contracts import Request from liquidcode.http import HttpResponse class OtherController: @route('/users') def index(self, request: Request) -> HttpResponse: return HttpResponse({'message': 'Other'}) """) args = argparse.Namespace( name="User", route="/users", directory="src/Controller", force=True, no_interactive=True, no_view=False, prefix=None, ) controller_run(args) # Должен быть создан файл assert os.path.exists("src/Controller/UserController.py") # Cleanup user_file = "src/Controller/UserController.py" if os.path.exists(user_file): os.remove(user_file) other_file = "src/Controller/OtherController.py" if os.path.exists(other_file): os.remove(other_file) controller_dir = "src/Controller" if os.path.exists(controller_dir): try: os.rmdir(controller_dir) except OSError: pass class TestCheckRouteConflict: """Тесты функции _check_route_conflict.""" def test_check_route_conflict_no_file(self): """Маршрут свободен (файла нет).""" result = _check_route_conflict("/free", False) assert result is True def test_check_route_conflict_no_force(self): """Конфликт без force.""" # Создаем файл с маршрутом /users os.makedirs("src/Controller", exist_ok=True) with open("src/Controller/TestController.py", "w") as f: f.write(""" from liquidcode import route from liquidcode.contracts import Request from liquidcode.http import HttpResponse class TestController: @route('/users') def index(self, request: Request) -> HttpResponse: return HttpResponse({'message': 'Test'}) """) result = _check_route_conflict("/users", False) assert result is False # Cleanup test_file = "src/Controller/TestController.py" if os.path.exists(test_file): os.remove(test_file) def test_check_route_conflict_with_force(self): """Конфликт с force.""" # Создаем файл с маршрутом /users os.makedirs("src/Controller", exist_ok=True) with open("src/Controller/TestController.py", "w") as f: f.write(""" from liquidcode import route from liquidcode.contracts import Request from liquidcode.http import HttpResponse class TestController: @route('/users') def index(self, request: Request) -> HttpResponse: return HttpResponse({'message': 'Test'}) """) result = _check_route_conflict("/users", True) assert result is True # Cleanup test_file = "src/Controller/TestController.py" if os.path.exists(test_file): os.remove(test_file)