Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sh-52 add post create by drf #53

Open
wants to merge 1 commit into
base: homework-sh
Choose a base branch
from
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
16 changes: 16 additions & 0 deletions v2/src/blog/serializers.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from django.contrib.auth.models import User
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer

from .models import Post
Expand All @@ -7,3 +9,17 @@ class PostSerializer(ModelSerializer):
class Meta:
model = Post
fields = "__all__"

def validate(self, data):
try:
pass
except User.DoesNotExist as author_not_exist:
raise serializers.ValidationError("author를 찾을 수 없습니다.") from author_not_exist

if not data["title"]:
raise serializers.ValidationError("title이 없습니다.")

if not data["text"]:
raise serializers.ValidationError("text가 없습니다.")

return data
7 changes: 7 additions & 0 deletions v2/src/blog/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.urls import path

from . import views

urlpatterns = [
path("posts/", views.PostListCreate.as_view(), name="post_list_create"),
]
29 changes: 29 additions & 0 deletions v2/src/blog/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from django.utils import timezone
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

from .models import Post
from .serializers import PostSerializer


class PostListCreate(APIView):
def get(self, request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by("published_date")
serializer = PostSerializer(posts, many=True)
return Response({"posts": serializer.data})

def post(self, request):
serializer = PostSerializer(data=request.data)

if serializer.is_valid():
serializer.save()
return Response({"post": serializer.data}, status=status.HTTP_201_CREATED)
else:
for key in serializer.errors:
if key == "author":
return Response({"message": "author를 찾을 수 없습니다."}, status=status.HTTP_404_NOT_FOUND)
elif key == "title":
return Response({"message": "title이 없습니다."}, status=status.HTTP_400_BAD_REQUEST)
elif key == "text":
return Response({"message": "text가 없습니다."}, status=status.HTTP_400_BAD_REQUEST)
Comment on lines +23 to +29
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

validationError를 message로 직접 사용하는 방법은 없나요??

70 changes: 64 additions & 6 deletions v2/src/tests/post/test_post.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# import json
import json

from blog.models import Post
from django.contrib.auth.models import User
from django.test import TestCase

# from django.urls import reverse
from django.urls import reverse
from rest_framework import status


class TestPostMixin:
Expand All @@ -20,6 +20,64 @@ def _create_author(username, password):
return User.objects.create_superuser(username=username, password=password)


class Test(TestPostMixin, TestCase):
def test_temp(self):
self.assertEqual(1, 1)
class TestPostCreate(TestPostMixin, TestCase):
def setUp(self):
super().setUp()

def test_post_create(self):
# Given: 유효한 request body 값이 주어질 때,
request_body = {"author": self.author.id, "title": "test title", "text": "test text"}

# When: post 생성 api를 호출하면,
response = self.client.post(reverse("post_list_create"), data=request_body)

# Then: 상태코드는 201 이고, Post의 개수는 1개이다
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Post.objects.all().count(), 1)
# And: 응답 값에서 생성된 post의 title과 text를 리턴한다
response = json.loads(response.content)["post"]
self.assertEqual(response["title"], "test title")
self.assertEqual(response["text"], "test text")

def test_post_create_with_error_on_404(self):
# Given: 유효하지 않은 author_id가 주어질 때,
invalid_author_id = 123123123
request_body = {"author": invalid_author_id, "title": "test title", "text": "test text"}

# When: post 생성 api를 호출하면,
response = self.client.post(reverse("post_list_create"), data=request_body)

# Then: 상태코드는 404이고, Post의 개수는 0개이다.
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
self.assertEqual(Post.objects.all().count(), 0)
# And: 응답 값으로 "author를 찾을 수 없습니다."를 리턴한다
response = json.loads(response.content)
self.assertEqual(response["message"], "author를 찾을 수 없습니다.")

def test_post_create_without_title(self):
# Given: title이 없을 때
request_body = {"author": self.author.id, "title": "", "text": "test text"}

# When: post 생성 api 호출
response = self.client.post(reverse("post_list_create"), data=request_body)

# then: 상태코드 400
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

# And: 응답 값으로 "title이 없습니다." 리턴.
response = json.loads(response.content)
self.assertEqual(response["message"], "title이 없습니다.")

def test_post_create_without_text(self):
# Given: text가 없을 때
request_body = {"author": self.author.id, "title": "text title", "text": ""}

# When: post 생성 api 호출
response = self.client.post(reverse("post_list_create"), data=request_body)

# then: 상태코드 400
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

# And: 응답 값으로 "text가 없습니다." 리턴.
response = json.loads(response.content)
self.assertEqual(response["message"], "text가 없습니다.")