From eb624380295d888ae31d53937d905461dbcc81e5 Mon Sep 17 00:00:00 2001 From: Mukeli3 Date: Fri, 28 Feb 2025 22:31:14 +0000 Subject: [PATCH 01/11] initial commit --- api/v1/routes/api_status.py | 14 ++++++++- api/v1/schemas/api_status.py | 5 ++- api/v1/services/api_status.py | 59 ++++++++++++++++++++++++++--------- main.py | 2 +- 4 files changed, 61 insertions(+), 19 deletions(-) diff --git a/api/v1/routes/api_status.py b/api/v1/routes/api_status.py index baf670124..d9f7020b0 100644 --- a/api/v1/routes/api_status.py +++ b/api/v1/routes/api_status.py @@ -1,6 +1,6 @@ from typing import Annotated from api.db.database import get_db -from api.v1.schemas.api_status import APIStatusPost +from api.v1.schemas.api_status import APIStatusPost, APIStatusUpdate from api.v1.services.api_status import APIStatusService from api.utils.success_response import success_response from fastapi import APIRouter, Depends, status @@ -32,3 +32,15 @@ async def post_api_status( data=new_status, status_code=status.HTTP_201_CREATED ) +@api_status.put('/{api_group}', response_model=success_response, status_code=200) +async def update_api_status( + api_group: str, + schema: APIStatusUpdate, + db: Annotated[Session, Depends(get_db)] +): + updated_status = APIStatusService.update(db, api_group, schema) + return success_response( + message='AP Status updated successfully', + data=updated_status, + status_code=status.HTTP_200_OK + ) \ No newline at end of file diff --git a/api/v1/schemas/api_status.py b/api/v1/schemas/api_status.py index 31b1fb468..f88da2fda 100644 --- a/api/v1/schemas/api_status.py +++ b/api/v1/schemas/api_status.py @@ -1,6 +1,5 @@ from decimal import Decimal from pydantic import BaseModel, Field, PositiveInt, PositiveFloat, ConfigDict, StringConstraints - from typing import List, Optional from datetime import datetime @@ -22,7 +21,7 @@ class APIStatusPost(BaseModel): api_group: str status: str response_time: Optional[Decimal] = None - details: str + details: str | None = None class Config: from_attributes = True @@ -44,7 +43,7 @@ class APIStatusUpdate(BaseModel): created_at (datetime): The date and time when the API status was created. """ - api_group: str = Field(..., alias="apiGroup") + api_group: Optional[str] = Field(None, alias="apiGroup") status: str last_checked: Optional[datetime] = None response_time: Optional[Decimal] = None diff --git a/api/v1/services/api_status.py b/api/v1/services/api_status.py index a46c288c4..fc2e9ffd3 100644 --- a/api/v1/services/api_status.py +++ b/api/v1/services/api_status.py @@ -2,7 +2,7 @@ from api.core.base.services import Service from sqlalchemy.orm import Session from api.v1.models.api_status import APIStatus -from api.v1.schemas.api_status import APIStatusPost +from api.v1.schemas.api_status import APIStatusPost, APIStatusUpdate from fastapi import HTTPException @@ -81,20 +81,51 @@ def upsert(db: Session, schema: APIStatusPost) -> APIStatus: status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="A database error occurred." ) + @staticmethod + def update(db: Session, api_group: str, schema: APIStatusUpdate) -> APIStatus: + """ + Update an existing API status record by api_group. + + Parameters: + db (Session): The SQLAlchemy database session. + api_group (str): The api_group identifier to update. + schema (APIStatusUpdate): The data model with updated API status info. + + Returns: + APIStatus: The updated API status record. + + Raises: + HTTException: 404 if the api_group doesn't exist, 500 for db errors. + """ + try: + existing_status = db.query(APIStatus).filter(APIStatus.api_group == api_group).first() + if not existing_status: + raise HTTException( + status_code=status.HTTP_404_NOT_FOUND, + detail="API Status not found" + ) + if schema.status is not None: + existing_status.status = schema.status + if schema.response_time is not None: + existing_status.response_time = schema.response_time + if schema.details is not None: + existing_status.details = schema.details + if schema.last_checked is not None: + existing_status.last_checked = schema.last_checked + + db.commit() + db.refresh(existing_status) + return existing_status + + except HTTException as e: + raise e + except Exception as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="A database error occured." + ) - # @staticmethod - # def update(db: Session, schema: APIStatusPost) -> APIStatus: - # status = APIStatus( - # api_group=schema.api_group, - # status=schema.status, - # response_time=schema.response_time, - # details=schema.details, - # ) - # db.add(status) - # db.commit() - # db.refresh(status) - # return status - @staticmethod def delete_by_api_group(db: Session, api_group) -> APIStatus: status = db.query(APIStatus).filter(APIStatus.api_group == api_group).first() diff --git a/main.py b/main.py index c5d8f9b3d..42e842ab0 100644 --- a/main.py +++ b/main.py @@ -154,4 +154,4 @@ async def global_exception(request: Request, exc: Exception): app.mount("/static", StaticFiles(directory="static"), name="static") if __name__ == "__main__": - uvicorn.run("main:app", port=7001, reload=True) + uvicorn.run("main:app", port=8000, reload=True) From 937c5e4a867101471d21b55ac7267c1b2241e0dd Mon Sep 17 00:00:00 2001 From: Mukeli3 Date: Sat, 1 Mar 2025 14:16:56 +0000 Subject: [PATCH 02/11] feat: updated the test file to account for new endpoints --- tests/v1/status_page/test_post_status.py | 144 +++++++++++++++++++++-- 1 file changed, 136 insertions(+), 8 deletions(-) diff --git a/tests/v1/status_page/test_post_status.py b/tests/v1/status_page/test_post_status.py index fabc7919f..0cd8a33c0 100644 --- a/tests/v1/status_page/test_post_status.py +++ b/tests/v1/status_page/test_post_status.py @@ -5,19 +5,21 @@ from fastapi.testclient import TestClient from sqlalchemy.orm import Session from uuid_extensions import uuid7 +from fastapi import HTTPException from api.db.database import get_db from api.v1.models.contact_us import ContactUs from api.v1.models.api_status import APIStatus +from api.v1.services.api_status import APIStatusService from main import app - @pytest.fixture def db_session_mock(): db_session = MagicMock(spec=Session) return db_session + @pytest.fixture def client(db_session_mock): app.dependency_overrides[get_db] = lambda: db_session_mock @@ -32,7 +34,8 @@ def mock_post_api_status(): api_group="Blog API", status="Down", response_time=None, - details="API not responding (HTTP 503)" + details="API not responding (HTTP 503)", + last_checked=datetime.now(timezone.utc) ) @@ -45,9 +48,8 @@ def test_post_api_status(mock_create, db_session_mock, client): db_session_mock.refresh.return_value = None mock_create.return_value = mock_post_api_status() - # mock_check_existing.return_value = None - response = client.post('/api/v1/api-status', json={ + response = client.post('/api-status', json={ "api_group": "Blog API", "status": "Down", "response_time": None, @@ -55,18 +57,144 @@ def test_post_api_status(mock_create, db_session_mock, client): }) assert response.status_code == 201 + json_response = response.json() + assert json_response["status"] == "success" + assert json_response["status_code"] == 201 + assert json_response["message"] == "API Status created successfully" + @patch("api.v1.services.api_status.APIStatusService.fetch_all") def test_get_api_status(mock_fetch, db_session_mock, client): - """Tests the GET /api/v1/api-status endpoint to ensure retrieval of API status""" + """Tests the GET /api-status endpoint to ensure retrieval of API status""" db_session_mock.add.return_value = None db_session_mock.commit.return_value = None db_session_mock.refresh.return_value = None - mock_fetch.return_value = mock_post_api_status() + mock_fetch.return_value = [mock_post_api_status()] # Return a list for fetch_all + + response = client.get('/api-status') + + assert response.status_code == 200 + json_response = response.json() + assert json_response["status"] == "success" + assert json_response["status_code"] == 200 + assert json_response["message"] == "All API Status fetched successfully" + + +# New tests for PUT endpoint +def mock_updated_api_status(): + return APIStatus( + id=str(uuid7()), + api_group="Blog API", + status="Up", + response_time=200.0, + details="API is running fine", + last_checked=datetime.now(timezone.utc) + ) + + +@patch("api.v1.services.api_status.APIStatusService.update") +def test_put_api_status_success(mock_update, db_session_mock, client): + """Tests the PUT /api/v1/api-status/{api_group} endpoint for successful update""" + + db_session_mock.commit.return_value = None + db_session_mock.refresh.return_value = None + + mock_update.return_value = mock_updated_api_status() - response = client.get('/api/v1/api-status') + update_data = { + "apiGroup": "Blog API", + "status": "Up", + "response_time": "200", + "details": "API is running fine" + } + response = client.put('/api-status/Blog API', json=update_data) - print(response.json()) assert response.status_code == 200 + json_response = response.json() + assert json_response["status"] == "success" + assert json_response["status_code"] == 200 + assert json_response["message"] == "API Status updated successfully" + data = json_response["data"] + assert data["api_group"] == "Blog API" + assert data["status"] == "Up" + assert float(data["response_time"]) == 200.0 + assert data["details"] == "API is running fine" + + +@patch("api.v1.services.api_status.APIStatusService.update") +def test_put_api_status_not_found(mock_update, db_session_mock, client): + """Tests the PUT /api-status/{api_group} endpoint for a non-existent api_group""" + + mock_update.side_effect = APIStatusService.update.side_effect = HTTPException( + status_code=404, detail="API Status not found" + ) + + update_data = { + "apiGroup": "Nonexistent API", + "status": "Up" + } + response = client.put('/api-status/Nonexistent API', json=update_data) + + assert response.status_code == 404 + json_response = response.json() + assert json_response["status"] == "error" + assert json_response["status_code"] == 404 + assert json_response["message"] == "API Status not found" + assert json_response["data"] is None + + +@patch("api.v1.services.api_status.APIStatusService.update") +def test_put_api_status_partial_update(mock_update, db_session_mock, client): + """Tests the PUT /api-status/{api_group} endpoint for partial update""" + + db_session_mock.commit.return_value = None + db_session_mock.refresh.return_value = None + + # Mock an updated status with only the status changed + partial_updated_status = APIStatus( + id=str(uuid7()), + api_group="Blog API", + status="Inactive", + response_time=None, + details="API not responding (HTTP 503)", + last_checked=datetime.now(timezone.utc) + ) + mock_update.return_value = partial_updated_status + + update_data = { + "status": "Inactive" + } + response = client.put('/api-status/Blog API', json=update_data) + + assert response.status_code == 200 + json_response = response.json() + assert json_response["status"] == "success" + assert json_response["status_code"] == 200 + assert json_response["message"] == "API Status updated successfully" + data = json_response["data"] + assert data["api_group"] == "Blog API" + assert data["status"] == "Inactive" + assert data["response_time"] is None + assert data["details"] == "API not responding (HTTP 503)" + + +@patch("api.v1.services.api_status.APIStatusService.update") +def test_put_api_status_invalid_response_time(mock_update, db_session_mock, client): + """Tests the PUT /api-status/{api_group} endpoint with invalid response_time""" + + mock_update.side_effect = HTTPException( + status_code=500, detail="A database error occurred." + ) + + update_data = { + "apiGroup": "Blog API", + "status": "Up", + "response_time": "invalid" + } + response = client.put('/api-status/Blog API', json=update_data) + + assert response.status_code == 500 + json_response = response.json() + assert "A database error occurred" in json_response["detail"] \ No newline at end of file From 77d3f480779851209109b92b854e7cf12afdef1d Mon Sep 17 00:00:00 2001 From: Mukeli3 Date: Sat, 1 Mar 2025 15:12:10 +0000 Subject: [PATCH 03/11] fix: adjusted the match with main, give clearer error meessage(s) --- tests/v1/status_page/test_post_status.py | 78 +++++++++++++----------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/tests/v1/status_page/test_post_status.py b/tests/v1/status_page/test_post_status.py index 0cd8a33c0..dbfe9b3f6 100644 --- a/tests/v1/status_page/test_post_status.py +++ b/tests/v1/status_page/test_post_status.py @@ -39,6 +39,17 @@ def mock_post_api_status(): ) +def mock_updated_api_status(): + return APIStatus( + id=str(uuid7()), + api_group="Blog API", + status="Up", + response_time=200.0, + details="API is running fine", + last_checked=datetime.now(timezone.utc) + ) + + @patch("api.v1.services.api_status.APIStatusService.upsert") def test_post_api_status(mock_create, db_session_mock, client): """Tests the POST /api/v1/api-status endpoint to ensure successful posting of API status""" @@ -47,51 +58,43 @@ def test_post_api_status(mock_create, db_session_mock, client): db_session_mock.commit.return_value = None db_session_mock.refresh.return_value = None - mock_create.return_value = mock_post_api_status() + mock_status = mock_post_api_status() + mock_create.return_value = mock_status - response = client.post('/api-status', json={ + response = client.post('/api/v1/api-status', json={ "api_group": "Blog API", "status": "Down", "response_time": None, "details": "API not responding (HTTP 503)" }) - assert response.status_code == 201 + assert response.status_code == 201, f"Expected 201, got {response.status_code}: {response.text}" json_response = response.json() assert json_response["status"] == "success" assert json_response["status_code"] == 201 assert json_response["message"] == "API Status created successfully" + assert json_response["data"]["api_group"] == "Blog API" @patch("api.v1.services.api_status.APIStatusService.fetch_all") def test_get_api_status(mock_fetch, db_session_mock, client): - """Tests the GET /api-status endpoint to ensure retrieval of API status""" + """Tests the GET /api/v1/api-status endpoint to ensure retrieval of API status""" db_session_mock.add.return_value = None db_session_mock.commit.return_value = None db_session_mock.refresh.return_value = None - mock_fetch.return_value = [mock_post_api_status()] # Return a list for fetch_all + mock_status = mock_post_api_status() + mock_fetch.return_value = [mock_status] - response = client.get('/api-status') + response = client.get('/api/v1/api-status') - assert response.status_code == 200 + assert response.status_code == 200, f"Expected 200, got {response.status_code}: {response.text}" json_response = response.json() assert json_response["status"] == "success" assert json_response["status_code"] == 200 assert json_response["message"] == "All API Status fetched successfully" - - -# New tests for PUT endpoint -def mock_updated_api_status(): - return APIStatus( - id=str(uuid7()), - api_group="Blog API", - status="Up", - response_time=200.0, - details="API is running fine", - last_checked=datetime.now(timezone.utc) - ) + assert json_response["data"][0]["api_group"] == "Blog API" @patch("api.v1.services.api_status.APIStatusService.update") @@ -101,17 +104,18 @@ def test_put_api_status_success(mock_update, db_session_mock, client): db_session_mock.commit.return_value = None db_session_mock.refresh.return_value = None - mock_update.return_value = mock_updated_api_status() + mock_status = mock_updated_api_status() + mock_update.return_value = mock_status update_data = { "apiGroup": "Blog API", "status": "Up", - "response_time": "200", + "response_time": 200, "details": "API is running fine" } - response = client.put('/api-status/Blog API', json=update_data) + response = client.put('/api/v1/api-status/Blog API', json=update_data) - assert response.status_code == 200 + assert response.status_code == 200, f"Expected 200, got {response.status_code}: {response.text}" json_response = response.json() assert json_response["status"] == "success" assert json_response["status_code"] == 200 @@ -125,9 +129,9 @@ def test_put_api_status_success(mock_update, db_session_mock, client): @patch("api.v1.services.api_status.APIStatusService.update") def test_put_api_status_not_found(mock_update, db_session_mock, client): - """Tests the PUT /api-status/{api_group} endpoint for a non-existent api_group""" + """Tests the PUT /api/v1/api-status/{api_group} endpoint for a non-existent api_group""" - mock_update.side_effect = APIStatusService.update.side_effect = HTTPException( + mock_update.side_effect = HTTPException( status_code=404, detail="API Status not found" ) @@ -135,24 +139,22 @@ def test_put_api_status_not_found(mock_update, db_session_mock, client): "apiGroup": "Nonexistent API", "status": "Up" } - response = client.put('/api-status/Nonexistent API', json=update_data) + response = client.put('/api/v1/api-status/Nonexistent API', json=update_data) - assert response.status_code == 404 + assert response.status_code == 404, f"Expected 404, got {response.status_code}: {response.text}" json_response = response.json() - assert json_response["status"] == "error" + assert json_response["status"] is False assert json_response["status_code"] == 404 assert json_response["message"] == "API Status not found" - assert json_response["data"] is None @patch("api.v1.services.api_status.APIStatusService.update") def test_put_api_status_partial_update(mock_update, db_session_mock, client): - """Tests the PUT /api-status/{api_group} endpoint for partial update""" + """Tests the PUT /api/v1/api-status/{api_group} endpoint for partial update""" db_session_mock.commit.return_value = None db_session_mock.refresh.return_value = None - # Mock an updated status with only the status changed partial_updated_status = APIStatus( id=str(uuid7()), api_group="Blog API", @@ -166,9 +168,9 @@ def test_put_api_status_partial_update(mock_update, db_session_mock, client): update_data = { "status": "Inactive" } - response = client.put('/api-status/Blog API', json=update_data) + response = client.put('/api/v1/api-status/Blog API', json=update_data) - assert response.status_code == 200 + assert response.status_code == 200, f"Expected 200, got {response.status_code}: {response.text}" json_response = response.json() assert json_response["status"] == "success" assert json_response["status_code"] == 200 @@ -182,7 +184,7 @@ def test_put_api_status_partial_update(mock_update, db_session_mock, client): @patch("api.v1.services.api_status.APIStatusService.update") def test_put_api_status_invalid_response_time(mock_update, db_session_mock, client): - """Tests the PUT /api-status/{api_group} endpoint with invalid response_time""" + """Tests the PUT /api/v1/api-status/{api_group} endpoint with invalid response_time""" mock_update.side_effect = HTTPException( status_code=500, detail="A database error occurred." @@ -193,8 +195,10 @@ def test_put_api_status_invalid_response_time(mock_update, db_session_mock, clie "status": "Up", "response_time": "invalid" } - response = client.put('/api-status/Blog API', json=update_data) + response = client.put('/api/v1/api-status/Blog API', json=update_data) - assert response.status_code == 500 + assert response.status_code == 500, f"Expected 500, got {response.status_code}: {response.text}" json_response = response.json() - assert "A database error occurred" in json_response["detail"] \ No newline at end of file + assert json_response["status"] is False + assert json_response["status_code"] == 500 + assert json_response["message"] == "A database error occurred." \ No newline at end of file From 237c449590bf19321d96f03187cccfd2432a4478 Mon Sep 17 00:00:00 2001 From: Mukeli3 Date: Sat, 1 Mar 2025 15:13:22 +0000 Subject: [PATCH 04/11] fix: corrected API spelling error --- api/v1/routes/api_status.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/v1/routes/api_status.py b/api/v1/routes/api_status.py index d9f7020b0..473cb60da 100644 --- a/api/v1/routes/api_status.py +++ b/api/v1/routes/api_status.py @@ -40,7 +40,7 @@ async def update_api_status( ): updated_status = APIStatusService.update(db, api_group, schema) return success_response( - message='AP Status updated successfully', + message='API Status updated successfully', data=updated_status, status_code=status.HTTP_200_OK ) \ No newline at end of file From e2bc4a931488d44c7c1e649e4001491248631fa7 Mon Sep 17 00:00:00 2001 From: Mukeli3 Date: Sat, 1 Mar 2025 15:45:51 +0000 Subject: [PATCH 05/11] fix: adjusted the functionality to account for invalid response --- api/v1/services/api_status.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/api/v1/services/api_status.py b/api/v1/services/api_status.py index fc2e9ffd3..2587a9d88 100644 --- a/api/v1/services/api_status.py +++ b/api/v1/services/api_status.py @@ -95,19 +95,28 @@ def update(db: Session, api_group: str, schema: APIStatusUpdate) -> APIStatus: APIStatus: The updated API status record. Raises: - HTTException: 404 if the api_group doesn't exist, 500 for db errors. + HTTPException: 404 if the api_group doesn't exist, 500 for db errors. """ try: existing_status = db.query(APIStatus).filter(APIStatus.api_group == api_group).first() if not existing_status: - raise HTTException( + raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="API Status not found" ) if schema.status is not None: existing_status.status = schema.status if schema.response_time is not None: - existing_status.response_time = schema.response_time + try: + if isinstance(schema.response_time, str): + existing_status.response_time = Decimal(schema.response_time) + else: + existing_status.response_time = schema.response_time + except (ValueError, TypeError): + raise HTTException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Invalid response_time format" + ) if schema.details is not None: existing_status.details = schema.details if schema.last_checked is not None: From 05bc956dd54950cf635ff15dd15cc40b5c8a3c3d Mon Sep 17 00:00:00 2001 From: Mukeli3 Date: Sat, 1 Mar 2025 15:47:16 +0000 Subject: [PATCH 06/11] fix: adjusted to account for str as response --- api/v1/schemas/api_status.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/v1/schemas/api_status.py b/api/v1/schemas/api_status.py index f88da2fda..b6ce9a6ac 100644 --- a/api/v1/schemas/api_status.py +++ b/api/v1/schemas/api_status.py @@ -1,6 +1,6 @@ from decimal import Decimal from pydantic import BaseModel, Field, PositiveInt, PositiveFloat, ConfigDict, StringConstraints -from typing import List, Optional +from typing import List, Optional, Union from datetime import datetime class APIStatusPost(BaseModel): @@ -20,7 +20,7 @@ class APIStatusPost(BaseModel): api_group: str status: str - response_time: Optional[Decimal] = None + response_time: Optional[Union[Decimal, str]] = None details: str | None = None class Config: From 96423890dacbc7e972297d48193bffe442135387 Mon Sep 17 00:00:00 2001 From: Mukeli3 Date: Sat, 1 Mar 2025 15:57:51 +0000 Subject: [PATCH 07/11] fix: adjusted file to match functionality --- tests/v1/status_page/test_post_status.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/v1/status_page/test_post_status.py b/tests/v1/status_page/test_post_status.py index dbfe9b3f6..43ab6fb21 100644 --- a/tests/v1/status_page/test_post_status.py +++ b/tests/v1/status_page/test_post_status.py @@ -187,7 +187,7 @@ def test_put_api_status_invalid_response_time(mock_update, db_session_mock, clie """Tests the PUT /api/v1/api-status/{api_group} endpoint with invalid response_time""" mock_update.side_effect = HTTPException( - status_code=500, detail="A database error occurred." + status_code=400, detail="Invalid response_time format." ) update_data = { @@ -197,8 +197,8 @@ def test_put_api_status_invalid_response_time(mock_update, db_session_mock, clie } response = client.put('/api/v1/api-status/Blog API', json=update_data) - assert response.status_code == 500, f"Expected 500, got {response.status_code}: {response.text}" + assert response.status_code == 400, f"Expected 400, got {response.status_code}: {response.text}" json_response = response.json() assert json_response["status"] is False - assert json_response["status_code"] == 500 + assert json_response["status_code"] == 400 assert json_response["message"] == "A database error occurred." \ No newline at end of file From c53e3576546395d425c997b9b8724d94134f359f Mon Sep 17 00:00:00 2001 From: Mukeli3 Date: Sat, 1 Mar 2025 16:10:09 +0000 Subject: [PATCH 08/11] fix: adjusted file toproperly account for invalid response time --- tests/v1/status_page/test_post_status.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/v1/status_page/test_post_status.py b/tests/v1/status_page/test_post_status.py index 43ab6fb21..2cfcaa85c 100644 --- a/tests/v1/status_page/test_post_status.py +++ b/tests/v1/status_page/test_post_status.py @@ -186,10 +186,6 @@ def test_put_api_status_partial_update(mock_update, db_session_mock, client): def test_put_api_status_invalid_response_time(mock_update, db_session_mock, client): """Tests the PUT /api/v1/api-status/{api_group} endpoint with invalid response_time""" - mock_update.side_effect = HTTPException( - status_code=400, detail="Invalid response_time format." - ) - update_data = { "apiGroup": "Blog API", "status": "Up", @@ -197,8 +193,12 @@ def test_put_api_status_invalid_response_time(mock_update, db_session_mock, clie } response = client.put('/api/v1/api-status/Blog API', json=update_data) - assert response.status_code == 400, f"Expected 400, got {response.status_code}: {response.text}" + assert response.status_code == 422, f"Expected 422, got {response.status_code}: {response.text}" json_response = response.json() assert json_response["status"] is False - assert json_response["status_code"] == 400 - assert json_response["message"] == "A database error occurred." \ No newline at end of file + assert json_response["status_code"] == 422 + assert json_response["message"] == "Invalid input" + assert len(json_response["errors"]) == 1 + assert json_response["errors"][0]["loc"] == ["body", "response_time"] + assert json_response["errors"][0]["msg"] == "Input should be a valid decimal" + assert json_response["errors"][0]["type"] == "decimal_parsing" \ No newline at end of file From 53a5606d474a98cf353aedd8d989a19346459438 Mon Sep 17 00:00:00 2001 From: Mukeli3 Date: Sat, 1 Mar 2025 16:13:28 +0000 Subject: [PATCH 09/11] fix: reverted file changes --- api/v1/schemas/api_status.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/v1/schemas/api_status.py b/api/v1/schemas/api_status.py index b6ce9a6ac..f88da2fda 100644 --- a/api/v1/schemas/api_status.py +++ b/api/v1/schemas/api_status.py @@ -1,6 +1,6 @@ from decimal import Decimal from pydantic import BaseModel, Field, PositiveInt, PositiveFloat, ConfigDict, StringConstraints -from typing import List, Optional, Union +from typing import List, Optional from datetime import datetime class APIStatusPost(BaseModel): @@ -20,7 +20,7 @@ class APIStatusPost(BaseModel): api_group: str status: str - response_time: Optional[Union[Decimal, str]] = None + response_time: Optional[Decimal] = None details: str | None = None class Config: From 76bd3263995f4e00c0f1469505235a056ccdacc3 Mon Sep 17 00:00:00 2001 From: Mukeli3 Date: Sat, 1 Mar 2025 16:14:10 +0000 Subject: [PATCH 10/11] fix: reverted file changes --- api/v1/services/api_status.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/api/v1/services/api_status.py b/api/v1/services/api_status.py index 2587a9d88..1039e7c6f 100644 --- a/api/v1/services/api_status.py +++ b/api/v1/services/api_status.py @@ -107,16 +107,7 @@ def update(db: Session, api_group: str, schema: APIStatusUpdate) -> APIStatus: if schema.status is not None: existing_status.status = schema.status if schema.response_time is not None: - try: - if isinstance(schema.response_time, str): - existing_status.response_time = Decimal(schema.response_time) - else: - existing_status.response_time = schema.response_time - except (ValueError, TypeError): - raise HTTException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="Invalid response_time format" - ) + existing_status.response_time = Decimal(schema.response_time) if schema.details is not None: existing_status.details = schema.details if schema.last_checked is not None: From 9a18ceae99ab1658f9cf7878c437661d23ba12d1 Mon Sep 17 00:00:00 2001 From: Mukeli3 Date: Sun, 2 Mar 2025 11:04:25 +0000 Subject: [PATCH 11/11] fix: reverted changes on port --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index 856d6c66d..e72225227 100644 --- a/main.py +++ b/main.py @@ -178,4 +178,4 @@ async def global_exception(request: Request, exc: Exception): app.mount("/static", StaticFiles(directory="static"), name="static") if __name__ == "__main__": - uvicorn.run("main:app", port=8000, reload=True) \ No newline at end of file + uvicorn.run("main:app", port=7001, reload=True)