From 287db218f1e11545711f5854fea0b18d1f5e3227 Mon Sep 17 00:00:00 2001 From: jaykayudo Date: Mon, 14 Apr 2025 17:22:21 +0100 Subject: [PATCH] feat: add accepted token list api --- Makefile | 8 +++++++ core/serializers.py | 35 +++++++++++++++++++++++++++++ core/tests/factories.py | 11 +++++++++ core/tests/test_accepted_tokens..py | 34 ++++++++++++++++++++++++++++ core/urls.py | 9 ++++++-- core/views.py | 5 +++++ 6 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 core/tests/test_accepted_tokens..py diff --git a/Makefile b/Makefile index ee0d4ec..8f33211 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,10 @@ migrations: migrate: poetry run python manage.py migrate +# run test +test: + poetry run python manage.py test + # start database database-up: docker compose up trajectfi_db -d @@ -60,6 +64,10 @@ docker-migrations: docker-migrate: docker compose run --rm ${service} python manage.py migrate +# run tests with docker +docker-test: + docker compose run --rm ${service} python manage.py test + # to format the codebase with docker docker-format: docker compose run --rm ${service} black . diff --git a/core/serializers.py b/core/serializers.py index d8d8a6d..9a9ff87 100644 --- a/core/serializers.py +++ b/core/serializers.py @@ -4,6 +4,17 @@ class AcceptedNFTSerializer(serializers.ModelSerializer): + """ + Serializer class for AcceptedNFT Model. + Additionally return a number of listings that uses + the nfts's contract address + + Fields: + - name + - contract_address + - listing_count + """ + listings_count = serializers.SerializerMethodField() class Meta: @@ -14,3 +25,27 @@ def get_listings_count(self, obj: models.AcceptedNFT) -> int: return models.Listing.objects.filter( nft_contract_address=obj.contract_address ).count() + + +class AcceptedTokenSerializer(serializers.ModelSerializer): + """ + Serializer class for AcceptedToken Model. + Additionally return a number of listings that uses + the token's contract address + + Fields: + - name + - contract_address + - listing_count + """ + + listings_count = serializers.SerializerMethodField() + + class Meta: + model = models.AcceptedToken + fields = ["name", "contract_address", "listings_count"] + + def get_listings_count(self, obj: models.AcceptedNFT) -> int: + return models.Listing.objects.filter( + token_contract_address=obj.contract_address + ).count() diff --git a/core/tests/factories.py b/core/tests/factories.py index faf1878..97f631b 100644 --- a/core/tests/factories.py +++ b/core/tests/factories.py @@ -14,3 +14,14 @@ class Meta: @factory.lazy_attribute def contract_address(self): return "0x" + "".join(random.choices("0123456789abcdef", k=60)) + + +class AcceptedTokenFactory(factory.django.DjangoModelFactory): + class Meta: + model = models.AcceptedToken + + name = factory.Faker("word") + + @factory.lazy_attribute + def contract_address(self): + return "0x" + "".join(random.choices("0123456789abcdef", k=60)) diff --git a/core/tests/test_accepted_tokens..py b/core/tests/test_accepted_tokens..py new file mode 100644 index 0000000..818cda3 --- /dev/null +++ b/core/tests/test_accepted_tokens..py @@ -0,0 +1,34 @@ +from django.urls import reverse +from rest_framework.test import APITestCase + +from . import factories + + +class TestAcceptedTokenListAPIView(APITestCase): + def setUp(self): + self.url = reverse("accepted-tokens-list-view") + + def test_accepted_token_list_view_successful(self): + """ + Test for the success response of the api + """ + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + + def test_accepted_token_list_view_with_data(self): + """ + Test for the success response of the api with data in the db + """ + self._generate_data() + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + data = response.json() + self.assertEqual(len(data), 3) + + def _generate_data(self): + """ + Generate mock data in the db using the factory + """ + factories.AcceptedTokenFactory() + factories.AcceptedTokenFactory() + factories.AcceptedTokenFactory() diff --git a/core/urls.py b/core/urls.py index 19a6994..8ffb363 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,4 +1,4 @@ -from django.urls import path # noqa +from django.urls import path from . import views @@ -7,5 +7,10 @@ "accepted-nfts/", views.AcceptedNFTListAPIView.as_view(), name="accepted-nfts-list-view", - ) + ), + path( + "accepted-tokens/", + views.AcceptedTokenListAPIView.as_view(), + name="accepted-tokens-list-view", + ), ] diff --git a/core/views.py b/core/views.py index 7a53eb4..c50b84b 100644 --- a/core/views.py +++ b/core/views.py @@ -7,3 +7,8 @@ class AcceptedNFTListAPIView(ListAPIView): queryset = models.AcceptedNFT.objects.all().order_by("name") serializer_class = serializers.AcceptedNFTSerializer + + +class AcceptedTokenListAPIView(ListAPIView): + queryset = models.AcceptedToken.objects.all().order_by("name") + serializer_class = serializers.AcceptedTokenSerializer