From 68e11a3275ce3669eaac116bbd993adee06b63af Mon Sep 17 00:00:00 2001 From: Colin Goutte Date: Sat, 26 Aug 2023 22:31:33 +0200 Subject: [PATCH] RED: Cannot bind list to string for genres --- crud.py | 16 +++++++++++++++- dev.py | 27 +++++++++++++++++++++++++++ utests/test_api.py | 23 +++++++++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/crud.py b/crud.py index 8d65073..b2daf35 100644 --- a/crud.py +++ b/crud.py @@ -13,7 +13,7 @@ def create_movie( description: str = "", vote_average: float | None = None, vote_count: int | None = None, - release_date: str | None = None + release_date: str | None = None, ): db_movie = models.Movie( title=title, @@ -55,3 +55,17 @@ def delete_movie_by_id(db: Session, id_: str = ""): movie = get_movie_by_id(db, id_) db.delete(movie) db.commit() + + +def update_movie(db: Session, id_: str, **payload): + movie = get_movie_by_id(db, id_) + + for name, value in payload.items(): + try: + movie.__mapper__.attrs[name] + except KeyError: + raise ValueError(f"Bad attribute {name}") + setattr(movie, name, value) + db.add(movie) + db.commit() + return movie diff --git a/dev.py b/dev.py index d77de24..2e7fe4c 100644 --- a/dev.py +++ b/dev.py @@ -73,6 +73,33 @@ async def create_movie( return out +@app.put("/movies/{id_}") +async def update_movie( + id_: str, db: Session = Depends(get_db), request: Request = None +): + try: + movie = crud.get_movie_by_id(db, id_) + except LookupError: + raise HTTPException(status_code=404, detail=f"No movie found with id {id_}") + + 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.update_movie(db, id_, **crud_params) + + out = {k: v for (k, v) in movie.__dict__.items() if not k.startswith("_")} + return out + + @app.get("/movies/{id_}") async def get_movie(id_: str, db: Session = Depends(get_db)): try: diff --git a/utests/test_api.py b/utests/test_api.py index ee6a6e3..0af0fa1 100644 --- a/utests/test_api.py +++ b/utests/test_api.py @@ -74,11 +74,34 @@ class BaseCrud(unittest.TestCase): created_movie_path = f"/movies/{movie_id}" response_delete = client.delete(created_movie_path) + response_missing = client.get(created_movie_path) assert response_delete.status_code == 204 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"]}) + movie_id = response.json()["id"] + created_movie_path = f"/movies/{movie_id}" + + new_name = name.replace("rand", "update") + new_genres = ["Drama", "war"] + response_get = client.get(f"/movies/{movie_id}") + + assert response_get.json()["title"] != new_name + assert response_get.json()["genres"] != new_genres + + response_update = client.put( + created_movie_path, json={"title": new_name, "genres": new_genres} + ) + assert response_update.status_code == 200 + + response_get = client.get(f"/movies/{movie_id}") + assert response_get.json()["title"] == new_name + assert response_get.json()["genres"] == new_genres + def test_list_movies(self): response = client.get("/movies/") # assert response.json() == []