diff --git a/setup.cfg b/setup.cfg index bc8f206..2dab461 100644 --- a/setup.cfg +++ b/setup.cfg @@ -24,7 +24,7 @@ ignore_errors = True [tool:pytest] -DJANGO_SETTINGS_MODULE=src.config.settings.test +DJANGO_SETTINGS_MODULE=config.settings.base norecursedirs = .git __pycache__ migrations template addopts = -s filterwarnings = diff --git a/v2/src/blog/api/__init__.py b/v2/src/blog/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2/src/blog/api/serializers.py b/v2/src/blog/api/serializers.py new file mode 100644 index 0000000..1205e9d --- /dev/null +++ b/v2/src/blog/api/serializers.py @@ -0,0 +1,19 @@ +from blog.models import Post +from rest_framework.serializers import ModelSerializer, SerializerMethodField + + +class PostSerializers(ModelSerializer): + author = SerializerMethodField() + + def get_author(self, post): + return post.author.username + + class Meta: + model = Post + fields = [ + "author", + "title", + "text", + "created_date", + "published_date", + ] diff --git a/v2/src/blog/api/urls.py b/v2/src/blog/api/urls.py new file mode 100644 index 0000000..d1485c5 --- /dev/null +++ b/v2/src/blog/api/urls.py @@ -0,0 +1,7 @@ +from django.urls import path + +from .views import PostRetrieveListView + +urlpatterns = [ + path("", PostRetrieveListView.as_view(), name="retrieve_post_list"), +] diff --git a/v2/src/blog/api/views.py b/v2/src/blog/api/views.py new file mode 100644 index 0000000..2029d9b --- /dev/null +++ b/v2/src/blog/api/views.py @@ -0,0 +1,14 @@ +from blog.models import Post +from django.utils import timezone +from rest_framework.response import Response +from rest_framework.status import HTTP_200_OK +from rest_framework.views import APIView + +from .serializers import PostSerializers + + +class PostRetrieveListView(APIView): + def get(self, request): + post = Post.objects.filter(published_date__lte=timezone.now()).order_by("published_date") + serialize = PostSerializers(post, many=True) + return Response({"posts": serialize.data}, status=HTTP_200_OK) diff --git a/v2/src/config/urls.py b/v2/src/config/urls.py index 4295eb5..16050cb 100644 --- a/v2/src/config/urls.py +++ b/v2/src/config/urls.py @@ -14,8 +14,6 @@ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import include, path -urlpatterns = [ - path("admin/", admin.site.urls), -] +urlpatterns = [path("admin/", admin.site.urls), path("api/posts/", include("blog.api.urls"))] diff --git a/v2/src/tests/post/test_post.py b/v2/src/tests/post/test_post.py index f74db64..aed8284 100644 --- a/v2/src/tests/post/test_post.py +++ b/v2/src/tests/post/test_post.py @@ -4,6 +4,7 @@ from django.contrib.auth.models import User from django.test import TestCase from django.urls import reverse +from rest_framework.status import HTTP_200_OK class TestPostMixin: @@ -24,24 +25,45 @@ def setUp(self): super().setUp() def test_list_with_count(self): + # Given: 10개의 publish한 post를 생성한다. for i in range(10): post = self._create_post(author=self.author, title=f"test title-{i}", text=f"test text-{i}") post.publish() + + # When: retrieve post list api 호출 response = self.client.get(reverse("retrieve_post_list")) + + # Then: 상태코드는 200이다. + self.assertEqual(response.status_code, HTTP_200_OK) + # And: 10개의 post 데이터를 리턴한다. response_data = json.loads(response.content)["posts"] self.assertEqual(len(response_data), 10) def test_list_with_published_post(self): + # Given: publish한 post를 1개 생성한다. post = self._create_post(author=self.author, title="test title", text="test text") post.publish() + + # When: retrieve post list api 호출 response = self.client.get(reverse("retrieve_post_list")) + + # Then: 상태코드는 200이다. + self.assertEqual(response.status_code, HTTP_200_OK) + # And: posts의 개수는 1개이며 post의 정보를 가지고있다. response_data = json.loads(response.content)["posts"] self.assertEqual(response_data[0]["title"], "test title") self.assertEqual(response_data[0]["text"], "test text") - self.assertEqual(response_data[0]["author"], self.author.id) + self.assertEqual(response_data[0]["author"], self.author.username) def test_list_with_no_published_post(self): + # Given: publish하지 않은 1개의 post를 생성한다. self._create_post(author=self.author, title="test title", text="test text") + + # When: retrieve post list api 호출 response = self.client.get(reverse("retrieve_post_list")) + + # Then: 상태코드는 200이다. + self.assertEqual(response.status_code, HTTP_200_OK) + # And: publish를 하지 않았기 때문에 posts의 개수는 0개이다. response_data = json.loads(response.content)["posts"] self.assertEqual(len(response_data), 0)