Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
test_study_subject.py 7.20 KiB
from django.test import TestCase

from web.models import Appointment
from web.models import Visit
from web.models import StudySubject, Study
from web.tests.functions import get_test_study, create_study_subject, create_appointment, create_study_subject_with_multiple_screening_numbers
from web.tests.functions import create_visit


class SubjectModelTests(TestCase):

    def test_signal_mark_as_endpoint_reached(self):
        subject = create_study_subject()
        visit = create_visit(subject)
        appointment = create_appointment(visit)

        subject.endpoint_reached = True
        subject.save()
        appointment_status = Appointment.objects.filter(id=appointment.id)[
            0].status
        visit_finished = Visit.objects.filter(id=visit.id)[0].is_finished

        self.assertTrue(subject.endpoint_reached)
        self.assertTrue(visit_finished)
        self.assertEquals(
            Appointment.APPOINTMENT_STATUS_CANCELLED, appointment_status)

    def test_mark_as_endpoint_reached(self):
        subject = create_study_subject()
        visit = create_visit(subject)
        appointment = create_appointment(visit)

        subject.mark_as_endpoint_reached()
        appointment_status = Appointment.objects.filter(id=appointment.id)[
            0].status
        visit_finished = Visit.objects.filter(id=visit.id)[0].is_finished

        self.assertTrue(subject.endpoint_reached)
        self.assertTrue(visit_finished)
        self.assertEquals(
            Appointment.APPOINTMENT_STATUS_CANCELLED, appointment_status)

    def test_signal_mark_as_resigned(self):
        subject = create_study_subject()
        visit = create_visit(subject)
        appointment = create_appointment(visit)

        subject.resigned = True
        subject.save()
        appointment_status = Appointment.objects.filter(id=appointment.id)[
            0].status
        visit_finished = Visit.objects.filter(id=visit.id)[0].is_finished

        self.assertTrue(subject.resigned)
        self.assertTrue(visit_finished)
        self.assertEquals(
            Appointment.APPOINTMENT_STATUS_CANCELLED, appointment_status)

    def test_mark_as_resigned(self):
        subject = create_study_subject()
        visit = create_visit(subject)
        appointment = create_appointment(visit)

        subject.mark_as_resigned()
        appointment_status = Appointment.objects.filter(id=appointment.id)[
            0].status
        visit_finished = Visit.objects.filter(id=visit.id)[0].is_finished

        self.assertTrue(subject.resigned)
        self.assertTrue(visit_finished)
        self.assertEquals(
            Appointment.APPOINTMENT_STATUS_CANCELLED, appointment_status)

    def test_signal_mark_as_excluded(self):
        subject = create_study_subject()
        visit = create_visit(subject)
        appointment = create_appointment(visit)

        subject.excluded = True
        subject.save()
        appointment_status = Appointment.objects.filter(id=appointment.id)[
            0].status
        visit_finished = Visit.objects.filter(id=visit.id)[0].is_finished

        self.assertTrue(subject.excluded)
        self.assertTrue(visit_finished)
        self.assertEquals(
            Appointment.APPOINTMENT_STATUS_CANCELLED, appointment_status)

    def test_mark_as_excluded(self):
        subject = create_study_subject()
        visit = create_visit(subject)
        appointment = create_appointment(visit)

        subject.mark_as_excluded()
        appointment_status = Appointment.objects.filter(id=appointment.id)[
            0].status
        visit_finished = Visit.objects.filter(id=visit.id)[0].is_finished

        self.assertTrue(subject.excluded)
        self.assertTrue(visit_finished)
        self.assertEquals(
            Appointment.APPOINTMENT_STATUS_CANCELLED, appointment_status)

    def test_check_nd_number_regex(self):
        study = get_test_study()

        # delete everything
        StudySubject.objects.all().delete()
        # get default regex
        nd_number_study_subject_regex_default = Study._meta.get_field(
            'nd_number_study_subject_regex').get_default()

        self.assertTrue(StudySubject.check_nd_number_regex(nd_number_study_subject_regex_default, study))
        # this will add a studysubject with a NDnumber
        study_subject = create_study_subject(nd_number='ND0001')

        self.assertTrue(StudySubject.check_nd_number_regex(nd_number_study_subject_regex_default, study))
        # delete everything
        StudySubject.objects.all().delete()
        # this will add a studysubject with a NDnumber
        create_study_subject(nd_number='ND00001')
        self.assertFalse(StudySubject.check_nd_number_regex(nd_number_study_subject_regex_default, study))

    def test_sort_matched_screening_first(self):

        def create_result(phrase, subject_id=1):
            phrase = phrase.format(subject_id=subject_id)
            phrase = phrase.split(';')
            for i, r in enumerate(phrase):
                letter, num = phrase[i].strip().split('-')
                phrase[i] = (letter, int(num))
            return phrase

        subject = create_study_subject_with_multiple_screening_numbers(
            subject_id=1)
        self.assertEqual(subject.sort_matched_screening_first('L'), create_result(
            'L-00{subject_id}; E-00{subject_id}', subject_id=1))
        self.assertEqual(subject.sort_matched_screening_first(
            'L-00'), create_result('L-00{subject_id}; E-00{subject_id}', subject_id=1))
        self.assertEqual(subject.sort_matched_screening_first('E'), create_result(
            'E-00{subject_id}; L-00{subject_id}', subject_id=1))
        self.assertEqual(subject.sort_matched_screening_first(
            '-'), create_result('E-00{subject_id}; L-00{subject_id}', subject_id=1))
        self.assertEqual(subject.sort_matched_screening_first(''), create_result(
            'E-00{subject_id}; L-00{subject_id}', subject_id=1))
        self.assertEqual(subject.sort_matched_screening_first('001'), create_result(
            'E-00{subject_id}; L-00{subject_id}', subject_id=1))
        self.assertEqual(subject.sort_matched_screening_first('00'), create_result(
            'E-00{subject_id}; L-00{subject_id}', subject_id=1))
        self.assertEqual(subject.sort_matched_screening_first('potato'), create_result(
            'E-00{subject_id}; L-00{subject_id}', subject_id=1))

    def test_sort_matched_screening_first_bad_number(self):

        subject_id = 2
        screening_number = 'L-0/0{}; E-00{}; F-0/1{}'.format(subject_id, subject_id, subject_id)

        subject = create_study_subject_with_multiple_screening_numbers(
            subject_id=subject_id, screening_number=screening_number)

        self.assertEqual(subject.sort_matched_screening_first('E-'), [('E', subject_id), ('F', '0/12'), ('L', '0/02')])

        self.assertEqual(subject.sort_matched_screening_first('L-'), [('L', '0/02'), ('E', subject_id), ('F', '0/12')])

    def test_sort_matched_screening_first_bad_format(self):

        screening_number = 'potato; tomato'
        subject_id = 3
        subject = create_study_subject_with_multiple_screening_numbers(
            subject_id=subject_id, screening_number=screening_number)

        self.assertEqual(subject.sort_matched_screening_first('L-'), [('potato', None), ('tomato', None)])