|
11 | 11 | from django.core.exceptions import FieldDoesNotExist
|
12 | 12 | from django.test import TestCase
|
13 | 13 | from django.urls import reverse
|
| 14 | +from django.utils import timezone |
| 15 | +from django_q.models import Schedule |
14 | 16 |
|
15 | 17 | from appointment.models import DayOff, PaymentInfo
|
16 | 18 | from appointment.tests.base.base_test import BaseTest
|
17 | 19 | from appointment.utils.date_time import get_current_year
|
18 |
| -from appointment.utils.db_helpers import (calculate_slots, check_day_off_for_staff, create_and_save_appointment, |
| 20 | +from appointment.utils.db_helpers import (calculate_slots, cancel_existing_reminder, check_day_off_for_staff, |
| 21 | + create_and_save_appointment, |
19 | 22 | create_payment_info_and_get_url, exclude_booked_slots,
|
20 | 23 | day_off_exists_for_date_range, get_all_staff_members,
|
21 | 24 | get_all_appointments, Config, get_appointment_buffer_time,
|
|
28 | 31 | get_staff_member_end_time, get_staff_member_buffer_time,
|
29 | 32 | get_staff_member_slot_duration, get_user_by_email, get_user_model,
|
30 | 33 | get_staff_member_from_user_id_or_logged_in,
|
31 |
| - get_staff_member_by_user_id, working_hours_exist, is_working_day, |
| 34 | + get_staff_member_by_user_id, schedule_email_reminder, |
| 35 | + update_appointment_reminder, working_hours_exist, |
| 36 | + is_working_day, |
32 | 37 | get_working_hours_for_staff_and_day,
|
33 | 38 | get_working_hours_by_id, get_website_name, get_times_from_config,
|
34 | 39 | create_new_user, generate_unique_username_from_email, parse_name,
|
@@ -149,6 +154,59 @@ def get_mock_reverse(url_name, **kwargs):
|
149 | 154 | return reverse(url_name, **kwargs)
|
150 | 155 |
|
151 | 156 |
|
| 157 | +class ScheduleEmailReminderTest(BaseTest): |
| 158 | + def test_schedule_email_reminder_cluster_running(self): |
| 159 | + appointment = self.create_appointment_for_user1() |
| 160 | + with patch('appointment.settings.check_q_cluster', return_value=True), \ |
| 161 | + patch('appointment.utils.db_helpers.schedule') as mock_schedule: |
| 162 | + schedule_email_reminder(appointment) |
| 163 | + mock_schedule.assert_called_once() |
| 164 | + # Further assertions can be made here based on the arguments passed to schedule |
| 165 | + |
| 166 | + def test_schedule_email_reminder_cluster_not_running(self): |
| 167 | + appointment = self.create_appointment_for_user2() |
| 168 | + with patch('appointment.settings.check_q_cluster', return_value=False), \ |
| 169 | + patch('appointment.utils.db_helpers.logger') as mock_logger: |
| 170 | + schedule_email_reminder(appointment) |
| 171 | + mock_logger.warning.assert_called_with( |
| 172 | + "Django-Q cluster is not running. Email reminder will not be scheduled.") |
| 173 | + |
| 174 | + |
| 175 | +class UpdateAppointmentReminderTest(BaseTest): |
| 176 | + def test_update_appointment_reminder_date_time_changed(self): |
| 177 | + appointment = self.create_appointment_for_user1() |
| 178 | + new_date = timezone.now().date() + timezone.timedelta(days=10) |
| 179 | + new_start_time = timezone.now().time() |
| 180 | + |
| 181 | + with patch('appointment.utils.db_helpers.schedule_email_reminder') as mock_schedule_email_reminder, \ |
| 182 | + patch('appointment.utils.db_helpers.cancel_existing_reminder') as mock_cancel_existing_reminder: |
| 183 | + update_appointment_reminder(appointment, new_date, new_start_time, True) |
| 184 | + mock_cancel_existing_reminder.assert_called_once_with(appointment.id_request) |
| 185 | + mock_schedule_email_reminder.assert_called_once() |
| 186 | + |
| 187 | + def test_update_appointment_reminder_no_change(self): |
| 188 | + appointment = self.create_appointment_for_user2() |
| 189 | + # Use existing date and time |
| 190 | + new_date = appointment.appointment_request.date |
| 191 | + new_start_time = appointment.appointment_request.start_time |
| 192 | + |
| 193 | + with patch('appointment.utils.db_helpers.schedule_email_reminder') as mock_schedule_email_reminder, \ |
| 194 | + patch('appointment.utils.db_helpers.cancel_existing_reminder') as mock_cancel_existing_reminder: |
| 195 | + update_appointment_reminder(appointment, new_date, new_start_time, appointment.want_reminder) |
| 196 | + mock_cancel_existing_reminder.assert_not_called() |
| 197 | + mock_schedule_email_reminder.assert_not_called() |
| 198 | + |
| 199 | + |
| 200 | +class CancelExistingReminderTest(BaseTest): |
| 201 | + def test_cancel_existing_reminder(self): |
| 202 | + appointment = self.create_appointment_for_user1() |
| 203 | + Schedule.objects.create(func='appointment.tasks.send_email_reminder', name=f"reminder_{appointment.id_request}") |
| 204 | + |
| 205 | + self.assertEqual(Schedule.objects.count(), 1) |
| 206 | + cancel_existing_reminder(appointment.id_request) |
| 207 | + self.assertEqual(Schedule.objects.filter(name=f"reminder_{appointment.id_request}").count(), 0) |
| 208 | + |
| 209 | + |
152 | 210 | class TestCreatePaymentInfoAndGetUrl(BaseTest):
|
153 | 211 |
|
154 | 212 | def setUp(self):
|
@@ -786,4 +844,3 @@ def test_create_new_user_check_password(self):
|
786 | 844 | user = create_new_user(client_data)
|
787 | 845 | password = f"{get_website_name()}{get_current_year()}"
|
788 | 846 | self.assertTrue(user.check_password(password))
|
789 |
| - |
|
0 commit comments