Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
test_daily_planning.py 9.05 KiB
# coding=utf-8
import datetime
import json

from django.contrib.auth.models import User
from django.test import Client, RequestFactory
from django.test import TestCase
from django.urls import reverse

from web.api_views.daily_planning import get_workers_for_daily_planning
from web.models import Worker, Availability, Holiday, AppointmentTypeLink
from web.models.constants import TUESDAY_AS_DAY_OF_WEEK
from web.tests.functions import create_worker, create_subject, create_appointment, create_flying_team, create_visit, \
    create_appointment_type, get_test_location


class TestApi(TestCase):
    def setUp(self):
        self.client = Client()
        username = 'piotr'
        password = 'top_secret'
        self.user = User.objects.create_user(
            username=username, email='jacob@bla', password=password)
        self.worker = create_worker(self.user, True)
        self.worker.role = Worker.ROLE_CHOICES_DOCTOR
        self.worker.save()
        self.client.login(username=username, password=password)

    def test_empty_availabilities(self):
        response = self.client.get(reverse('web.api.events', kwargs={'date': "2017-09-05"}))
        self.assertEqual(response.status_code, 200)

        availabilities = json.loads(response.content)['availabilities']

        self.assertEqual(0, len(availabilities))

    def test_events_with_appointments(self):
        flying_team = create_flying_team()
        flying_team.place = "UTF name: ät"
        flying_team.save()
        subject = create_subject()
        visit = create_visit(subject)

        appointment = create_appointment(visit)
        appointment.datetime_when = datetime.datetime.now().replace(year=2017, month=9, day=5,
                                                                    hour=12)
        appointment.length = 30
        appointment.location = self.worker.locations.all()[0]
        appointment.flying_team = flying_team
        appointment.save()

        AppointmentTypeLink.objects.create(appointment=appointment, appointment_type=create_appointment_type())

        response = self.client.get(reverse('web.api.events', kwargs={'date': "2017-09-05"}))
        self.assertEqual(response.status_code, 200)

        content = json.loads(response.content)

        self.assertEqual(0, len(content['availabilities']))
        self.assertEqual(1, len(content['data'][0]['events']))

    def test_nonempty_availabilities(self):
        availability = Availability.objects.create(person=self.worker, day_number=TUESDAY_AS_DAY_OF_WEEK,
                                                   available_from="8:00", available_till="16:00")
        availability.save()
        response = self.client.get(reverse('web.api.events', kwargs={'date': "2017-09-05"}))
        self.assertEqual(response.status_code, 200)

        availabilities = json.loads(response.content)['availabilities']

        self.assertEqual(1, len(availabilities))

    def test_nonempty_availabilities_with_non_overlapping_holidays(self):
        availability = Availability.objects.create(person=self.worker, day_number=TUESDAY_AS_DAY_OF_WEEK,
                                                   available_from="8:00", available_till="16:00")
        availability.save()

        holiday = Holiday.objects.create(person=self.worker,
                                         datetime_start=datetime.datetime.now().replace(day=1, hour=5),
                                         datetime_end=datetime.datetime.now().replace(day=2, hour=20)
                                         )
        holiday.save()

        response = self.client.get(reverse('web.api.events', kwargs={'date': "2017-09-05"}))
        self.assertEqual(response.status_code, 200)

        availabilities = json.loads(response.content)['availabilities']

        self.assertEqual(1, len(availabilities))

    def test_empty_availabilities_due_to_holidays(self):
        availability = Availability.objects.create(person=self.worker, day_number=TUESDAY_AS_DAY_OF_WEEK,
                                                   available_from="8:00", available_till="16:00")
        availability.save()

        holiday = Holiday.objects.create(person=self.worker,
                                         datetime_start=datetime.datetime.now().replace(year=2017, month=9, day=5,
                                                                                        hour=5),
                                         datetime_end=datetime.datetime.now().replace(year=2017, month=9, day=5,
                                                                                      hour=20)
                                         )
        holiday.save()

        response = self.client.get(reverse('web.api.events', kwargs={'date': "2017-09-05"}))
        self.assertEqual(response.status_code, 200)

        availabilities = json.loads(response.content)['availabilities']

        self.assertEqual(0, len(availabilities))

    def test_empty_availabilities_due_to_holidays_2(self):
        availability = Availability.objects.create(person=self.worker, day_number=TUESDAY_AS_DAY_OF_WEEK,
                                                   available_from="8:00", available_till="16:00")
        availability.save()

        holiday = Holiday.objects.create(person=self.worker,
                                         datetime_start=datetime.datetime.now().replace(year=2017, month=9, day=1,
                                                                                        hour=12),
                                         datetime_end=datetime.datetime.now().replace(year=2017, month=9, day=17,
                                                                                      hour=12)
                                         )
        holiday.save()

        response = self.client.get(reverse('web.api.events', kwargs={'date': "2017-09-05"}))
        self.assertEqual(response.status_code, 200)

        availabilities = json.loads(response.content)['availabilities']

        self.assertEqual(0, len(availabilities))

    def test_nonempty_availabilities_with_overlapping_holidays(self):
        availability = Availability.objects.create(person=self.worker, day_number=TUESDAY_AS_DAY_OF_WEEK,
                                                   available_from="8:00", available_till="16:00")
        availability.save()

        holiday = Holiday.objects.create(person=self.worker,
                                         datetime_start=datetime.datetime.now().replace(year=2017, month=9, day=6,
                                                                                        hour=12),
                                         datetime_end=datetime.datetime.now().replace(year=2017, month=9, day=6,
                                                                                      hour=20)
                                         )
        holiday.save()

        response = self.client.get(reverse('web.api.events', kwargs={'date': "2017-09-05"}))
        self.assertEqual(response.status_code, 200)

        availabilities = json.loads(response.content)['availabilities']

        self.assertEqual(1, len(availabilities))

    def test_nonempty_availabilities_with_included_holidays(self):
        availability = Availability.objects.create(person=self.worker, day_number=TUESDAY_AS_DAY_OF_WEEK,
                                                   available_from="8:00", available_till="16:00")
        availability.save()

        holiday = Holiday.objects.create(person=self.worker,
                                         datetime_start=datetime.datetime.now().replace(year=2017, month=9, day=5,
                                                                                        hour=12),
                                         datetime_end=datetime.datetime.now().replace(year=2017, month=9, day=5,
                                                                                      hour=13)
                                         )
        holiday.save()

        response = self.client.get(reverse('web.api.events', kwargs={'date': "2017-09-05"}))
        self.assertEqual(response.status_code, 200)

        availabilities = json.loads(response.content)['availabilities']

        self.assertEqual(2, len(availabilities))

    def test_get_workers_for_daily_planning(self):
        factory = RequestFactory()
        request = factory.get('/api/workers')
        request.user = self.user

        user = User.objects.create_user(username="a", email='jacob@bla', password="b")

        invalid_worker = create_worker(user)
        invalid_worker.locations = [get_test_location()]
        invalid_worker.save()
        invalid_worker.disable()

        workers = get_workers_for_daily_planning(request)
        self.assertFalse(invalid_worker in workers)

    def test_get_workers_for_daily_planning_2(self):
        factory = RequestFactory()
        request = factory.get('/api/workers')
        request.user = self.user

        invalid_worker = create_worker()
        invalid_worker.locations = [get_test_location()]
        invalid_worker.save()
        invalid_worker.disable()

        workers = get_workers_for_daily_planning(request)
        self.assertFalse(invalid_worker in workers)