Skip to content

Commit

Permalink
Merge e1eab3b into 5bf5139
Browse files Browse the repository at this point in the history
  • Loading branch information
phillipseryazi committed Aug 14, 2018
2 parents 5bf5139 + e1eab3b commit 99ec551
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 12 deletions.
86 changes: 86 additions & 0 deletions authors/apps/articles/tests/test_delete_article.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
from django.test import TestCase, RequestFactory
from authors.apps.authentication.views import RegistrationAPIView, VerificationAPIView
from authors.apps.articles.views import (
UpdateArticleAPIView,
ArticleCreateAPIView,
DeleteArticleAPIView,)
import json
from minimock import Mock
import smtplib
from rest_framework import exceptions, authentication


class DeleteArticleTestCase(TestCase):
def setUp(self):
self.factory = RequestFactory()
smtplib.SMTP = Mock('smtplib.SMTP')
smtplib.SMTP.mock_returns = Mock('smtp_connection')
self.article = {
'title': 'original title',
'description': 'original description',
'body': 'original body'
}
self.user = {'user': {'email': 'allan.guwatudde@andela.com',
'username': 'testusername7',
'password': 'testpassword1234567#'
}
}
self.token = self.make_token(self.user)
self.kwargs = {'token': self.token}
self.verify_user()
self.slug = self.create_article()

def make_token(self, user):
request = self.factory.post(
'/api/users/', data=json.dumps(user), content_type='application/json')
response = RegistrationAPIView.as_view()(request)
return response.data['token']

def verify_user(self):
request = self.factory.post(
'/api/users/verify/', content_type='application/json')
VerificationAPIView.as_view()(request, **self.kwargs)

def create_article(self):
headers = {
'HTTP_AUTHORIZATION': 'Token ' + self.token
}
request = self.factory.post(
'/api/articles/', **headers, data=json.dumps(self.article), content_type='application/json')
response = ArticleCreateAPIView.as_view()(request)
return response.data['slug']

def test_delete_article(self):
headers = {
'HTTP_AUTHORIZATION': 'Token ' + self.token
}
request = self.factory.delete(
'/api/article/<slug>/delete', **headers, content_type='application/json')
response = DeleteArticleAPIView.as_view()(
request, **{'slug': self.slug})
self.assertEqual(response.data['message'], 'Article deleted.')
self.assertEqual(response.status_code, 200)

def test_delete_non_article(self):
headers = {
'HTTP_AUTHORIZATION': 'Token ' + self.token
}
request = self.factory.delete(
'/api/article/<slug>/delete', **headers, content_type='application/json')
response = DeleteArticleAPIView.as_view()(
request, **{'slug': 'uyfuygbhcbyegfyuergbhybcvyqegbfgygbdhbfefbfbccvyvfe'})
self.assertEqual(
response.data['message'], 'Operation was not performed, no such article found.')
self.assertEqual(response.status_code, 404)

def test_delete_for_missing_slug(self):
headers = {
'HTTP_AUTHORIZATION': 'Token ' + self.token
}
request = self.factory.delete(
'/api/article/<slug>/delete', **headers, content_type='application/json')
response = DeleteArticleAPIView.as_view()(
request, **{'slug': ''})
self.assertEqual(
response.data['message'], 'Operation was not performed, no such article found.')
self.assertEqual(response.status_code, 404)
10 changes: 6 additions & 4 deletions authors/apps/articles/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
FavoriteArticleAPIView,
UpdateArticleAPIView,
SearchArticlesAPIView,
DeleteArticleAPIView,
)

app_name = "articles"
Expand All @@ -18,8 +19,9 @@
path('articles/<slug>/rate/', RateArticleAPIView.as_view()),
path('articles/<slug>/comment', CommentCreateAPIView.as_view()),
path('articles/<slug>/update/', UpdateArticleAPIView.as_view()),
path('articles/<slug>/like',LikeArticleAPIView.as_view()),
path('articles/<slug>/dislike',DislikeArticleAPIView.as_view()),
path('articles/<slug>/favorite',FavoriteArticleAPIView.as_view()),
path('articles/search', SearchArticlesAPIView.as_view() ),
path('articles/<slug>/like', LikeArticleAPIView.as_view()),
path('articles/<slug>/dislike', DislikeArticleAPIView.as_view()),
path('articles/<slug>/favorite', FavoriteArticleAPIView.as_view()),
path('articles/search', SearchArticlesAPIView.as_view()),
path('articles/<slug>/delete/', DeleteArticleAPIView.as_view()),
]
29 changes: 21 additions & 8 deletions authors/apps/articles/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,22 +170,22 @@ def get_queryset(self):
queryset = Article.objects.all()
if "title" in self.request.query_params:
filter_field = self.request.query_params.get('title')
filtered_queryset = queryset.filter(title__icontains = filter_field)
filtered_queryset = queryset.filter(title__icontains=filter_field)

if "author" in self.request.query_params:
filter_field = self.request.query_params.get('author')
user = get_object_or_404(User,username__icontains = filter_field)
filtered_queryset = queryset.filter(author = user.id)
user = get_object_or_404(User, username__icontains=filter_field)
filtered_queryset = queryset.filter(author=user.id)
if "tag" in self.request.query_params:
filter_field = self.request.query_params.get('tag')
filtered_queryset =[]
filtered_queryset = []
if filter_field is not None:
for article in queryset:
for tag in article.tags.all():
if filter_field ==tag.name:
if filter_field == tag.name:
filtered_queryset.append(article)
return filtered_queryset


class UpdateArticleAPIView(UpdateAPIView):
permission_classes = (IsAuthenticated, )
Expand Down Expand Up @@ -217,5 +217,18 @@ def put(self, request, *args, **kwargs):
raise exceptions.APIException(e)

return Response(data=self.serializer_class(updated_article).data, status=status.HTTP_201_CREATED)


class DeleteArticleAPIView(APIView):
permission_classes = (IsAuthenticated, )
look_url_kwarg = 'slug'

def delete(self, request, *args, **kwargs):
slug = self.kwargs.get(self.look_url_kwarg)


article = Article.objects.filter(slug=slug).delete()

if article[0] == 0:
return Response({'message': 'Operation was not performed, no such article found.'}, status=status.HTTP_404_NOT_FOUND)

return Response({'message': 'Article deleted.'}, status=status.HTTP_200_OK)

0 comments on commit 99ec551

Please sign in to comment.