Skip to content

Commit 31a021c

Browse files
feat: add unit tests and make new schema for updation
1 parent 7a207c4 commit 31a021c

7 files changed

Lines changed: 100 additions & 6 deletions

File tree

main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from fastapi import FastAPI
22

33
from routes.posts import router
4-
from schemas.schemas import HealthResponse
4+
from schemas.models import HealthResponse
55

66
app = FastAPI()
77

requirements.txt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ aniso8601==7.0.0
33
appdirs==1.4.4
44
async-exit-stack==1.0.1
55
async-generator==1.10
6+
atomicwrites==1.4.0
7+
attrs==20.3.0
68
black==20.8b1
79
certifi==2020.12.5
810
chardet==4.0.0
@@ -17,15 +19,23 @@ graphql-relay==2.0.1
1719
greenlet==1.0.0
1820
h11==0.12.0
1921
idna==2.10
22+
iniconfig==1.1.1
23+
isort==5.8.0
2024
itsdangerous==1.1.0
2125
Jinja2==2.11.3
2226
MarkupSafe==1.1.1
2327
mypy-extensions==0.4.3
2428
orjson==3.5.2
29+
packaging==20.9
2530
pathspec==0.8.1
31+
pluggy==0.13.1
2632
promise==2.3
2733
psycopg2==2.8.6
34+
py==1.10.0
2835
pydantic==1.8.1
36+
pyparsing==2.4.7
37+
pytest==6.2.3
38+
pytest-dependency==0.5.1
2939
python-decouple==3.4
3040
python-dotenv==0.17.0
3141
python-multipart==0.0.5
@@ -34,7 +44,7 @@ regex==2021.4.4
3444
requests==2.25.1
3545
Rx==1.6.1
3646
six==1.15.0
37-
SQLAlchemy==1.4.10
47+
SQLAlchemy==1.4.11
3848
starlette==0.13.6
3949
toml==0.10.2
4050
typed-ast==1.4.3

routes/posts.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from sqlalchemy.orm import Session
55

66
from database.connection import get_db
7-
from schemas.schemas import DeletePostResponse, Post
7+
from schemas.models import DeletePostResponse, Post, UpdatePost
88
from utils.post_crud import (
99
post_create,
1010
post_delete,
@@ -45,5 +45,5 @@ def delete_post(id, db: Session = Depends(get_db)):
4545

4646

4747
@router.patch("/update", status_code=status.HTTP_200_OK, response_model=Post)
48-
def update_post(post: Post, db: Session = Depends(get_db)):
48+
def update_post(post: UpdatePost, db: Session = Depends(get_db)):
4949
return post_update(db=db, post=post)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,12 @@ class Config:
1919

2020
class DeletePostResponse(BaseModel):
2121
detail: str
22+
23+
24+
class UpdatePost(BaseModel):
25+
id: UUID
26+
title: str
27+
description: str
28+
29+
class Config:
30+
orm_mode = True

tests/__init__.py

Whitespace-only changes.

tests/test_posts.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import pytest
2+
from fastapi import status
3+
from fastapi.testclient import TestClient
4+
5+
from main import app
6+
7+
client = TestClient(app)
8+
9+
initial_post_title = "Hello"
10+
initial_post_description = "World"
11+
changed_post_description = "From the other side"
12+
13+
14+
@pytest.mark.dependency()
15+
def test_create_post(request):
16+
response = client.post(
17+
"/posts/create",
18+
json={"title": initial_post_title, "description": initial_post_description},
19+
)
20+
assert response.status_code == status.HTTP_201_CREATED
21+
assert response.json()["title"] == "Hello"
22+
assert response.json()["description"] == "World"
23+
request.config.cache.set("post_id", response.json()["id"])
24+
25+
26+
@pytest.mark.dependency(depends=["test_create_post"])
27+
def test_get_all_posts():
28+
response = client.get("/posts/list/all")
29+
assert response.status_code == status.HTTP_200_OK
30+
assert response.json() is not None
31+
32+
33+
@pytest.mark.dependency(depends=["test_create_post"])
34+
def test_get_one_post(request):
35+
post_id = request.config.cache.get("post_id", None)
36+
response = client.get(f"/posts/get/{post_id}")
37+
assert response.status_code == status.HTTP_200_OK
38+
assert response.json()["id"] == post_id
39+
assert response.json()["title"] == initial_post_title
40+
assert (
41+
response.json()["description"] == initial_post_description
42+
or changed_post_description
43+
)
44+
45+
46+
@pytest.mark.dependency(depends=["test_create_post", "test_get_one_post"])
47+
def test_patch_post(request):
48+
post_id = request.config.cache.get("post_id", None)
49+
response = client.patch(
50+
"/posts/update",
51+
json={
52+
"id": post_id,
53+
"title": initial_post_title,
54+
"description": changed_post_description,
55+
},
56+
)
57+
assert response.status_code == status.HTTP_200_OK
58+
assert response.json()["id"] == post_id
59+
assert response.json()["title"] == initial_post_title
60+
assert response.json()["description"] == changed_post_description
61+
62+
63+
@pytest.mark.dependency(
64+
depends=[
65+
"test_create_post",
66+
"test_get_one_post",
67+
"test_patch_post",
68+
"test_get_all_posts",
69+
]
70+
)
71+
def test_delete_post(request):
72+
post_id = request.config.cache.get("post_id", None)
73+
response = client.delete(f"/posts/delete/{post_id}")
74+
assert response.status_code == status.HTTP_200_OK
75+
assert response.json()["detail"] == "Post Deleted"

utils/post_crud.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from sqlalchemy.orm import Session
44

55
from database.models import Posts
6-
from schemas.schemas import DeletePostResponse, Post
6+
from schemas.models import DeletePostResponse, Post, UpdatePost
77

88

99
def post_create(db: Session, post: Post):
@@ -22,7 +22,7 @@ def post_get_one(db: Session, id: UUID):
2222
return db.query(Posts).filter_by(id=id).one()
2323

2424

25-
def post_update(db: Session, post: Post):
25+
def post_update(db: Session, post: UpdatePost):
2626
update_query = {Posts.title: post.title, Posts.description: post.description}
2727
db.query(Posts).filter_by(id=post.id).update(update_query)
2828
db.commit()

0 commit comments

Comments
 (0)