Skip to content

Commit

Permalink
Merge 8b5b6d7 into e29d703
Browse files Browse the repository at this point in the history
  • Loading branch information
RutaleIvanPaul committed Aug 9, 2018
2 parents e29d703 + 8b5b6d7 commit b8092ec
Show file tree
Hide file tree
Showing 9 changed files with 190 additions and 38 deletions.
20 changes: 20 additions & 0 deletions authors/apps/articles/migrations/0025_article_favorites.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 2.0.7 on 2018-08-09 09:37

from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('articles', '0024_merge_20180809_0647'),
]

operations = [
migrations.AddField(
model_name='article',
name='favorites',
field=models.ManyToManyField(blank=True, related_name='favorites', to=settings.AUTH_USER_MODEL),
),
]
1 change: 1 addition & 0 deletions authors/apps/articles/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class Article(models.Model):
rating = models.PositiveIntegerField(blank = True, editable = False, null = True)
likes = models.ManyToManyField(User,related_name="likes",blank=True)
dislikes = models.ManyToManyField(User,related_name="dislikes",blank=True)
favorites = models.ManyToManyField(User,related_name="favorites",blank=True)

def save(self, *args, **kwargs):
if not self.id:
Expand Down
18 changes: 12 additions & 6 deletions authors/apps/articles/tests/test_comment.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from django.test import TestCase, RequestFactory
from authors.apps.articles.views import CommentCreateAPIView,ArticleCreateAPIView
from authors.apps.authentication.views import RegistrationAPIView
from authors.apps.authentication.views import LoginAPIView
from rest_framework.test import force_authenticate
from authors.apps.authentication.models import User
import json

class CreateCommentTestCase(TestCase):
Expand All @@ -17,22 +18,27 @@ def setUp(self):
}
}

self.request = self.factory.post('/api/users/', data = json.dumps(self.user), content_type='application/json')
self.response = RegistrationAPIView.as_view()(self.request)
self.headers = {
'HTTP_AUTHORIZATION': 'Token ' + self.response.data["token"]
}
user = User.objects.create_user(self.user["user"]["username"], self.user["user"]["email"], self.user["user"]["password"])
user.is_verified = True
user.save()

self.article_data = {
"title":"How to Survive",
"description":"How?",
"body":"This is how to survive"
}

self.request = self.factory.post('/api/users/login/', data = json.dumps(self.user), content_type='application/json')
self.response = LoginAPIView.as_view()(self.request)
self.headers = {
'HTTP_AUTHORIZATION': 'Token ' + self.response.data["token"]
}


request = self.factory.post('api/articles', data = json.dumps(self.article_data), **self.headers, content_type = 'application/json')
response = ArticleCreateAPIView.as_view()(request)


def test_comment_created_successful(self):
comment = {
"body":"This is a comment"
Expand Down
75 changes: 75 additions & 0 deletions authors/apps/articles/tests/test_favorite_unfavorite.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
from django.test import TestCase, RequestFactory
from authors.apps.articles.views import ArticleCreateAPIView,FavoriteArticleAPIView
from authors.apps.authentication.views import LoginAPIView
from rest_framework.test import force_authenticate
from authors.apps.authentication.models import User
import json

class FavoriteUnfavoriteTestCase(TestCase):

def setUp(self):
self.factory = RequestFactory()

self.user = {
"user" : {
"email":"test@gmail.com",
"username":"tester",
"password":"testpass@word"
}
}

user = User.objects.create_user(self.user["user"]["username"], self.user["user"]["email"], self.user["user"]["password"])
user.is_verified = True
user.save()

self.article_data = {
"title":"How to Survive",
"description":"How?",
"body":"This is how to survive"
}

self.request = self.factory.post('/api/users/login/', data = json.dumps(self.user), content_type='application/json')
self.response = LoginAPIView.as_view()(self.request)
self.headers = {
'HTTP_AUTHORIZATION': 'Token ' + self.response.data["token"]
}


request = self.factory.post('api/articles', data = json.dumps(self.article_data), **self.headers, content_type = 'application/json')
response = ArticleCreateAPIView.as_view()(request)

def test_favorite_normal(self):
kwargs = {"slug":"how-to-survive"}
request = self.factory.post('api/articles/how-to-survive/favorite', **self.headers)
response = FavoriteArticleAPIView.as_view()(request,**kwargs)
self.assertEqual(response.status_code, 201)

def test_favorite_missing_slug(self):
request = self.factory.post('api/articles/favorite', **self.headers)
response = FavoriteArticleAPIView.as_view()(request)
self.assertEqual(response.status_code, 404)

def test_favorite_already_favorited(self):
kwargs = {"slug":"how-to-survive"}
request = self.factory.post('api/articles/how-to-survive/factory', **self.headers)
response = FavoriteArticleAPIView.as_view()(request,**kwargs)
response = FavoriteArticleAPIView.as_view()(request,**kwargs)
self.assertEqual(response.status_code, 409)

def test_unfavorite_normal(self):
kwargs = {"slug":"how-to-survive"}
FavoriteArticleAPIView.as_view()(self.factory.post('api/articles/how-to-survive/favorite', **self.headers),**kwargs)
request = self.factory.delete('api/articles/how-to-survive/factory', **self.headers)
response = FavoriteArticleAPIView.as_view()(request,**kwargs)
self.assertEqual(response.status_code, 200)

def test_unfavorite_before_favorite(self):
kwargs = {"slug":"how-to-survive"}
request = self.factory.delete('api/articles/how-to-survive/favorite', **self.headers)
response = FavoriteArticleAPIView.as_view()(request,**kwargs)
self.assertEqual(response.status_code, 409)

def test_unfavorite_missing_slug(self):
request = self.factory.delete('api/articles/favorite', **self.headers)
response = FavoriteArticleAPIView.as_view()(request)
self.assertEqual(response.status_code, 404)
32 changes: 18 additions & 14 deletions authors/apps/articles/tests/test_like_dislike.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from django.test import TestCase, RequestFactory
from authors.apps.articles.views import ArticleCreateAPIView,LikeArticleAPIView,DislikeArticleAPIView
from authors.apps.authentication.views import RegistrationAPIView
from authors.apps.authentication.views import LoginAPIView
from rest_framework.test import force_authenticate
from authors.apps.authentication.models import User
import json

class LikeDislikeTestCase(TestCase):

def setUp(self):
self.factory = RequestFactory()

Expand All @@ -17,55 +17,59 @@ def setUp(self):
}
}

self.request = self.factory.post('/api/users/', data = json.dumps(self.user), content_type='application/json')
self.response = RegistrationAPIView.as_view()(self.request)
self.headers = {
'HTTP_AUTHORIZATION': 'Token ' + self.response.data["token"]
}
user = User.objects.create_user(self.user["user"]["username"], self.user["user"]["email"], self.user["user"]["password"])
user.is_verified = True
user.save()

self.article_data = {
"title":"How to Survive",
"description":"How?",
"body":"This is how to survive"
}

self.request = self.factory.post('/api/users/login/', data = json.dumps(self.user), content_type='application/json')
self.response = LoginAPIView.as_view()(self.request)
self.headers = {
'HTTP_AUTHORIZATION': 'Token ' + self.response.data["token"]
}


request = self.factory.post('api/articles', data = json.dumps(self.article_data), **self.headers, content_type = 'application/json')
response = ArticleCreateAPIView.as_view()(request)

def test_like_normal(self):
kwargs = {"slug":"how-to-survive"}
request = self.factory.post('api/articles/how-to-survive/favorite', **self.headers)
request = self.factory.post('api/articles/how-to-survive/like', **self.headers)
response = LikeArticleAPIView.as_view()(request,**kwargs)
self.assertEqual(response.status_code, 201)

def test_like_already_liked(self):
kwargs = {"slug":"how-to-survive"}
request = self.factory.post('api/articles/how-to-survive/favorite', **self.headers)
request = self.factory.post('api/articles/how-to-survive/like', **self.headers)
response = LikeArticleAPIView.as_view()(request,**kwargs)
response = LikeArticleAPIView.as_view()(request,**kwargs)
self.assertEqual(response.status_code, 409)

def test_like_missing_slug(self):
request = self.factory.post('api/articles/favorite', **self.headers)
request = self.factory.post('api/articles/like', **self.headers)
response = LikeArticleAPIView.as_view()(request)
self.assertEqual(response.status_code, 404)

def test_delete_like_normal(self):
kwargs = {"slug":"how-to-survive"}
LikeArticleAPIView.as_view()(self.factory.post('api/articles/how-to-survive/favorite', **self.headers),**kwargs)
request = self.factory.delete('api/articles/how-to-survive/favorite', **self.headers)
LikeArticleAPIView.as_view()(self.factory.post('api/articles/how-to-survive/like', **self.headers),**kwargs)
request = self.factory.delete('api/articles/how-to-survive/like', **self.headers)
response = LikeArticleAPIView.as_view()(request,**kwargs)
self.assertEqual(response.status_code, 200)

def test_delete_like_before_like(self):
kwargs = {"slug":"how-to-survive"}
request = self.factory.delete('api/articles/how-to-survive/favorite', **self.headers)
request = self.factory.delete('api/articles/how-to-survive/like', **self.headers)
response = LikeArticleAPIView.as_view()(request,**kwargs)
self.assertEqual(response.status_code, 409)

def test_delete_like_missing_slug(self):
request = self.factory.delete('api/articles/favorite', **self.headers)
request = self.factory.delete('api/articles/like', **self.headers)
response = LikeArticleAPIView.as_view()(request)
self.assertEqual(response.status_code, 404)

Expand Down
10 changes: 9 additions & 1 deletion authors/apps/articles/urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
from django.urls import path

from .views import ArticleCreateAPIView, RateArticleAPIView,CommentCreateAPIView,LikeArticleAPIView,DislikeArticleAPIView
from .views import (
ArticleCreateAPIView,
RateArticleAPIView,
CommentCreateAPIView,
LikeArticleAPIView,
DislikeArticleAPIView,
FavoriteArticleAPIView
)


app_name = "articles"
Expand All @@ -11,5 +18,6 @@
path('articles/<slug>/comment', CommentCreateAPIView.as_view()),
path('articles/<slug>/like',LikeArticleAPIView.as_view()),
path('articles/<slug>/dislike',DislikeArticleAPIView.as_view()),
path('articles/<slug>/favorite',FavoriteArticleAPIView.as_view()),
]

39 changes: 35 additions & 4 deletions authors/apps/articles/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,6 @@ def perform_create(self, serializer):
user_data = jwt.authenticate(self.request)
serializer.save(user = user_data[0], article = get_object_or_404(Article, slug = slug))





class CommentCreateAPIView(CreateAPIView):
permission_classes = (IsAuthenticated, )
Expand Down Expand Up @@ -122,4 +119,38 @@ def delete(self,*args,**kwargs):
else:
return Response(data = {"errors":{"error":"Not yet disliked"}},status=status.HTTP_409_CONFLICT)


class FavoriteArticleAPIView(APIView):
permission_classes = (IsAuthenticated, )
look_url_kwarg = "slug"


def post(self,*args,**kwargs):
jwt = JWTAuthentication()
user_data = jwt.authenticate(self.request)
slug = self.kwargs.get(self.look_url_kwarg)
article = get_object_or_404(Article,slug = slug)
if article.favorites.filter(id=User.objects.filter(email=user_data[0])[0].id).exists():
return Response(data = {"errors":{"error":"Already favorited"}},status=status.HTTP_409_CONFLICT)
article.favorites.add(user_data[0])
article.favorited = True
article.favoritesCount+=1
article.save()

return Response(data = CreateArticleSerializer(article).data,status=status.HTTP_201_CREATED)

def delete(self,*args,**kwargs):
jwt = JWTAuthentication()
user_data = jwt.authenticate(self.request)
slug = self.kwargs.get(self.look_url_kwarg)
article = get_object_or_404(Article,slug = slug)
if article.favorites.filter(id=User.objects.filter(email=user_data[0])[0].id).exists():
article.favorites.remove(user_data[0])
article.favoritesCount-=1
if article.favoritesCount < 1:
article.favorited = False
article.save()
return Response(data = CreateArticleSerializer(article).data,status=status.HTTP_200_OK)
else:
return Response(data = {"errors":{"error":"Not yet Favorited"}},status=status.HTTP_409_CONFLICT)


18 changes: 10 additions & 8 deletions authors/apps/profiles/tests/test_profile_view.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
from django.test import TestCase,RequestFactory
from authors.apps.profiles.views import ProfileView,UserUpdate
from authors.apps.authentication.models import User
from authors.apps.authentication.views import RegistrationAPIView
from authors.apps.authentication.views import LoginAPIView
import json

class ProfileViewTestCase(TestCase):
def setUp(self):
self.factory = RequestFactory()
# self.user = User.objects.create_user(
# username='rutale',
# email='rutale@gmail.com',
# password='pass'
# )
self.user = User.objects.create_user(
username='rutale',
email='rutale@gmail.com',
password='rutale1234*'
)
self.user.is_verified = True
self.user.save()
self.user_to_register = {
"user":{
"email": "rutale@gmail.com",
Expand All @@ -25,8 +27,8 @@ def setUp(self):

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

def test_get_profile_normal(self):
Expand Down
15 changes: 10 additions & 5 deletions authors/apps/profiles/tests/test_update.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,36 @@
from django.test import TestCase,RequestFactory
from authors.apps.profiles.views import ProfileView,UserUpdate
from authors.apps.authentication.models import User
from authors.apps.authentication.views import RegistrationAPIView,LoginAPIView
from authors.apps.authentication.views import LoginAPIView
from PIL import Image
import json
import tempfile

class UpdateTestCase(TestCase):
def setUp(self):
self.factory = RequestFactory()
self.user = User.objects.create_user(
username='rutale',
email='rutale@gmail.com',
password='rutale1234*'
)
self.user.is_verified = True
self.user.save()
self.user_to_register = {
"user":{
"email": "rutale@gmail.com",
"password": "rutale1234*",
"username":"rutale"
}
}

self.headers = {
'HTTP_AUTHORIZATION': 'Token ' + self.make_token(self.user_to_register)
}


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

def test_update_bio_normal(self):
Expand Down

0 comments on commit b8092ec

Please sign in to comment.