Skip to content

Commit 4428d34

Browse files
committed
test(playlists): add mangalist and mangalistiem integration tests
1 parent ab78bf2 commit 4428d34

File tree

5 files changed

+2088
-40
lines changed

5 files changed

+2088
-40
lines changed

.vscode/settings.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,10 @@
3434
"statusBarItem.remoteBackground": "#FF135B",
3535
"extensionButton.prominentBackground": "#FF135B",
3636
"debugConsoleInputIcon.foreground": "#FF135B",
37-
}
37+
},
38+
"python.testing.pytestArgs": [
39+
"."
40+
],
41+
"python.testing.unittestEnabled": false,
42+
"python.testing.pytestEnabled": true
3843
}

apps/characters/tests/integration/test_endpoints.py

Lines changed: 58 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import pytest
44
from rest_framework import status
5+
from rest_framework.test import APIClient
56

67
from apps.animes.tests.factories import AnimeFactory
78
from apps.animes.serializers import AnimeMinimalSerializer
@@ -22,8 +23,8 @@
2223

2324

2425
@pytest.mark.django_db
25-
def test_list_character(anonymous_user, character):
26-
endpoint = "/api/v1/characters/"
26+
def test_list_character(anonymous_user: APIClient, character: Character) -> None:
27+
endpoint: str = "/api/v1/characters/"
2728
response = anonymous_user.get(endpoint)
2829
assert response.status_code == status.HTTP_200_OK
2930
assert response.reason_phrase == "OK"
@@ -32,8 +33,8 @@ def test_list_character(anonymous_user, character):
3233

3334

3435
@pytest.mark.django_db
35-
def test_retrieve_character(anonymous_user, character):
36-
endpoint = f"/api/v1/characters/{character.id}/"
36+
def test_retrieve_character(anonymous_user: APIClient, character: Character) -> None:
37+
endpoint: str = f"/api/v1/characters/{character.id}/"
3738
response = anonymous_user.get(endpoint)
3839
assert response.status_code == status.HTTP_200_OK
3940
assert response.reason_phrase == "OK"
@@ -42,18 +43,18 @@ def test_retrieve_character(anonymous_user, character):
4243

4344

4445
@pytest.mark.django_db
45-
def test_retrieve_character_errors(anonymous_user):
46-
endpoint = "/api/v1/characters/989423d1-d6c0-431a-8f62-d805b8a5f321/"
46+
def test_retrieve_character_errors(anonymous_user: APIClient) -> None:
47+
endpoint: str = "/api/v1/characters/989423d1-d6c0-431a-8f62-d805b8a5f321/"
4748
response = anonymous_user.get(endpoint)
4849
assert response.status_code == status.HTTP_404_NOT_FOUND
4950
assert response.reason_phrase == "Not Found"
5051
assert response.data["detail"] == "Not found."
5152

5253

5354
@pytest.mark.django_db
54-
def test_create_character(contributor_user, character):
55-
endpoint = "/api/v1/characters/"
56-
data = {
55+
def test_create_character(contributor_user: APIClient, character: Character) -> None:
56+
endpoint: str = "/api/v1/characters/"
57+
data: dict[str, str] = {
5758
"name": "Makoto",
5859
"name_kanji": character.name_kanji,
5960
"about": character.about,
@@ -68,9 +69,9 @@ def test_create_character(contributor_user, character):
6869

6970

7071
@pytest.mark.django_db
71-
def test_create_character_unauthorized(member_user):
72-
endpoint = "/api/v1/characters/"
73-
data = {}
72+
def test_create_character_unauthorized(member_user: APIClient) -> None:
73+
endpoint: str = "/api/v1/characters/"
74+
data: dict = {}
7475
member_response = member_user.post(endpoint, data, format="json")
7576
assert member_response.status_code == status.HTTP_403_FORBIDDEN
7677
assert member_response.reason_phrase == "Forbidden"
@@ -81,9 +82,9 @@ def test_create_character_unauthorized(member_user):
8182

8283

8384
@pytest.mark.django_db
84-
def test_update_character(contributor_user, character):
85-
endpoint = f"/api/v1/characters/{character.id}/"
86-
data = {
85+
def test_update_character(contributor_user: APIClient, character: Character) -> None:
86+
endpoint: str = f"/api/v1/characters/{character.id}/"
87+
data: dict[str, str] = {
8788
"name": "Updated Character",
8889
"name_kanji": character.name_kanji,
8990
"about": character.about,
@@ -98,9 +99,11 @@ def test_update_character(contributor_user, character):
9899

99100

100101
@pytest.mark.django_db
101-
def test_partial_update_character(contributor_user, character):
102-
endpoint = f"/api/v1/characters/{character.id}/"
103-
data = {"name": "Partially Updated Character"}
102+
def test_partial_update_character(
103+
contributor_user: APIClient, character: Character
104+
) -> None:
105+
endpoint: str = f"/api/v1/characters/{character.id}/"
106+
data: dict[str, str] = {"name": "Partially Updated Character"}
104107
response = contributor_user.patch(endpoint, data, format="json")
105108
assert response.status_code == status.HTTP_200_OK
106109
assert response.reason_phrase == "OK"
@@ -109,9 +112,9 @@ def test_partial_update_character(contributor_user, character):
109112

110113

111114
@pytest.mark.django_db
112-
def test_delete_character(contributor_user, character):
115+
def test_delete_character(contributor_user: APIClient, character: Character) -> None:
113116
assert character.is_available
114-
endpoint = f"/api/v1/characters/{character.id}/"
117+
endpoint: str = f"/api/v1/characters/{character.id}/"
115118
response = contributor_user.delete(endpoint)
116119
character.refresh_from_db()
117120
assert response.status_code == status.HTTP_204_NO_CONTENT
@@ -121,12 +124,14 @@ def test_delete_character(contributor_user, character):
121124

122125

123126
@pytest.mark.django_db
124-
def test_list_pictures_by_character(anonymous_user, character):
127+
def test_list_pictures_by_character(
128+
anonymous_user: APIClient, character: Character
129+
) -> None:
125130
picture = PictureFactory(
126131
content_object=character,
127132
object_id=character.id,
128133
)
129-
endpoint = f"/api/v1/characters/{character.id}/pictures/"
134+
endpoint: str = f"/api/v1/characters/{character.id}/pictures/"
130135
response = anonymous_user.get(endpoint)
131136
expected_data = PictureReadSerializer([picture], many=True).data
132137
assert response.status_code == status.HTTP_200_OK
@@ -135,8 +140,10 @@ def test_list_pictures_by_character(anonymous_user, character):
135140

136141

137142
@pytest.mark.django_db
138-
def test_list_pictures_by_character_errors(anonymous_user, character):
139-
endpoint = f"/api/v1/characters/{character.id}/pictures/"
143+
def test_list_pictures_by_character_errors(
144+
anonymous_user: APIClient, character: Character
145+
) -> None:
146+
endpoint: str = f"/api/v1/characters/{character.id}/pictures/"
140147
response = anonymous_user.get(endpoint)
141148
assert response.status_code == status.HTTP_404_NOT_FOUND
142149
assert response.reason_phrase == "Not Found"
@@ -147,9 +154,11 @@ def test_list_pictures_by_character_errors(anonymous_user, character):
147154

148155

149156
@pytest.mark.django_db
150-
def test_create_picture_by_character(contributor_user, character):
151-
endpoint = f"/api/v1/characters/{character.id}/pictures/create/"
152-
data = {
157+
def test_create_picture_by_character(
158+
contributor_user: APIClient, character: Character
159+
) -> None:
160+
endpoint: str = f"/api/v1/characters/{character.id}/pictures/create/"
161+
data: dict[str, str] = {
153162
"name": "Momo Ayase",
154163
"image": character.image,
155164
}
@@ -161,12 +170,15 @@ def test_create_picture_by_character(contributor_user, character):
161170

162171

163172
@pytest.mark.django_db
164-
def test_list_voices_by_character(anonymous_user, character):
173+
def test_list_voices_by_character(
174+
anonymous_user: APIClient,
175+
character: Character,
176+
) -> None:
165177
staff_one = PersonFactory()
166178
staff_two = PersonFactory()
167179
CharacterVoiceFactory(voice_id=staff_one, character_id=character)
168180
CharacterVoiceFactory(voice_id=staff_two, character_id=character)
169-
endpoint = f"/api/v1/characters/{character.id}/voices/"
181+
endpoint: int = f"/api/v1/characters/{character.id}/voices/"
170182
response = anonymous_user.get(endpoint)
171183
voices_ids = CharacterVoice.objects.filter(character_id=character.id).values_list(
172184
"voice_id", flat=True
@@ -179,7 +191,10 @@ def test_list_voices_by_character(anonymous_user, character):
179191

180192

181193
@pytest.mark.django_db
182-
def test_retrieve_anime_by_character(anonymous_user, character):
194+
def test_retrieve_anime_by_character(
195+
anonymous_user: APIClient,
196+
character: Character,
197+
) -> None:
183198
anime = AnimeFactory()
184199
CharacterAnimeFactory(character_id=character, anime_id=anime)
185200
endpoint = f"/api/v1/characters/{character.id}/anime/"
@@ -191,7 +206,9 @@ def test_retrieve_anime_by_character(anonymous_user, character):
191206

192207

193208
@pytest.mark.django_db
194-
def test_retrieve_anime_by_character_not_found(anonymous_user, character):
209+
def test_retrieve_anime_by_character_not_found(
210+
anonymous_user: APIClient, character: Character
211+
):
195212
endpoint = f"/api/v1/characters/{character.id}/anime/"
196213
response = anonymous_user.get(endpoint)
197214
assert response.status_code == status.HTTP_404_NOT_FOUND
@@ -200,10 +217,13 @@ def test_retrieve_anime_by_character_not_found(anonymous_user, character):
200217

201218

202219
@pytest.mark.django_db
203-
def test_retrieve_manga_by_character(anonymous_user, character):
220+
def test_retrieve_manga_by_character(
221+
anonymous_user: APIClient,
222+
character: Character,
223+
) -> None:
204224
manga = MangaFactory()
205225
CharacterMangaFactory(character_id=character, manga_id=manga)
206-
endpoint = f"/api/v1/characters/{character.id}/manga/"
226+
endpoint: str = f"/api/v1/characters/{character.id}/manga/"
207227
response = anonymous_user.get(endpoint)
208228
expected_data = MangaMinimalSerializer(manga).data
209229
assert response.status_code == status.HTTP_200_OK
@@ -212,8 +232,11 @@ def test_retrieve_manga_by_character(anonymous_user, character):
212232

213233

214234
@pytest.mark.django_db
215-
def test_retrieve_manga_by_character_not_found(anonymous_user, character):
216-
endpoint = f"/api/v1/characters/{character.id}/manga/"
235+
def test_retrieve_manga_by_character_not_found(
236+
anonymous_user: APIClient,
237+
character: Character,
238+
) -> None:
239+
endpoint: str = f"/api/v1/characters/{character.id}/manga/"
217240
response = anonymous_user.get(endpoint)
218241
assert response.status_code == status.HTTP_404_NOT_FOUND
219242
assert response.reason_phrase == "Not Found"

apps/playlists/tests/integration/test_endpoints.py

Lines changed: 144 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@
33
import pytest
44
from rest_framework import status
55

6-
from ...models import AnimeListItem
7-
from ...choices import AnimeStatusChoices
8-
from ..factories import AnimeListFactory, AnimeListItemFactory
6+
from ...models import AnimeListItem, MangaListItem
7+
from ...choices import AnimeStatusChoices, MangaStatusChoices
8+
from ..factories import (
9+
AnimeListFactory,
10+
AnimeListItemFactory,
11+
MangaListFactory,
12+
MangaListItemFactory,
13+
)
914

1015

1116
@pytest.mark.django_db
@@ -137,3 +142,139 @@ def test_delete_animelist_item(api_client_with_member_user):
137142
assert response.status_code == status.HTTP_204_NO_CONTENT
138143
assert response.reason_phrase == "No Content"
139144
assert AnimeListItem.objects.filter(id=item.id).exists()
145+
146+
147+
# Manga List
148+
149+
150+
@pytest.mark.django_db
151+
def test_retrieve_mangalist(member_user):
152+
endpoint = "/api/v1/playlists/mangalist/"
153+
response = member_user.get(endpoint)
154+
assert response.status_code == status.HTTP_200_OK
155+
assert response.reason_phrase == "OK"
156+
assert "id" in response.data
157+
assert "banner" in response.data
158+
assert "is_public" in response.data
159+
assert "created_at" in response.data
160+
assert "updated_at" in response.data
161+
162+
163+
@pytest.mark.django_db
164+
def test_retrieve_mangalist_errors(anonymous_user):
165+
endpoint = "/api/v1/playlists/mangalist/"
166+
response = anonymous_user.get(endpoint)
167+
assert response.status_code == status.HTTP_401_UNAUTHORIZED
168+
assert response.reason_phrase == "Unauthorized"
169+
assert response.data["detail"] == "Authentication credentials were not provided."
170+
171+
172+
@pytest.mark.django_db
173+
def test_partial_update_mangalist(member_user):
174+
endpoint = "/api/v1/playlists/mangalist/"
175+
data = {"is_public": False}
176+
response = member_user.patch(endpoint, data, format="json")
177+
assert response.status_code == status.HTTP_200_OK
178+
assert response.reason_phrase == "OK"
179+
assert not response.data["is_public"]
180+
181+
182+
@pytest.mark.django_db
183+
def test_partial_update_mangalist_errors(member_user):
184+
endpoint = "/api/v1/playlists/mangalist/"
185+
data = {"is_public": "String field"}
186+
response = member_user.patch(endpoint, data, format="json")
187+
assert response.status_code == status.HTTP_400_BAD_REQUEST
188+
assert response.reason_phrase == "Bad Request"
189+
assert response.data["is_public"][0] == "Must be a valid boolean."
190+
191+
192+
@pytest.mark.django_db
193+
def test_list_mangalist_item(member_user):
194+
endpoint = "/api/v1/playlists/mangalist/mangas/"
195+
response = member_user.get(endpoint)
196+
assert response.status_code == status.HTTP_204_NO_CONTENT
197+
assert response.reason_phrase == "No Content"
198+
assert response.data["detail"] == "Your mangalist is empty."
199+
200+
201+
@pytest.mark.django_db
202+
def test_create_mangalist_item(member_user, manga_list_item, manga):
203+
endpoint = "/api/v1/playlists/mangalist/mangas/"
204+
data = {
205+
"manga_id": manga.id,
206+
"status": manga_list_item.status,
207+
"volumes_read": manga_list_item.volumes_read,
208+
"chapters_read": manga_list_item.chapters_read,
209+
"score": manga_list_item.score,
210+
"start_date": manga_list_item.start_date,
211+
"finish_date": manga_list_item.finish_date,
212+
"priority": manga_list_item.priority,
213+
"storage": manga_list_item.storage,
214+
"times_reread": manga_list_item.times_reread,
215+
"notes": manga_list_item.notes,
216+
"order": manga_list_item.order,
217+
"is_read": manga_list_item.is_read,
218+
"is_favorite": manga_list_item.is_favorite,
219+
}
220+
response = member_user.post(endpoint, data, format="multipart")
221+
assert response.status_code == status.HTTP_201_CREATED
222+
assert response.reason_phrase == "Created"
223+
assert str(response.data["manga_id"]) == str(manga.id)
224+
response = member_user.get(endpoint)
225+
assert response.status_code == status.HTTP_200_OK
226+
assert response.reason_phrase == "OK"
227+
228+
229+
@pytest.mark.django_db
230+
def test_retrieve_mangalist_item(api_client_with_member_user):
231+
api_client, user = api_client_with_member_user
232+
mangalist = MangaListFactory.create(user=user)
233+
item = MangaListItemFactory.create(mangalist_id=mangalist)
234+
endpoint = f"/api/v1/playlists/mangalist/mangas/{item.id}/"
235+
response = api_client.get(endpoint)
236+
assert response.status_code == status.HTTP_200_OK
237+
assert response.reason_phrase == "OK"
238+
assert "id" in response.data
239+
assert "manga_id" in response.data
240+
assert "status" in response.data
241+
assert "volumes_read" in response.data
242+
assert "chapters_read" in response.data
243+
assert "score" in response.data
244+
assert "start_date" in response.data
245+
assert "finish_date" in response.data
246+
assert "tags" in response.data
247+
assert "priority" in response.data
248+
assert "storage" in response.data
249+
assert "times_reread" in response.data
250+
assert "notes" in response.data
251+
assert "order" in response.data
252+
assert "is_read" in response.data
253+
assert "is_favorite" in response.data
254+
assert "created_at" in response.data
255+
assert "updated_at" in response.data
256+
257+
258+
@pytest.mark.django_db
259+
def test_partial_update_mangalist_item(api_client_with_member_user):
260+
api_client, user = api_client_with_member_user
261+
mangalist = MangaListFactory.create(user=user)
262+
item = MangaListItemFactory.create(mangalist_id=mangalist)
263+
endpoint = f"/api/v1/playlists/mangalist/mangas/{item.id}/"
264+
data = {"status": "reading"}
265+
response = api_client.patch(endpoint, data, format="json")
266+
assert response.status_code == status.HTTP_200_OK
267+
assert response.reason_phrase == "OK"
268+
assert response.data["status"] == MangaStatusChoices.READING
269+
270+
271+
@pytest.mark.django_db
272+
def test_delete_mangalist_item(api_client_with_member_user):
273+
api_client, user = api_client_with_member_user
274+
mangalist = MangaListFactory.create(user=user)
275+
item = MangaListItemFactory.create(mangalist_id=mangalist)
276+
endpoint = f"/api/v1/playlists/mangalist/mangas/{item.id}/"
277+
response = api_client.delete(endpoint)
278+
assert response.status_code == status.HTTP_204_NO_CONTENT
279+
assert response.reason_phrase == "No Content"
280+
assert MangaListItem.objects.filter(id=item.id).exists()

0 commit comments

Comments
 (0)