-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
9 changed files
with
377 additions
and
118 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,25 +1,36 @@ | ||
from typing import Optional | ||
|
||
from fastapi import APIRouter, Depends | ||
from fastapi_pagination.cursor import CursorPage | ||
from sqlmodel import Session | ||
|
||
from ..auth import get_current_user | ||
from ..crud import get_file_as_text, get_standards_admin | ||
from ..crud import get_data, get_file, get_file_as_text, get_standards_admin | ||
from ..database import get_session | ||
from ..models.response_models import AdminXASStandardResponse | ||
|
||
router = APIRouter() | ||
|
||
|
||
@router.get("/api/admin/data/{id}") | ||
async def read_admin_data(id: int, session: Session = Depends(get_session)): | ||
async def read_admin_data( | ||
id: int, | ||
format: Optional[str] = "", | ||
session: Session = Depends(get_session), | ||
user_id: str = Depends(get_current_user), | ||
): | ||
if format == "download": | ||
return get_file(session, id) | ||
|
||
return get_file_as_text(session, id) | ||
if format == "json": | ||
return get_data(session, id) | ||
|
||
return get_file_as_text(session, id, user_id) | ||
|
||
|
||
@router.get("/api/admin/standards") | ||
def read_standards_admin( | ||
session: Session = Depends(get_session), | ||
user_id: str = Depends(get_current_user), | ||
) -> CursorPage[AdminXASStandardResponse]: | ||
|
||
return get_standards_admin(session, user_id) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
from fastapi.testclient import TestClient | ||
from sqlmodel import Session, SQLModel, create_engine | ||
from sqlmodel.pool import StaticPool | ||
|
||
from utils import build_test_database | ||
from xas_standards_api.app import app | ||
from xas_standards_api.auth import get_current_user | ||
from xas_standards_api.database import get_session | ||
from xas_standards_api.models.response_models import AdminXASStandardResponse | ||
|
||
|
||
def test_admin_read_permissions(): | ||
engine = create_engine( | ||
"sqlite://", | ||
connect_args={"check_same_thread": False}, | ||
poolclass=StaticPool, | ||
) | ||
SQLModel.metadata.create_all(engine) | ||
|
||
with Session(engine) as session: | ||
build_test_database(session) | ||
|
||
def get_session_override(): | ||
return session | ||
|
||
def get_ordinary_user(): | ||
return "user" | ||
|
||
def get_admin_user(): | ||
return "admin" | ||
|
||
client = TestClient(app) | ||
|
||
# first try with ordinary user | ||
app.dependency_overrides[get_session] = get_session_override | ||
app.dependency_overrides[get_current_user] = get_ordinary_user | ||
|
||
response = client.get("/api/admin/standards") | ||
|
||
assert response.status_code == 401 | ||
|
||
# check cant get data | ||
response = client.get("/api/admin/data/2") | ||
assert response.status_code == 401 | ||
|
||
# check cant get data from open endpoint | ||
response = client.get("/api/data/2") | ||
assert response.status_code == 401 | ||
|
||
# now try admin user | ||
app.dependency_overrides.clear() | ||
app.dependency_overrides[get_session] = get_session_override | ||
app.dependency_overrides[get_current_user] = get_admin_user | ||
|
||
response = client.get("/api/admin/standards") | ||
r = response.json() | ||
|
||
# check response is paginated, containing 1 item | ||
assert "items" in r | ||
assert len(r["items"]) == 1 | ||
|
||
# check its correct response and contains the submitter identifier | ||
axassr = AdminXASStandardResponse.model_validate(r["items"][0]) | ||
assert axassr.submitter.identifier == "user" | ||
|
||
# check can get data | ||
response = client.get("/api/admin/data/2") | ||
|
||
assert response.text.startswith("# XDI") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,102 +1,10 @@ | ||
from fastapi.testclient import TestClient | ||
from sqlmodel import Session, SQLModel, create_engine | ||
from sqlmodel.pool import StaticPool | ||
|
||
from xas_standards_api.app import app | ||
from xas_standards_api.auth import get_current_user | ||
from xas_standards_api.database import get_session | ||
from xas_standards_api.models.models import Beamline, Edge, Element, Facility, Person | ||
from xas_standards_api.models.response_models import MetadataResponse | ||
|
||
client = TestClient(app) | ||
|
||
|
||
def test_read_item(): | ||
engine = create_engine( | ||
"sqlite://", | ||
connect_args={"check_same_thread": False}, | ||
poolclass=StaticPool, | ||
) | ||
SQLModel.metadata.create_all(engine) | ||
|
||
with Session(engine) as session: | ||
|
||
session.add(Element(name="Hydrogen", z=1, symbol="H")) | ||
session.add(Edge(name="K", id=1, level="sp")) | ||
session.add( | ||
Facility( | ||
id=1, | ||
name="synchrotron", | ||
notes="a place", | ||
fullname="a synchrotron", | ||
city="somewhere", | ||
region="someplace", | ||
laboratory="a lab", | ||
country="somecountry", | ||
) | ||
) | ||
|
||
session.add( | ||
Beamline( | ||
facility_id=1, | ||
id=1, | ||
name="my beamline", | ||
notes="a beamline", | ||
xray_source="BM", | ||
) | ||
) | ||
session.commit() | ||
|
||
def get_session_override(): | ||
return session | ||
|
||
app.dependency_overrides[get_session] = get_session_override | ||
|
||
client = TestClient(app) | ||
|
||
response = client.get("/api/metadata/") | ||
app.dependency_overrides.clear() | ||
|
||
print(response) | ||
|
||
mr = MetadataResponse.model_validate(response.json()) | ||
|
||
assert response.status_code == 200 | ||
assert mr.elements[0].symbol == "H" | ||
assert mr.edges[0].name == "K" | ||
assert mr.beamlines[0].name == "my beamline" | ||
assert mr.beamlines[0].facility.name == "synchrotron" | ||
|
||
|
||
def test_read_person(): | ||
engine = create_engine( | ||
"sqlite://", | ||
connect_args={"check_same_thread": False}, | ||
poolclass=StaticPool, | ||
) | ||
SQLModel.metadata.create_all(engine) | ||
|
||
with Session(engine) as session: | ||
|
||
session.add(Person(id=1, identifier="abc123", admin=False)) | ||
|
||
session.commit() | ||
|
||
def get_session_override(): | ||
return session | ||
|
||
def get_current_user_override(): | ||
return "abc123" | ||
|
||
app.dependency_overrides[get_session] = get_session_override | ||
app.dependency_overrides[get_current_user] = get_current_user_override | ||
|
||
client = TestClient(app) | ||
|
||
response = client.get("/api/user/") | ||
app.dependency_overrides.clear() | ||
|
||
r = response.json() | ||
|
||
assert r["user"] == "abc123" | ||
assert not r["admin"] | ||
def test_login_redirect(): | ||
client = TestClient(app) | ||
response = client.get("/login") | ||
# expect 404 since root is not defined in test | ||
assert response.status_code == 404 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.