Skip to content

Commit b9a9465

Browse files
committed
Add is_unavailable to DependencySerializer
Add the is_unavailable status to the DependencySerializer. Use SerializerMethodField and implement a function to fetch the is_unavailable value from the PackageVersion model. Implement tests for the endpoint using the serializer. The tests should verify that the field is present and correctly reflects the result of the is_unavailable function. Refs. TS-2276
1 parent 7c30846 commit b9a9465

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

django/thunderstore/api/cyberstorm/tests/test_package_listing.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from datetime import datetime
22
from typing import Optional
3+
from unittest.mock import Mock, patch
34

45
import pytest
56
from rest_framework.test import APIClient
@@ -9,11 +10,13 @@
910
get_custom_package_listing,
1011
)
1112
from thunderstore.community.factories import (
13+
Community,
1214
CommunityFactory,
1315
PackageCategoryFactory,
1416
PackageListingFactory,
1517
)
1618
from thunderstore.repository.factories import (
19+
NamespaceFactory,
1720
PackageRatingFactory,
1821
PackageVersionFactory,
1922
TeamMemberFactory,
@@ -334,3 +337,39 @@ def test_dependency_serializer__when_dependency_is_not_active__censors_icon_and_
334337

335338
def _date_to_z(value: datetime) -> str:
336339
return value.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
340+
341+
342+
@pytest.mark.django_db
343+
@pytest.mark.parametrize("return_val", [True, False])
344+
@patch("thunderstore.repository.models.package_version.PackageVersion.is_unavailable")
345+
def test_package_listing_is_unavailable(
346+
is_unavailable_func: Mock,
347+
return_val: bool,
348+
api_client: APIClient,
349+
community: Community,
350+
) -> None:
351+
is_unavailable_func.return_value = return_val
352+
353+
package = "Mod"
354+
target_ns = NamespaceFactory()
355+
356+
target_dependency = PackageListingFactory(
357+
community_=community,
358+
package_kwargs={"name": package, "namespace": target_ns},
359+
)
360+
361+
target_package = PackageListingFactory(community_=community)
362+
target_package.package.latest.dependencies.set(
363+
[target_dependency.package.latest.id],
364+
)
365+
366+
community_id = target_package.community.identifier
367+
namespace = target_package.package.namespace.name
368+
package_name = target_package.package.name
369+
370+
url = f"/api/cyberstorm/listing/{community_id}/{namespace}/{package_name}/"
371+
response = api_client.get(url)
372+
response_dependencies = response.json()["dependencies"][0]
373+
374+
assert "is_unavailable" in response_dependencies
375+
assert response_dependencies["is_unavailable"] == return_val

django/thunderstore/api/cyberstorm/views/package_listing.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from thunderstore.community.models.package_listing import PackageListing
2424
from thunderstore.repository.models.package import get_package_dependants
2525
from thunderstore.repository.models.package_version import PackageVersion
26+
from thunderstore.community.models.community import Community
2627

2728

2829
class DependencySerializer(serializers.Serializer):
@@ -44,6 +45,7 @@ class DependencySerializer(serializers.Serializer):
4445
name = serializers.CharField()
4546
namespace = serializers.CharField(source="package.namespace.name")
4647
version_number = serializers.CharField()
48+
is_unavailable = serializers.SerializerMethodField()
4749

4850
def get_description(self, obj: PackageVersion) -> str:
4951
return (
@@ -55,6 +57,13 @@ def get_description(self, obj: PackageVersion) -> str:
5557
def get_icon_url(self, obj: PackageVersion) -> Optional[str]:
5658
return obj.icon.url if obj.is_effectively_active else None
5759

60+
def get_is_unavailable(self, obj: PackageVersion) -> bool:
61+
community = Community.objects.filter(
62+
identifier=obj.community_identifier
63+
).first()
64+
65+
return obj.is_unavailable(community)
66+
5867

5968
class TeamSerializer(serializers.Serializer):
6069
"""

0 commit comments

Comments
 (0)