diff --git a/local_settings_ci.py b/local_settings_ci.py index 2d800c09d81d71a66bac4fdc53b44dc31948baa7..3a42e373d5140f1c3e4a07be95c79c81c53161f1 100644 --- a/local_settings_ci.py +++ b/local_settings_ci.py @@ -33,3 +33,6 @@ MEDIA_ROOT = '/tmp/media' # Warning! `/tmp` directory can be flushed in any mom ALLOWED_HOSTS = ["127.0.0.1", "localhost"] STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage' +NEXMO_API_KEY = 'API_KEY' +NEXMO_API_SECRET = 'API_SECRET' +NEXMO_DEFAULT_FROM = 'Scheduling' # the sender of the message (phone number or text) diff --git a/requirements-dev.txt b/requirements-dev.txt index c98d53a535b2af51259e18d8888b30b135f37b42..5bb00bd7e43df115c62f2a24dcdbe44b513133ef 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,2 +1,3 @@ coverage -django-debug-toolbar \ No newline at end of file +django-debug-toolbar +mockito diff --git a/smash/web/models/__init__.py b/smash/web/models/__init__.py index 3b9f8e50c878e0764d4ff6a7bb5c288ca933b56c..6c0f4e1ec5b043bbccd4afb39de3a9aa4a424395 100644 --- a/smash/web/models/__init__.py +++ b/smash/web/models/__init__.py @@ -1,8 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -import datetime - from django.contrib.auth.models import User from configuration_item import ConfigurationItem @@ -25,10 +23,6 @@ from missing_subject import MissingSubject from inconsistent_subject import InconsistentSubject, InconsistentField -def get_current_year(): - return datetime.datetime.now().year - - __all__ = [FlyingTeam, Appointment, AppointmentType, Availability, Holiday, Item, Language, Location, Room, Subject, Visit, Worker, ContactAttempt, ConfigurationItem, MailTemplate, AppointmentTypeLink, MissingSubject, InconsistentSubject, InconsistentField] diff --git a/smash/web/nexmo_gateway.py b/smash/web/nexmo_gateway.py index 0515c732b1ce3a96e8a414eb9bc6fb712054efcd..bf5147d634ef5c0adc4b7cae222cf8d26e99098d 100644 --- a/smash/web/nexmo_gateway.py +++ b/smash/web/nexmo_gateway.py @@ -25,9 +25,6 @@ class Nexmo: self.client = nexmo.Client(key=getattr(settings, 'NEXMO_API_KEY'), secret=getattr(settings, 'NEXMO_API_SECRET')) self.default_from = getattr(settings, 'NEXMO_DEFAULT_FROM') - def make_call(self, device, token): - pass - def send_sms(self, device, token): body = 'Your authentication token is %s' % token phone_number = device.number.as_e164 diff --git a/smash/web/tests/functions.py b/smash/web/tests/functions.py index 3d84268e3fc699814ddddb5dc3eef508d26d78ba..a350938b7cce2cf517e696244398a88ed9948934 100644 --- a/smash/web/tests/functions.py +++ b/smash/web/tests/functions.py @@ -1,13 +1,13 @@ import datetime - import os + from django.contrib.auth.models import User -from web.redcap_connector import RedcapSubject from web.models import Location, AppointmentType, Subject, Worker, Visit, Appointment, ConfigurationItem, Language, \ - ContactAttempt, FlyingTeam -from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, CONTACT_TYPES_PHONE - + ContactAttempt, FlyingTeam, Availability +from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, CONTACT_TYPES_PHONE, \ + MONDAY_AS_DAY_OF_WEEK +from web.redcap_connector import RedcapSubject from web.views.notifications import get_today_midnight_date @@ -98,6 +98,17 @@ def create_worker(user=None, with_test_location=False): return worker +def create_availability(worker=None): + if worker is None: + worker = create_worker() + availability = Availability.objects.create(person=worker, + day_number=MONDAY_AS_DAY_OF_WEEK, + available_from=get_today_midnight_date(), + available_till=get_today_midnight_date(), + ) + return availability + + def create_visit(subject=None): if subject is None: subject = create_subject() diff --git a/smash/web/tests/test_nexmo_gateway.py b/smash/web/tests/test_nexmo_gateway.py new file mode 100644 index 0000000000000000000000000000000000000000..0ee3fea16e2b22699b64d7fb82f886446d2d6c2b --- /dev/null +++ b/smash/web/tests/test_nexmo_gateway.py @@ -0,0 +1,18 @@ +# coding=utf-8 + +from django.test import TestCase +from mockito import when, verify, ARGS +from phonenumbers import PhoneNumber +from two_factor.models import PhoneDevice + +from web.nexmo_gateway import Nexmo + + +class TestNexmo(TestCase): + def test_send_sms(self): + nexmo = Nexmo() + when(nexmo.client).send_message(*ARGS).thenReturn(True) + device = PhoneDevice() + device.number = PhoneNumber() + nexmo.send_sms(device=device, token="xxy") + verify(nexmo.client).send_message(*ARGS) diff --git a/smash/web/tests/test_view_kit_request.py b/smash/web/tests/test_view_kit_request.py index 00967ccd05c7072169f177071669ee3cf59ae772..cc82b543178595e8433f7f5c26ac2aadb3090f39 100644 --- a/smash/web/tests/test_view_kit_request.py +++ b/smash/web/tests/test_view_kit_request.py @@ -96,23 +96,22 @@ class ViewFunctionsTests(LoggedInTestCase): self.assertEqual(appointment1, result['appointments'][1]) self.assertEqual(appointment2, result['appointments'][2]) + def test_kit_requests_send_email(self): + item_name = "Test item to be ordered" + item = Item.objects.create(disposable=True, name=item_name) + appointment_type = create_appointment_type() + appointment_type.required_equipment.add(item) + appointment_type.save() -def test_kit_requests_send_email(self): - item_name = "Test item to be ordered" - item = Item.objects.create(disposable=True, name=item_name) - appointment_type = create_appointment_type() - appointment_type.required_equipment.add(item) - appointment_type.save() - - appointment = create_appointment() - appointment.datetime_when = get_today_midnight_date() + datetime.timedelta(days=2) - appointment.save() - AppointmentTypeLink.objects.create(appointment=appointment, appointment_type=appointment_type) + appointment = create_appointment() + appointment.datetime_when = get_today_midnight_date() + datetime.timedelta(days=2) + appointment.save() + AppointmentTypeLink.objects.create(appointment=appointment, appointment_type=appointment_type) - response = self.client.get(reverse('web.views.kit_requests_send_mail', - kwargs={'start_date': str(get_today_midnight_date().strftime("%Y-%m-%d"))})) - self.assertEqual(response.status_code, 200) + response = self.client.get(reverse('web.views.kit_requests_send_mail', + kwargs={'start_date': str(get_today_midnight_date().strftime("%Y-%m-%d"))})) + self.assertEqual(response.status_code, 200) - self.assertTrue(item_name in response.content) + self.assertTrue(item_name in response.content) - self.assertEqual(1, len(mail.outbox)) + self.assertEqual(1, len(mail.outbox)) diff --git a/smash/web/tests/view/__init__.py b/smash/web/tests/view/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/smash/web/tests/view/test_doctor.py b/smash/web/tests/view/test_doctor.py new file mode 100644 index 0000000000000000000000000000000000000000..5689a18676c0a8dd5b67e357a9302d1c58785304 --- /dev/null +++ b/smash/web/tests/view/test_doctor.py @@ -0,0 +1,78 @@ +import logging + +from django.urls import reverse + +from web.tests.functions import create_language, create_location, create_availability +from web.forms import WorkerAddForm +from web.tests import create_worker +from web.models import Worker +from .. import LoggedInTestCase + +logger = logging.getLogger(__name__) + + +class DoctorViewTests(LoggedInTestCase): + def test_render_workers_list_request(self): + create_worker() + + response = self.client.get(reverse('web.views.doctors')) + self.assertEqual(response.status_code, 200) + + def test_render_add_worker_request(self): + create_worker() + + response = self.client.get(reverse('web.views.doctor_add')) + self.assertEqual(response.status_code, 200) + + def test_render_worker_added_request(self): + + language = create_language() + location = create_location() + count = Worker.objects.all().count() + + form = WorkerAddForm() + form_data = {} + for key, value in form.initial.items(): + if value is not None: + form_data[key] = value + form_data["first_name"] = "John" + form_data["last_name"] = "Doe" + form_data["phone_number"] = "0123456789" + form_data["unit"] = "TEST DEPARTMENT" + form_data["email"] = "john.doe@unknown.domain.com" + form_data["role"] = Worker.ROLE_CHOICES_DOCTOR + form_data["specialization"] = "tester" + form_data["languages"] = [language.id] + form_data["locations"] = [location.id] + + response = self.client.post(reverse('web.views.doctor_add'), data=form_data) + + self.assertEqual(response.status_code, 302) + + new_count = Worker.objects.all().count() + self.assertEqual(count + 1, new_count) + + def test_render_edit_worker_request(self): + worker = create_worker() + + response = self.client.get(reverse('web.views.doctor_edit', args=[worker.id])) + self.assertEqual(response.status_code, 200) + + def test_render_add_availability_request(self): + worker = create_worker() + + response = self.client.get(reverse('views.doctor.doctor_availability_add', args=[worker.id])) + self.assertEqual(response.status_code, 200) + + def test_render_edit_availability_request(self): + worker = create_worker() + availability = create_availability(worker) + + response = self.client.get(reverse('web.views.doctor_availability_edit', args=[availability.id])) + self.assertEqual(response.status_code, 200) + + def test_render_add_holiday_request(self): + worker = create_worker() + + response = self.client.get(reverse('views.doctor.doctor_holiday_add', args=[worker.id])) + self.assertEqual(response.status_code, 200) diff --git a/smash/web/tests/view/test_redcap.py b/smash/web/tests/view/test_redcap.py new file mode 100644 index 0000000000000000000000000000000000000000..21d1f3527285c7180dc41e54e57896a0a1192189 --- /dev/null +++ b/smash/web/tests/view/test_redcap.py @@ -0,0 +1,17 @@ +import logging + +from django.urls import reverse + +from .. import LoggedInTestCase + +logger = logging.getLogger(__name__) + + +class RedcapViewTests(LoggedInTestCase): + def test_render_workers_list_request(self): + response = self.client.get(reverse('web.views.missing_redcap_subject')) + self.assertEqual(response.status_code, 200) + + def test_render_add_worker_request(self): + response = self.client.get(reverse('web.views.inconsistent_redcap_subject')) + self.assertEqual(response.status_code, 200) diff --git a/smash/web/urls.py b/smash/web/urls.py index 55216a0476214da6380ca798a75ad05967ed2106..825d5e003f646ea653a95f897873f870a048e1e5 100644 --- a/smash/web/urls.py +++ b/smash/web/urls.py @@ -81,7 +81,8 @@ urlpatterns = [ ######################### url(r'^redcap/missing_subjects$', views.redcap.missing_subjects, name='web.views.missing_redcap_subject'), - url(r'^redcap/inconsistent_subjects$', views.redcap.inconsistent_subjects, name='web.views.inconsistent_redcap_subject'), + url(r'^redcap/inconsistent_subjects$', views.redcap.inconsistent_subjects, + name='web.views.inconsistent_redcap_subject'), #################### # CONTACTS #