From 4543f2f0d7063444082cce11f8b9fb98f4d276f6 Mon Sep 17 00:00:00 2001 From: Colin Goutte Date: Sat, 26 Aug 2023 23:21:30 +0200 Subject: [PATCH] cleanup: make use of pydatic schemas for create --- dev.py | 24 +----------------------- schemas.py | 10 +++++----- utests/test_api.py | 34 ++++++++++++++++++++-------------- 3 files changed, 26 insertions(+), 42 deletions(-) diff --git a/dev.py b/dev.py index 1136b09..890beed 100644 --- a/dev.py +++ b/dev.py @@ -44,35 +44,13 @@ async def root(): return {"message": "Hello World"} -@app.post("/pydantic_movies/") +@app.post("/movies/") async def create_movie(payload: schemas.MoviePayload, db: Session = Depends(get_db)): movie = crud.create_movie(db, **payload.dict()) out = {"message": f"Created {movie.title} XX", "id": movie.id} return out -@app.post("/movies/") -async def create_movie( - name: str = "", db: Session = Depends(get_db), request: Request = None -): - out = {} - try: # Bypass for dev - data = await request.json() - except: - data = {} - crud_params = dict( - genres=data.get("genres", ["Unknown"]), - description=data.get("description", ""), - title=data.get("title", ""), - vote_average=data.get("vote_average"), - vote_count=data.get("vote_count"), - ) - - movie = crud.create_movie(db, **crud_params) - out = {"message": f"Created {movie.title} XX", "id": movie.id} - return out - - @app.put("/movies/{id_}") async def update_movie( id_: str, db: Session = Depends(get_db), request: Request = None diff --git a/schemas.py b/schemas.py index 8609fe6..c1baf48 100644 --- a/schemas.py +++ b/schemas.py @@ -4,9 +4,9 @@ from pydantic import BaseModel class MoviePayload(BaseModel): title: str - vote_count: int - vote_average: float + vote_count: int = 0 + vote_average: float | None = None - genres: list[str] - description: str - release_date: str + genres: list[str] = [] + description: str = "" + release_date: str | None = None # Use custom formatted string validation diff --git a/utests/test_api.py b/utests/test_api.py index 0af0fa1..7a855c0 100644 --- a/utests/test_api.py +++ b/utests/test_api.py @@ -51,6 +51,12 @@ def rand_name(): class BaseCrud(unittest.TestCase): + def setUp(self): + name = f"rand_{random.randint(1, 1000)}" + self.create_payload = { + "title": name, + } + def test_get_delete_movie_404_if_not_found(self): response = client.get("/movies/-1") assert response.status_code == 404 @@ -58,18 +64,16 @@ class BaseCrud(unittest.TestCase): assert response_delete.status_code == 404 def test_create_movie_api(self): - name = f"rand_{random.randint(1, 1000)}" - response = client.post("/movies/", json={"title": name}) + response = client.post("/movies/", json=self.create_payload) assert response.status_code == 200 movie_id = response.json()["id"] - assert f"Created {name}" in response.json()["message"] + assert f"Created {self.create_payload['title']}" in response.json()["message"] response = client.get(f"/movies/{movie_id}") - assert response.json()["title"] == name + assert response.json()["title"] == self.create_payload["title"] def test_delete_movie(self): - name = f"rand_{random.randint(1, 1000)}" - response = client.post("/movies/", json={"title": name}) + response = client.post("/movies/", json=self.create_payload) movie_id = response.json()["id"] created_movie_path = f"/movies/{movie_id}" @@ -81,12 +85,12 @@ class BaseCrud(unittest.TestCase): assert response_missing.status_code == 404 def test_update_movie_api(self): - name = f"rand_{random.randint(1, 1000)}" - response = client.post("/movies/", json={"title": name, "genres": ["anime"]}) + self.create_payload["genres"] = ["anime"] + response = client.post("/movies/", json=self.create_payload) movie_id = response.json()["id"] created_movie_path = f"/movies/{movie_id}" - new_name = name.replace("rand", "update") + new_name = self.create_payload["title"].replace("rand", "update") new_genres = ["Drama", "war"] response_get = client.get(f"/movies/{movie_id}") @@ -104,6 +108,7 @@ class BaseCrud(unittest.TestCase): def test_list_movies(self): response = client.get("/movies/") + assert response.status_code == 200 # assert response.json() == [] N = 10 @@ -112,7 +117,8 @@ class BaseCrud(unittest.TestCase): name = rand_name() names.append(name) - response = client.post("/movies/", json={"title": name}) + self.create_payload["title"] = name + response = client.post("/movies/", json=self.create_payload) assert response.status_code == 200 movies = client.get("/movies/") @@ -185,7 +191,7 @@ class ApiTestCase(unittest.TestCase): payload.pop(missing_key) - response = client.post("/pydantic_movies/", json=payload) + response = client.post("/movies/", json=payload) assert 400 <= response.status_code < 500 @@ -215,13 +221,13 @@ class ApiTestCase(unittest.TestCase): payload.pop(missing_key) - response = client.post("/pydantic_movies/", json=payload) + response = client.post("/movies/", json=payload) assert 400 <= response.status_code < 500 assert response.status_code == 400 - def test_payload_content_in_and_out_loopback_pydantic(self): + def test_payload_content_in_and_out_loopback(self): be_the_fun_in_de_funes = { "id": 1, "title": "La Grande Vadrouille", @@ -242,7 +248,7 @@ class ApiTestCase(unittest.TestCase): payload = {k: be_the_fun_in_de_funes[k] for k in domain_keys} # FIXME - response = client.post("/pydantic_movies/", json=payload) + response = client.post("/movies/", json=payload) assert response.status_code == 200 movie_id = response.json()["id"]