44Classes:
55 EventsToolingTest: Test events tooling.
66"""
7+ import datetime
78from contextlib import contextmanager
89from unittest .mock import Mock , patch
10+ from uuid import UUID
911
1012import attr
1113import ddt
@@ -85,7 +87,8 @@ def test_get_signal_by_type(self):
8587 @override_settings (SERVICE_VARIANT = "lms" )
8688 @patch ("openedx_events.data.openedx_events" )
8789 @patch ("openedx_events.data.socket" )
88- def test_get_signal_metadata (self , socket_mock , events_package_mock ):
90+ @patch ("openedx_events.data.datetime" )
91+ def test_generate_signal_metadata (self , datetime_mock , socket_mock , events_package_mock ):
8992 """
9093 This methods tests getting the generated metadata for an event.
9194
@@ -94,23 +97,72 @@ def test_get_signal_metadata(self, socket_mock, events_package_mock):
9497 """
9598 events_package_mock .__version__ = "0.1.0"
9699 socket_mock .gethostname .return_value = "edx.devstack.lms"
100+ expected_time = datetime .datetime .now (datetime .timezone .utc )
101+ datetime_mock .now .return_value = expected_time
97102 expected_metadata = {
98103 "event_type" : self .event_type ,
99104 "minorversion" : 0 ,
100105 "source" : "openedx/lms/web" ,
101106 "sourcehost" : "edx.devstack.lms" ,
102107 "sourcelib" : [0 , 1 , 0 ],
108+ "time" : expected_time ,
103109 }
104110
105111 metadata = self .public_signal .generate_signal_metadata ()
106112
107113 self .assertDictContainsSubset (expected_metadata , attr .asdict (metadata ))
114+ self .assertIsInstance (metadata .id , UUID )
115+
116+ @override_settings (SERVICE_VARIANT = "lms" )
117+ @patch ("openedx_events.data.openedx_events" )
118+ @patch ("openedx_events.data.socket" )
119+ def test_generate_signal_metadata_with_valid_time (self , socket_mock , events_package_mock ):
120+ """
121+ Tests getting the generated metadata for an event, providing a valid time in UTC.
122+
123+ Expected behavior:
124+ Returns the metadata containing information about the event.
125+ """
126+ events_package_mock .__version__ = "0.1.0"
127+ socket_mock .gethostname .return_value = "edx.devstack.lms"
128+ expected_time = datetime .datetime .now (datetime .timezone .utc )
129+ expected_metadata = {
130+ "event_type" : self .event_type ,
131+ "minorversion" : 0 ,
132+ "source" : "openedx/lms/web" ,
133+ "sourcehost" : "edx.devstack.lms" ,
134+ "sourcelib" : [0 , 1 , 0 ],
135+ "time" : expected_time ,
136+ }
137+
138+ metadata = self .public_signal .generate_signal_metadata (time = expected_time )
139+
140+ self .assertDictContainsSubset (expected_metadata , attr .asdict (metadata ))
141+ self .assertIsInstance (metadata .id , UUID )
142+
143+ @ddt .data (
144+ (1 , TypeError , "'time' must be <class 'datetime.datetime'" ,),
145+ # WARNING: utcnow() has no timezone, and could be misinterpreted in local time
146+ (datetime .datetime .utcnow (), ValueError , "'time' must have timezone.utc" ,),
147+ )
148+ @ddt .unpack
149+ def test_generate_signal_metadata_fails_with_invalid_time (
150+ self , invalid_time , error_class , error_message
151+ ):
152+ """
153+ Tests getting generated metadata for an event fails with a non-UTC time.
154+
155+ Expected behavior:
156+ Raises an exception
157+ """
158+ with self .assertRaisesMessage (error_class , error_message ):
159+ self .public_signal .generate_signal_metadata (time = invalid_time )
108160
109161 @patch ("openedx_events.tooling.OpenEdxPublicSignal.generate_signal_metadata" )
110162 @patch ("openedx_events.tooling.Signal.send" )
111163 def test_send_event_successfully (self , send_mock , fake_metadata ):
112164 """
113- This method tests the process of sending an event that's allow to fail.
165+ This method tests the process of sending an event that's allowed to fail.
114166
115167 Expected behavior:
116168 The event is sent as a django signal with send method.
@@ -155,6 +207,23 @@ def test_send_robust_event_successfully(self, format_responses_mock, log_mock, f
155207 "Responses of the Open edX Event <org.openedx.learning.session.login.completed.v1>: \n fake-output"
156208 )
157209
210+ @patch ("openedx_events.tooling.OpenEdxPublicSignal.generate_signal_metadata" )
211+ def test_send_event_with_time (self , fake_metadata ):
212+ """
213+ This method tests the process of sending an event with a time argument.
214+
215+ Expected behavior:
216+ The generate_signal_metadata is called using the passed time.
217+ """
218+ expected_metadata = Mock (some_data = "some_data" )
219+ expected_time = datetime .datetime .now (datetime .timezone .utc )
220+ fake_metadata .return_value = expected_metadata
221+
222+ self .public_signal .send_event (user = self .user_mock , time = expected_time )
223+
224+ # generate_signal_metadata is fully tested elsewhere
225+ fake_metadata .assert_called_once_with (time = expected_time )
226+
158227 @ddt .data (
159228 (
160229 {"student" : Mock ()},
@@ -190,7 +259,7 @@ def test_send_event_with_django(self):
190259 method.
191260
192261 Expected behavior:
193- A warning is showed advicing to use Open edX events custom
262+ A warning is showed advising to use Open edX events custom
194263 send_signal method.
195264 """
196265 message = "Please, use 'send_event' when triggering an Open edX event."
0 commit comments