Skip to content

Commit 90bcd64

Browse files
committed
test: added more unittests for method handlers
1 parent b97edbb commit 90bcd64

File tree

6 files changed

+53
-74
lines changed

6 files changed

+53
-74
lines changed

.env.example

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,3 @@ DB_URL=postgresql://fastapiusr:fastapipwd@localhost:5432/fastapidb
1111
# DB_URL=sqlite:///./db.sqlite3
1212
# Uncomment the line below if DB_TYPE=mysql
1313
# DB_URL=mysql+pymysql://fastapiusr:fastapipwd@localhost:3306/fastapidb
14-
MYSQL_DRIVER=

api/v1/routes/blog.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ async def create_blog(
6060
)
6161

6262
except HTTPException as http_err:
63-
logger.warning(f"HTTP error occurred: {http_err.detail}")
6463
raise http_err
6564

6665
except SQLAlchemyError as sql_err:
@@ -71,7 +70,7 @@ async def create_blog(
7170
)
7271

7372
except Exception as e:
74-
logger.error(f"Unexpected error occurred: {e}")
73+
logger.error(f"Internal server error: {e}")
7574
raise HTTPException(
7675
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
7776
detail="Internal server error.",
@@ -131,7 +130,7 @@ async def list_blog(
131130
detail="Database error occurred.",
132131
)
133132
except Exception as e:
134-
logger.error(f"Unexpected error occurred: {e}")
133+
logger.error(f"Internal server error: {e}")
135134
raise HTTPException(
136135
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
137136
detail="Internal server error.",
@@ -166,17 +165,20 @@ async def read_blog(
166165
logger.info(f"Blog post with ID '{id}' retrieved successfully.")
167166
return BlogResponseSchema.model_validate(blog.__dict__)
168167

168+
except HTTPException as http_err:
169+
raise http_err
170+
169171
except SQLAlchemyError as e:
170172
logger.error(f"Database error occurred: {e}")
171173
raise HTTPException(
172174
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
173175
detail="Database error occurred.",
174176
)
175177
except Exception as e:
176-
logger.error(f"Unexpected error occurred: {e}")
178+
logger.error(f"Internal server error: {e}")
177179
raise HTTPException(
178180
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
179-
detail="Unexpected error occurred.",
181+
detail="Internal server error.",
180182
)
181183

182184

@@ -247,12 +249,9 @@ def update_blog(
247249
)
248250

249251
except HTTPException as http_err:
250-
# Log the HTTP exception
251-
logger.warning(f"HTTP error occurred: {http_err.detail}")
252252
raise http_err
253253

254254
except SQLAlchemyError as sql_err:
255-
# Log SQLAlchemy errors
256255
logger.error(f"Database error occurred: {sql_err}")
257256
db.rollback()
258257
raise HTTPException(
@@ -261,8 +260,7 @@ def update_blog(
261260
)
262261

263262
except Exception as e:
264-
# Log other unexpected errors
265-
logger.error(f"Unexpected error occurred: {e}")
263+
logger.error(f"Internal server error: {e}")
266264
db.rollback()
267265
raise HTTPException(
268266
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
@@ -298,6 +296,9 @@ async def delete_blog(
298296
db.commit()
299297
logger.info(f"Blog post '{blog_to_delete.title}' deleted successfully.")
300298

299+
except HTTPException as http_err:
300+
raise http_err
301+
301302
except SQLAlchemyError as e:
302303
logger.error(f"Database error occurred: {e}")
303304
db.rollback()
@@ -307,7 +308,7 @@ async def delete_blog(
307308
)
308309

309310
except Exception as e:
310-
logger.error(f"Unexpected error occurred: {e}")
311+
logger.error(f"Internal server error: {e}")
311312
db.rollback()
312313
raise HTTPException(
313314
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,

tests/database.py

Lines changed: 0 additions & 61 deletions
This file was deleted.

tests/v1/blog/test_delete_blog.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,14 @@ def test_delete_invalid_blog_id(db_session_mock):
4747
response = client.delete("/api/v1/blogs/abc")
4848

4949
assert response.status_code == 422
50+
51+
52+
def test_blog_post_not_found(db_session_mock):
53+
"""Simulate a request to delete a blog post that does not exist."""
54+
db_session_mock.query.return_value.filter.return_value.first.return_value = None
55+
56+
response = client.delete("/api/v1/blogs/1")
57+
58+
assert response.status_code == 404
59+
data = response.json()
60+
assert data["detail"] == "Blog post with given id not found."

tests/v1/blog/test_read_blog.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,32 @@ def test_invalid_blog_post_id():
5353
response = client.get("/api/v1/blogs/abc")
5454

5555
assert response.status_code == 422
56+
57+
58+
def test_deleted_blog_post_not_found(db_session_mock):
59+
"""Simulate a request to retrieve a blog post that has been deleted."""
60+
db_session_mock.query.return_value.filter.return_value.first.return_value = None
61+
62+
response = client.get("/api/v1/blogs/1")
63+
64+
assert response.status_code == 404
65+
data = response.json()
66+
assert data["detail"] == "Blog post not found."
67+
68+
69+
def test_invalid_method():
70+
response = client.post("/api/v1/blogs/1")
71+
72+
assert response.status_code == 405
73+
data = response.json()
74+
assert data["detail"] == "Method Not Allowed"
75+
76+
77+
def test_internal_server_error(mocker):
78+
mocker.patch("api.v1.routes.blog", side_effect=Exception("Test exception"))
79+
80+
response = client.get("/api/v1/blogs/1")
81+
82+
assert response.status_code == 500
83+
data = response.json()
84+
assert data["detail"] == "Internal server error."

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ basepython = python3.10
1414
deps =
1515
-r requirements.txt
1616
commands =
17-
pytest --cov-config=.coveragerc --cov=api --cov-report=html:htmlcov --cov-report=term-missing tests/
17+
pytest --cov-config=.coveragerc --cov=api/v1 --cov-report=html:htmlcov --cov-report=term-missing tests/
1818

1919
[testenv:type]
2020
description = run type checks

0 commit comments

Comments
 (0)