Skip to content

Commit 020b6d4

Browse files
committed
fix conflict
1 parent 2e0add8 commit 020b6d4

File tree

2 files changed

+77
-15
lines changed

2 files changed

+77
-15
lines changed

appointment/tests/utils/test_db_helpers.py

Lines changed: 76 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Path: appointment/tests/utils/test_db_helpers.py
33

44
import datetime
5+
from unittest import skip
56
from unittest.mock import MagicMock, PropertyMock, patch
67

78
from django.apps import apps
@@ -12,8 +13,8 @@
1213
from django.test.client import RequestFactory
1314
from django.urls import reverse
1415
from django.utils import timezone
15-
from django_q.models import Schedule
1616

17+
from appointment.logger_config import get_logger
1718
from appointment.models import Config, DayOff, PaymentInfo
1819
from appointment.tests.base.base_test import BaseTest
1920
from appointment.tests.mixins.base_mixin import ConfigMixin
@@ -31,6 +32,28 @@
3132
staff_change_allowed_on_reschedule, update_appointment_reminder, username_in_user_model, working_hours_exist
3233
)
3334

35+
logger = get_logger(__name__)
36+
37+
# Check if django-q is installed in settings
38+
DJANGO_Q_AVAILABLE = 'django_q' in settings.INSTALLED_APPS
39+
40+
# Check if django-q is installed as a dependency
41+
try:
42+
from django_q.models import Schedule
43+
from django_q.tasks import schedule
44+
45+
DJANGO_Q_AVAILABLE = True
46+
except ImportError:
47+
DJANGO_Q_AVAILABLE = False
48+
Schedule = None
49+
schedule = None
50+
51+
52+
@skip("Django-Q is not available")
53+
class DjangoQUnavailableTest(TestCase):
54+
def test_placeholder(self):
55+
self.skipTest("Django-Q is not available")
56+
3457

3558
class TestCalculateSlots(TestCase):
3659
def setUp(self):
@@ -165,18 +188,12 @@ def test_another_staff_member_no_day_off(self):
165188
self.assertFalse(check_day_off_for_staff(self.staff_member2, "2023-10-06"))
166189

167190

168-
class TestCreateAndSaveAppointment(BaseTest):
169-
191+
class TestCreateAndSaveAppointment(BaseTest, TestCase):
170192
def setUp(self):
171-
super().setUp() # Call the parent class setup
172-
# Specific setups for this test class
173-
self.ar = self.create_appt_request_for_sm1()
193+
super().setUp()
174194
self.factory = RequestFactory()
175195
self.request = self.factory.get('/')
176-
177-
def tearDown(self):
178-
Appointment.objects.all().delete()
179-
AppointmentRequest.objects.all().delete()
196+
self.ar = self.create_appt_request_for_sm1()
180197

181198
def test_create_and_save_appointment(self):
182199
client_data = {
@@ -190,7 +207,8 @@ def test_create_and_save_appointment(self):
190207
'additional_info': 'Please bring a Zat gun.'
191208
}
192209

193-
appointment = create_and_save_appointment(self.ar, client_data, appointment_data, self.request)
210+
with patch('appointment.utils.db_helpers.schedule_email_reminder') as mock_schedule_reminder:
211+
appointment = create_and_save_appointment(self.ar, client_data, appointment_data, self.request)
194212

195213
self.assertIsNotNone(appointment)
196214
self.assertEqual(appointment.client.email, client_data['email'])
@@ -199,6 +217,32 @@ def test_create_and_save_appointment(self):
199217
self.assertEqual(appointment.address, appointment_data['address'])
200218
self.assertEqual(appointment.additional_info, appointment_data['additional_info'])
201219

220+
if DJANGO_Q_AVAILABLE:
221+
mock_schedule_reminder.assert_called_once()
222+
else:
223+
mock_schedule_reminder.assert_not_called()
224+
225+
@patch('appointment.utils.db_helpers.DJANGO_Q_AVAILABLE', False)
226+
def test_create_and_save_appointment_without_django_q(self):
227+
client_data = {
228+
'email': '[email protected]',
229+
'name': 'samantha.carter',
230+
}
231+
appointment_data = {
232+
'phone': '987654321',
233+
'want_reminder': True,
234+
'address': '456, SGC, Colorado Springs, USA',
235+
'additional_info': 'Bring naquadah generator.'
236+
}
237+
238+
with patch('appointment.utils.db_helpers.logger.warning') as mock_logger_warning:
239+
appointment = create_and_save_appointment(self.ar, client_data, appointment_data, self.request)
240+
241+
self.assertIsNotNone(appointment)
242+
self.assertEqual(appointment.client.email, client_data['email'])
243+
mock_logger_warning.assert_called_with(
244+
f"Email reminder requested for appointment {appointment.id}, but django-q is not available.")
245+
202246

203247
def get_mock_reverse(url_name, **kwargs):
204248
"""A mocked version of the reverse function."""
@@ -208,6 +252,13 @@ def get_mock_reverse(url_name, **kwargs):
208252

209253

210254
class ScheduleEmailReminderTest(BaseTest):
255+
@classmethod
256+
def setUpClass(cls):
257+
if not DJANGO_Q_AVAILABLE:
258+
import unittest
259+
raise unittest.SkipTest("Django-Q is not available")
260+
super().setUpClass()
261+
211262
def setUp(self):
212263
super().setUp()
213264
self.factory = RequestFactory()
@@ -217,6 +268,7 @@ def setUp(self):
217268
def tearDown(self):
218269
Appointment.objects.all().delete()
219270
AppointmentRequest.objects.all().delete()
271+
super().tearDown()
220272

221273
def test_schedule_email_reminder_cluster_running(self):
222274
with patch('appointment.settings.check_q_cluster', return_value=True), \
@@ -233,7 +285,14 @@ def test_schedule_email_reminder_cluster_not_running(self):
233285
"Django-Q cluster is not running. Email reminder will not be scheduled.")
234286

235287

236-
class UpdateAppointmentReminderTest(BaseTest):
288+
class UpdateAppointmentReminderTest(BaseTest, TestCase):
289+
@classmethod
290+
def setUpClass(cls):
291+
if not DJANGO_Q_AVAILABLE:
292+
import unittest
293+
raise unittest.SkipTest("Django-Q is not available")
294+
super().setUpClass()
295+
237296
def setUp(self):
238297
super().setUp()
239298
self.factory = RequestFactory()
@@ -243,6 +302,7 @@ def setUp(self):
243302
def tearDown(self):
244303
Appointment.objects.all().delete()
245304
AppointmentRequest.objects.all().delete()
305+
super().tearDown()
246306

247307
def test_update_appointment_reminder_date_time_changed(self):
248308
appointment = self.create_appt_for_sm1()
@@ -267,7 +327,7 @@ def test_update_appointment_reminder_no_change(self):
267327
mock_cancel_existing_reminder.assert_not_called()
268328
mock_schedule_email_reminder.assert_not_called()
269329

270-
@patch('appointment.utils.db_helpers.logger') # Adjust the import path as necessary
330+
@patch('appointment.utils.db_helpers.logger')
271331
def test_reminder_not_scheduled_due_to_user_preference(self, mock_logger):
272332
# Scenario where user does not want a reminder
273333
want_reminder = False
@@ -281,7 +341,7 @@ def test_reminder_not_scheduled_due_to_user_preference(self, mock_logger):
281341
f"Reminder for appointment {self.appointment.id} is not scheduled per user's preference or past datetime."
282342
)
283343

284-
@patch('appointment.utils.db_helpers.logger') # Adjust the import path as necessary
344+
@patch('appointment.utils.db_helpers.logger')
285345
def test_reminder_not_scheduled_due_to_past_datetime(self, mock_logger):
286346
# Scenario where the new datetime is in the past
287347
want_reminder = True
@@ -371,6 +431,8 @@ def test_staff_change_not_allowed(self, mock_config_first):
371431

372432
class CancelExistingReminderTest(BaseTest):
373433
def test_cancel_existing_reminder(self):
434+
if not DJANGO_Q_AVAILABLE:
435+
return
374436
appointment = self.create_appt_for_sm1()
375437
Schedule.objects.create(func='appointment.tasks.send_email_reminder', name=f"reminder_{appointment.id_request}")
376438

appointment/utils/db_helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ def update_appointment_reminder(appointment, new_date, new_start_time, request,
179179
cancel_existing_reminder(appointment.id_request)
180180

181181
# If a reminder is still desired and the appointment is in the future, schedule a new one
182-
if want_reminder and new_datetime > timezone.now():
182+
if want_reminder and new_datetime > timezone.now() and DJANGO_Q_AVAILABLE:
183183
schedule_email_reminder(appointment, request, new_datetime)
184184
else:
185185
logger.info(

0 commit comments

Comments
 (0)