From 51f50f9d655311cb8036bdc427c1cb2e616c504a Mon Sep 17 00:00:00 2001 From: Luc Rocher Date: Thu, 18 May 2017 13:36:44 +0200 Subject: [PATCH] Fix API tests and serialization --- apps/rp/api/serializers.py | 2 +- apps/rp/api/urls.py | 1 + apps/rp/models/article.py | 39 +++++++++++++++++++++++-------- apps/rp/tests/test_votes_views.py | 30 ++++++++++++++++++------ 4 files changed, 54 insertions(+), 18 deletions(-) diff --git a/apps/rp/api/serializers.py b/apps/rp/api/serializers.py index 58ca4cb..a3ea055 100644 --- a/apps/rp/api/serializers.py +++ b/apps/rp/api/serializers.py @@ -6,4 +6,4 @@ from rp.models import Article class ArticleSerializer(serializers.ModelSerializer): class Meta: model = Article - fields = "__all__" + fields = ('id', 'url', 'title') diff --git a/apps/rp/api/urls.py b/apps/rp/api/urls.py index d6260cc..6a32c3c 100644 --- a/apps/rp/api/urls.py +++ b/apps/rp/api/urls.py @@ -3,3 +3,4 @@ from .views import ArticleViewSet router = routers.DefaultRouter() router.register(r"articles", ArticleViewSet) +urlpatterns = router.urls diff --git a/apps/rp/models/article.py b/apps/rp/models/article.py index ac25976..1933597 100644 --- a/apps/rp/models/article.py +++ b/apps/rp/models/article.py @@ -12,6 +12,7 @@ from datetime import datetime from tempfile import NamedTemporaryFile from project.settings import env +from rp.utils import cleanup_url ARTICLE_SCORE_THRESHOLD = 3 @@ -84,33 +85,33 @@ class Article(VoteMixin): # Finite state logic @transition(field=status, source='DRAFT', target='PUBLISHED', - permission="can_change_status") + permission="rp.can_change_status") def publish(self): self.published_at = datetime.now() @transition(field=status, source='NEW', target='DRAFT', - permission="can_change_status") + permission="rp.can_change_status") def recover(self): pass @transition(field=status, source=['NEW', 'DRAFT'], target='REJECTED', - permission="can_change_status") + permission="rp.can_change_status") def reject(self): pass @transition(field=status, source='DRAFT', target='DRAFT', - permission="can_change_priority") + permission="rp.can_change_priority") def set_priority(self): self.priority = True @transition(field=status, source='DRAFT', target='DRAFT', - permission="can_change_priority") + permission="rp.can_change_priority") def unset_priority(self): self.priority = False @transition(field=status, source='DRAFT', target='DRAFT') @transition(field=status, source='NEW', - target=RETURN_VALUE('NEW', 'DRAFT'), permission="can_vote") + target=RETURN_VALUE('NEW', 'DRAFT'), permission="rp.can_vote") def upvote(self, by=None): super(Article, self).upvote(by) if self.und_score >= ARTICLE_SCORE_THRESHOLD: @@ -118,21 +119,39 @@ class Article(VoteMixin): else: return self.status - @transition(field=status, source='NEW', target='NEW', permission="can_vote") + @transition(field=status, source='NEW', target='NEW', permission="rp.can_vote") @transition(field=status, source='DRAFT', target='DRAFT', - permission="can_vote") + permission="rp.can_vote") def downvote(self, by=None): super(Article, self).downvote(by) + def add_new_url(url, by=None): + url = cleanup_url(url) + article, _ = Article.objects.get_or_create(url=url) + + if article.created_by is None: + article.created_by = by + + if by is not None: + article.upvote(by) + + article.save() + return article + + # Content extraction def fetch_content(self): - lang_lower = self.lang.lower() if self.lang != "NA" else None - article = ArticleParser(url=self.url, language=lang_lower) + if self.lang != "NA": + article = ArticleParser(url=self.url, language=lang_lower) + else: + article = ArticleParser(url=self.url) + article.download() article.parse() self.title = article.title self.extracts = article.text + self.save() def fetch_screenshot(self): from selenium import webdriver diff --git a/apps/rp/tests/test_votes_views.py b/apps/rp/tests/test_votes_views.py index c826bb0..218eaad 100644 --- a/apps/rp/tests/test_votes_views.py +++ b/apps/rp/tests/test_votes_views.py @@ -1,9 +1,13 @@ from django.urls import reverse from django.test import TestCase +from django.contrib.auth.models import Permission, User +from rest_framework.test import APIClient +from rest_framework.test import APIRequestFactory, force_authenticate from userprofile.factories import ProfileFactory from rp.factories import ArticleFactory from rp.models import Article +from rp.api.views import ArticleViewSet class VoteViewTestCase(TestCase): @@ -13,7 +17,15 @@ class VoteViewTestCase(TestCase): self.profile = ProfileFactory() self.user = self.profile.user - self.client.force_login(self.user) + + p = Permission.objects.get(codename="can_vote") + self.user.user_permissions.add(p) + p = Permission.objects.get(codename="can_change_status") + self.user.user_permissions.add(p) + self.user.save() + + self.client = APIClient() + self.client.force_authenticate(user=self.user) def test_votes(self): url_upvote = reverse("api:article-upvote", kwargs={ @@ -25,12 +37,12 @@ class VoteViewTestCase(TestCase): }) response = self.client.post(url_upvote) - assert response.status_code == 200 + self.assertEqual(response.status_code, 200) article_db = Article.objects.get(id=self.article.id) assert article_db.und_score == 1 response = self.client.post(url_downvote) - assert response.status_code == 200 + self.assertEqual(response.status_code, 200) article_db = Article.objects.get(id=self.article.id) assert article_db.und_score == -1 @@ -40,17 +52,21 @@ class VoteViewTestCase(TestCase): }) response = self.client.post(url_publish) - assert response.status_code == 200 + self.assertEqual(response.status_code, 200) article_db = Article.objects.get(id=self.article_draft.id) assert article_db.status == "PUBLISHED" - def test_reject(self): url_reject = reverse("api:article-reject", kwargs={ "pk": self.article.id }) - response = self.client.post(url_reject) - assert response.status_code == 200 + factory = APIRequestFactory() + request = factory.post(url_reject) + force_authenticate(request, user=self.user) + view = ArticleViewSet.as_view({"post": "reject"}) + response = view(request, pk=self.article.id) + self.assertEqual(response.status_code, 200) + article_db = Article.objects.get(id=self.article.id) assert article_db.status == "REJECTED" -- GitLab