fix: tests sometimes failed because of missing sorting

This commit is contained in:
ducklet 2024-05-11 17:15:21 +02:00
parent 1a7d85b31d
commit 05d387a6b5
4 changed files with 20 additions and 14 deletions

View file

@ -48,11 +48,13 @@ select = [
# See https://docs.astral.sh/ruff/rules/ for a list of all rules. # See https://docs.astral.sh/ruff/rules/ for a list of all rules.
"B", # flake8-bugbear "B", # flake8-bugbear
"C4", # flake8-comprehensions "C4", # flake8-comprehensions
"DTZ", # flake8-datetimez
"E", # pycodestyle Error "E", # pycodestyle Error
"F", # Pyflakes unused-import "F", # Pyflakes unused-import
"I", # isort "I", # isort
"RUF", # Ruff-specific rules "RUF", # Ruff-specific rules
"S", # flake8-bandit "S", # flake8-bandit
"T20", # flake8-print
"W", # pycodestyle Warning "W", # pycodestyle Warning
] ]
ignore = [ ignore = [

View file

@ -1,4 +1,4 @@
from datetime import datetime from datetime import UTC, datetime
import pytest import pytest
@ -141,21 +141,21 @@ async def test_remove(conn: db.Connection):
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_find_ratings(conn: db.Connection): async def test_find_ratings(conn: db.Connection):
m1 = a_movie( m1 = a_movie(
title="test movie", title="a test movie",
release_year=2013, release_year=2013,
genres={"genre-1"}, genres={"genre-1"},
) )
await db.add(conn, m1) await db.add(conn, m1)
m2 = a_movie( m2 = a_movie(
title="it's anöther Movie, Part 2", title="b it's anöther Movie, Part 2",
release_year=2015, release_year=2015,
genres={"genre-2"}, genres={"genre-2"},
) )
await db.add(conn, m2) await db.add(conn, m2)
m3 = a_movie( m3 = a_movie(
title="movie it's, Part 3", title="c movie it's, Part 3",
release_year=m2.release_year, release_year=m2.release_year,
genres=m2.genres, genres=m2.genres,
) )
@ -181,7 +181,7 @@ async def test_find_ratings(conn: db.Connection):
user_id=u1.id, user_id=u1.id,
user=u1, user=u1,
score=66, score=66,
rating_date=datetime.now(), rating_date=datetime.now(tz=UTC),
) )
await db.add(conn, r1) await db.add(conn, r1)
@ -191,7 +191,7 @@ async def test_find_ratings(conn: db.Connection):
user_id=u2.id, user_id=u2.id,
user=u2, user=u2,
score=77, score=77,
rating_date=datetime.now(), rating_date=datetime.now(tz=UTC),
) )
await db.add(conn, r2) await db.add(conn, r2)
@ -224,35 +224,35 @@ async def test_find_ratings(conn: db.Connection):
ratings = tuple(web_models.Rating(**r) for r in rows) ratings = tuple(web_models.Rating(**r) for r in rows)
assert ( assert (
web_models.Rating.from_movie(m1), web_models.Rating.from_movie(m1),
web_models.Rating.from_movie(m3),
web_models.Rating.from_movie(m2, rating=r1), web_models.Rating.from_movie(m2, rating=r1),
web_models.Rating.from_movie(m2, rating=r2), web_models.Rating.from_movie(m2, rating=r2),
web_models.Rating.from_movie(m3),
) == ratings ) == ratings
aggr = web_models.aggregate_ratings(ratings, user_ids=[]) aggr = web_models.aggregate_ratings(ratings, user_ids=[])
assert tuple( assert tuple(
web_models.RatingAggregate.from_movie(m) for m in [m1, m2, m3] web_models.RatingAggregate.from_movie(m) for m in [m1, m3, m2]
) == tuple(aggr) ) == tuple(aggr)
aggr = web_models.aggregate_ratings(ratings, user_ids=[str(u1.id)]) aggr = web_models.aggregate_ratings(ratings, user_ids=[str(u1.id)])
assert ( assert (
web_models.RatingAggregate.from_movie(m1), web_models.RatingAggregate.from_movie(m1),
web_models.RatingAggregate.from_movie(m2, ratings=[r1]),
web_models.RatingAggregate.from_movie(m3), web_models.RatingAggregate.from_movie(m3),
web_models.RatingAggregate.from_movie(m2, ratings=[r1]),
) == tuple(aggr) ) == tuple(aggr)
aggr = web_models.aggregate_ratings(ratings, user_ids=[str(u1.id), str(u2.id)]) aggr = web_models.aggregate_ratings(ratings, user_ids=[str(u1.id), str(u2.id)])
assert ( assert (
web_models.RatingAggregate.from_movie(m1), web_models.RatingAggregate.from_movie(m1),
web_models.RatingAggregate.from_movie(m2, ratings=[r1, r2]),
web_models.RatingAggregate.from_movie(m3), web_models.RatingAggregate.from_movie(m3),
web_models.RatingAggregate.from_movie(m2, ratings=[r1, r2]),
) == tuple(aggr) ) == tuple(aggr)
rows = await db.find_ratings(conn, title="movie", include_unrated=True) rows = await db.find_ratings(conn, title="movie", include_unrated=True)
ratings = (web_models.Rating(**r) for r in rows) ratings = (web_models.Rating(**r) for r in rows)
aggr = web_models.aggregate_ratings(ratings, user_ids=[]) aggr = web_models.aggregate_ratings(ratings, user_ids=[])
assert tuple( assert tuple(
web_models.RatingAggregate.from_movie(m) for m in [m1, m2, m3] web_models.RatingAggregate.from_movie(m) for m in [m1, m3, m2]
) == tuple(aggr) ) == tuple(aggr)
rows = await db.find_ratings(conn, title="test", include_unrated=True) rows = await db.find_ratings(conn, title="test", include_unrated=True)
@ -288,7 +288,7 @@ async def test_ratings_for_movies(conn: db.Connection):
user_id=u1.id, user_id=u1.id,
user=u1, user=u1,
score=66, score=66,
rating_date=datetime.now(), rating_date=datetime.now(tz=UTC),
) )
await db.add(conn, r1) await db.add(conn, r1)
@ -353,7 +353,7 @@ async def test_find_movies(conn: db.Connection):
user_id=u1.id, user_id=u1.id,
user=u1, user=u1,
score=66, score=66,
rating_date=datetime.now(), rating_date=datetime.now(tz=UTC),
) )
await db.add(conn, r1) await db.add(conn, r1)

View file

@ -582,6 +582,10 @@ async def ratings_for_movie_ids(
) )
.outerjoin_from(movies, ratings, movies.c.id == ratings.c.movie_id) .outerjoin_from(movies, ratings, movies.c.id == ratings.c.movie_id)
.where(sa.or_(*conds)) .where(sa.or_(*conds))
.order_by(
ratings.c.rating_date.asc(),
movies.c.title.asc(),
)
) )
rows = await fetch_all(conn, query) rows = await fetch_all(conn, query)
return tuple(dict(r._mapping) for r in rows) return tuple(dict(r._mapping) for r in rows)

View file

@ -356,7 +356,7 @@ async def _load_ratings_page_legacy(url: str, soup: bs4.BeautifulSoup) -> _Ratin
async def load_and_store_ratings( async def load_and_store_ratings(
user_id: MovieId, user_id: UserId,
) -> AsyncIterable[tuple[Rating, bool]]: ) -> AsyncIterable[tuple[Rating, bool]]:
async with db.new_connection() as conn: async with db.new_connection() as conn:
user = await db.get(conn, User, imdb_id=user_id) or User( user = await db.get(conn, User, imdb_id=user_id) or User(