SciPost Code Repository

Skip to content
Snippets Groups Projects
  • Jorran de Wit's avatar
    Fix vetting Commentaries bug · a2b1493c
    Jorran de Wit authored
    Due to the new Commentary request forms, which were
    also used during vetting (choice=modify), the vetting
    went wrong sometimes.
    If the vetting action was 'modify', the user was redirected
    to the old form which didn't exist anymore.
    
    As a result of how the contruction of this modify structure, the Commentary
    was first deleted and thus the data was lost. The requester did receive
    a mail that his/her Commentary was accessible on SciPost however.
    
    I fixed this by recontructing the vetting views. I combined the
    vetting list and the vet request. I removed the action removing
    the Commentary and made this a redirect to a new view which is
    a modify page accessible only for EdCol Admins to modify+accept
    the Commentary. Also, the mail for 'modify' vetting is also just sent
    at *after* modification now.
    a2b1493c
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
test_forms.py 8.97 KiB
import re

from django.test import TestCase

from common.helpers import model_form_data
from scipost.factories import UserFactory, ContributorFactory

from .factories import VettedCommentaryFactory, UnvettedCommentaryFactory,\
                       UnvettedArxivPreprintCommentaryFactory
from .forms import RequestPublishedArticleForm, VetCommentaryForm, DOIToQueryForm,\
                   ArxivQueryForm, RequestArxivPreprintForm
from .models import Commentary
from common.helpers.test import add_groups_and_permissions


class TestArxivQueryForm(TestCase):
    def setUp(self):
        add_groups_and_permissions()
        ContributorFactory.create_batch(5)

    def test_new_arxiv_identifier_is_valid(self):
        new_identifier_data = {'identifier': '1612.07611v1'}
        form = ArxivQueryForm(new_identifier_data)
        self.assertTrue(form.is_valid())

    def test_old_arxiv_identifier_is_valid(self):
        old_identifier_data = {'identifier': 'cond-mat/0612480v1'}
        form = ArxivQueryForm(old_identifier_data)
        self.assertTrue(form.is_valid())

    def test_invalid_arxiv_identifier(self):
        invalid_data = {'identifier': 'i am not valid'}
        form = ArxivQueryForm(invalid_data)
        self.assertFalse(form.is_valid())

    def test_new_arxiv_identifier_without_version_number_is_invalid(self):
        data = {'identifier': '1612.07611'}
        form = ArxivQueryForm(data)
        self.assertFalse(form.is_valid())

    def test_old_arxiv_identifier_without_version_number_is_invalid(self):
        data = {'identifier': 'cond-mat/0612480'}
        form = ArxivQueryForm(data)
        self.assertFalse(form.is_valid())

    def test_arxiv_identifier_that_already_has_commentary_page_is_invalid(self):
        unvetted_commentary = UnvettedCommentaryFactory()
        invalid_data = {'identifier': unvetted_commentary.arxiv_identifier}
        form = ArxivQueryForm(invalid_data)
        self.assertFalse(form.is_valid())
        error_message = form.errors['identifier'][0]
        self.assertRegexpMatches(error_message, re.compile('already exist'))

    def test_valid_but_non_existent_identifier_is_invalid(self):
        invalid_data = {'identifier': '1613.07611v1'}
        form = ArxivQueryForm(invalid_data)
        self.assertFalse(form.is_valid())


class TestDOIToQueryForm(TestCase):
    def setUp(self):
        add_groups_and_permissions()
        ContributorFactory.create_batch(5)

    def test_invalid_doi_is_invalid(self):
        invalid_data = {'doi': 'blablab'}
        form = DOIToQueryForm(invalid_data)
        self.assertFalse(form.is_valid())

    def test_doi_that_already_has_commentary_page_is_invalid(self):
        unvetted_commentary = UnvettedCommentaryFactory()
        invalid_data = {'doi': unvetted_commentary.pub_DOI}
        form = DOIToQueryForm(invalid_data)
        self.assertFalse(form.is_valid())
        error_message = form.errors['doi'][0]
        self.assertRegexpMatches(error_message, re.compile('already exist'))

    def test_physrev_doi_is_valid(self):
        physrev_doi = "10.21468/SciPostPhys.2.2.010"
        form = DOIToQueryForm({'doi': physrev_doi})
        self.assertTrue(form.is_valid())

    def test_scipost_doi_is_valid(self):
        scipost_doi = "10.21468/SciPostPhys.2.2.010"
        form = DOIToQueryForm({'doi': scipost_doi})
        self.assertTrue(form.is_valid())

    def test_old_doi_is_valid(self):
        old_doi = "10.1088/0022-3719/7/6/005"
        form = DOIToQueryForm({'doi': old_doi})
        self.assertTrue(form.is_valid())

    def test_valid_but_nonexistent_doi_is_invalid(self):
        doi = "10.21468/NonExistentJournal.2.2.010"
        form = DOIToQueryForm({'doi': doi})
        self.assertEqual(form.is_valid(), False)


class TestVetCommentaryForm(TestCase):
    def setUp(self):
        add_groups_and_permissions()
        ContributorFactory.create_batch(5)
        self.commentary = UnvettedCommentaryFactory.create()
        self.user = UserFactory()
        self.form_data = {
            'action_option': VetCommentaryForm.ACTION_ACCEPT,
            'refusal_reason': VetCommentaryForm.REFUSAL_EMPTY,
            'email_response_field': 'Lorem Ipsum'
        }


    def test_valid_accepted_form(self):
        """Test valid form data and return Commentary"""
        form = VetCommentaryForm(self.form_data, commentary_id=self.commentary.id, user=self.user)
        self.assertTrue(form.is_valid())
        self.assertFalse(Commentary.objects.vetted().exists())
        self.assertTrue(Commentary.objects.awaiting_vetting().exists())

        # Accept Commentary in database
        form.process_commentary()
        self.assertTrue(Commentary.objects.vetted().exists())
        self.assertFalse(Commentary.objects.awaiting_vetting().exists())

    def test_valid_modified_form(self):
        """Test valid form data and delete Commentary"""
        self.form_data['action_option'] = VetCommentaryForm.ACTION_MODIFY
        form = VetCommentaryForm(self.form_data, commentary_id=self.commentary.id, user=self.user)
        self.assertTrue(form.is_valid())
        self.assertFalse(Commentary.objects.vetted().exists())
        self.assertTrue(Commentary.objects.awaiting_vetting().exists())

        # Delete the Commentary
        form.process_commentary()
        self.assertTrue(form.commentary_is_modified())
        self.assertFalse(Commentary.objects.awaiting_vetting().exists())

    def test_valid_rejected_form(self):
        """Test valid form data and delete Commentary"""
        self.form_data['action_option'] = VetCommentaryForm.ACTION_REFUSE
        self.form_data['refusal_reason'] = VetCommentaryForm.REFUSAL_UNTRACEBLE
        form = VetCommentaryForm(self.form_data, commentary_id=self.commentary.id, user=self.user)
        self.assertTrue(form.is_valid())
        self.assertFalse(Commentary.objects.vetted().exists())
        self.assertTrue(Commentary.objects.awaiting_vetting().exists())

        # Delete the Commentary
        form.process_commentary()
        self.assertTrue(form.commentary_is_refused())
        self.assertFalse(Commentary.objects.awaiting_vetting().exists())

        # Refusal choice is ok
        refusal_reason_inserted = VetCommentaryForm.COMMENTARY_REFUSAL_DICT[
            VetCommentaryForm.REFUSAL_UNTRACEBLE]
        self.assertEqual(form.get_refusal_reason(), refusal_reason_inserted)

    def test_process_before_validation(self):
        """Test response of form on processing before validation"""
        form = VetCommentaryForm(self.form_data, commentary_id=self.commentary.id, user=self.user)
        self.assertRaises(ValueError, form.process_commentary)


class TestRequestPublishedArticleForm(TestCase):
    def setUp(self):
        add_groups_and_permissions()
        ContributorFactory.create_batch(5)
        factory_instance = UnvettedCommentaryFactory.build()
        self.user = UserFactory()
        self.valid_form_data = model_form_data(factory_instance, RequestPublishedArticleForm)

    def test_valid_data_is_valid(self):
        """Test valid form for DOI"""
        form = RequestPublishedArticleForm(self.valid_form_data)
        self.assertTrue(form.is_valid())

    def test_doi_that_already_has_commentary_page_is_invalid(self):
        unvetted_commentary = UnvettedCommentaryFactory()
        invalid_data = {**self.valid_form_data, **{'pub_DOI': unvetted_commentary.pub_DOI}}
        form = RequestPublishedArticleForm(invalid_data)
        self.assertEqual(form.is_valid(), False)
        error_message = form.errors['pub_DOI'][0]
        self.assertRegexpMatches(error_message, re.compile('already exist'))

    def test_commentary_without_pub_DOI_is_invalid(self):
        invalid_data = {**self.valid_form_data, **{'pub_DOI': ''}}
        form = RequestPublishedArticleForm(invalid_data)
        self.assertEqual(form.is_valid(), False)


class TestRequestArxivPreprintForm(TestCase):
    def setUp(self):
        add_groups_and_permissions()
        ContributorFactory.create_batch(5)
        factory_instance = UnvettedArxivPreprintCommentaryFactory.build()
        self.user = UserFactory()
        self.valid_form_data = model_form_data(factory_instance, RequestPublishedArticleForm)
        self.valid_form_data['arxiv_identifier'] = factory_instance.arxiv_identifier

    def test_valid_data_is_valid(self):
        form = RequestArxivPreprintForm(self.valid_form_data)
        self.assertTrue(form.is_valid())

    def test_identifier_that_already_has_commentary_page_is_invalid(self):
        commentary = UnvettedArxivPreprintCommentaryFactory()
        invalid_data = {**self.valid_form_data, **{'arxiv_identifier': commentary.arxiv_identifier}}
        form = RequestArxivPreprintForm(invalid_data)
        self.assertEqual(form.is_valid(), False)
        error_message = form.errors['arxiv_identifier'][0]
        self.assertRegexpMatches(error_message, re.compile('already exist'))

    def test_commentary_without_arxiv_identifier_is_invalid(self):
        invalid_data = {**self.valid_form_data, **{'arxiv_identifier': ''}}
        form = RequestArxivPreprintForm(invalid_data)
        self.assertEqual(form.is_valid(), False)