/
liquid-g
/
liquid-code
Обзор
Документация
Войти
/
liquid-g
/
liquid-code
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop-0.4
tests/feature/controllers/test_controllers.py
285 строк
9 KB
User
0.4.1 - продолжаю переписывать тесты. пофиксил несколько багов по дороге.
04 июл 2026, 23:46
04 июл 2026, 23:46
7632abc
Код
Авторство
О чём код?
"""Feature-тесты для контроллеров.""" import pytest import tempfile import os import sys from liquidcode import Application, route, controller, TestClient # Добавляем src в path sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "src")) class TestControllerFeature: """Feature-тесты для контроллеров.""" def test_controller_with_route_group(self): """Контроллер с группой маршрутов.""" app = Application() @controller(prefix="/api/users") class UserController: @route("/", methods=["GET"]) def list(self): return {"users": []} @route("/", methods=["POST"]) def create(self): return {"created": True} @route("/{id}", methods=["GET"]) def get(self, id): return {"id": id} @route("/{id}", methods=["PUT"]) def update(self, id): return {"updated": True} @route("/{id}", methods=["DELETE"]) def delete(self, id): return {"deleted": True} app.add_controller(UserController) # Проверяем все маршруты assert app.router.has_route("/api/users", "GET") assert app.router.has_route("/api/users", "POST") assert app.router.has_route("/api/users/{id}", "GET") assert app.router.has_route("/api/users/{id}", "PUT") assert app.router.has_route("/api/users/{id}", "DELETE") def test_controller_with_dependencies(self): """Контроллер с зависимостями через DI.""" app = Application() class Service: def get_data(self): return ["item1", "item2"] app.container.set(Service, Service()) @controller(prefix="/api/data") class DataController: def __init__(self, service: Service): self.service = service @route("/") def list(self): return {"data": self.service.get_data()} app.add_controller(DataController) assert app.router.has_route("/api/data", "GET") def test_controller_with_validation(self): """Контроллер с валидацией.""" app = Application() @controller(prefix="/api/users") class UserController: @route("/", methods=["POST"]) def create(self, name: str, email: str): return {"name": name, "email": email} app.add_controller(UserController) assert app.router.has_route("/api/users", "POST") def test_controller_with_middlewares(self): """Контроллер с middleware.""" app = Application() def auth_middleware(request, call_next): request.environ["authenticated"] = True return call_next(request) def log_middleware(request, call_next): request.environ["logged"] = True return call_next(request) @controller( prefix="/api/protected", middlewares=[auth_middleware, log_middleware] ) class ProtectedController: @route("/dashboard") def dashboard(self): return {"page": "dashboard"} app.add_controller(ProtectedController) assert app.router.has_route("/api/protected/dashboard", "GET") def test_controller_inheritance(self): """Наследование контроллеров.""" app = Application() class BaseController: @route("/base") def base(self): return {"base": True} @controller(prefix="/extended") class ExtendedController(BaseController): @route("/extended") def extended(self): return {"extended": True} app.add_controller(ExtendedController) # Маршрут от ExtendedController должен быть добавлен assert app.router.has_route("/extended/extended", "GET") # Маршрут от BaseController НЕ добавляется автоматически (только методы декорированные @route в ExtendedController) # Это ожидаемое поведение: декораторы обрабатываются только для класса, к которому применены def test_controller_route_overrides(self): """Переопределение маршрутов в контроллере.""" app = Application() @controller(prefix="/api") class ApiController: @route("/users", methods=["GET"]) def users(self): return {"users": []} @route("/users", methods=["POST"]) def create_user(self): return {"created": True} @route("/users/{id}") def get_user(self, id): return {"id": id} app.add_controller(ApiController) assert app.router.has_route("/api/users", "GET") assert app.router.has_route("/api/users", "POST") assert app.router.has_route("/api/users/{id}", "GET") class TestControllerDiscoveryFeature: """Feature-тесты для обнаружения контроллеров.""" def test_controller_discovery_from_directory(self): """Обнаружение контроллеров из директории.""" app = Application() with tempfile.TemporaryDirectory() as tmpdir: controller_dir = os.path.join(tmpdir, "src", "Controller") os.makedirs(controller_dir) # Создаем первый контроллер controller1 = os.path.join(controller_dir, "UserController.py") with open(controller1, "w") as f: f.write(""" from liquidcode import route class UserController: @route('/users') def index(self): return {'users': []} """) # Создаем второй контроллер controller2 = os.path.join(controller_dir, "ProductController.py") with open(controller2, "w") as f: f.write(""" from liquidcode import route class ProductController: @route('/products') def index(self): return {'products': []} """) app.discover_controllers(controller_dir) assert app.router.has_route("/users", "GET") assert app.router.has_route("/products", "GET") # Cleanup for file in [controller1, controller2]: if os.path.exists(file): os.remove(file) if os.path.exists(controller_dir): try: os.rmdir(controller_dir) except OSError: pass def test_controller_discovery_with_prefix(self): """Обнаружение контроллеров с префиксами.""" app = Application() with tempfile.TemporaryDirectory() as tmpdir: controller_dir = os.path.join(tmpdir, "src", "Controller") os.makedirs(controller_dir) controller_file = os.path.join(controller_dir, "ApiController.py") with open(controller_file, "w") as f: f.write(""" from liquidcode import controller, route @controller(prefix="/api/v1") class ApiController: @route('/users') def users(self): return {'users': []} @route('/products') def products(self): return {'products': []} """) app.discover_controllers(controller_dir) assert app.router.has_route("/api/v1/users", "GET") assert app.router.has_route("/api/v1/products", "GET") # Cleanup if os.path.exists(controller_file): os.remove(controller_file) if os.path.exists(controller_dir): try: os.rmdir(controller_dir) except OSError: pass class TestControllerIntegrationFeature: """Feature-тесты для интеграции контроллеров.""" def test_controller_full_request_cycle(self): """Полный цикл запроса к контроллеру.""" app = Application() class TestController: @route("/test") def index(self): return {"message": "Hello, World!"} app.add_controller(TestController) client = TestClient(app) response = client.get("/test") assert response.status == 200 assert response.json() == {"message": "Hello, World!"} def test_controller_with_parameters(self): """Контроллер с параметрами в маршруте.""" app = Application() class UserController: @route("/users/{id}") def get(self, id): return {"id": id, "name": f"User {id}"} app.add_controller(UserController) client = TestClient(app) response = client.get("/users/123") assert response.status == 200 assert response.json() == {"id": "123", "name": "User 123"}