RED: Cannot bind list to string for genres

This commit is contained in:
Colin Goutte 2023-08-26 22:31:33 +02:00
parent e565b445ff
commit 68e11a3275
3 changed files with 65 additions and 1 deletions

16
crud.py
View File

@ -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

27
dev.py
View File

@ -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:

View File

@ -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() == []