Skip to content

Commit d8131bb

Browse files
committed
Update tests
1 parent 2c687c7 commit d8131bb

File tree

6 files changed

+163
-35
lines changed

6 files changed

+163
-35
lines changed

backend/apps/nest/schedulers/calendar_events/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"""Base Scheduler for Nest Calendar Events."""
22

3+
from django.utils import timezone
34
from django_rq import get_scheduler
45

5-
from django.utils import timezone
66
from apps.nest.models.reminder_schedule import ReminderSchedule
77

88

backend/tests/apps/nest/schedulers/calendar_events/base_test.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from unittest.mock import MagicMock, patch
44

55
import pytest
6+
from django.utils import timezone
67

78
from apps.nest.schedulers.calendar_events.base import BaseScheduler
89

@@ -28,7 +29,7 @@ def test_schedule_once(self, mock_get_scheduler):
2829
"""Test scheduling a one-time reminder."""
2930
mock_reminder_schedule = MagicMock()
3031
mock_reminder_schedule.recurrence = "once"
31-
mock_reminder_schedule.scheduled_time = "2024-10-10 10:00:00"
32+
mock_reminder_schedule.scheduled_time = timezone.datetime(2024, 10, 10, 10, 0, 0)
3233
mock_reminder_schedule.reminder.message = "Test Message"
3334
mock_reminder_schedule.reminder.channel_id = "C123456"
3435

@@ -38,12 +39,17 @@ def test_schedule_once(self, mock_get_scheduler):
3839
base_scheduler = BaseScheduler(reminder_schedule=mock_reminder_schedule)
3940
base_scheduler.schedule()
4041

41-
scheduler_instance.enqueue_at.assert_called_once_with(
42-
"2024-10-10 10:00:00",
42+
scheduler_instance.enqueue_at.assert_any_call(
43+
mock_reminder_schedule.scheduled_time,
4344
BaseScheduler.send_message,
4445
message="Test Message",
4546
channel_id="C123456",
4647
)
48+
scheduler_instance.enqueue_at.assert_any_call(
49+
mock_reminder_schedule.scheduled_time + timezone.timedelta(minutes=1),
50+
mock_reminder_schedule.reminder.delete,
51+
)
52+
mock_reminder_schedule.save.assert_called_once_with(update_fields=["job_id"])
4753

4854
@patch("apps.nest.schedulers.calendar_events.base.get_scheduler")
4955
def test_schedule_recurring(self, mock_get_scheduler):
@@ -62,12 +68,13 @@ def test_schedule_recurring(self, mock_get_scheduler):
6268

6369
scheduler_instance.cron.assert_called_once_with(
6470
"0 9 * * *",
65-
func=BaseScheduler.send_message,
66-
args=("Daily Reminder", "C123456"),
71+
func=BaseScheduler.send_message_and_update,
72+
args=("Daily Reminder", "C123456", mock_reminder_schedule),
6773
queue_name="default",
6874
use_local_timezone=True,
6975
result_ttl=500,
7076
)
77+
mock_reminder_schedule.save.assert_called_once_with(update_fields=["job_id"])
7178

7279
@patch("apps.nest.schedulers.calendar_events.base.get_scheduler")
7380
def test_cancel(self, mock_get_scheduler):
@@ -83,10 +90,16 @@ def test_cancel(self, mock_get_scheduler):
8390
base_scheduler.cancel()
8491

8592
scheduler_instance.cancel.assert_called_once_with("job_123")
86-
mock_reminder_schedule.delete.assert_called_once()
93+
mock_reminder_schedule.reminder.delete.assert_called_once()
8794

8895
def test_send_message_not_implemented(self):
8996
"""Test that send_message raises NotImplementedError."""
9097
with pytest.raises(NotImplementedError) as exc_info:
9198
BaseScheduler.send_message("Test Message", "C123456")
9299
assert str(exc_info.value) == "Subclasses must implement this method."
100+
101+
def test_send_message_and_update_not_implemented(self):
102+
"""Test that send_message_and_update raises NotImplementedError."""
103+
with pytest.raises(NotImplementedError) as exc_info:
104+
BaseScheduler.send_message_and_update("Test Message", "C123456", MagicMock())
105+
assert str(exc_info.value) == "Subclasses must implement this method."

backend/tests/apps/nest/schedulers/calendar_events/slack_test.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,13 @@ def test_send_message(self, mock_slack_config):
1919
channel="C123456",
2020
text="Test Message",
2121
)
22+
23+
@patch("apps.nest.schedulers.calendar_events.slack.SlackScheduler.send_message")
24+
@patch("apps.nest.schedulers.calendar_events.slack.update_reminder_schedule_date")
25+
def test_send_message_and_update(self, mock_update_reminder_schedule_date, mock_send_message):
26+
"""Test sending a message and updating it via Slack."""
27+
mock_reminder_schedule = MagicMock()
28+
SlackScheduler.send_message_and_update("Test Message", "C123456", mock_reminder_schedule)
29+
30+
mock_send_message.assert_called_once_with("Test Message", "C123456")
31+
mock_update_reminder_schedule_date.assert_called_once_with(mock_reminder_schedule)

backend/tests/apps/nest/utils/calendar_events_test.py

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
"""Test cases for Nest calendar events utilities."""
22

3-
from apps.nest.utils.calendar_events import parse_reminder_args
3+
from unittest.mock import patch
4+
5+
from dateutil.relativedelta import relativedelta
6+
from django.utils import timezone
7+
8+
from apps.nest.models.reminder_schedule import ReminderSchedule
9+
from apps.nest.utils.calendar_events import parse_reminder_args, update_reminder_schedule_date
410

511

612
class TestCalendarEventsUtils:
@@ -28,3 +34,48 @@ def test_parse_reminder_args_missing_optional_args(self):
2834
assert args.minutes_before == 10 # Default value
2935
assert args.message == [] # Default value
3036
assert args.recurrence == "once" # Default value
37+
38+
def test_update_reminder_schedule_date_once(self):
39+
"""Test update_reminder_schedule_date with 'once' recurrence (no update)."""
40+
reminder = ReminderSchedule(scheduled_time=timezone.now(), recurrence="once")
41+
original_time = reminder.scheduled_time
42+
update_reminder_schedule_date(reminder)
43+
assert reminder.scheduled_time == original_time # No change expected
44+
45+
def test_update_reminder_schedule_date_future_date(self):
46+
"""Test update_reminder_schedule_date with a future scheduled_time (no update)."""
47+
future_time = timezone.now() + timezone.timedelta(days=1)
48+
reminder = ReminderSchedule(scheduled_time=future_time, recurrence="daily")
49+
original_time = reminder.scheduled_time
50+
update_reminder_schedule_date(reminder)
51+
assert reminder.scheduled_time == original_time # No change expected
52+
53+
@patch("apps.nest.models.reminder_schedule.ReminderSchedule.save")
54+
def test_update_reminder_schedule_date_daily(self, mock_save):
55+
"""Test update_reminder_schedule_date with 'daily' recurrence."""
56+
past_time = timezone.now() - timezone.timedelta(days=1)
57+
reminder = ReminderSchedule(scheduled_time=past_time, recurrence="daily")
58+
update_reminder_schedule_date(reminder)
59+
expected_time = past_time + timezone.timedelta(days=1)
60+
assert reminder.scheduled_time == expected_time
61+
mock_save.assert_called_once_with(update_fields=["scheduled_time"])
62+
63+
@patch("apps.nest.models.reminder_schedule.ReminderSchedule.save")
64+
def test_update_reminder_schedule_date_weekly(self, mock_save):
65+
"""Test update_reminder_schedule_date with 'weekly' recurrence."""
66+
past_time = timezone.now() - timezone.timedelta(weeks=1)
67+
reminder = ReminderSchedule(scheduled_time=past_time, recurrence="weekly")
68+
update_reminder_schedule_date(reminder)
69+
expected_time = past_time + timezone.timedelta(weeks=1)
70+
assert reminder.scheduled_time == expected_time
71+
mock_save.assert_called_once_with(update_fields=["scheduled_time"])
72+
73+
@patch("apps.nest.models.reminder_schedule.ReminderSchedule.save")
74+
def test_update_reminder_schedule_date_monthly(self, mock_save):
75+
"""Test update_reminder_schedule_date with 'monthly' recurrence."""
76+
past_time = timezone.now() - timezone.timedelta(days=30)
77+
reminder = ReminderSchedule(scheduled_time=past_time, recurrence="monthly")
78+
update_reminder_schedule_date(reminder)
79+
expected_time = past_time + relativedelta(months=1)
80+
assert reminder.scheduled_time == expected_time
81+
mock_save.assert_called_once_with(update_fields=["scheduled_time"])

backend/tests/apps/slack/commands/set_reminder_test.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@
77

88

99
class TestSetReminderCommand:
10-
@patch("apps.slack.commands.set_reminder.get_reminder_blocks")
11-
def test_render_blocks_valid_args(self, mock_get_reminder_blocks):
10+
@patch("apps.slack.commands.set_reminder.get_setting_reminder_blocks")
11+
def test_render_blocks_valid_args(self, mock_get_setting_reminder_blocks):
1212
"""Test render_blocks with valid arguments."""
13-
mock_get_reminder_blocks.return_value = [markdown("Reminder set!")]
13+
mock_get_setting_reminder_blocks.return_value = [markdown("Reminder set!")]
1414
command = {
1515
"text": "--channel C123456 --event_number 1 --minutes_before 10",
1616
"user_id": "U123456",
1717
}
1818
set_reminder_cmd = SetReminder()
1919
blocks = set_reminder_cmd.render_blocks(command)
2020
assert blocks == [markdown("Reminder set!")]
21-
mock_get_reminder_blocks.assert_called_once()
21+
mock_get_setting_reminder_blocks.assert_called_once()
2222

23-
@patch("apps.slack.commands.set_reminder.parse_reminder_args")
23+
@patch("apps.nest.utils.calendar_events.parse_reminder_args")
2424
def test_render_blocks_invalid_args(self, mock_parse_reminder_args):
2525
"""Test render_blocks with invalid arguments."""
2626
mock_parse_reminder_args.side_effect = SystemExit()

backend/tests/apps/slack/common/handlers/calendar_events_test.py

Lines changed: 76 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@
1111
from apps.nest.models.reminder import Reminder
1212
from apps.nest.models.reminder_schedule import ReminderSchedule
1313
from apps.owasp.models.event import Event
14-
from apps.slack.common.handlers.calendar_events import get_blocks, get_reminder_blocks
14+
from apps.slack.common.handlers.calendar_events import (
15+
get_events_blocks,
16+
get_reminders_blocks,
17+
get_setting_reminder_blocks,
18+
)
1519
from apps.slack.common.presentation import EntityPresentation
1620
from apps.slack.models.member import Member
1721

@@ -23,8 +27,10 @@ class TestCalendarEvents:
2327
@patch("apps.nest.clients.google_calendar.GoogleCalendarClient")
2428
@patch("apps.nest.models.google_account_authorization.GoogleAccountAuthorization.authorize")
2529
@patch("apps.owasp.models.event.Event.parse_google_calendar_events")
26-
def test_get_blocks(self, mock_parse_events, mock_authorize, mock_google_calendar_client):
27-
"""Test get_blocks function."""
30+
def test_get_events_blocks(
31+
self, mock_parse_events, mock_authorize, mock_google_calendar_client
32+
):
33+
"""Test get_events_blocks function."""
2834
auth = GoogleAccountAuthorization(
2935
access_token="test_access_token", # noqa: S106
3036
refresh_token="test_refresh_token", # noqa: S106
@@ -63,7 +69,7 @@ def test_get_blocks(self, mock_parse_events, mock_authorize, mock_google_calenda
6369
key="event2",
6470
),
6571
]
66-
blocks = get_blocks(
72+
blocks = get_events_blocks(
6773
"test_slack_user_id", presentation=EntityPresentation(include_pagination=True), page=1
6874
)
6975
assert len(blocks) == 4 # 1 header + 2 events + 1 pagination
@@ -76,10 +82,10 @@ def test_get_blocks(self, mock_parse_events, mock_authorize, mock_google_calenda
7682

7783
@override_settings(IS_GOOGLE_AUTH_ENABLED=True, IS_AWS_KMS_ENABLED=True)
7884
@patch("apps.nest.models.google_account_authorization.GoogleAccountAuthorization.authorize")
79-
def test_get_blocks_no_auth(self, mock_authorize):
80-
"""Test get_blocks function when no authorization."""
85+
def test_get_events_blocks_no_auth(self, mock_authorize):
86+
"""Test get_events_blocks function when no authorization."""
8187
mock_authorize.return_value = ("http://auth.url", "state123") # NOSONAR
82-
blocks = get_blocks(
88+
blocks = get_events_blocks(
8389
"test_slack_user_id", presentation=EntityPresentation(include_pagination=True), page=1
8490
)
8591
assert len(blocks) == 1
@@ -91,15 +97,15 @@ def test_get_blocks_no_auth(self, mock_authorize):
9197
@override_settings(IS_GOOGLE_AUTH_ENABLED=True, IS_AWS_KMS_ENABLED=True)
9298
@patch("apps.nest.clients.google_calendar.GoogleCalendarClient")
9399
@patch("apps.nest.models.google_account_authorization.GoogleAccountAuthorization.authorize")
94-
def test_get_blocks_service_error(self, mock_authorize, mock_google_calendar_client):
95-
"""Test get_blocks function when Google Calendar service error."""
100+
def test_get_events_blocks_service_error(self, mock_authorize, mock_google_calendar_client):
101+
"""Test get_events_blocks function when Google Calendar service error."""
96102
mock_authorize.return_value = GoogleAccountAuthorization(
97103
access_token="test_access_token", # noqa: S106
98104
refresh_token="test_refresh_token", # noqa: S106
99105
expires_at=timezone.now() + timezone.timedelta(hours=1),
100106
)
101107
mock_google_calendar_client.side_effect = ServerNotFoundError()
102-
blocks = get_blocks(
108+
blocks = get_events_blocks(
103109
"test_slack_user_id", presentation=EntityPresentation(include_pagination=True), page=1
104110
)
105111
assert len(blocks) == 1
@@ -108,24 +114,72 @@ def test_get_blocks_service_error(self, mock_authorize, mock_google_calendar_cli
108114
@override_settings(IS_GOOGLE_AUTH_ENABLED=True, IS_AWS_KMS_ENABLED=True)
109115
@patch("apps.nest.clients.google_calendar.GoogleCalendarClient")
110116
@patch("apps.nest.models.google_account_authorization.GoogleAccountAuthorization.authorize")
111-
def test_get_blocks_no_events(self, mock_authorize, mock_google_calendar_client):
112-
"""Test get_blocks function when no events."""
117+
def test_get_events_blocks_no_events(self, mock_authorize, mock_google_calendar_client):
118+
"""Test get_events_blocks function when no events."""
113119
mock_authorize.return_value = GoogleAccountAuthorization(
114120
access_token="test_access_token", # noqa: S106
115121
refresh_token="test_refresh_token", # noqa: S106
116122
expires_at=timezone.now() + timezone.timedelta(hours=1),
117123
)
118124
mock_google_calendar_client.return_value.get_events.return_value = []
119-
blocks = get_blocks(
125+
blocks = get_events_blocks(
120126
"test_slack_user_id", presentation=EntityPresentation(include_pagination=True), page=1
121127
)
122128
assert len(blocks) == 1
123129
assert "*No upcoming calendar events found.*" in blocks[0]["text"]["text"]
124130

131+
@patch("apps.nest.models.reminder_schedule.ReminderSchedule.objects.filter")
132+
def test_get_reminders_blocks_success(self, mock_filter):
133+
"""Test get_reminders_blocks function."""
134+
mock_filter.return_value.order_by.return_value = [
135+
MagicMock(
136+
spec=ReminderSchedule,
137+
pk=1,
138+
reminder=MagicMock(
139+
spec=Reminder,
140+
channel_id="C123456",
141+
message="Test reminder message",
142+
),
143+
scheduled_time=timezone.now() + timezone.timedelta(minutes=10),
144+
recurrence="once",
145+
),
146+
MagicMock(
147+
spec=ReminderSchedule,
148+
pk=2,
149+
reminder=MagicMock(
150+
spec=Reminder,
151+
channel_id="C654321",
152+
message="Another reminder message",
153+
),
154+
scheduled_time=timezone.now() + timezone.timedelta(minutes=20),
155+
recurrence="daily",
156+
),
157+
]
158+
blocks = get_reminders_blocks("test_slack_user_id")
159+
assert len(blocks) == 3 # 1 header + 2 reminders
160+
assert "*Your upcoming reminders:*" in blocks[0]["text"]["text"]
161+
assert "Test reminder message" in blocks[1]["text"]["text"]
162+
assert "Another reminder message" in blocks[2]["text"]["text"]
163+
mock_filter.assert_called_once_with(reminder__member__slack_user_id="test_slack_user_id")
164+
mock_filter.return_value.order_by.assert_called_once_with("scheduled_time")
165+
166+
@patch("apps.nest.models.reminder_schedule.ReminderSchedule.objects.filter")
167+
def test_get_reminders_blocks_no_reminders(self, mock_filter):
168+
"""Test get_reminders_blocks function when no reminders."""
169+
mock_filter.return_value.order_by.return_value = []
170+
blocks = get_reminders_blocks("test_slack_user_id")
171+
assert len(blocks) == 1
172+
assert (
173+
"*No reminders found. You can set one with `/set-reminder`*"
174+
in blocks[0]["text"]["text"]
175+
)
176+
mock_filter.assert_called_once_with(reminder__member__slack_user_id="test_slack_user_id")
177+
mock_filter.return_value.order_by.assert_called_once_with("scheduled_time")
178+
125179
@patch("apps.nest.controllers.calendar_events.set_reminder")
126180
@patch("apps.nest.schedulers.calendar_events.slack.SlackScheduler")
127-
def test_get_reminder_blocks_success(self, mock_slack_scheduler, mock_set_reminder):
128-
"""Test get_reminder_blocks function for successful reminder setting."""
181+
def test_get_setting_reminder_blocks_success(self, mock_slack_scheduler, mock_set_reminder):
182+
"""Test get_setting_reminder_blocks function for successful reminder setting."""
129183
mock_set_reminder.return_value = MagicMock(
130184
spec=ReminderSchedule,
131185
reminder=MagicMock(
@@ -145,7 +199,7 @@ def test_get_reminder_blocks_success(self, mock_slack_scheduler, mock_set_remind
145199
message=["Test", "reminder", "message"],
146200
recurrence="daily",
147201
)
148-
blocks = get_reminder_blocks(args, "test_slack_user_id")
202+
blocks = get_setting_reminder_blocks(args, "test_slack_user_id")
149203
assert len(blocks) == 1
150204
assert "*10-minute reminder set for event " in blocks[0]["text"]["text"]
151205
mock_set_reminder.assert_called_once_with(
@@ -161,8 +215,8 @@ def test_get_reminder_blocks_success(self, mock_slack_scheduler, mock_set_remind
161215
mock_slack_scheduler.send_message.assert_called_once()
162216

163217
@patch("apps.nest.controllers.calendar_events.set_reminder")
164-
def test_get_reminder_blocks_validation_error(self, mock_set_reminder):
165-
"""Test get_reminder_blocks function when ValidationError is raised."""
218+
def test_get_setting_reminder_blocks_validation_error(self, mock_set_reminder):
219+
"""Test get_setting_reminder_blocks function when ValidationError is raised."""
166220
mock_set_reminder.side_effect = ValidationError("Invalid event number.")
167221
args = MagicMock(
168222
channel="C123456",
@@ -171,13 +225,13 @@ def test_get_reminder_blocks_validation_error(self, mock_set_reminder):
171225
message=["Test", "reminder", "message"],
172226
recurrence="daily",
173227
)
174-
blocks = get_reminder_blocks(args, "test_slack_user_id")
228+
blocks = get_setting_reminder_blocks(args, "test_slack_user_id")
175229
assert len(blocks) == 1
176230
assert "*Invalid event number.*" in blocks[0]["text"]["text"]
177231

178232
@patch("apps.nest.controllers.calendar_events.set_reminder")
179-
def test_get_reminder_blocks_service_error(self, mock_set_reminder):
180-
"""Test get_reminder_blocks function when service error occurs."""
233+
def test_get_setting_reminder_blocks_service_error(self, mock_set_reminder):
234+
"""Test get_setting_reminder_blocks function when service error occurs."""
181235
mock_set_reminder.side_effect = ServerNotFoundError()
182236
args = MagicMock(
183237
channel="C123456",
@@ -186,6 +240,6 @@ def test_get_reminder_blocks_service_error(self, mock_set_reminder):
186240
message=["Test", "reminder", "message"],
187241
recurrence="daily",
188242
)
189-
blocks = get_reminder_blocks(args, "test_slack_user_id")
243+
blocks = get_setting_reminder_blocks(args, "test_slack_user_id")
190244
assert len(blocks) == 1
191245
assert "*Please check your internet connection.*" in blocks[0]["text"]["text"]

0 commit comments

Comments
 (0)