From 53fe34a5c86e67e4bcd9df1c4b71c79a22299eb2 Mon Sep 17 00:00:00 2001 From: Jorran de Wit <jorrandewit@outlook.com> Date: Sun, 19 Mar 2017 10:16:30 +0100 Subject: [PATCH] Add view tests for About View --- scipost/factories.py | 22 ++- scipost/migrations/0044_auto_20170319_0940.py | 20 +++ scipost/models.py | 2 +- scipost/test_views.py | 154 ++++++++++++++++++ 4 files changed, 196 insertions(+), 2 deletions(-) create mode 100644 scipost/migrations/0044_auto_20170319_0940.py create mode 100644 scipost/test_views.py diff --git a/scipost/factories.py b/scipost/factories.py index e32c408de..8a747b60b 100644 --- a/scipost/factories.py +++ b/scipost/factories.py @@ -1,9 +1,10 @@ import factory +import random from django.contrib.auth import get_user_model from django.contrib.auth.models import Group -from .models import Contributor +from .models import Contributor, EditorialCollege, EditorialCollegeMember class ContributorFactory(factory.django.DjangoModelFactory): @@ -48,3 +49,22 @@ class UserFactory(factory.django.DjangoModelFactory): self.groups.add(group) else: self.groups.add(Group.objects.get(name="Registered Contributors")) + + +class EditorialCollegeFactory(factory.django.DjangoModelFactory): + class Meta: + model = EditorialCollege + django_get_or_create = ('discipline', ) + + discipline = random.choice(['Physics', 'Chemistry', 'Medicine']) + + +class EditorialCollegeMemberFactory(factory.django.DjangoModelFactory): + class Meta: + model = EditorialCollegeMember + + title = factory.Faker('prefix') + name = factory.Faker('name') + link = factory.Faker('url') + subtitle = factory.Faker('company') + college = factory.Iterator(EditorialCollege.objects.all()) diff --git a/scipost/migrations/0044_auto_20170319_0940.py b/scipost/migrations/0044_auto_20170319_0940.py new file mode 100644 index 000000000..6a7dae356 --- /dev/null +++ b/scipost/migrations/0044_auto_20170319_0940.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2017-03-19 08:40 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('scipost', '0043_auto_20170318_2237'), + ] + + operations = [ + migrations.RenameField( + model_name='editorialcollegemember', + old_name='discipline', + new_name='college', + ), + ] diff --git a/scipost/models.py b/scipost/models.py index 2e7ad6f0c..fcec39e5f 100644 --- a/scipost/models.py +++ b/scipost/models.py @@ -534,7 +534,7 @@ class EditorialCollegeMember(models.Model): title = models.CharField(max_length=10, blank=True) link = models.URLField(blank=True) subtitle = models.CharField(max_length=255, blank=True) - discipline = models.ForeignKey('scipost.EditorialCollege', related_name='member') + college = models.ForeignKey('scipost.EditorialCollege', related_name='member') def __str__(self): return ('%s %s' % (self.title, self.name)).strip() diff --git a/scipost/test_views.py b/scipost/test_views.py new file mode 100644 index 000000000..d6b766630 --- /dev/null +++ b/scipost/test_views.py @@ -0,0 +1,154 @@ +from django.core.urlresolvers import reverse +from django.contrib.auth.models import Group +from django.test import TestCase, Client, tag + +from commentaries.factories import UnvettedCommentaryFactory, VettedCommentaryFactory,\ + UnpublishedVettedCommentaryFactory +from commentaries.forms import CommentarySearchForm +from commentaries.models import Commentary + +from .factories import ContributorFactory,\ + EditorialCollegeMemberFactory, EditorialCollegeFactory +from .models import EditorialCollege, EditorialCollegeMember + + +class RequestCommentaryTest(TestCase): + """Test cases for `request_commentary` view method""" + fixtures = ['permissions', 'groups', 'contributors'] + + def setUp(self): + self.view_url = reverse('commentaries:request_commentary') + self.login_url = reverse('scipost:login') + self.redirected_login_url = '%s?next=%s' % (self.login_url, self.view_url) + + def test_get_requests(self): + """Test different GET requests on view""" + # Anoymous user should redirect to login page + request = self.client.get(self.view_url) + self.assertRedirects(request, self.redirected_login_url) + + # Registered Contributor should get 200 + self.client.login(username="Test", password="testpw") + request = self.client.get(self.view_url) + self.assertEquals(request.status_code, 200) + + def test_post_invalid_forms(self): + """Test different kind of invalid RequestCommentaryForm submits""" + self.client.login(username="Test", password="testpw") + request = self.client.post(self.view_url) + self.assertEquals(request.status_code, 200) + + +class VetCommentaryRequestsTest(TestCase): + """Test cases for `vet_commentary_requests` view method""" + fixtures = ['groups', 'permissions'] + + def setUp(self): + self.view_url = reverse('commentaries:vet_commentary_requests') + self.login_url = reverse('scipost:login') + self.password = 'test123' + self.contributor = ContributorFactory(user__password=self.password) + + def set_required_permissions_and_login(self): + '''Set the required permissions to testuser to access vet_commentary_requests.''' + group = Group.objects.get(name="Vetting Editors") + self.contributor.user.groups.add(group) + self.client.login(username=self.contributor.user.username, password=self.password) + + def test_user_permissions(self): + """Test view permission is restricted to Vetting Editors.""" + # Anoymous user + response = self.client.get(self.view_url) + self.assertEquals(response.status_code, 403) + + # Wrong permissions group + self.client.login(username=self.contributor.user.username, password=self.password) + response = self.client.get(self.view_url) + self.assertEquals(response.status_code, 403) + + # Right permissions group + self.set_required_permissions_and_login() + response = self.client.get(self.view_url) + self.assertEquals(response.status_code, 200) + + def test_get_valid_unvetted_commentaries(self): + """Test if valid commentaries are sent back to user, if exists.""" + self.set_required_permissions_and_login() + + # No Commentary exists! + response = self.client.get(self.view_url) + self.assertTrue('commentary_to_vet' in response.context) + self.assertEquals(response.context['commentary_to_vet'], None) + + # Only vetted Commentaries exist! + VettedCommentaryFactory() + response = self.client.get(self.view_url) + self.assertEquals(response.context['commentary_to_vet'], None) + + # Unvetted Commentaries do exist! + UnvettedCommentaryFactory() + response = self.client.get(self.view_url) + self.assertTrue(type(response.context['commentary_to_vet']) is Commentary) + + +class BrowseCommentariesTest(TestCase): + """Test cases for `browse` view.""" + fixtures = ['groups', 'permissions'] + + def setUp(self): + VettedCommentaryFactory(discipline='physics') + self.view_url = reverse('commentaries:browse', kwargs={ + 'discipline': 'physics', + 'nrweeksback': '1' + }) + + def test_response_list(self): + '''Test if the browse view is passing commentaries to anoymous users.''' + response = self.client.get(self.view_url) + self.assertEquals(response.status_code, 200) + + # The created vetted Commentary is found! + self.assertTrue(response.context['commentary_browse_list'].count() >= 1) + # The search form is passed trough the view... + self.assertTrue(type(response.context['form']) is CommentarySearchForm) + + +class CommentaryDetailTest(TestCase): + fixtures = ['permissions', 'groups'] + + def setUp(self): + self.client = Client() + self.commentary = UnpublishedVettedCommentaryFactory() + self.target = reverse( + 'commentaries:commentary', + kwargs={'arxiv_or_DOI_string': self.commentary.arxiv_or_DOI_string} + ) + + def test_status_code_200(self): + response = self.client.get(self.target) + self.assertEqual(response.status_code, 200) + + +@tag('static-info', 'full') +class AboutViewTest(TestCase): + def setUp(self): + self.client = Client() + self.target = reverse('scipost:about') + + # Create College with 10 members + self.college = EditorialCollegeFactory() + EditorialCollegeMemberFactory.create_batch(10) + + def test_status_code_200_including_members(self): + response = self.client.get(self.target) + self.assertEqual(response.status_code, 200) + + # College exists in context + self.assertTrue('object_list' in response.context) + college = response.context['object_list'][0] + self.assertTrue(isinstance(college, EditorialCollege)) + + # Members exist in college + self.assertTrue(college.member.count() >= 10) + last_member = college.member.last() + self.assertTrue(isinstance(last_member, EditorialCollegeMember)) -- GitLab