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

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

from web.tests.functions import create_subject, create_worker, create_appointment_type, create_location, \
    create_get_suffix
from web.views.subject import SUBJECT_LIST_GENERIC, SUBJECT_LIST_NO_VISIT, SUBJECT_LIST_REQUIRE_CONTACT
from web.api_views.subject import get_subjects_order, get_subjects_filtered, serialize_subject

from web.models import Subject


class TestApi(TestCase):
    def setUp(self):
        self.subject = create_subject()
        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)
        self.client.login(username=username, password=password)

    def test_cities(self):
        city_name = "some city"

        response = self.client.get(reverse('web.api.cities'))
        self.assertEqual(response.status_code, 200)

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

        self.assertFalse(city_name in cities)

        self.subject.city = city_name
        self.subject.save()

        response = self.client.get(reverse('web.api.cities'))
        cities = json.loads(response.content)['cities']

        self.assertTrue(city_name in cities)

    def test_countries(self):
        country_name = "some country"

        response = self.client.get(reverse('web.api.countries'))
        self.assertEqual(response.status_code, 200)

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

        self.assertFalse(country_name in countries)

        self.subject.country = country_name
        self.subject.save()

        response = self.client.get(reverse('web.api.countries'))
        countries = json.loads(response.content)['countries']

        self.assertTrue(country_name in countries)

    def test_referrals(self):
        referral_name = "some referral"

        response = self.client.get(reverse('web.api.referrals'))
        self.assertEqual(response.status_code, 200)

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

        self.assertFalse(referral_name in referrals)

        self.subject.referral = referral_name
        self.subject.save()

        response = self.client.get(reverse('web.api.referrals'))
        referrals = json.loads(response.content)['referrals']

        self.assertTrue(referral_name in referrals)

    def test_subjects_general(self):
        response = self.client.get(reverse('web.api.subjects', kwargs={'type': SUBJECT_LIST_GENERIC}))
        self.assertEqual(response.status_code, 200)

    def test_subjects_no_visit(self):
        response = self.client.get(reverse('web.api.subjects', kwargs={'type': SUBJECT_LIST_NO_VISIT}))
        self.assertEqual(response.status_code, 200)

    def test_subjects_require_contact(self):
        response = self.client.get(reverse('web.api.subjects', kwargs={'type': SUBJECT_LIST_REQUIRE_CONTACT}))
        self.assertEqual(response.status_code, 200)

    def test_subjects_invalid(self):
        response = self.client.get(reverse('web.api.subjects', kwargs={'type': "bla"}))
        self.assertEqual(response.status_code, 500)

    def test_subjects_general_search(self):
        name = "Piotrek"
        self.subject.first_name = name
        self.subject.save()

        params = {
            "columns[0][search][value]": "another_name",
            "columns[0][data]": "first_name"
        }
        url = ("%s" + create_get_suffix(params)) % reverse('web.api.subjects', kwargs={'type': SUBJECT_LIST_GENERIC})
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertFalse(name in response.content)

        params["columns[0][search][value]"] = name
        url = ("%s" + create_get_suffix(params)) % reverse('web.api.subjects', kwargs={'type': SUBJECT_LIST_GENERIC})
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertTrue(name in response.content)

    def check_subject_filtered(self, filters, result):
        subjects = get_subjects_filtered(Subject.objects.all(), filters)
        self.assertEqual(len(result), subjects.count())
        for index in range(len(result)):
            self.assertEqual(result[index], subjects[index])

    def check_subject_ordered(self, order, result):
        subjects = get_subjects_order(Subject.objects.all(), order, "asc")
        self.assertEqual(len(result), subjects.count())
        for index in range(len(result)):
            self.assertEqual(result[index], subjects[index])

        subjects = get_subjects_order(Subject.objects.all(), order, "desc")
        length = len(result)
        self.assertEqual(length, subjects.count())
        for index in range(length):
            self.assertEqual(result[length - index - 1], subjects[index])

    def test_subjects_sort_nd_number(self):
        subject = self.subject
        subject.nd_number = "PPP"
        subject.save()

        subject2 = create_subject(2)
        subject2.nd_number = "QQQ"
        subject2.save()

        self.check_subject_ordered("nd_number", [subject, subject2])

    def test_subjects_sort_default_location(self):
        subject = self.subject

        self.check_subject_ordered("default_location", [subject])

    def test_subjects_sort_screening_number(self):
        subject = self.subject
        subject.screening_number = "PPP"
        subject.save()

        subject2 = create_subject(2)
        subject2.screening_number = "QQQ"
        subject2.save()

        self.check_subject_ordered("screening_number", [subject, subject2])

    def test_subjects_sort_last_name(self):
        subject = self.subject
        subject.last_name = "XXX"
        subject.save()

        subject2 = create_subject(2)
        subject2.last_name = "YYY"
        subject2.save()

        self.check_subject_ordered("last_name", [subject, subject2])

    def test_subjects_sort_dead(self):
        subject = self.subject
        subject.dead = True
        subject.save()

        subject2 = create_subject(2)
        subject2.dead = False
        subject2.save()

        self.check_subject_ordered("dead", [subject2, subject])

    def test_subjects_sort_resigned(self):
        subject = self.subject
        subject.resigned = True
        subject.save()

        subject2 = create_subject(2)
        subject2.resigned = False
        subject2.save()

        self.check_subject_ordered("resigned", [subject2, subject])

    def test_subjects_sort_postponed(self):
        subject = self.subject
        subject.postponed = True
        subject.save()

        subject2 = create_subject(2)
        subject2.postponed = False
        subject2.save()

        self.check_subject_ordered("postponed", [subject2, subject])

    def test_subjects_filter_dead(self):
        subject = self.subject
        subject.dead = True
        subject.save()

        subject2 = create_subject(2)
        subject2.dead = False
        subject2.save()

        self.check_subject_filtered([["dead", "true"]], [subject])
        self.check_subject_filtered([["dead", "false"]], [subject2])

    def test_subjects_filter_nd_number(self):
        subject = self.subject
        subject.nd_number = "PPP"
        subject.save()

        subject2 = create_subject(2)
        subject2.nd_number = "QQQ"
        subject2.save()

        self.check_subject_filtered([["nd_number", "P"]], [subject])

    def test_subjects_filter_screening_number(self):
        subject = self.subject
        subject.screening_number = "PPP"
        subject.save()

        subject2 = create_subject(2)
        subject2.screening_number = "QQQ"
        subject2.save()

        self.check_subject_filtered([["screening_number", "Q"]], [subject2])

    def test_subjects_filter_last_name(self):
        subject = self.subject
        subject.last_name = "XXX"
        subject.save()

        subject2 = create_subject(2)
        subject2.last_name = "YYY"
        subject2.save()

        self.check_subject_filtered([["last_name", "Q"]], [])

    def test_subjects_filter_resigned(self):
        subject = self.subject
        subject.resigned = True
        subject.save()

        subject2 = create_subject(2)
        subject2.resigned = False
        subject2.save()

        self.check_subject_filtered([["resigned", "true"]], [subject])
        self.check_subject_filtered([["resigned", "false"]], [subject2])

    def test_subjects_filter_postponed(self):
        subject = self.subject
        subject.postponed = True
        subject.save()

        subject2 = create_subject(2)
        subject2.postponed = False
        subject2.save()

        self.check_subject_filtered([["postponed", "true"]], [subject])
        self.check_subject_filtered([["postponed", "false"]], [subject2])

    def test_subjects_filter_default_location(self):
        subject = self.subject

        self.check_subject_filtered([["default_location", str(subject.default_location.id)]], [subject])
        self.check_subject_filtered([["default_location", "-1"]], [])

    def test_subjects_filter_unknown(self):
        subject = self.subject

        self.check_subject_filtered([["some_unknown", "zxczxc"]], [subject])
        self.check_subject_filtered([["", ""]], [subject])

    def test_serialize_subject(self):
        subject = self.subject
        subject.dead = True

        subject_json = serialize_subject(subject);
        self.assertEqual("YES", subject_json["dead"]);