diff --git a/v2/src/blog/serializers.py b/v2/src/blog/serializers.py index 3aaabe9..3a5135a 100644 --- a/v2/src/blog/serializers.py +++ b/v2/src/blog/serializers.py @@ -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 @@ -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 diff --git a/v2/src/blog/urls.py b/v2/src/blog/urls.py index e69de29..00a92cd 100644 --- a/v2/src/blog/urls.py +++ b/v2/src/blog/urls.py @@ -0,0 +1,7 @@ +from django.urls import path + +from . import views + +urlpatterns = [ + path("posts/", views.PostListCreate.as_view(), name="post_list_create"), +] diff --git a/v2/src/blog/views.py b/v2/src/blog/views.py index e69de29..14980b6 100644 --- a/v2/src/blog/views.py +++ b/v2/src/blog/views.py @@ -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) diff --git a/v2/src/tests/post/test_post.py b/v2/src/tests/post/test_post.py index 0336f47..31f1bc3 100644 --- a/v2/src/tests/post/test_post.py +++ b/v2/src/tests/post/test_post.py @@ -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: @@ -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가 없습니다.")