From f6af6dc9137e6ec50362dd973689a2d351bf32f7 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 18 Nov 2020 09:35:42 +0100
Subject: [PATCH] validation of visit_import_data form

---
 smash/web/forms/visit_import_data_form.py     | 11 +++++
 .../forms/test_visit_import_data_forms.py     | 43 +++++++++++++++++++
 .../web/tests/view/test_visit_import_data.py  | 41 ++++++++++++++++++
 3 files changed, 95 insertions(+)
 create mode 100644 smash/web/tests/forms/test_visit_import_data_forms.py
 create mode 100644 smash/web/tests/view/test_visit_import_data.py

diff --git a/smash/web/forms/visit_import_data_form.py b/smash/web/forms/visit_import_data_form.py
index 8da98260..fd149463 100644
--- a/smash/web/forms/visit_import_data_form.py
+++ b/smash/web/forms/visit_import_data_form.py
@@ -1,3 +1,5 @@
+import re
+
 from django.forms import ModelForm
 
 from web.models import VisitImportData
@@ -10,3 +12,12 @@ class VisitImportDataEditForm(ModelForm):
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
+
+    def clean_run_at_times(self):
+        run_at_times = self.cleaned_data['run_at_times']
+        pattern = re.compile("^[0-9]{2}:[0-9]{2}$")
+        for entry in run_at_times.split(";"):
+            if entry != '' and not pattern.match(entry):
+                self.add_error('run_at_times', "Hours must be semicolon separated HH:MM values")
+        else:
+            return run_at_times
diff --git a/smash/web/tests/forms/test_visit_import_data_forms.py b/smash/web/tests/forms/test_visit_import_data_forms.py
new file mode 100644
index 00000000..bae4ac5a
--- /dev/null
+++ b/smash/web/tests/forms/test_visit_import_data_forms.py
@@ -0,0 +1,43 @@
+import logging
+
+from web.forms.visit_import_data_form import VisitImportDataEditForm
+from web.models import VisitImportData
+from web.tests import LoggedInWithWorkerTestCase
+from web.tests.functions import format_form_field, create_worker, get_test_study
+
+logger = logging.getLogger(__name__)
+
+
+class VisitImportDataEditFormTests(LoggedInWithWorkerTestCase):
+    def setUp(self):
+        super(VisitImportDataEditFormTests, self).setUp()
+        self.visit_import_data = VisitImportData.objects.create(study=get_test_study(),
+                                                                import_worker=create_worker())
+
+    def test_invalid_run_at_times(self):
+        self.login_as_admin()
+
+        form_data = self.get_form_data(self.visit_import_data)
+        form_data["run_at_times"] = "bla"
+
+        voucher_form = VisitImportDataEditForm(instance=self.visit_import_data, data=form_data)
+
+        self.assertFalse(voucher_form.is_valid())
+        self.assertTrue("run_at_times" in voucher_form.errors)
+
+    def test_valid_form(self):
+        self.login_as_admin()
+
+        form_data = self.get_form_data(self.visit_import_data)
+
+        voucher_form = VisitImportDataEditForm(instance=self.visit_import_data, data=form_data)
+
+        self.assertTrue(voucher_form.is_valid())
+
+    @staticmethod
+    def get_form_data(visit_import_data: VisitImportData) -> dict:
+        voucher_form = VisitImportDataEditForm(instance=visit_import_data)
+        form_data = {}
+        for key, value in list(voucher_form.initial.items()):
+            form_data[key] = format_form_field(value)
+        return form_data
diff --git a/smash/web/tests/view/test_visit_import_data.py b/smash/web/tests/view/test_visit_import_data.py
new file mode 100644
index 00000000..e15dbe9e
--- /dev/null
+++ b/smash/web/tests/view/test_visit_import_data.py
@@ -0,0 +1,41 @@
+import logging
+
+from django.urls import reverse
+
+from web.forms.visit_import_data_form import VisitImportDataEditForm
+from web.models import VisitImportData
+from web.tests import LoggedInWithWorkerTestCase
+from web.tests.functions import get_test_study, format_form_field
+
+logger = logging.getLogger(__name__)
+
+
+class VisitImportDataViewViewTests(LoggedInWithWorkerTestCase):
+    def setUp(self):
+        super().setUp()
+        self.study = get_test_study()
+        self.visit_import_data = VisitImportData.objects.create(study=get_test_study())
+
+    def test_render_edit(self):
+        self.login_as_admin()
+        response = self.client.get(reverse('web.views.import_visit_edit',
+                                           kwargs={'study_id': self.study.id, 'import_id': self.visit_import_data.id}))
+        self.assertEqual(response.status_code, 200)
+
+    def test_save_edit(self):
+        form_data = self.get_form_data(self.visit_import_data)
+
+        response = self.client.post(
+            reverse('web.views.import_visit_edit',
+                    kwargs={'study_id': self.study.id, 'import_id': self.visit_import_data.id}), data=form_data)
+
+        self.assertEqual(response.status_code, 302)
+        self.assertFalse("study" in response['Location'])
+
+    @staticmethod
+    def get_form_data(visit_import_data: VisitImportData) -> dict:
+        voucher_form = VisitImportDataEditForm(instance=visit_import_data)
+        form_data = {}
+        for key, value in list(voucher_form.initial.items()):
+            form_data[key] = format_form_field(value)
+        return form_data
-- 
GitLab