Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 37 additions & 1 deletion gs/backend/api/v1/mcc/endpoints/aro_requests.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,39 @@
from fastapi import APIRouter
from fastapi import APIRouter, Query
from sqlalchemy import desc
from sqlmodel import select

from gs.backend.api.v1.mcc.models.responses import ARORequestsResponse
from gs.backend.data.database.engine import get_db_session
from gs.backend.data.enums.aro_requests import ARORequestStatus
from gs.backend.data.tables.transactional_tables import ARORequest

aro_requests_router = APIRouter(tags=["MCC", "ARO Requests"])


@aro_requests_router.get("/", response_model=ARORequestsResponse)
async def get_aro_requests(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should also define a requests base model which you pass in like this. I believe that tells fastapi to look for an incoming json object with the params defined in the base model.
image
image

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am using query parameters to pass in the parameters currently. Does that work or should I switch to a request model?

count: int = Query(default=100),
offset: int = Query(default=0),
filters: list[ARORequestStatus] = Query(default=[]),
) -> ARORequestsResponse:
"""
Gets all ARO requests with optional filtering and pagination

:param count: Number of most recent requests to return. If ≤ 0, returns all data
:param offset: Starting point for paging
:param filters: List of request statuses to filter by. If empty, no filtering is applied
:return: ARO requests matching the criteria
"""
with get_db_session() as session:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please use ARORequestWrapper found in wrappers.py to do database querying

query = select(ARORequest).order_by(desc(ARORequest.created_on)) # type: ignore

if filters:
query = query.where(ARORequest.status.in_(filters)) # type: ignore
if offset > 0:
query = query.offset(offset)
if count > 0:
query = query.limit(count)

requests = list(session.exec(query).all())

return ARORequestsResponse(data=requests)
9 changes: 9 additions & 0 deletions gs/backend/api/v1/mcc/models/responses.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from pydantic import BaseModel

from gs.backend.data.tables.main_tables import MainCommand
from gs.backend.data.tables.transactional_tables import ARORequest


class MainCommandsResponse(BaseModel):
Expand All @@ -9,3 +10,11 @@ class MainCommandsResponse(BaseModel):
"""

data: list[MainCommand]


class ARORequestsResponse(BaseModel):
"""
The ARO requests response model.
"""

data: list[ARORequest]
1 change: 1 addition & 0 deletions python_test/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ def test_get_db_session(monkeypatch, db_session: Session):
"gs.backend.data.data_wrappers.mcc_wrappers.packet_telemetry_wrapper",
"gs.backend.data.data_wrappers.mcc_wrappers.packet_wrapper",
"gs.backend.data.data_wrappers.mcc_wrappers.telemetry_wrapper",
"gs.backend.api.v1.mcc.endpoints.aro_requests",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When refactoring to use the ARORequestWrapper, pls remove from this from conftest

]

for path in path_list:
Expand Down
137 changes: 137 additions & 0 deletions python_test/test_aro_requests_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
from datetime import datetime
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pls adjust if necessary to accommodate the refactoring

from decimal import Decimal
from uuid import UUID

import pytest
from fastapi.testclient import TestClient
from gs.backend.data.data_wrappers.aro_wrapper.aro_request_wrapper import add_request
from gs.backend.data.data_wrappers.aro_wrapper.aro_user_data_wrapper import add_user
from gs.backend.data.enums.aro_requests import ARORequestStatus
from gs.backend.main import app


@pytest.fixture
def client():
return TestClient(app)


# Create user for request 1
@pytest.fixture
def test_user1():
user = add_user(
call_sign="TEST01",
email="test1@example.com",
f_name="Test",
l_name="User1",
phone_number="1234567890",
)
return user


# Create user for request 2
@pytest.fixture
def test_user2():
user = add_user(
call_sign="TEST02",
email="test2@example.com",
f_name="Test",
l_name="User2",
phone_number="0987654321",
)
return user


# Test data for request 1
@pytest.fixture
def request1_data(test_user1):
dt_str = "2021-01-01T00:00:00Z"
dt = datetime.fromisoformat(dt_str.replace("Z", "+00:00"))
return {
"aro_id": test_user1.id,
"long": Decimal("123.456"),
"lat": Decimal("49.282"),
"created_on": dt,
"request_sent_obc": dt,
"taken_date": dt,
"transmission": dt,
"status": ARORequestStatus.PENDING,
}


# Test data for request 2
@pytest.fixture
def request2_data(test_user2):
dt_str = "2021-01-01T00:00:00Z"
dt = datetime.fromisoformat(dt_str.replace("Z", "+00:00"))
return {
"aro_id": test_user2.id,
"long": Decimal("123.456"),
"lat": Decimal("49.282"),
"created_on": dt,
"request_sent_obc": dt,
"taken_date": dt,
"transmission": dt,
"status": ARORequestStatus.COMPLETED,
}


# Add request1 to database
@pytest.fixture
def test_request1_creation(client, request1_data):
request = add_request(
aro_id=request1_data["aro_id"],
long=request1_data["long"],
lat=request1_data["lat"],
created_on=request1_data["created_on"],
request_sent_obc=request1_data["request_sent_obc"],
taken_date=request1_data["taken_date"],
transmission=request1_data["transmission"],
status=request1_data["status"],
)
return request


# Add request2 to database
@pytest.fixture
def test_request2_creation(client, request2_data):
request = add_request(
aro_id=request2_data["aro_id"],
long=request2_data["long"],
lat=request2_data["lat"],
created_on=request2_data["created_on"],
request_sent_obc=request2_data["request_sent_obc"],
taken_date=request2_data["taken_date"],
transmission=request2_data["transmission"],
status=request2_data["status"],
)
return request


def test_get_all_requests(client, request1_data, request2_data, test_request1_creation, test_request2_creation):
response = client.get(
"/api/v1/mcc/requests?count=2&offset=0&filters=pending&filters=completed",
headers={"Content-Type": "application/json"},
)
assert response.status_code == 200
requests = response.json()["data"]
assert len(requests) == 2

request1_response = requests[0]
assert request1_response["aro_id"] == request1_data["aro_id"]
assert request1_response["long"] == request1_data["long"]
assert request1_response["lat"] == request1_data["lat"]
assert request1_response["created_on"] == request1_data["created_on"]
assert request1_response["request_sent_obc"] == request1_data["request_sent_obc"]
assert request1_response["taken_date"] == request1_data["taken_date"]
assert request1_response["transmission"] == request1_data["transmission"]
assert request1_response["status"] == request1_data["status"].value

request2_response = requests[1]
assert request2_response["aro_id"] == request2_data["aro_id"]
assert request2_response["long"] == request2_data["long"]
assert request2_response["lat"] == request2_data["lat"]
assert request2_response["created_on"] == request2_data["created_on"].isoformat()
assert request2_response["request_sent_obc"] == request2_data["request_sent_obc"].isoformat()
assert request2_response["taken_date"] == request2_data["taken_date"].isoformat()
assert request2_response["transmission"] == request2_data["transmission"].isoformat()
assert request2_response["status"] == request2_data["status"].value
Loading