Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down
Empty file added v2/src/blog/api/__init__.py
Empty file.
19 changes: 19 additions & 0 deletions v2/src/blog/api/serializers.py
Original file line number Diff line number Diff line change
@@ -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",
]
7 changes: 7 additions & 0 deletions v2/src/blog/api/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.urls import path

from .views import PostRetrieveListView

urlpatterns = [
path("", PostRetrieveListView.as_view(), name="retrieve_post_list"),
]
14 changes: 14 additions & 0 deletions v2/src/blog/api/views.py
Original file line number Diff line number Diff line change
@@ -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)
6 changes: 2 additions & 4 deletions v2/src/config/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"))]
24 changes: 23 additions & 1 deletion v2/src/tests/post/test_post.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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)