From ecbef97d6cf97cbccffd3d144aa912ba66e0959d Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Mon, 27 Nov 2017 16:02:11 +0100 Subject: [PATCH] unit test fixed --- smash/web/forms.py | 31 +++++++++++++++++-- smash/web/statistics.py | 16 +++++----- ...AddForm.py => test_StudySubjectAddForm.py} | 28 ++++++++++------- ...itForm.py => test_StudySubjectEditForm.py} | 17 +++++----- smash/web/tests/view/test_subjects.py | 20 ++++++------ smash/web/views/subject.py | 6 ++-- 6 files changed, 77 insertions(+), 41 deletions(-) rename smash/web/tests/forms/{test_SubjectAddForm.py => test_StudySubjectAddForm.py} (82%) rename smash/web/tests/forms/{test_SubjectEditForm.py => test_StudySubjectEditForm.py} (78%) diff --git a/smash/web/forms.py b/smash/web/forms.py index 9a30d9e7..0f4efe76 100644 --- a/smash/web/forms.py +++ b/smash/web/forms.py @@ -5,7 +5,7 @@ from django import forms from django.forms import ModelForm, Form from django.utils.dates import MONTHS -from web.models import StudySubject, Worker, Appointment, Visit, AppointmentType, ContactAttempt, AppointmentTypeLink, \ +from web.models import Subject, StudySubject, Worker, Appointment, Visit, AppointmentType, ContactAttempt, AppointmentTypeLink, \ Availability, Holiday from web.models.constants import SUBJECT_TYPE_CHOICES, SCREENING_NUMBER_PREFIXES_FOR_TYPE, COUNTRY_OTHER_ID from web.views.notifications import get_filter_locations @@ -62,7 +62,7 @@ def validate_subject_mpower_number(self, cleaned_data): self.add_error('mpower_id', "mPower number already in use") -class SubjectAddForm(ModelForm): +class StudySubjectAddForm(ModelForm): date_born = forms.DateField(label="Date of birth", widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"), required=False @@ -98,7 +98,7 @@ class SubjectAddForm(ModelForm): return screening_number def clean(self): - cleaned_data = super(SubjectAddForm, self).clean() + cleaned_data = super(StudySubjectAddForm, self).clean() screening_number = self.build_screening_number(cleaned_data) if screening_number is not None: cleaned_data['screening_number'] = screening_number @@ -521,3 +521,28 @@ class HolidayAddForm(ModelForm): availabilities = worker.availability_set.all() for availability in availabilities: validate_availability_conflict(self, self.cleaned_data, availability) + + +class SubjectAddForm(ModelForm): + date_born = forms.DateField(label="Date of birth", + widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"), + required=False + ) + + class Meta: + model = Subject + fields = '__all__' + exclude = ['dead'] + + def build_screening_number(self, cleaned_data): + screening_number = cleaned_data.get('screening_number', None) + if not screening_number: + prefix_screening_number = self.get_prefix_screening_number() + if prefix_screening_number is not None: + screening_number = get_new_screening_number(prefix_screening_number) + return screening_number + + def clean(self): + cleaned_data = super(SubjectAddForm, self).clean() + validate_subject_country(self, cleaned_data) + return cleaned_data diff --git a/smash/web/statistics.py b/smash/web/statistics.py index c68c3750..f94df0a8 100644 --- a/smash/web/statistics.py +++ b/smash/web/statistics.py @@ -16,28 +16,28 @@ SELECT DISTINCT(rank() OVER (PARTITION BY subject_id ORDER BY datetime_begin)) A """ QUERY_APPOINTMENTS_COUNT = """ -SELECT count(*) FROM web_appointment LEFT JOIN (SELECT id, subject_id, rank() +SELECT count(*) FROM web_appointment LEFT JOIN (SELECT id, subject_id as web_visit_subject_id, rank() OVER (PARTITION BY subject_id ORDER BY datetime_begin) AS rnk FROM web_visit) a ON a.id = web_appointment.visit_id -LEFT JOIN web_studysubject ON web_studysubject.id = subject_id +LEFT JOIN web_studysubject ON web_studysubject.id = web_visit_subject_id WHERE a.rnk = %s AND EXTRACT(MONTH FROM web_appointment.datetime_when) = %s AND EXTRACT(YEAR FROM web_appointment.datetime_when) = %s """ QUERY_VISITS_ENDED_COUNT = """ -SELECT count(*) FROM (SELECT id, subject_id, datetime_begin, datetime_end, rank() +SELECT count(*) FROM (SELECT id, subject_id as web_visit_subject_id, datetime_begin, datetime_end, rank() OVER (PARTITION BY subject_id ORDER BY datetime_begin) AS rnk FROM web_visit) a -LEFT JOIN web_studysubject ON web_studysubject.id = subject_id +LEFT JOIN web_studysubject ON web_studysubject.id = web_visit_subject_id WHERE a.rnk = %s AND EXTRACT(MONTH FROM a.datetime_end) = %s AND EXTRACT(YEAR FROM a.datetime_end) = %s """ QUERY_VISITS_STARTED_COUNT = """ -SELECT count(*) FROM (SELECT id, subject_id, datetime_begin, datetime_end, rank() +SELECT count(*) FROM (SELECT id, subject_id as web_visit_subject_id, datetime_begin, datetime_end, rank() OVER (PARTITION BY subject_id ORDER BY datetime_begin) AS rnk FROM web_visit) a -LEFT JOIN web_studysubject ON web_studysubject.id = subject_id +LEFT JOIN web_studysubject ON web_studysubject.id = web_visit_subject_id WHERE a.rnk = %s AND EXTRACT(MONTH FROM a.datetime_begin) = %s AND EXTRACT(YEAR FROM a.datetime_begin) = %s @@ -45,10 +45,10 @@ EXTRACT(YEAR FROM a.datetime_begin) = %s QUERY_APPOINTMENTS = """ SELECT types.appointment_type_id, web_appointment.status, count(*) FROM web_appointment -LEFT JOIN (SELECT id, subject_id, rank() OVER (PARTITION BY subject_id ORDER BY datetime_begin) AS rnk +LEFT JOIN (SELECT id, subject_id as web_visit_subject_id, rank() OVER (PARTITION BY subject_id ORDER BY datetime_begin) AS rnk FROM web_visit) a ON a.id = web_appointment.visit_id LEFT JOIN web_appointmenttypelink types ON types.appointment_id = web_appointment.id -LEFT JOIN web_studysubject ON web_studysubject.id = subject_id +LEFT JOIN web_studysubject ON web_studysubject.id = web_visit_subject_id WHERE a.rnk = %s AND EXTRACT(MONTH FROM web_appointment.datetime_when) = %s AND EXTRACT(YEAR FROM web_appointment.datetime_when) = %s diff --git a/smash/web/tests/forms/test_SubjectAddForm.py b/smash/web/tests/forms/test_StudySubjectAddForm.py similarity index 82% rename from smash/web/tests/forms/test_SubjectAddForm.py rename to smash/web/tests/forms/test_StudySubjectAddForm.py index 1c743a8b..644863fe 100644 --- a/smash/web/tests/forms/test_SubjectAddForm.py +++ b/smash/web/tests/forms/test_StudySubjectAddForm.py @@ -1,14 +1,19 @@ -from web.forms import SubjectAddForm, get_new_screening_number +import logging + +from web.forms import StudySubjectAddForm, get_new_screening_number from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, COUNTRY_AFGHANISTAN_ID from web.tests import LoggedInWithWorkerTestCase -from web.tests.functions import create_study_subject +from web.tests.functions import create_study_subject, create_subject + +logger = logging.getLogger(__name__) -class SubjectAddFormTests(LoggedInWithWorkerTestCase): +class StudySubjectAddFormTests(LoggedInWithWorkerTestCase): def setUp(self): - super(SubjectAddFormTests, self).setUp() + super(StudySubjectAddFormTests, self).setUp() location = self.worker.locations.all()[0] + self.subject = create_subject() self.sample_data = {'first_name': 'name', 'last_name': 'name', 'sex': SEX_CHOICES_MALE, @@ -16,10 +21,11 @@ class SubjectAddFormTests(LoggedInWithWorkerTestCase): 'default_location': location.id, 'screening_number': "123", 'country': COUNTRY_AFGHANISTAN_ID, + 'subject': self.subject.id } def test_validation(self): - form = SubjectAddForm(data=self.sample_data, user=self.user) + form = StudySubjectAddForm(data=self.sample_data, user=self.user) form.is_valid() self.assertTrue(form.is_valid()) @@ -27,13 +33,13 @@ class SubjectAddFormTests(LoggedInWithWorkerTestCase): form_data = self.sample_data form_data['screening_number'] = "123" - form = SubjectAddForm(data=form_data, user=self.user) + form = StudySubjectAddForm(data=form_data, user=self.user) form.is_valid() self.assertTrue(form.is_valid()) self.assertIsNone(form.fields['year_of_diagnosis'].initial) form.save() - form2 = SubjectAddForm(data=form_data, user=self.user) + form2 = StudySubjectAddForm(data=form_data, user=self.user) validation_status = form2.is_valid() self.assertFalse(validation_status) self.assertTrue("screening_number" in form2.errors) @@ -42,13 +48,13 @@ class SubjectAddFormTests(LoggedInWithWorkerTestCase): form_data = self.sample_data form_data['nd_number'] = "ND0123" - form = SubjectAddForm(data=form_data, user=self.user) + form = StudySubjectAddForm(data=form_data, user=self.user) form.is_valid() self.assertTrue(form.is_valid()) form.save() form_data['screening_number'] = "2" - form2 = SubjectAddForm(data=form_data, user=self.user) + form2 = StudySubjectAddForm(data=form_data, user=self.user) validation_status = form2.is_valid() self.assertFalse(validation_status) self.assertTrue("nd_number" in form2.errors) @@ -57,13 +63,13 @@ class SubjectAddFormTests(LoggedInWithWorkerTestCase): form_data = self.sample_data form_data['mpower_id'] = "123" - form = SubjectAddForm(data=form_data, user=self.user) + form = StudySubjectAddForm(data=form_data, user=self.user) form.is_valid() self.assertTrue(form.is_valid()) form.save() form_data['screening_number'] = "2" - form2 = SubjectAddForm(data=form_data, user=self.user) + form2 = StudySubjectAddForm(data=form_data, user=self.user) validation_status = form2.is_valid() self.assertFalse(validation_status) self.assertTrue("mpower_id" in form2.errors) diff --git a/smash/web/tests/forms/test_SubjectEditForm.py b/smash/web/tests/forms/test_StudySubjectEditForm.py similarity index 78% rename from smash/web/tests/forms/test_SubjectEditForm.py rename to smash/web/tests/forms/test_StudySubjectEditForm.py index f07135c4..fde535a5 100644 --- a/smash/web/tests/forms/test_SubjectEditForm.py +++ b/smash/web/tests/forms/test_StudySubjectEditForm.py @@ -1,13 +1,15 @@ -from web.forms import SubjectAddForm +from web.forms import StudySubjectAddForm from web.forms import SubjectEditForm from web.models import StudySubject from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, COUNTRY_AFGHANISTAN_ID from web.tests import LoggedInWithWorkerTestCase +from web.tests.functions import create_subject class SubjectEditFormTests(LoggedInWithWorkerTestCase): def setUp(self): super(SubjectEditFormTests, self).setUp() + self.subject = create_subject() location = self.worker.locations.all()[0] self.sample_data = {'first_name': 'name', @@ -17,14 +19,15 @@ class SubjectEditFormTests(LoggedInWithWorkerTestCase): 'default_location': location.id, 'country': COUNTRY_AFGHANISTAN_ID, 'screening_number': '123', - 'nd_number': 'ND0123' + 'nd_number': 'ND0123', + 'subject': self.subject.id } def tearDown(self): StudySubject.objects.all().delete() def test_validation(self): - add_form = SubjectAddForm(data=self.sample_data, user=self.user) + add_form = StudySubjectAddForm(data=self.sample_data, user=self.user) subject = add_form.save() self.sample_data['id'] = subject.id @@ -33,12 +36,12 @@ class SubjectEditFormTests(LoggedInWithWorkerTestCase): self.assertTrue(save_status) def test_invalid_nd_number_edit(self): - add_form = SubjectAddForm(data=self.sample_data, user=self.user) + add_form = StudySubjectAddForm(data=self.sample_data, user=self.user) add_form.save() self.sample_data['nd_number'] = "ND0124" self.sample_data['screening_number'] = "124" - add_form = SubjectAddForm(data=self.sample_data, user=self.user) + add_form = StudySubjectAddForm(data=self.sample_data, user=self.user) subject = add_form.save() self.sample_data['id'] = subject.id @@ -50,13 +53,13 @@ class SubjectEditFormTests(LoggedInWithWorkerTestCase): def test_invalid_mpower_id_edit(self): self.sample_data['screening_number'] = "001" - add_form = SubjectAddForm(data=self.sample_data, user=self.user) + add_form = StudySubjectAddForm(data=self.sample_data, user=self.user) subject = add_form.save() self.sample_data['mpower_id'] = "mpower_002" self.sample_data['nd_number'] = "ND0002" self.sample_data['screening_number'] = "002" - add_form = SubjectAddForm(data=self.sample_data, user=self.user) + add_form = StudySubjectAddForm(data=self.sample_data, user=self.user) add_form.save() self.sample_data['id'] = subject.id diff --git a/smash/web/tests/view/test_subjects.py b/smash/web/tests/view/test_subjects.py index acb84c15..9278a436 100644 --- a/smash/web/tests/view/test_subjects.py +++ b/smash/web/tests/view/test_subjects.py @@ -2,18 +2,20 @@ import datetime from django.urls import reverse -from web.forms import SubjectAddForm, SubjectEditForm +from web.forms import StudySubjectAddForm, SubjectEditForm from web.models import StudySubject from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, SUBJECT_TYPE_CHOICES_PATIENT, \ COUNTRY_AFGHANISTAN_ID, COUNTRY_OTHER_ID from web.tests import LoggedInWithWorkerTestCase -from web.tests.functions import create_study_subject, create_visit, create_appointment, get_test_location +from web.tests.functions import create_study_subject, create_visit, create_appointment, get_test_location, \ + create_subject from web.views.notifications import get_today_midnight_date class SubjectsViewTests(LoggedInWithWorkerTestCase): def setUp(self): super(SubjectsViewTests, self).setUp() + self.subject = create_subject() def test_subjects_add(self): self.worker.save() @@ -80,8 +82,8 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): def test_subjects_add_2(self): - form = SubjectAddForm(user=self.user) - form_data = {} + form = StudySubjectAddForm(user=self.user) + form_data = {"subject": self.subject.id} for key, value in form.initial.items(): if value is not None: form_data[key] = value @@ -99,17 +101,17 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): "prefix should start by L" + " as default location prefix is not defined and subject type is control") - @staticmethod - def add_valid_form_data_for_subject_add(form_data): + def add_valid_form_data_for_subject_add(self, form_data): form_data["country"] = COUNTRY_AFGHANISTAN_ID form_data["first_name"] = "John" form_data["last_name"] = "Doe" form_data["sex"] = SEX_CHOICES_MALE form_data["type"] = SUBJECT_TYPE_CHOICES_PATIENT + form_data["subject"] = self.subject.id def test_subjects_add_patient(self): - form = SubjectAddForm(user=self.user) + form = StudySubjectAddForm(user=self.user) form_data = {} for key, value in form.initial.items(): if value is not None: @@ -129,7 +131,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): def test_subjects_add_invalid(self): - form = SubjectAddForm(user=self.user) + form = StudySubjectAddForm(user=self.user) form_data = {} for key, value in form.initial.items(): if value is not None: @@ -143,7 +145,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): def test_subjects_add_with_prefixed_location(self): - form = SubjectAddForm(user=self.user) + form = StudySubjectAddForm(user=self.user) form_data = {} for key, value in form.initial.items(): if value is not None: diff --git a/smash/web/views/subject.py b/smash/web/views/subject.py index a8ed5770..996387a5 100644 --- a/smash/web/views/subject.py +++ b/smash/web/views/subject.py @@ -3,7 +3,7 @@ from django.contrib import messages from django.shortcuts import redirect, get_object_or_404 from . import wrap_response -from ..forms import SubjectAddForm, SubjectEditForm, VisitDetailForm +from ..forms import StudySubjectAddForm, SubjectEditForm, VisitDetailForm from ..models import StudySubject, MailTemplate, Worker SUBJECT_LIST_GENERIC = "GENERIC" @@ -21,7 +21,7 @@ def subjects(request): def subject_add(request): if request.method == 'POST': - form = SubjectAddForm(request.POST, request.FILES, user=request.user) + form = StudySubjectAddForm(request.POST, request.FILES, user=request.user) if form.is_valid(): form.save() messages.add_message(request, messages.SUCCESS, 'Subject created') @@ -30,7 +30,7 @@ def subject_add(request): messages.add_message(request, messages.ERROR, 'Invalid data. Please fix data and try again.') else: - form = SubjectAddForm(user=request.user) + form = StudySubjectAddForm(user=request.user) return wrap_response(request, 'subjects/add.html', {'form': form}) -- GitLab