Skip to content

Commit

Permalink
test(playlists): add mangalist and mangalistiem integration tests
Browse files Browse the repository at this point in the history
  • Loading branch information
tyronejosee committed Dec 7, 2024
1 parent ab78bf2 commit 4428d34
Show file tree
Hide file tree
Showing 5 changed files with 2,088 additions and 40 deletions.
7 changes: 6 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,10 @@
"statusBarItem.remoteBackground": "#FF135B",
"extensionButton.prominentBackground": "#FF135B",
"debugConsoleInputIcon.foreground": "#FF135B",
}
},
"python.testing.pytestArgs": [
"."
],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true
}
93 changes: 58 additions & 35 deletions apps/characters/tests/integration/test_endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import pytest
from rest_framework import status
from rest_framework.test import APIClient

from apps.animes.tests.factories import AnimeFactory
from apps.animes.serializers import AnimeMinimalSerializer
Expand All @@ -22,8 +23,8 @@


@pytest.mark.django_db
def test_list_character(anonymous_user, character):
endpoint = "/api/v1/characters/"
def test_list_character(anonymous_user: APIClient, character: Character) -> None:
endpoint: str = "/api/v1/characters/"
response = anonymous_user.get(endpoint)
assert response.status_code == status.HTTP_200_OK
assert response.reason_phrase == "OK"
Expand All @@ -32,8 +33,8 @@ def test_list_character(anonymous_user, character):


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


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


@pytest.mark.django_db
def test_create_character(contributor_user, character):
endpoint = "/api/v1/characters/"
data = {
def test_create_character(contributor_user: APIClient, character: Character) -> None:
endpoint: str = "/api/v1/characters/"
data: dict[str, str] = {
"name": "Makoto",
"name_kanji": character.name_kanji,
"about": character.about,
Expand All @@ -68,9 +69,9 @@ def test_create_character(contributor_user, character):


@pytest.mark.django_db
def test_create_character_unauthorized(member_user):
endpoint = "/api/v1/characters/"
data = {}
def test_create_character_unauthorized(member_user: APIClient) -> None:
endpoint: str = "/api/v1/characters/"
data: dict = {}
member_response = member_user.post(endpoint, data, format="json")
assert member_response.status_code == status.HTTP_403_FORBIDDEN
assert member_response.reason_phrase == "Forbidden"
Expand All @@ -81,9 +82,9 @@ def test_create_character_unauthorized(member_user):


@pytest.mark.django_db
def test_update_character(contributor_user, character):
endpoint = f"/api/v1/characters/{character.id}/"
data = {
def test_update_character(contributor_user: APIClient, character: Character) -> None:
endpoint: str = f"/api/v1/characters/{character.id}/"
data: dict[str, str] = {
"name": "Updated Character",
"name_kanji": character.name_kanji,
"about": character.about,
Expand All @@ -98,9 +99,11 @@ def test_update_character(contributor_user, character):


@pytest.mark.django_db
def test_partial_update_character(contributor_user, character):
endpoint = f"/api/v1/characters/{character.id}/"
data = {"name": "Partially Updated Character"}
def test_partial_update_character(
contributor_user: APIClient, character: Character
) -> None:
endpoint: str = f"/api/v1/characters/{character.id}/"
data: dict[str, str] = {"name": "Partially Updated Character"}
response = contributor_user.patch(endpoint, data, format="json")
assert response.status_code == status.HTTP_200_OK
assert response.reason_phrase == "OK"
Expand All @@ -109,9 +112,9 @@ def test_partial_update_character(contributor_user, character):


@pytest.mark.django_db
def test_delete_character(contributor_user, character):
def test_delete_character(contributor_user: APIClient, character: Character) -> None:
assert character.is_available
endpoint = f"/api/v1/characters/{character.id}/"
endpoint: str = f"/api/v1/characters/{character.id}/"
response = contributor_user.delete(endpoint)
character.refresh_from_db()
assert response.status_code == status.HTTP_204_NO_CONTENT
Expand All @@ -121,12 +124,14 @@ def test_delete_character(contributor_user, character):


@pytest.mark.django_db
def test_list_pictures_by_character(anonymous_user, character):
def test_list_pictures_by_character(
anonymous_user: APIClient, character: Character
) -> None:
picture = PictureFactory(
content_object=character,
object_id=character.id,
)
endpoint = f"/api/v1/characters/{character.id}/pictures/"
endpoint: str = f"/api/v1/characters/{character.id}/pictures/"
response = anonymous_user.get(endpoint)
expected_data = PictureReadSerializer([picture], many=True).data
assert response.status_code == status.HTTP_200_OK
Expand All @@ -135,8 +140,10 @@ def test_list_pictures_by_character(anonymous_user, character):


@pytest.mark.django_db
def test_list_pictures_by_character_errors(anonymous_user, character):
endpoint = f"/api/v1/characters/{character.id}/pictures/"
def test_list_pictures_by_character_errors(
anonymous_user: APIClient, character: Character
) -> None:
endpoint: str = f"/api/v1/characters/{character.id}/pictures/"
response = anonymous_user.get(endpoint)
assert response.status_code == status.HTTP_404_NOT_FOUND
assert response.reason_phrase == "Not Found"
Expand All @@ -147,9 +154,11 @@ def test_list_pictures_by_character_errors(anonymous_user, character):


@pytest.mark.django_db
def test_create_picture_by_character(contributor_user, character):
endpoint = f"/api/v1/characters/{character.id}/pictures/create/"
data = {
def test_create_picture_by_character(
contributor_user: APIClient, character: Character
) -> None:
endpoint: str = f"/api/v1/characters/{character.id}/pictures/create/"
data: dict[str, str] = {
"name": "Momo Ayase",
"image": character.image,
}
Expand All @@ -161,12 +170,15 @@ def test_create_picture_by_character(contributor_user, character):


@pytest.mark.django_db
def test_list_voices_by_character(anonymous_user, character):
def test_list_voices_by_character(
anonymous_user: APIClient,
character: Character,
) -> None:
staff_one = PersonFactory()
staff_two = PersonFactory()
CharacterVoiceFactory(voice_id=staff_one, character_id=character)
CharacterVoiceFactory(voice_id=staff_two, character_id=character)
endpoint = f"/api/v1/characters/{character.id}/voices/"
endpoint: int = f"/api/v1/characters/{character.id}/voices/"
response = anonymous_user.get(endpoint)
voices_ids = CharacterVoice.objects.filter(character_id=character.id).values_list(
"voice_id", flat=True
Expand All @@ -179,7 +191,10 @@ def test_list_voices_by_character(anonymous_user, character):


@pytest.mark.django_db
def test_retrieve_anime_by_character(anonymous_user, character):
def test_retrieve_anime_by_character(
anonymous_user: APIClient,
character: Character,
) -> None:
anime = AnimeFactory()
CharacterAnimeFactory(character_id=character, anime_id=anime)
endpoint = f"/api/v1/characters/{character.id}/anime/"
Expand All @@ -191,7 +206,9 @@ def test_retrieve_anime_by_character(anonymous_user, character):


@pytest.mark.django_db
def test_retrieve_anime_by_character_not_found(anonymous_user, character):
def test_retrieve_anime_by_character_not_found(
anonymous_user: APIClient, character: Character
):
endpoint = f"/api/v1/characters/{character.id}/anime/"
response = anonymous_user.get(endpoint)
assert response.status_code == status.HTTP_404_NOT_FOUND
Expand All @@ -200,10 +217,13 @@ def test_retrieve_anime_by_character_not_found(anonymous_user, character):


@pytest.mark.django_db
def test_retrieve_manga_by_character(anonymous_user, character):
def test_retrieve_manga_by_character(
anonymous_user: APIClient,
character: Character,
) -> None:
manga = MangaFactory()
CharacterMangaFactory(character_id=character, manga_id=manga)
endpoint = f"/api/v1/characters/{character.id}/manga/"
endpoint: str = f"/api/v1/characters/{character.id}/manga/"
response = anonymous_user.get(endpoint)
expected_data = MangaMinimalSerializer(manga).data
assert response.status_code == status.HTTP_200_OK
Expand All @@ -212,8 +232,11 @@ def test_retrieve_manga_by_character(anonymous_user, character):


@pytest.mark.django_db
def test_retrieve_manga_by_character_not_found(anonymous_user, character):
endpoint = f"/api/v1/characters/{character.id}/manga/"
def test_retrieve_manga_by_character_not_found(
anonymous_user: APIClient,
character: Character,
) -> None:
endpoint: str = f"/api/v1/characters/{character.id}/manga/"
response = anonymous_user.get(endpoint)
assert response.status_code == status.HTTP_404_NOT_FOUND
assert response.reason_phrase == "Not Found"
Expand Down
147 changes: 144 additions & 3 deletions apps/playlists/tests/integration/test_endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,14 @@
import pytest
from rest_framework import status

from ...models import AnimeListItem
from ...choices import AnimeStatusChoices
from ..factories import AnimeListFactory, AnimeListItemFactory
from ...models import AnimeListItem, MangaListItem
from ...choices import AnimeStatusChoices, MangaStatusChoices
from ..factories import (
AnimeListFactory,
AnimeListItemFactory,
MangaListFactory,
MangaListItemFactory,
)


@pytest.mark.django_db
Expand Down Expand Up @@ -137,3 +142,139 @@ def test_delete_animelist_item(api_client_with_member_user):
assert response.status_code == status.HTTP_204_NO_CONTENT
assert response.reason_phrase == "No Content"
assert AnimeListItem.objects.filter(id=item.id).exists()


# Manga List


@pytest.mark.django_db
def test_retrieve_mangalist(member_user):
endpoint = "/api/v1/playlists/mangalist/"
response = member_user.get(endpoint)
assert response.status_code == status.HTTP_200_OK
assert response.reason_phrase == "OK"
assert "id" in response.data
assert "banner" in response.data
assert "is_public" in response.data
assert "created_at" in response.data
assert "updated_at" in response.data


@pytest.mark.django_db
def test_retrieve_mangalist_errors(anonymous_user):
endpoint = "/api/v1/playlists/mangalist/"
response = anonymous_user.get(endpoint)
assert response.status_code == status.HTTP_401_UNAUTHORIZED
assert response.reason_phrase == "Unauthorized"
assert response.data["detail"] == "Authentication credentials were not provided."


@pytest.mark.django_db
def test_partial_update_mangalist(member_user):
endpoint = "/api/v1/playlists/mangalist/"
data = {"is_public": False}
response = member_user.patch(endpoint, data, format="json")
assert response.status_code == status.HTTP_200_OK
assert response.reason_phrase == "OK"
assert not response.data["is_public"]


@pytest.mark.django_db
def test_partial_update_mangalist_errors(member_user):
endpoint = "/api/v1/playlists/mangalist/"
data = {"is_public": "String field"}
response = member_user.patch(endpoint, data, format="json")
assert response.status_code == status.HTTP_400_BAD_REQUEST
assert response.reason_phrase == "Bad Request"
assert response.data["is_public"][0] == "Must be a valid boolean."


@pytest.mark.django_db
def test_list_mangalist_item(member_user):
endpoint = "/api/v1/playlists/mangalist/mangas/"
response = member_user.get(endpoint)
assert response.status_code == status.HTTP_204_NO_CONTENT
assert response.reason_phrase == "No Content"
assert response.data["detail"] == "Your mangalist is empty."


@pytest.mark.django_db
def test_create_mangalist_item(member_user, manga_list_item, manga):
endpoint = "/api/v1/playlists/mangalist/mangas/"
data = {
"manga_id": manga.id,
"status": manga_list_item.status,
"volumes_read": manga_list_item.volumes_read,
"chapters_read": manga_list_item.chapters_read,
"score": manga_list_item.score,
"start_date": manga_list_item.start_date,
"finish_date": manga_list_item.finish_date,
"priority": manga_list_item.priority,
"storage": manga_list_item.storage,
"times_reread": manga_list_item.times_reread,
"notes": manga_list_item.notes,
"order": manga_list_item.order,
"is_read": manga_list_item.is_read,
"is_favorite": manga_list_item.is_favorite,
}
response = member_user.post(endpoint, data, format="multipart")
assert response.status_code == status.HTTP_201_CREATED
assert response.reason_phrase == "Created"
assert str(response.data["manga_id"]) == str(manga.id)
response = member_user.get(endpoint)
assert response.status_code == status.HTTP_200_OK
assert response.reason_phrase == "OK"


@pytest.mark.django_db
def test_retrieve_mangalist_item(api_client_with_member_user):
api_client, user = api_client_with_member_user
mangalist = MangaListFactory.create(user=user)
item = MangaListItemFactory.create(mangalist_id=mangalist)
endpoint = f"/api/v1/playlists/mangalist/mangas/{item.id}/"
response = api_client.get(endpoint)
assert response.status_code == status.HTTP_200_OK
assert response.reason_phrase == "OK"
assert "id" in response.data
assert "manga_id" in response.data
assert "status" in response.data
assert "volumes_read" in response.data
assert "chapters_read" in response.data
assert "score" in response.data
assert "start_date" in response.data
assert "finish_date" in response.data
assert "tags" in response.data
assert "priority" in response.data
assert "storage" in response.data
assert "times_reread" in response.data
assert "notes" in response.data
assert "order" in response.data
assert "is_read" in response.data
assert "is_favorite" in response.data
assert "created_at" in response.data
assert "updated_at" in response.data


@pytest.mark.django_db
def test_partial_update_mangalist_item(api_client_with_member_user):
api_client, user = api_client_with_member_user
mangalist = MangaListFactory.create(user=user)
item = MangaListItemFactory.create(mangalist_id=mangalist)
endpoint = f"/api/v1/playlists/mangalist/mangas/{item.id}/"
data = {"status": "reading"}
response = api_client.patch(endpoint, data, format="json")
assert response.status_code == status.HTTP_200_OK
assert response.reason_phrase == "OK"
assert response.data["status"] == MangaStatusChoices.READING


@pytest.mark.django_db
def test_delete_mangalist_item(api_client_with_member_user):
api_client, user = api_client_with_member_user
mangalist = MangaListFactory.create(user=user)
item = MangaListItemFactory.create(mangalist_id=mangalist)
endpoint = f"/api/v1/playlists/mangalist/mangas/{item.id}/"
response = api_client.delete(endpoint)
assert response.status_code == status.HTTP_204_NO_CONTENT
assert response.reason_phrase == "No Content"
assert MangaListItem.objects.filter(id=item.id).exists()
Loading

0 comments on commit 4428d34

Please sign in to comment.