From 47ffc28f4ae8178c1e7cbb26bfa83c36ec3e9746 Mon Sep 17 00:00:00 2001
From: Geert Kapteijns <ghkapteijns@gmail.com>
Date: Sat, 13 May 2017 20:30:39 +0200
Subject: [PATCH] ArxivQueryForm tests

---
 commentaries/forms.py      |  6 ++-
 commentaries/test_forms.py | 29 ++++++++++-
 commentaries/views.py      | 12 ++++-
 scipost/test_services.py   | 98 ++++++++++++++++++++++----------------
 4 files changed, 100 insertions(+), 45 deletions(-)

diff --git a/commentaries/forms.py b/commentaries/forms.py
index f64ee17ff..d3d30be91 100644
--- a/commentaries/forms.py
+++ b/commentaries/forms.py
@@ -42,7 +42,11 @@ class DOIToQueryForm(forms.Form):
 
 
 class ArxivQueryForm(forms.Form):
-    identifier = forms.CharField()
+    IDENTIFIER_PATTERN_NEW = r'^[0-9]{4,}.[0-9]{4,5}v[0-9]{1,2}$'
+    IDENTIFIER_PATTERN_OLD = r'^[-.a-z]+/[0-9]{7,}v[0-9]{1,2}$'
+    VALID_ARXIV_IDENTIFIER_REGEX = "(?:{})|(?:{})".format(IDENTIFIER_PATTERN_NEW, IDENTIFIER_PATTERN_OLD)
+
+    identifier = forms.RegexField(regex=VALID_ARXIV_IDENTIFIER_REGEX, strip=True)
 
 #         identifierpattern_new = re.compile("^[0-9]{4,}.[0-9]{4,5}v[0-9]{1,2}$")
 #         identifierpattern_old = re.compile("^[-.a-z]+/[0-9]{7,}v[0-9]{1,2}$")
diff --git a/commentaries/test_forms.py b/commentaries/test_forms.py
index 9e9d4a483..84d600a71 100644
--- a/commentaries/test_forms.py
+++ b/commentaries/test_forms.py
@@ -6,11 +6,38 @@ from common.helpers import model_form_data
 from scipost.factories import UserFactory
 
 from .factories import VettedCommentaryFactory, UnvettedCommentaryFactory
-from .forms import RequestCommentaryForm, RequestPublishedArticleForm, VetCommentaryForm, DOIToQueryForm
+from .forms import RequestCommentaryForm, RequestPublishedArticleForm, VetCommentaryForm, DOIToQueryForm, ArxivQueryForm
 from .models import Commentary
 from common.helpers.test import add_groups_and_permissions
 
 
+class TestArxivQueryForm(TestCase):
+    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())
+
+
 class TestDOIToQueryForm(TestCase):
     def setUp(self):
         add_groups_and_permissions()
diff --git a/commentaries/views.py b/commentaries/views.py
index 4255f6f90..1e47459c7 100644
--- a/commentaries/views.py
+++ b/commentaries/views.py
@@ -117,7 +117,17 @@ def prefill_using_DOI(request):
 @permission_required('scipost.can_request_commentary_pages', raise_exception=True)
 def prefill_using_arxiv_identifier(request):
     if request.method == "POST":
-        return 1
+        arxiv_query_form = ArxivQueryForm(request.POST)
+        if arxiv_query_form.is_valid():
+            raise NotImplementedError
+        else:
+            form = RequestArxivPreprintForm()
+
+        context = {
+            'form': form,
+            'arxiv_query_form': arxiv_query_form,
+        }
+        return render(request, 'commentaries/request_arxiv_preprint.html', context)
     else:
         raise Http404
 
diff --git a/scipost/test_services.py b/scipost/test_services.py
index 44986d73d..bb48a7066 100644
--- a/scipost/test_services.py
+++ b/scipost/test_services.py
@@ -6,50 +6,25 @@ from submissions.models import Submission
 
 
 class ArxivCallerTest(TestCase):
-    def setUp(self):
-        self.valid_arxiv_identifier = '1612.07611v1'
-
-    def test_collects_metadata(self):
-        raise NotImplementedError
-
-class ArxivCallerTestOld(TestCase):
-    def test_correct_lookup(self):
-        caller = ArxivCaller(Submission, '1611.09574v1')
-
-        caller.process()
-
-        self.assertEqual(caller.is_valid(), True)
-        self.assertIn('entries', caller.metadata)
-
-    def test_errorcode_for_non_existing_paper(self):
-        caller = ArxivCaller(Submission, '2611.09574v1')
-
-        caller.process()
-        self.assertEqual(caller.is_valid(), False)
-        self.assertEqual(caller.errorcode, 'preprint_does_not_exist')
-
-    def test_errorcode_for_bad_request(self):
-        caller = ArxivCaller(Submission, '161109574v1')
-
-        caller.process()
-        self.assertEqual(caller.is_valid(), False)
-        self.assertEqual(caller.errorcode, 'arxiv_bad_request')
-
-    def test_errorcode_for_already_published_journal_ref(self):
-        caller = ArxivCaller(Submission, '1412.0006v1')
-
-        caller.process()
-        self.assertEqual(caller.is_valid(), False)
-        self.assertEqual(caller.errorcode, 'paper_published_journal_ref')
-        self.assertNotEqual(caller.arxiv_journal_ref, '')
+    def test_identifier_new_style(self):
+        caller = ArxivCaller('1612.07611v1')
+        self.assertTrue(caller.is_valid)
+        correct_data = {
+            'pub_abstract': 'The Berezinskii-Kosterlitz-Thouless (BKT) transitions of the six-state clock\nmodel on the square lattice are investigated by means of the corner-transfer\nmatrix renormalization group method. The classical analogue of the entanglement\nentropy $S( L, T )$ is calculated for $L$ by $L$ square system up to $L = 129$,\nas a function of temperature $T$. The entropy has a peak at $T = T^{*}_{~}( L\n)$, where the temperature depends on both $L$ and boundary conditions. Applying\nthe finite-size scaling to $T^{*}_{~}( L )$ and assuming the presence of BKT\ntransitions, the transition temperature is estimated to be $T_1^{~} = 0.70$ and\n$T_2^{~} = 0.88$. The obtained results agree with previous analyses. It should\nbe noted that no thermodynamic function is used in this study.', 'author_list': ['Roman Krčmár', 'Andrej Gendiar', 'Tomotoshi Nishino'], 'arxiv_link': 'http://arxiv.org/abs/1612.07611v1', 'pub_title': 'Phase transition of the six-state clock model observed from the\n  entanglement entropy'
+        }
+        self.assertEqual(caller.data, correct_data)
 
-    def test_errorcode_no_version_nr(self):
-        # Should be already caught in form validation
-        caller = ArxivCaller(Submission, '1412.0006')
+    def test_identifier_old_style(self):
+        caller = ArxivCaller('cond-mat/0612480')
+        self.assertTrue(caller.is_valid)
+        correct_data = {
+            'pub_title': 'Least Action Principle for the Real-Time Density Matrix Renormalization\n  Group', 'arxiv_link': 'http://arxiv.org/abs/cond-mat/0612480v2', 'author_list': ['Kouji Ueda', 'Chenglong Jin', 'Naokazu Shibata', 'Yasuhiro Hieida', 'Tomotoshi Nishino'], 'pub_abstract': 'A kind of least action principle is introduced for the discrete time\nevolution of one-dimensional quantum lattice models. Based on this principle,\nwe obtain an optimal condition for the matrix product states on succeeding time\nslices generated by the real-time density matrix renormalization group method.\nThis optimization can also be applied to classical simulations of quantum\ncircuits. We discuss the time reversal symmetry in the fully optimized MPS.'
+        }
+        self.assertEqual(caller.data, correct_data)
 
-        caller.process()
-        self.assertEqual(caller.is_valid(), False)
-        self.assertEqual(caller.errorcode, 'bad_identifier')
+    def valid_but_nonexistent_identifier(self):
+        caller = ArxivCaller('1613.07611v1')
+        self.assertFalse(caller.is_valid)
 
 
 class DOICallerTest(TestCase):
@@ -85,3 +60,42 @@ class DOICallerTest(TestCase):
     def test_valid_but_non_existent_doi(self):
         caller = DOICaller('10.21468/NonExistentJournal.2.2.012')
         self.assertEqual(caller.is_valid, False)
+
+# class ArxivCallerTestOld(TestCase):
+#     def test_correct_lookup(self):
+#         caller = ArxivCaller(Submission, '1611.09574v1')
+#
+#         caller.process()
+#
+#         self.assertEqual(caller.is_valid(), True)
+#         self.assertIn('entries', caller.metadata)
+#
+#     def test_errorcode_for_non_existing_paper(self):
+#         caller = ArxivCaller(Submission, '2611.09574v1')
+#
+#         caller.process()
+#         self.assertEqual(caller.is_valid(), False)
+#         self.assertEqual(caller.errorcode, 'preprint_does_not_exist')
+#
+#     def test_errorcode_for_bad_request(self):
+#         caller = ArxivCaller(Submission, '161109574v1')
+#
+#         caller.process()
+#         self.assertEqual(caller.is_valid(), False)
+#         self.assertEqual(caller.errorcode, 'arxiv_bad_request')
+#
+#     def test_errorcode_for_already_published_journal_ref(self):
+#         caller = ArxivCaller(Submission, '1412.0006v1')
+#
+#         caller.process()
+#         self.assertEqual(caller.is_valid(), False)
+#         self.assertEqual(caller.errorcode, 'paper_published_journal_ref')
+#         self.assertNotEqual(caller.arxiv_journal_ref, '')
+#
+#     def test_errorcode_no_version_nr(self):
+#         # Should be already caught in form validation
+#         caller = ArxivCaller(Submission, '1412.0006')
+#
+#         caller.process()
+#         self.assertEqual(caller.is_valid(), False)
+#         self.assertEqual(caller.errorcode, 'bad_identifier')
-- 
GitLab