From 33a5aff5c24f632bdd96bd3fe550d645ea848e4d Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 6 Dec 2017 12:22:13 +0100
Subject: [PATCH] unit test for visit sorting

---
 smash/web/tests/api_views/test_visit.py | 101 +++++++++++++++++++++++-
 1 file changed, 100 insertions(+), 1 deletion(-)

diff --git a/smash/web/tests/api_views/test_visit.py b/smash/web/tests/api_views/test_visit.py
index c77c67ae..e475967e 100644
--- a/smash/web/tests/api_views/test_visit.py
+++ b/smash/web/tests/api_views/test_visit.py
@@ -1,14 +1,18 @@
 # coding=utf-8
+import datetime
 import json
 import logging
 
 from django.urls import reverse
 
+from web.api_views.visit import get_visits_filtered, get_visits_order
+from web.models import Visit
 from web.models.study_visit_list import VISIT_LIST_GENERIC, VISIT_LIST_EXCEEDED_TIME, VISIT_LIST_UNFINISHED, \
     VISIT_LIST_MISSING_APPOINTMENTS, VISIT_LIST_APPROACHING_WITHOUT_APPOINTMENTS, \
     VISIT_LIST_APPROACHING_FOR_MAIL_CONTACT
 from web.tests import LoggedInWithWorkerTestCase
 from web.tests.functions import create_study_subject, create_get_suffix, create_visit
+from web.views.notifications import get_today_midnight_date
 
 logger = logging.getLogger(__name__)
 
@@ -17,6 +21,7 @@ class TestVisitApi(LoggedInWithWorkerTestCase):
     def setUp(self):
         super(TestVisitApi, self).setUp()
         self.study_subject = create_study_subject()
+        self.visit = create_visit(self.study_subject)
 
     def test_get_columns(self):
         response = self.client.get(reverse('web.api.visits.columns', kwargs={'visit_list_type': VISIT_LIST_GENERIC}))
@@ -26,7 +31,8 @@ class TestVisitApi(LoggedInWithWorkerTestCase):
         self.assertTrue(len(columns) > 0)
 
     def test_get_columns_for_time_exceeded(self):
-        response = self.client.get(reverse('web.api.visits.columns', kwargs={'visit_list_type': VISIT_LIST_EXCEEDED_TIME}))
+        response = self.client.get(
+            reverse('web.api.visits.columns', kwargs={'visit_list_type': VISIT_LIST_EXCEEDED_TIME}))
         self.assertEqual(response.status_code, 200)
 
         columns = json.loads(response.content)['columns']
@@ -81,3 +87,96 @@ class TestVisitApi(LoggedInWithWorkerTestCase):
         response = self.client.get(url)
         self.assertEqual(response.status_code, 200)
         self.assertTrue(name in response.content)
+
+    def check_visit_filtered(self, filters, result):
+        subjects = get_visits_filtered(Visit.objects.all(), filters)
+        self.assertEqual(len(result), subjects.count())
+        for index in range(len(result)):
+            self.assertEqual(result[index], subjects[index])
+
+    def check_visit_ordered(self, order, result):
+        visits = get_visits_order(Visit.objects.all(), order, "asc")
+        self.assertEqual(len(result), visits.count())
+        for index in range(len(result)):
+            self.assertEqual(result[index], visits[index])
+
+        visits = get_visits_order(Visit.objects.all(), order, "desc")
+        length = len(result)
+        self.assertEqual(length, visits.count())
+        for index in range(length):
+            self.assertEqual(result[length - index - 1], visits[index])
+
+    def test_visits_sort_first_name(self):
+        subject = self.study_subject
+        subject.subject.first_name = "PPP"
+        subject.subject.save()
+
+        subject2 = create_study_subject(2)
+        subject2.subject.first_name = "QQQ"
+        subject2.subject.save()
+
+        visit2 = create_visit(subject2)
+
+        self.check_visit_ordered("first_name", [self.visit, visit2])
+
+    def test_visits_sort_last_name(self):
+        subject = self.study_subject
+        subject.subject.last_name = "PPP"
+        subject.subject.save()
+
+        subject2 = create_study_subject(2)
+        subject2.subject.last_name = "QQQ"
+        subject2.subject.save()
+
+        visit2 = create_visit(subject2)
+
+        self.check_visit_ordered("last_name", [self.visit, visit2])
+
+    def test_visits_sort_default_location(self):
+        self.check_visit_ordered("default_location", [self.visit])
+
+    def test_visits_sort_flying_team(self):
+        self.check_visit_ordered("flying_team", [self.visit])
+
+    def test_visits_sort_is_finished(self):
+        self.check_visit_ordered("is_finished", [self.visit])
+
+    def test_visits_sort_post_mail_sent(self):
+        self.check_visit_ordered("post_mail_sent", [self.visit])
+
+    def test_visits_sort_datetime_begin(self):
+        visit1 = self.visit
+        visit2 = create_visit(self.study_subject)
+        visit1.datetime_begin = get_today_midnight_date() + datetime.timedelta(days=1)
+        visit2.datetime_begin = get_today_midnight_date() + datetime.timedelta(days=2)
+        visit1.save()
+        visit2.save()
+
+        self.check_visit_ordered("datetime_begin", [visit1, visit2])
+
+    def test_visits_sort_datetime_end(self):
+        visit1 = self.visit
+        visit2 = create_visit(self.study_subject)
+        visit1.datetime_end = get_today_midnight_date() + datetime.timedelta(days=1)
+        visit2.datetime_end = get_today_midnight_date() + datetime.timedelta(days=2)
+        visit1.save()
+        visit2.save()
+
+        self.check_visit_ordered("datetime_end", [visit1, visit2])
+
+    def test_visits_sort_visit_number(self):
+        visit1 = self.visit
+        visit2 = create_visit(self.study_subject)
+
+        visit2.datetime_begin = get_today_midnight_date() + datetime.timedelta(days=2)
+        visit2.save()
+        visit1.datetime_begin = get_today_midnight_date() + datetime.timedelta(days=1)
+        visit1.save()
+
+        # visit_number is adjusted automatically according to start date
+        self.check_visit_ordered("visit_number", [visit1, visit2])
+
+    def test_subjects_filter_unknown(self):
+        self.check_visit_ordered([["some_unknown", "unknown data"]], [self.visit])
+        self.check_visit_ordered([["", ""]], [self.visit])
+        self.check_visit_ordered([["", None]], [self.visit])
-- 
GitLab