From e3c8f3cb88b23a8a3ee1bccce76ab19e9080d2da Mon Sep 17 00:00:00 2001 From: jrhong95 Date: Mon, 12 Jul 2021 17:08:04 +0900 Subject: [PATCH 1/8] Add retrieve_comment_list test with comment count --- .../step2/sehwa/djangogirls/blog/api/urls.py | 7 +++-- .../step2/sehwa/djangogirls/blog/tests.py | 29 ++++++++++++++++++- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/urls.py b/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/urls.py index 46de861..d394387 100644 --- a/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/urls.py +++ b/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/urls.py @@ -5,7 +5,8 @@ urlpatterns = [ path("posts/", views.retrieve_post_list, name="retrieve_post_list"), path("posts/", views.retrieve_post_detail, name="retrieve_post_detail"), - path("posts/create", views.create_post, name="create_post"), - path("posts//put/update", views.update_post_with_put, name="update_post_with_put"), - path("posts//delete", views.delete_post, name="delete_post") + # path("posts/create", views.create_post, name="create_post"), + # path("posts//put/update", views.update_post_with_put, name="update_post_with_put"), + # path("posts//delete", views.delete_post, name="delete_post") + path("comments/", views.retrieve_comment_list, name="retrieve_comment_list"), ] diff --git a/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py b/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py index 280ed10..350a25e 100644 --- a/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py +++ b/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py @@ -5,7 +5,7 @@ from django.test import TestCase from django.urls import reverse -from .models import Post +from .models import Post, Comment class TestPostMixin: @@ -20,7 +20,12 @@ def _create_post(author, title, text): def _create_author(username, password): return User.objects.create_superuser(username=username, password=password) + @staticmethod + def _create_comment_on_post(post, author, text): + return Comment.objects.create(post=post, author=author, text=text) + +"""띄어쓰기 ㄴㄴ class TestPostList(TestPostMixin, TestCase): def setUp(self): super().setUp() @@ -243,3 +248,25 @@ def test_delete_post_with_invalid_author_id(self): # And: 응답 메세지가 유효하지 않은 사용자 id입니다. 여야 한다. response = json.loads(response.content) self.assertEqual(response["message"], "유효하지 않은 사용자 id입니다.") +""" + + +class TestCommentList(TestPostMixin, TestCase): + def setUp(self): + super().setUp() + self.post = self._create_post(self.author, "test", "test text") + + def test_comment_list_on_valid_post_with_comment_count_(self): + # Given: 정상적으로 생성된 comment 10개, 올바른 post id + post_id = self.post.id + comment_count = 10 + for i in range(comment_count): + comment = self._create_comment_on_post(self.post, f"author{i}", f"comment{i}") + comment.approve() + + # When: retrieve_comment_list api 실행 + response = self.client.get(reverse("retrieve_comment_list", kwargs={"post_id": post_id})) + + # Then: 실행결과 200, 댓글 갯수 10개여야 함. + response = json.loads(response.content) + self.assertEqual(comment_count, len(response["data"])) From 628508086b518bc04d1e5f5f9164f9d84e2e7062 Mon Sep 17 00:00:00 2001 From: jrhong95 Date: Mon, 12 Jul 2021 17:08:54 +0900 Subject: [PATCH 2/8] Add retrieve_comment_list API --- .../step2/sehwa/djangogirls/blog/api/views.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/views.py b/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/views.py index fec4c4c..a9396ee 100644 --- a/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/views.py +++ b/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/views.py @@ -4,13 +4,11 @@ from django.views.decorators.http import require_http_methods from django.contrib.auth.models import User -from blog.models import Post +from blog.models import Post, Comment def retrieve_post_list(request): - posts = Post.objects.filter(published_date__lte=timezone.now()).order_by( - "published_date" - ) + posts = Post.objects.filter(published_date__lte=timezone.now()).order_by("published_date") post_list = [ { @@ -43,3 +41,15 @@ def retrieve_post_detail(request, id): }, status=200, ) + + +def retrieve_comment_list(request, post_id): + try: + post = Post.objects.get(pk=post_id) + except Post.DoesNotExist: + return JsonResponse({"message": "post가 없습니다."}, status=404) + + comments = Comment.objects.filter(post=post, created_date__lte=timezone.now()).order_by("created_date") + comment_list = [{"author": comment.author, "text": comment.text} for comment in comments] + + return JsonResponse({"data": comment_list}) From c2dd46b1efc73f990c0aaffcc0a5c2919ae2e377 Mon Sep 17 00:00:00 2001 From: jrhong95 Date: Mon, 12 Jul 2021 17:12:03 +0900 Subject: [PATCH 3/8] Rename comment count test --- django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py b/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py index 350a25e..b9e4e9c 100644 --- a/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py +++ b/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py @@ -256,7 +256,7 @@ def setUp(self): super().setUp() self.post = self._create_post(self.author, "test", "test text") - def test_comment_list_on_valid_post_with_comment_count_(self): + def test_comment_list_on_valid_post_with_comment_count(self): # Given: 정상적으로 생성된 comment 10개, 올바른 post id post_id = self.post.id comment_count = 10 From 89e92b920049d4bf78f2625fb60d4b7fe7ed1314 Mon Sep 17 00:00:00 2001 From: jrhong95 Date: Mon, 12 Jul 2021 17:23:30 +0900 Subject: [PATCH 4/8] Add retrieve_comment_list test with invalid postid --- .../step2/sehwa/djangogirls/blog/tests.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py b/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py index b9e4e9c..9a85595 100644 --- a/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py +++ b/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py @@ -257,7 +257,7 @@ def setUp(self): self.post = self._create_post(self.author, "test", "test text") def test_comment_list_on_valid_post_with_comment_count(self): - # Given: 정상적으로 생성된 comment 10개, 올바른 post id + # Given: 정상적으로 생성된 comment 10개, 유효한 post id post_id = self.post.id comment_count = 10 for i in range(comment_count): @@ -270,3 +270,17 @@ def test_comment_list_on_valid_post_with_comment_count(self): # Then: 실행결과 200, 댓글 갯수 10개여야 함. response = json.loads(response.content) self.assertEqual(comment_count, len(response["data"])) + + def test_comment_list_on_invalid_post(self): + # Given: 유효하지 않은 post id + invalid_post_id = 9876 + + # When: retrieve_comment_list api 실행 + response = self.client.get(reverse("retrieve_comment_list", kwargs={"post_id": invalid_post_id})) + + # Then: 실행결과 404여야 함. + self.assertEqual(response.status_code, 404) + + # And: 메세지 응답이 post가 없습니다. 여야 함. + response = json.loads(response.content) + self.assertAlmostEqual(response["message"], "post가 없습니다.") From a197a6a4c7264bfe0e1196bff3c020c552629738 Mon Sep 17 00:00:00 2001 From: jrhong95 Date: Mon, 12 Jul 2021 17:27:21 +0900 Subject: [PATCH 5/8] Delete tests.py remark --- .../step2/sehwa/djangogirls/blog/tests.py | 49 +++++++++---------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py b/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py index 9a85595..73d1cd1 100644 --- a/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py +++ b/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py @@ -25,25 +25,20 @@ def _create_comment_on_post(post, author, text): return Comment.objects.create(post=post, author=author, text=text) -"""띄어쓰기 ㄴㄴ class TestPostList(TestPostMixin, TestCase): def setUp(self): super().setUp() def test_list_with_count(self): for i in range(10): - post = self._create_post( - author=self.author, title=f"test title-{i}", text=f"test text-{i}" - ) + 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")) response_data = json.loads(response.content)["posts"] self.assertEqual(len(response_data), 10) def test_list_with_published_post(self): - post = self._create_post( - author=self.author, title="test title", text="test text" - ) + post = self._create_post(author=self.author, title="test title", text="test text") post.publish() response = self.client.get(reverse("retrieve_post_list")) response_data = json.loads(response.content)["posts"] @@ -63,9 +58,7 @@ def setUp(self): super().setUp() def test_post_detail(self): - post = self._create_post( - author=self.author, title="test title", text="test text" - ) + post = self._create_post(author=self.author, title="test title", text="test text") post.publish() response = self.client.get(reverse("retrieve_post_detail", kwargs={"id": 1})) response_data = json.loads(response.content)["post"] @@ -123,10 +116,14 @@ def setUp(self): def test_post_update_with_put(self): # Given: 업데이트 하기 위한 유효한 request body 값이 주어지고, - request_body_for_put_update = json.dumps({"author": self.author.id, "title": "test test title", "text": "test test text"}) + request_body_for_put_update = json.dumps( + {"author": self.author.id, "title": "test test title", "text": "test test text"} + ) # When: 1번 post에 대한 업데이트 api를 호출 할 때, - response = self.client.put(reverse("update_post_with_put", kwargs={"id": self.post.id}), data=request_body_for_put_update) + response = self.client.put( + reverse("update_post_with_put", kwargs={"id": self.post.id}), data=request_body_for_put_update + ) # Then: 상태코드는 200이고, self.assertEqual(response.status_code, 200) @@ -140,15 +137,17 @@ def test_post_update_with_put(self): self.assertEqual(response["title"], "test test title") self.assertEqual(response["text"], "test test text") - def test_post_update_with_error_with_author_on_404(self): # Given: 업데이트 하기 위한 유효하지 않은 author_id 값이 주어지고, invalid_author_id = 123123123 request_body_for_put_update = json.dumps( - {"author": invalid_author_id, "title": "test test title", "text": "test test text"}) + {"author": invalid_author_id, "title": "test test title", "text": "test test text"} + ) # When: 1번 post에 대한 업데이트 api를 호출 할 때, - response = self.client.put(reverse("update_post_with_put", kwargs={"id": self.post.id}), data=request_body_for_put_update) + response = self.client.put( + reverse("update_post_with_put", kwargs={"id": self.post.id}), data=request_body_for_put_update + ) # Then: 상태코드는 404이고, self.assertEqual(response.status_code, 404) @@ -164,11 +163,14 @@ def test_post_update_with_error_with_author_on_404(self): def test_post_update_with_error_with_post_on_404(self): # Given: 업데이트 하기 위한 유효하지 않은 post_id 값이 주어지고, request_body_for_put_update = json.dumps( - {"author": self.author.id, "title": "test test title", "text": "test test text"}) + {"author": self.author.id, "title": "test test title", "text": "test test text"} + ) invalid_post_id = 12345 # When: # When: 유효하지 않은 post에 대한 업데이트 api를 호출 할 때, - response = self.client.put(reverse("update_post_with_put", kwargs={"id": invalid_post_id}), data=request_body_for_put_update) + response = self.client.put( + reverse("update_post_with_put", kwargs={"id": invalid_post_id}), data=request_body_for_put_update + ) # Then: 상태코드는 404이고, self.assertEqual(response.status_code, 404) @@ -193,9 +195,7 @@ def test_delete_post(self): post_id = self.post.id # When: delete_post api 실행. - response = self.client.delete( - reverse("delete_post", kwargs={"id": post_id}), data=request_body - ) + response = self.client.delete(reverse("delete_post", kwargs={"id": post_id}), data=request_body) # Then: 실행 결과 상태코드 200 return. self.assertEqual(response.status_code, 200) @@ -209,9 +209,7 @@ def test_delete_post_with_invalid_post_id(self): invalid_post_id = 9999999 # When: delete_post api 실행. - response = self.client.delete( - reverse("delete_post", kwargs={"id": invalid_post_id}), data=request_body - ) + response = self.client.delete(reverse("delete_post", kwargs={"id": invalid_post_id}), data=request_body) # Then: 실행결과 상태코드 403 여야 한다. self.assertEqual(response.status_code, 403) @@ -233,9 +231,7 @@ def test_delete_post_with_invalid_author_id(self): post_id = self.post.id # When: delete_post api 실행. - response = self.client.delete( - reverse("delete_post", kwargs={"id": post_id}), data=invalid_request_body - ) + response = self.client.delete(reverse("delete_post", kwargs={"id": post_id}), data=invalid_request_body) # Then: 실행결과 상태코드 404 여야 한다. self.assertEqual(response.status_code, 404) @@ -248,7 +244,6 @@ def test_delete_post_with_invalid_author_id(self): # And: 응답 메세지가 유효하지 않은 사용자 id입니다. 여야 한다. response = json.loads(response.content) self.assertEqual(response["message"], "유효하지 않은 사용자 id입니다.") -""" class TestCommentList(TestPostMixin, TestCase): From 956e561075d65b18b84462f9f7bb85414c0b6a66 Mon Sep 17 00:00:00 2001 From: jrhong95 Date: Mon, 12 Jul 2021 20:24:18 +0900 Subject: [PATCH 6/8] Add comment create test and list api to CBV --- .../step2/sehwa/djangogirls/blog/api/urls.py | 2 +- .../step2/sehwa/djangogirls/blog/tests.py | 33 ++++++++++++++++--- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/urls.py b/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/urls.py index d394387..aef7133 100644 --- a/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/urls.py +++ b/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/urls.py @@ -8,5 +8,5 @@ # path("posts/create", views.create_post, name="create_post"), # path("posts//put/update", views.update_post_with_put, name="update_post_with_put"), # path("posts//delete", views.delete_post, name="delete_post") - path("comments/", views.retrieve_comment_list, name="retrieve_comment_list"), + path("posts//comments", views.CommentListCreate.as_view(), name="comment_list_create"), ] diff --git a/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py b/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py index 73d1cd1..6eec667 100644 --- a/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py +++ b/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py @@ -259,19 +259,19 @@ def test_comment_list_on_valid_post_with_comment_count(self): comment = self._create_comment_on_post(self.post, f"author{i}", f"comment{i}") comment.approve() - # When: retrieve_comment_list api 실행 - response = self.client.get(reverse("retrieve_comment_list", kwargs={"post_id": post_id})) + # When: comment_list_create api get 실행 + response = self.client.get(reverse("comment_list_create", kwargs={"post_id": post_id})) # Then: 실행결과 200, 댓글 갯수 10개여야 함. response = json.loads(response.content) self.assertEqual(comment_count, len(response["data"])) - def test_comment_list_on_invalid_post(self): + def test_comment_list_on_invalid_post_id(self): # Given: 유효하지 않은 post id invalid_post_id = 9876 - # When: retrieve_comment_list api 실행 - response = self.client.get(reverse("retrieve_comment_list", kwargs={"post_id": invalid_post_id})) + # When: comment_list_create api get 실행 + response = self.client.get(reverse("comment_list_create", kwargs={"post_id": invalid_post_id})) # Then: 실행결과 404여야 함. self.assertEqual(response.status_code, 404) @@ -279,3 +279,26 @@ def test_comment_list_on_invalid_post(self): # And: 메세지 응답이 post가 없습니다. 여야 함. response = json.loads(response.content) self.assertAlmostEqual(response["message"], "post가 없습니다.") + + +class TestCommentCreate(TestPostMixin, TestCase): + def setUp(self): + super().setUp() + self.post = self._create_post(self.author, "test", "test") + + def test_comment_create(self): + # Given: 유효한 post id, comment data + post_id = self.post.id + request_body = {"author": "test author", "text": "test text"} + + # When: comment_list_create api post 실행 + response = self.client.post(reverse("comment_list_create", kwargs={"post_id": post_id}), data=request_body) + + # Then: 정상적으로 등록. 상태코드 201 + self.assertEqual(response.status_code, 201) + + # And: 응답에서 comment의 post id, author, text를 리턴. + response = json.loads(response.content)["data"] + self.assertEqual(response["post_id"], post_id) + self.assertEqual(response["author"], "test author") + self.assertEqual(response["text"], "test text") From 2c19f8e28e66a69cb348b27efea66c0de1267c11 Mon Sep 17 00:00:00 2001 From: jrhong95 Date: Mon, 12 Jul 2021 20:40:43 +0900 Subject: [PATCH 7/8] Add test comment create with errors --- .../step2/sehwa/djangogirls/blog/tests.py | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py b/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py index 6eec667..3a06cf1 100644 --- a/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py +++ b/django_girls_tutorial/step2/sehwa/djangogirls/blog/tests.py @@ -278,7 +278,7 @@ def test_comment_list_on_invalid_post_id(self): # And: 메세지 응답이 post가 없습니다. 여야 함. response = json.loads(response.content) - self.assertAlmostEqual(response["message"], "post가 없습니다.") + self.assertEqual(response["message"], "post가 없습니다.") class TestCommentCreate(TestPostMixin, TestCase): @@ -302,3 +302,54 @@ def test_comment_create(self): self.assertEqual(response["post_id"], post_id) self.assertEqual(response["author"], "test author") self.assertEqual(response["text"], "test text") + + def test_comment_create_with_invalid_post_id(self): + # Given: 유효하지 않은 post id + invalid_post_id = 9876 + request_body = {"author": "test author", "text": "test text"} + + # When: comment_list_create api post 실행 + response = self.client.post( + reverse("comment_list_create", kwargs={"post_id": invalid_post_id}), data=request_body + ) + + # Then: comment 등록 실패, 상태코드 404 + self.assertEqual(response.status_code, 404) + + # And: 메세지 응답이 post가 없습니다. 여야 함. + response = json.loads(response.content) + self.assertEqual(response["message"], "post가 없습니다.") + + def test_comment_create_without_author(self): + # Given: author를 입력받지 않음. + post_id = self.post.id + invalid_request_body = {"author": "", "text": "test text"} + + # When: comment_list_create api post 실행 + response = self.client.post( + reverse("comment_list_create", kwargs={"post_id": post_id}), data=invalid_request_body + ) + + # Then: comment 등록 실패, 상태코드 400 + self.assertEqual(response.status_code, 400) + + # And: 메세지 응답이 author가 없습니다. 여야 함. + response = json.loads(response.content) + self.assertEqual(response["message"], "author가 없습니다.") + + def test_comment_create_without_text(self): + # Given: text를 입력받지 않음. + post_id = self.post.id + invalid_request_body = {"author": "test author", "text": ""} + + # When: comment_list_create api post 실행 + response = self.client.post( + reverse("comment_list_create", kwargs={"post_id": post_id}), data=invalid_request_body + ) + + # Then: comment 등록 실패, 상태코드 400 + self.assertEqual(response.status_code, 400) + + # And: 메세지 응답이 text가 없습니다. 여야 함. + response = json.loads(response.content) + self.assertEqual(response["message"], "text가 없습니다.") From b053a63f2d112e1fa61a7aef4a2edfd3a9942c4a Mon Sep 17 00:00:00 2001 From: jrhong95 Date: Mon, 12 Jul 2021 20:41:30 +0900 Subject: [PATCH 8/8] Add post method in CommentListCreate --- .../step2/sehwa/djangogirls/blog/api/views.py | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/views.py b/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/views.py index a9396ee..e274b24 100644 --- a/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/views.py +++ b/django_girls_tutorial/step2/sehwa/djangogirls/blog/api/views.py @@ -1,6 +1,7 @@ import json from django.http import JsonResponse from django.utils import timezone +from django.views import View from django.views.decorators.http import require_http_methods from django.contrib.auth.models import User @@ -43,13 +44,29 @@ def retrieve_post_detail(request, id): ) -def retrieve_comment_list(request, post_id): - try: - post = Post.objects.get(pk=post_id) - except Post.DoesNotExist: - return JsonResponse({"message": "post가 없습니다."}, status=404) +class CommentListCreate(View): + def get(self, request, post_id): + try: + post = Post.objects.get(pk=post_id) + except Post.DoesNotExist: + return JsonResponse({"message": "post가 없습니다."}, status=404) + + comments = Comment.objects.filter(post=post, created_date__lte=timezone.now()).order_by("created_date") + comment_list = [{"author": comment.author, "text": comment.text} for comment in comments] + + return JsonResponse({"data": comment_list}) + + def post(self, request, post_id): + try: + post = Post.objects.get(pk=post_id) + except Post.DoesNotExist: + return JsonResponse({"message": "post가 없습니다."}, status=404) - comments = Comment.objects.filter(post=post, created_date__lte=timezone.now()).order_by("created_date") - comment_list = [{"author": comment.author, "text": comment.text} for comment in comments] + body = request.POST + if not body["author"]: + return JsonResponse({"message": "author가 없습니다."}, status=400) + elif not body["text"]: + return JsonResponse({"message": "text가 없습니다."}, status=400) - return JsonResponse({"data": comment_list}) + comment = Comment.objects.create(post=post, author=body["author"], text=body["text"]) + return JsonResponse({"data": {"post_id": post.id, "author": comment.author, "text": comment.text}}, status=201)