Skip to content

Commit

Permalink
Merge pull request #57 from andela/bg-get-all-likes-of-article-165900489
Browse files Browse the repository at this point in the history
bug(liking functionality): Users should be able to see all article likes/dislikes
  • Loading branch information
abulojoshua1 committed May 9, 2019
2 parents 2467dcf + 52797cd commit 52a38df
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 6 deletions.
1 change: 1 addition & 0 deletions authors/apps/articles/tests/article_tests_base_class.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ def setUp(self):
retrieved_article.published = True
retrieved_article.save()
self.like_article_url = '/api/articles/{}/like/'.format(self.slug)
self.all_article_likes_url = '/api/articles/{}/all-likes/'.format(self.slug)
self.favorite_article_url = '/api/articles/{}/favorite/'.format(self.slug)
self.get_favorites_url = reverse('articles:get_favorites')
self.rate_url = '/api/articles/{}/rate/'.format(self.slug)
Expand Down
16 changes: 15 additions & 1 deletion authors/apps/articles/tests/test_like_dislike_article.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ def test_get_like(self):
"""Test like"""
response = self.client.get(self.like_article_url,
**self.header_user1)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
detail = "undefined"
self.assertEqual(response.data.get("is_like"), detail)
self.assertEqual(response.status_code, status.HTTP_200_OK)

self.client.post(self.like_article_url,
like_data, **self.header_user1, format='json')
Expand All @@ -43,6 +45,18 @@ def test_get_like(self):
self.assertEqual(response.data.get('detail'), detail)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

def test_get_all_likes(self):
"""Test get all likes"""
self.client.post(self.like_article_url,
like_data, **self.header_user1, format='json')
response1 = self.client.get(
self.all_article_likes_url, **self.header_user1)
self.assertEqual(response1.status_code, status.HTTP_200_OK)
# Test invalid slug
response = self.client.get('/api/articles/invalid-slug/all-likes/',
**self.header_user1)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

def test_update_like(self):
"""Test update like to dislike or vice versa"""
# test updating like that does not exist
Expand Down
2 changes: 2 additions & 0 deletions authors/apps/articles/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
name="comment"),
path('<slug:slug>/likes/',
views.GetArticleLikesView.as_view(), name="get_likes"),
path('<slug:slug>/all-likes/',
views.GetAllLikesView.as_view(), name="get_all_likes"),
path('<slug:slug>/favorite/',
views.FavoriteView.as_view(), name="favorite"),

Expand Down
31 changes: 26 additions & 5 deletions authors/apps/articles/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,17 +242,39 @@ def get(self, request, slug):
user_id=request.user.pk, article_id=article.id).first()
if like is None:
no_like = {
"detail": "This user has neither liked \
nor disliked the article."
"is_like": "undefined"
}
return Response(data=no_like, status=status.HTTP_404_NOT_FOUND)
return Response(data=no_like, status=status.HTTP_200_OK)
like_data = {"id": like.id,
"article_id": like.article_id.id,
"user_id": like.user_id.id
"user_id": like.user_id.id,
"is_like": like.is_like
}
return Response(data=like_data, status=status.HTTP_200_OK)


class GetAllLikesView(generics.RetrieveAPIView):
"""Fetch like or dislike for an article"""
permission_classes = (AllowAny,)
queryset = Like.objects.all()

def get(self, request, slug):
article = Article.objects.filter(
slug=slug, published=True, activated=True).first()
if article is None:
not_found = {
"detail": "This article has not been found."
}
return Response(data=not_found, status=status.HTTP_404_NOT_FOUND)
likes = Like.objects.filter(article_id=article.id, is_like=True)
dislikes = Like.objects.filter(article_id=article.id, is_like=False)
like_data = {
"total_likes": len(likes),
"total_dislikes": len(dislikes)
}
return Response(data=like_data, status=status.HTTP_200_OK)


class UpdateLikeView(generics.UpdateAPIView):
"""Perfom update on likes"""
permission_classes = (IsAuthenticated,)
Expand Down Expand Up @@ -849,4 +871,3 @@ def put(self, request, *args, **kwargs):
payload["articles"] = serializer.data

return Response(payload, status=status.HTTP_200_OK)

0 comments on commit 52a38df

Please sign in to comment.