From a6df1670c0d91c869124054114b31a7582e081cc Mon Sep 17 00:00:00 2001 From: JinHoooooou Date: Fri, 16 Jul 2021 18:37:43 +0900 Subject: [PATCH 1/7] JH-49 update setup.cfg --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 = From 78fa993a9df15e870c96d84b58b5baf619440d0e Mon Sep 17 00:00:00 2001 From: JinHoooooou Date: Fri, 16 Jul 2021 19:03:01 +0900 Subject: [PATCH 2/7] JH-49 add api urls --- v2/src/config/urls.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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"))] From ae26badc62da36f6296f9c9a36b0b9a56927d064 Mon Sep 17 00:00:00 2001 From: JinHoooooou Date: Fri, 16 Jul 2021 19:04:12 +0900 Subject: [PATCH 3/7] JH-49 add api package --- v2/src/blog/api/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 v2/src/blog/api/__init__.py diff --git a/v2/src/blog/api/__init__.py b/v2/src/blog/api/__init__.py new file mode 100644 index 0000000..e69de29 From ca894235e678fa43086c738743f5dc79bb48f22c Mon Sep 17 00:00:00 2001 From: JinHoooooou Date: Fri, 16 Jul 2021 19:10:13 +0900 Subject: [PATCH 4/7] JH-49 add retrieve_post_list api by DRF --- v2/src/blog/api/serializers.py | 14 ++++++++++++++ v2/src/blog/api/urls.py | 7 +++++++ v2/src/blog/api/views.py | 13 +++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 v2/src/blog/api/serializers.py create mode 100644 v2/src/blog/api/urls.py create mode 100644 v2/src/blog/api/views.py diff --git a/v2/src/blog/api/serializers.py b/v2/src/blog/api/serializers.py new file mode 100644 index 0000000..fd24826 --- /dev/null +++ b/v2/src/blog/api/serializers.py @@ -0,0 +1,14 @@ +from blog.models import Post +from rest_framework.serializers import ModelSerializer + + +class PostSerializers(ModelSerializer): + 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..cc1498b --- /dev/null +++ b/v2/src/blog/api/views.py @@ -0,0 +1,13 @@ +from blog.models import Post +from django.utils import timezone +from rest_framework.response import Response +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}) From 4aa8ad9d03804bf82f4bb1c4c79d12b689eec390 Mon Sep 17 00:00:00 2001 From: JinHoooooou Date: Wed, 21 Jul 2021 16:34:50 +0900 Subject: [PATCH 5/7] JH-49 modify author id to author username --- v2/src/blog/api/serializers.py | 7 ++++++- v2/src/tests/post/test_post.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/v2/src/blog/api/serializers.py b/v2/src/blog/api/serializers.py index fd24826..1205e9d 100644 --- a/v2/src/blog/api/serializers.py +++ b/v2/src/blog/api/serializers.py @@ -1,8 +1,13 @@ from blog.models import Post -from rest_framework.serializers import ModelSerializer +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 = [ diff --git a/v2/src/tests/post/test_post.py b/v2/src/tests/post/test_post.py index f74db64..796614f 100644 --- a/v2/src/tests/post/test_post.py +++ b/v2/src/tests/post/test_post.py @@ -38,7 +38,7 @@ def test_list_with_published_post(self): 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): self._create_post(author=self.author, title="test title", text="test text") From fedde09d882d1984ebafdef0a90685cd7c6ef40a Mon Sep 17 00:00:00 2001 From: JinHoooooou Date: Wed, 21 Jul 2021 16:40:25 +0900 Subject: [PATCH 6/7] JH-49 add status code to test --- v2/src/blog/api/views.py | 3 ++- v2/src/tests/post/test_post.py | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/v2/src/blog/api/views.py b/v2/src/blog/api/views.py index cc1498b..2029d9b 100644 --- a/v2/src/blog/api/views.py +++ b/v2/src/blog/api/views.py @@ -1,6 +1,7 @@ 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 @@ -10,4 +11,4 @@ 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}) + return Response({"posts": serialize.data}, status=HTTP_200_OK) diff --git a/v2/src/tests/post/test_post.py b/v2/src/tests/post/test_post.py index 796614f..135bbe7 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: @@ -28,6 +29,7 @@ def test_list_with_count(self): post = self._create_post(author=self.author, title=f"test title-{i}", text=f"test text-{i}") post.publish() response = self.client.get(reverse("retrieve_post_list")) + self.assertEqual(response.status_code, HTTP_200_OK) response_data = json.loads(response.content)["posts"] self.assertEqual(len(response_data), 10) @@ -35,6 +37,7 @@ def test_list_with_published_post(self): post = self._create_post(author=self.author, title="test title", text="test text") post.publish() response = self.client.get(reverse("retrieve_post_list")) + self.assertEqual(response.status_code, HTTP_200_OK) response_data = json.loads(response.content)["posts"] self.assertEqual(response_data[0]["title"], "test title") self.assertEqual(response_data[0]["text"], "test text") @@ -43,5 +46,6 @@ def test_list_with_published_post(self): def test_list_with_no_published_post(self): self._create_post(author=self.author, title="test title", text="test text") response = self.client.get(reverse("retrieve_post_list")) + self.assertEqual(response.status_code, HTTP_200_OK) response_data = json.loads(response.content)["posts"] self.assertEqual(len(response_data), 0) From 96b021391cf42bba549592a565858355686b7c73 Mon Sep 17 00:00:00 2001 From: JinHoooooou Date: Wed, 21 Jul 2021 16:41:09 +0900 Subject: [PATCH 7/7] JH-49 add comment Given When Then to test --- v2/src/tests/post/test_post.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/v2/src/tests/post/test_post.py b/v2/src/tests/post/test_post.py index 135bbe7..aed8284 100644 --- a/v2/src/tests/post/test_post.py +++ b/v2/src/tests/post/test_post.py @@ -25,27 +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.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)