mirror of
https://git.sr.ht/~tsileo/microblog.pub
synced 2024-12-21 20:54:27 +00:00
Cleanup utils
This commit is contained in:
parent
b7b04cad03
commit
f9f9e62e13
13 changed files with 21 additions and 13 deletions
|
@ -1,5 +1,6 @@
|
||||||
import typing
|
import typing
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
from typing import Union
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
|
@ -148,7 +149,7 @@ ActorsMetadata = dict[str, ActorMetadata]
|
||||||
|
|
||||||
def get_actors_metadata(
|
def get_actors_metadata(
|
||||||
db: Session,
|
db: Session,
|
||||||
actors: list["ActorModel"],
|
actors: list[Union["ActorModel", "RemoteActor"]],
|
||||||
) -> ActorsMetadata:
|
) -> ActorsMetadata:
|
||||||
from app import models
|
from app import models
|
||||||
|
|
||||||
|
@ -179,6 +180,8 @@ def get_actors_metadata(
|
||||||
}
|
}
|
||||||
idx: ActorsMetadata = {}
|
idx: ActorsMetadata = {}
|
||||||
for actor in actors:
|
for actor in actors:
|
||||||
|
if not actor.ap_id:
|
||||||
|
raise ValueError("Should never happen")
|
||||||
idx[actor.ap_id] = ActorMetadata(
|
idx[actor.ap_id] = ActorMetadata(
|
||||||
ap_actor_id=actor.ap_id,
|
ap_actor_id=actor.ap_id,
|
||||||
is_following=actor.ap_id in following,
|
is_following=actor.ap_id in following,
|
||||||
|
|
|
@ -72,9 +72,9 @@ def get_lookup(
|
||||||
if query:
|
if query:
|
||||||
ap_object = lookup(db, query)
|
ap_object = lookup(db, query)
|
||||||
if ap_object.ap_type in ap.ACTOR_TYPES:
|
if ap_object.ap_type in ap.ACTOR_TYPES:
|
||||||
actors_metadata = get_actors_metadata(db, [ap_object])
|
actors_metadata = get_actors_metadata(db, [ap_object]) # type: ignore
|
||||||
else:
|
else:
|
||||||
actors_metadata = get_actors_metadata(db, [ap_object.actor])
|
actors_metadata = get_actors_metadata(db, [ap_object.actor]) # type: ignore
|
||||||
print(ap_object)
|
print(ap_object)
|
||||||
return templates.render_template(
|
return templates.render_template(
|
||||||
db,
|
db,
|
||||||
|
|
|
@ -7,10 +7,10 @@ from dateutil.parser import isoparse
|
||||||
from markdown import markdown
|
from markdown import markdown
|
||||||
|
|
||||||
from app import activitypub as ap
|
from app import activitypub as ap
|
||||||
from app import opengraph
|
|
||||||
from app.actor import LOCAL_ACTOR
|
from app.actor import LOCAL_ACTOR
|
||||||
from app.actor import Actor
|
from app.actor import Actor
|
||||||
from app.actor import RemoteActor
|
from app.actor import RemoteActor
|
||||||
|
from app.utils import opengraph
|
||||||
|
|
||||||
|
|
||||||
class Object:
|
class Object:
|
||||||
|
|
|
@ -23,8 +23,8 @@ from app.config import VERSION
|
||||||
from app.config import generate_csrf_token
|
from app.config import generate_csrf_token
|
||||||
from app.config import session_serializer
|
from app.config import session_serializer
|
||||||
from app.database import now
|
from app.database import now
|
||||||
from app.highlight import HIGHLIGHT_CSS
|
from app.utils.highlight import HIGHLIGHT_CSS
|
||||||
from app.highlight import highlight
|
from app.utils.highlight import highlight
|
||||||
|
|
||||||
_templates = Jinja2Templates(directory="app/templates")
|
_templates = Jinja2Templates(directory="app/templates")
|
||||||
|
|
||||||
|
|
0
app/utils/__init__.py
Normal file
0
app/utils/__init__.py
Normal file
|
@ -8,7 +8,7 @@ from pydantic import BaseModel
|
||||||
|
|
||||||
from app import activitypub as ap
|
from app import activitypub as ap
|
||||||
from app import config
|
from app import config
|
||||||
from app.urlutils import is_url_valid
|
from app.utils.url import is_url_valid
|
||||||
|
|
||||||
|
|
||||||
class OpenGraphMeta(BaseModel):
|
class OpenGraphMeta(BaseModel):
|
|
@ -1,16 +1,20 @@
|
||||||
|
import typing
|
||||||
|
|
||||||
|
import starlette
|
||||||
from fastapi.testclient import TestClient
|
from fastapi.testclient import TestClient
|
||||||
|
|
||||||
from app.main import app
|
from app.main import app
|
||||||
|
|
||||||
|
|
||||||
def test_admin_endpoints_are_authenticated(client: TestClient):
|
def test_admin_endpoints_are_authenticated(client: TestClient) -> None:
|
||||||
routes_tested = []
|
routes_tested = []
|
||||||
|
|
||||||
for route in app.routes:
|
for route in app.routes:
|
||||||
|
route = typing.cast(starlette.routing.Route, route)
|
||||||
if not route.path.startswith("/admin") or route.path == "/admin/login":
|
if not route.path.startswith("/admin") or route.path == "/admin/login":
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for method in route.methods:
|
for method in route.methods: # type: ignore
|
||||||
resp = client.request(method, route.path)
|
resp = client.request(method, route.path)
|
||||||
|
|
||||||
# Admin routes should redirect to the login page
|
# Admin routes should redirect to the login page
|
||||||
|
|
|
@ -55,7 +55,6 @@ def test_enforce_httpsig__no_signature(
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_enforce_httpsig__with_valid_signature(
|
async def test_enforce_httpsig__with_valid_signature(
|
||||||
client: TestClient,
|
|
||||||
respx_mock: respx.MockRouter,
|
respx_mock: respx.MockRouter,
|
||||||
) -> None:
|
) -> None:
|
||||||
# Given a remote actor
|
# Given a remote actor
|
||||||
|
@ -105,7 +104,6 @@ def test_httpsig_checker__no_signature(
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_httpsig_checker__with_valid_signature(
|
async def test_httpsig_checker__with_valid_signature(
|
||||||
client: TestClient,
|
|
||||||
respx_mock: respx.MockRouter,
|
respx_mock: respx.MockRouter,
|
||||||
) -> None:
|
) -> None:
|
||||||
# Given a remote actor
|
# Given a remote actor
|
||||||
|
@ -138,7 +136,6 @@ async def test_httpsig_checker__with_valid_signature(
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_httpsig_checker__with_invvalid_signature(
|
async def test_httpsig_checker__with_invvalid_signature(
|
||||||
client: TestClient,
|
|
||||||
respx_mock: respx.MockRouter,
|
respx_mock: respx.MockRouter,
|
||||||
) -> None:
|
) -> None:
|
||||||
# Given a remote actor
|
# Given a remote actor
|
||||||
|
|
|
@ -44,6 +44,9 @@ def test_new_outgoing_activity(
|
||||||
outbox_object = _setup_outbox_object()
|
outbox_object = _setup_outbox_object()
|
||||||
inbox_url = "https://example.com/inbox"
|
inbox_url = "https://example.com/inbox"
|
||||||
|
|
||||||
|
if not outbox_object.id:
|
||||||
|
raise ValueError("Should never happen")
|
||||||
|
|
||||||
# When queuing the activity
|
# When queuing the activity
|
||||||
outgoing_activity = new_outgoing_activity(db, inbox_url, outbox_object.id)
|
outgoing_activity = new_outgoing_activity(db, inbox_url, outbox_object.id)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
import fastapi
|
import fastapi
|
||||||
|
|
||||||
|
@ -25,5 +26,5 @@ def mock_httpsig_checker(ra: actor.RemoteActor):
|
||||||
del app.dependency_overrides[httpsig.httpsig_checker]
|
del app.dependency_overrides[httpsig.httpsig_checker]
|
||||||
|
|
||||||
|
|
||||||
def generate_admin_session_cookies() -> dict[str, str]:
|
def generate_admin_session_cookies() -> dict[str, Any]:
|
||||||
return {"session": session_serializer.dumps({"is_logged_in": True})}
|
return {"session": session_serializer.dumps({"is_logged_in": True})}
|
||||||
|
|
Loading…
Reference in a new issue