44import requests
55
66from country_workspace .notifications .bitcaster_client import BitcasterClient , RetryableBitcasterError
7+ from country_workspace .notifications .notifier import send_notification_event
78from country_workspace .notifications .tasks import send_bitcaster_event_task
89
910
@@ -59,6 +60,17 @@ def test_trigger_event_raises_retryable_error_for_http_5xx(settings, mocker) ->
5960 BitcasterClient ().trigger_event ("data_imported" , {"program_id" : 42 })
6061
6162
63+ def test_trigger_event_reraises_http_error (settings , mocker ) -> None :
64+ _configure_bitcaster_settings (settings )
65+ post_mock = mocker .patch ("country_workspace.notifications.bitcaster_client.requests.post" )
66+ response = Mock (status_code = 400 )
67+ response .raise_for_status .side_effect = requests .exceptions .HTTPError ("bad request" )
68+ post_mock .return_value = response
69+
70+ with pytest .raises (requests .exceptions .HTTPError , match = "bad request" ):
71+ BitcasterClient ().trigger_event ("data_imported" , {"program_id" : 42 })
72+
73+
6274def test_trigger_event_returns_false_when_client_not_configured (settings ) -> None :
6375 settings .BITCASTER_API_URL = ""
6476 settings .BITCASTER_API_KEY = ""
@@ -69,6 +81,21 @@ def test_trigger_event_returns_false_when_client_not_configured(settings) -> Non
6981 assert BitcasterClient ().trigger_event ("data_imported" , {"program_id" : 12 }) is False
7082
7183
84+ def test_send_notification_event_delegates_to_backend (mocker ) -> None :
85+ backend = Mock ()
86+ backend .trigger_event .return_value = True
87+ get_backend = mocker .patch (
88+ "country_workspace.notifications.notifier.get_notification_backend" ,
89+ return_value = backend ,
90+ )
91+
92+ result = send_notification_event ("rdi_pushed" , {"program_id" : 7 })
93+
94+ assert result is True
95+ get_backend .assert_called_once_with ()
96+ backend .trigger_event .assert_called_once_with ("rdi_pushed" , {"program_id" : 7 })
97+
98+
7299def test_send_bitcaster_event_task_retries_on_retryable_client_error (mocker ) -> None :
73100 backend = Mock (is_configured = True )
74101 retry_mock = mocker .patch .object (send_bitcaster_event_task , "retry" , side_effect = RuntimeError ("retry" ))
@@ -96,6 +123,17 @@ def test_send_bitcaster_event_task_does_not_retry_on_http_400(mocker) -> None:
96123 retry_mock .assert_not_called ()
97124
98125
126+ def test_send_bitcaster_event_task_logs_warning_when_backend_returns_false (mocker ) -> None :
127+ backend = Mock (is_configured = True )
128+ warning = mocker .patch ("country_workspace.notifications.tasks.logger.warning" )
129+ mocker .patch ("country_workspace.notifications.tasks.get_notification_backend" , return_value = backend )
130+ mocker .patch ("country_workspace.notifications.tasks.send_notification_event" , return_value = False )
131+
132+ send_bitcaster_event_task .run ("data_imported" , {"program_id" : 12 })
133+
134+ warning .assert_any_call ("Bitcaster client returned false for event '%s'" , "data_imported" )
135+
136+
99137def test_send_bitcaster_event_task_skips_when_backend_not_configured (mocker ) -> None :
100138 backend = Mock (is_configured = False )
101139 send_event = mocker .patch ("country_workspace.notifications.tasks.send_notification_event" )
0 commit comments