|
2 | 2 | from typing import Generator |
3 | 3 |
|
4 | 4 | import pytest |
| 5 | +from jinja2 import TemplateNotFound |
5 | 6 | from markupsafe import Markup |
6 | 7 | from sqlalchemy import Boolean, Column, Enum, ForeignKey, Integer, String, select |
7 | 8 | from sqlalchemy.dialects.postgresql import UUID |
8 | 9 | from sqlalchemy.orm import contains_eager, declarative_base, relationship, sessionmaker |
9 | 10 | from sqlalchemy.sql.expression import Select |
10 | 11 | from starlette.applications import Starlette |
11 | 12 | from starlette.requests import Request |
| 13 | +from starlette.testclient import TestClient |
12 | 14 |
|
13 | | -from sqladmin import Admin, ModelView |
| 15 | +from sqladmin import Admin, ModelView, expose |
14 | 16 | from sqladmin.exceptions import InvalidModelError |
15 | 17 | from sqladmin.helpers import get_column_python_type |
16 | 18 | from tests.common import sync_engine as engine |
@@ -77,6 +79,12 @@ def prepare_database() -> Generator[None, None, None]: |
77 | 79 | Base.metadata.drop_all(engine) |
78 | 80 |
|
79 | 81 |
|
| 82 | +@pytest.fixture |
| 83 | +def client() -> Generator[TestClient, None, None]: |
| 84 | + with TestClient(app=app, base_url="http://testserver") as c: |
| 85 | + yield c |
| 86 | + |
| 87 | + |
80 | 88 | def test_metadata_setup() -> None: |
81 | 89 | class UserAdmin(ModelView, model=User): |
82 | 90 | pass |
@@ -478,3 +486,18 @@ class AddressAdmin(ModelView, model=Address): |
478 | 486 | stmt = AddressAdmin().search_query(select(Address), "example") |
479 | 487 | assert "lower(CAST(users.name AS VARCHAR))" in str(stmt) |
480 | 488 | assert "lower(CAST(profiles.role AS VARCHAR))" in str(stmt) |
| 489 | + |
| 490 | + |
| 491 | +def test_expose_decorator(client: TestClient) -> None: |
| 492 | + class UserAdmin(ModelView, model=User): |
| 493 | + @expose("/profile/{pk}") |
| 494 | + async def profile(self, request: Request): |
| 495 | + user: User = await self.get_object_for_edit(request) |
| 496 | + return await self.templates.TemplateResponse( |
| 497 | + request, "user.html", {"user": user} |
| 498 | + ) |
| 499 | + |
| 500 | + admin.add_view(UserAdmin) |
| 501 | + |
| 502 | + with pytest.raises(TemplateNotFound, match="user.html"): |
| 503 | + client.get("/admin/user/profile/1") |
0 commit comments