RED: Cannot bind list to string for genres
This commit is contained in:
parent
e565b445ff
commit
68e11a3275
16
crud.py
16
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
|
||||
|
|
27
dev.py
27
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:
|
||||
|
|
|
@ -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() == []
|
||||
|
|
Loading…
Reference in New Issue