@@ -71,7 +71,8 @@ class TestIncogniaAPI(TestCase):
71
71
CLIENT_ERROR_CODE : Final [int ] = 400
72
72
VALID_EVENT_FEEDBACK_TYPE : Final [str ] = 'valid_event_feedback_type'
73
73
INVALID_EVENT_FEEDBACK_TYPE : Final [str ] = 'invalid_event_feedback_type'
74
- TIMESTAMP : Final [dt .datetime ] = dt .datetime .now ()
74
+ TIMESTAMP : Final [dt .datetime ] = dt .datetime .now (dt .timezone .utc )
75
+ TIMESTAMP_WITHOUT_TIMEZONE : Final [dt .datetime ] = dt .datetime .now ()
75
76
LOGIN_ID : Final [str ] = 'ANY_LOGIN_ID'
76
77
PAYMENT_ID : Final [str ] = 'ANY_PAYMENT_ID'
77
78
REGISTER_VALID_FEEDBACK_DATA : Final [bytes ] = encode ({
@@ -86,7 +87,10 @@ class TestIncogniaAPI(TestCase):
86
87
'account_id' : f'{ ACCOUNT_ID } ' ,
87
88
'installation_id' : f'{ INSTALLATION_ID } ' ,
88
89
'session_token' : f'{ SESSION_TOKEN } ' ,
89
- 'timestamp' : int ((TIMESTAMP - dt .datetime .utcfromtimestamp (0 )).total_seconds () * 1000.0 )
90
+ 'timestamp' : int ((
91
+ TIMESTAMP - dt .datetime .fromtimestamp (0 , dt .timezone .utc )).total_seconds () * 1000.0 ),
92
+ 'occurred_at' : TIMESTAMP .isoformat (),
93
+ 'expires_at' : TIMESTAMP .isoformat (),
90
94
})
91
95
REGISTER_INVALID_FEEDBACK_DATA : Final [bytes ] = encode ({
92
96
'event' : f'{ INVALID_EVENT_FEEDBACK_TYPE } '
@@ -211,6 +215,8 @@ def test_register_feedback_when_all_fields_are_valid_should_work(
211
215
212
216
api .register_feedback (self .VALID_EVENT_FEEDBACK_TYPE ,
213
217
timestamp = self .TIMESTAMP ,
218
+ occurred_at = self .TIMESTAMP ,
219
+ expires_at = self .TIMESTAMP ,
214
220
external_id = self .EXTERNAL_ID ,
215
221
login_id = self .LOGIN_ID ,
216
222
payment_id = self .PAYMENT_ID ,
@@ -235,6 +241,48 @@ def test_register_feedback_when_event_is_empty_should_raise_an_IncogniaError(
235
241
mock_token_manager_get .assert_not_called ()
236
242
mock_base_request_post .assert_not_called ()
237
243
244
+ @patch .object (BaseRequest , 'post' )
245
+ @patch .object (TokenManager , 'get' , return_value = TOKEN_VALUES )
246
+ def test_register_feedback_when_timestamp_does_not_have_timezone_should_raise_IncogniaError (
247
+ self , mock_token_manager_get : Mock , mock_base_request_post : Mock ):
248
+ api = IncogniaAPI (self .CLIENT_ID , self .CLIENT_SECRET )
249
+
250
+ self .assertRaises (IncogniaError ,
251
+ api .register_feedback ,
252
+ event = self .VALID_EVENT_FEEDBACK_TYPE ,
253
+ timestamp = self .TIMESTAMP_WITHOUT_TIMEZONE )
254
+
255
+ mock_token_manager_get .assert_not_called ()
256
+ mock_base_request_post .assert_not_called ()
257
+
258
+ @patch .object (BaseRequest , 'post' )
259
+ @patch .object (TokenManager , 'get' , return_value = TOKEN_VALUES )
260
+ def test_register_feedback_when_occurred_at_does_not_have_timezone_should_raise_IncogniaError (
261
+ self , mock_token_manager_get : Mock , mock_base_request_post : Mock ):
262
+ api = IncogniaAPI (self .CLIENT_ID , self .CLIENT_SECRET )
263
+
264
+ self .assertRaises (IncogniaError ,
265
+ api .register_feedback ,
266
+ event = self .VALID_EVENT_FEEDBACK_TYPE ,
267
+ occurred_at = self .TIMESTAMP_WITHOUT_TIMEZONE )
268
+
269
+ mock_token_manager_get .assert_not_called ()
270
+ mock_base_request_post .assert_not_called ()
271
+
272
+ @patch .object (BaseRequest , 'post' )
273
+ @patch .object (TokenManager , 'get' , return_value = TOKEN_VALUES )
274
+ def test_register_feedback_when_expires_at_does_not_have_timezone_should_raise_IncogniaError (
275
+ self , mock_token_manager_get : Mock , mock_base_request_post : Mock ):
276
+ api = IncogniaAPI (self .CLIENT_ID , self .CLIENT_SECRET )
277
+
278
+ self .assertRaises (IncogniaError ,
279
+ api .register_feedback ,
280
+ event = self .VALID_EVENT_FEEDBACK_TYPE ,
281
+ expires_at = self .TIMESTAMP_WITHOUT_TIMEZONE )
282
+
283
+ mock_token_manager_get .assert_not_called ()
284
+ mock_base_request_post .assert_not_called ()
285
+
238
286
@patch .object (BaseRequest , 'post' )
239
287
@patch .object (TokenManager , 'get' , return_value = TOKEN_VALUES )
240
288
def test_register_feedback_when_required_fields_are_invalid_should_raise_an_IncogniaHTTPError (
0 commit comments