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