Skip to content

Commit b7870f6

Browse files
committed
- add app/tests/test_like_router.py
- add app/tests/test_review_router.py
1 parent b862d3d commit b7870f6

File tree

2 files changed

+554
-0
lines changed

2 files changed

+554
-0
lines changed

src/tests/test_like_router.py

+202
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
import httpx
2+
from httpx import AsyncClient
3+
from tortoise.contrib.test import TestCase
4+
5+
from main import app
6+
from src.models.likes import ReviewLike
7+
from src.models.movies import Movie
8+
from src.models.reviews import Review
9+
from src.models.users import GenderEnum, User
10+
from src.services.auth import AuthService
11+
12+
13+
class LikeRouterTestCase(TestCase):
14+
async def create_user(self, username: str, password: str) -> User:
15+
user = await User.create(
16+
username=username,
17+
hashed_password=AuthService().hash_password(password),
18+
age=25,
19+
gender=GenderEnum.MALE,
20+
)
21+
return user
22+
23+
async def create_movie(self) -> Movie:
24+
movie = await Movie.create(
25+
title="test",
26+
plot="Testing...",
27+
cast=[
28+
{"name": "lee", "age": 23, "agency": "A actors", "gender": "male"},
29+
{"name": "lee2", "age": 24, "agency": "B actors", "gender": "male"},
30+
],
31+
playtime=240,
32+
genre="SF",
33+
)
34+
return movie
35+
36+
async def create_review(self, movie_id: int, user_id: int) -> Review:
37+
review = await Review.create(user_id=user_id, movie_id=movie_id, title="test review", content="test review...")
38+
return review
39+
40+
async def user_login(self, client: AsyncClient, username: str, password: str) -> None:
41+
await client.post("/users/login", json={"username": username, "password": password})
42+
43+
async def test_api_review_like(self) -> None:
44+
# given
45+
user = await self.create_user(username="testuser", password="password1234")
46+
movie = await self.create_movie()
47+
review = await self.create_review(movie_id=movie.id, user_id=user.id)
48+
49+
other_user = await self.create_user(username=(username := "other_user"), password=(password := "password1234"))
50+
51+
async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url="http://test") as client:
52+
await client.post(url="/users/login", json={"username": username, "password": password})
53+
54+
# when
55+
response = await client.post(url=f"/likes/reviews/{review.id}/like")
56+
57+
# then
58+
assert response.status_code == 200
59+
response_json = response.json()
60+
61+
assert response_json["user_id"] == other_user.id
62+
assert response_json["review_id"] == review.id
63+
assert response_json["is_liked"]
64+
65+
async def test_api_review_unlike(self) -> None:
66+
# given
67+
user = await self.create_user(username="testuser", password="password1234")
68+
movie = await self.create_movie()
69+
review = await self.create_review(movie_id=movie.id, user_id=user.id)
70+
71+
other_user = await self.create_user(username=(username := "other_user"), password=(password := "password1234"))
72+
73+
async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url="http://test") as client:
74+
await client.post(url="/users/login", json={"username": username, "password": password})
75+
76+
like_response = await client.post(url=f"/likes/reviews/{review.id}/like")
77+
like_response_json = like_response.json()
78+
79+
response = await client.post(url=f"/likes/reviews/{review.id}/unlike")
80+
# then
81+
assert response.status_code == 200
82+
response_json = response.json()
83+
84+
assert response_json["id"] == like_response_json["id"]
85+
assert response_json["user_id"] == other_user.id
86+
assert response_json["review_id"] == review.id
87+
assert response_json["is_liked"] is False
88+
89+
async def test_api_review_unlike_when_review_like_object_is_none(self) -> None:
90+
# given
91+
user = await self.create_user(username="testuser", password="password1234")
92+
movie = await self.create_movie()
93+
review = await self.create_review(movie_id=movie.id, user_id=user.id)
94+
95+
other_user = await self.create_user(username=(username := "other_user"), password=(password := "password1234"))
96+
97+
async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url="http://test") as client:
98+
await client.post(url="/users/login", json={"username": username, "password": password})
99+
100+
# when
101+
response = await client.post(url=f"/likes/reviews/{review.id}/unlike")
102+
103+
# then
104+
assert response.status_code == 200
105+
response_json = response.json()
106+
107+
assert response_json["id"] is None
108+
assert response_json["user_id"] == other_user.id
109+
assert response_json["review_id"] == review.id
110+
assert response_json["is_liked"] is False
111+
112+
async def test_api_review_like_when_review_status_is_false(self) -> None:
113+
# given
114+
user = await self.create_user(username="testuser", password="password1234")
115+
movie = await self.create_movie()
116+
review = await self.create_review(movie_id=movie.id, user_id=user.id)
117+
other_user = await self.create_user(username=(username := "other_user"), password=(password := "password1234"))
118+
119+
async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url="http://test") as client:
120+
await client.post(url="/users/login", json={"username": username, "password": password})
121+
122+
like_response = await client.post(url=f"/likes/reviews/{review.id}/like")
123+
like_response_json = like_response.json()
124+
125+
await client.post(url=f"/likes/reviews/{review.id}/unlike")
126+
127+
response = await client.post(url=f"/likes/reviews/{review.id}/like")
128+
129+
assert response.status_code == 200
130+
response_json = response.json()
131+
132+
assert response_json["id"] == like_response_json["id"]
133+
assert response_json["user_id"] == other_user.id
134+
assert response_json["review_id"] == review.id
135+
assert response_json["is_liked"]
136+
137+
async def test_api_get_review_like_count(self) -> None:
138+
# given
139+
await User.bulk_create(
140+
[
141+
User(
142+
username=f"testuser{i}",
143+
hashed_password=AuthService().hash_password("password1234"),
144+
age=25 + i,
145+
gender=GenderEnum.MALE,
146+
)
147+
for i in range(1, 4)
148+
]
149+
)
150+
users = await User.filter().all()
151+
movie = await self.create_movie()
152+
153+
review = await self.create_review(movie_id=movie.id, user_id=users[0].id)
154+
async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url="http://test") as client:
155+
review_like_responses = []
156+
for _ in users:
157+
response = await client.post(f"/likes/reviews/{review.id}/like")
158+
response_json = response.json()
159+
review_like_responses.append(response_json)
160+
161+
response = await client.get(f"/reviews/{review.id}/like_count")
162+
163+
assert response.status_code == 200
164+
response_json = response.json()
165+
166+
assert response_json["review_id"] == review.id
167+
assert response_json["like_count"] == await ReviewLike.filter(review_id=review.id).count()
168+
169+
async def test_api_get_whether_user_liked_the_review_when_user_not_like_review(self) -> None:
170+
# given
171+
user = await self.create_user(username=(username := "testuser"), password=(password := "password1234"))
172+
movie = await self.create_movie()
173+
review = await self.create_review(movie_id=movie.id, user_id=user.id)
174+
175+
async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url="http://test") as client:
176+
await client.post(url="/users/login", json={"username": username, "password": password})
177+
178+
response = await client.get(url=f"/reviews/{review.id}/is_liked")
179+
180+
assert response.status_code == 200
181+
response_json = response.json()
182+
183+
assert response_json["review_id"] == review.id
184+
assert response_json["is_liked"] is False
185+
186+
async def test_api_get_whether_user_liked_the_review_when_user_like_review(self) -> None:
187+
# given
188+
user = await self.create_user(username=(username := "testuser"), password=(password := "password1234"))
189+
movie = await self.create_movie()
190+
review = await self.create_review(movie_id=movie.id, user_id=user.id)
191+
192+
async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url="http://test") as client:
193+
await client.post(url="/users/login", json={"username": username, "password": password})
194+
await client.post(url=f"/likes/reviews/{review.id}/like")
195+
196+
response = await client.get(url=f"/reviews/{review.id}/is_liked")
197+
198+
assert response.status_code == 200
199+
response_json = response.json()
200+
201+
assert response_json["review_id"] == review.id
202+
assert response_json["is_liked"]

0 commit comments

Comments
 (0)