django-webhook-subscriber 0.4.0__py3-none-any.whl → 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. django_webhook_subscriber/__init__.py +7 -1
  2. django_webhook_subscriber/admin.py +831 -182
  3. django_webhook_subscriber/apps.py +3 -20
  4. django_webhook_subscriber/conf.py +11 -24
  5. django_webhook_subscriber/delivery.py +414 -159
  6. django_webhook_subscriber/http.py +51 -0
  7. django_webhook_subscriber/management/commands/webhook.py +169 -0
  8. django_webhook_subscriber/management/commands/webhook_cache.py +173 -0
  9. django_webhook_subscriber/management/commands/webhook_logs.py +226 -0
  10. django_webhook_subscriber/management/commands/webhook_performance_test.py +469 -0
  11. django_webhook_subscriber/management/commands/webhook_send.py +96 -0
  12. django_webhook_subscriber/management/commands/webhook_status.py +139 -0
  13. django_webhook_subscriber/managers.py +36 -14
  14. django_webhook_subscriber/migrations/0002_remove_webhookregistry_content_type_and_more.py +192 -0
  15. django_webhook_subscriber/models.py +291 -114
  16. django_webhook_subscriber/serializers.py +16 -50
  17. django_webhook_subscriber/tasks.py +434 -56
  18. django_webhook_subscriber/tests/factories.py +40 -0
  19. django_webhook_subscriber/tests/settings.py +27 -8
  20. django_webhook_subscriber/tests/test_delivery.py +453 -190
  21. django_webhook_subscriber/tests/test_http.py +32 -0
  22. django_webhook_subscriber/tests/test_managers.py +26 -37
  23. django_webhook_subscriber/tests/test_models.py +341 -251
  24. django_webhook_subscriber/tests/test_serializers.py +22 -56
  25. django_webhook_subscriber/tests/test_tasks.py +477 -189
  26. django_webhook_subscriber/tests/test_utils.py +98 -94
  27. django_webhook_subscriber/utils.py +87 -69
  28. django_webhook_subscriber/validators.py +53 -0
  29. django_webhook_subscriber-2.0.0.dist-info/METADATA +774 -0
  30. django_webhook_subscriber-2.0.0.dist-info/RECORD +38 -0
  31. django_webhook_subscriber/management/commands/check_webhook_tasks.py +0 -113
  32. django_webhook_subscriber/management/commands/clean_webhook_logs.py +0 -65
  33. django_webhook_subscriber/management/commands/test_webhook.py +0 -96
  34. django_webhook_subscriber/signals.py +0 -152
  35. django_webhook_subscriber/testing.py +0 -14
  36. django_webhook_subscriber/tests/test_signals.py +0 -268
  37. django_webhook_subscriber-0.4.0.dist-info/METADATA +0 -448
  38. django_webhook_subscriber-0.4.0.dist-info/RECORD +0 -33
  39. {django_webhook_subscriber-0.4.0.dist-info → django_webhook_subscriber-2.0.0.dist-info}/WHEEL +0 -0
  40. {django_webhook_subscriber-0.4.0.dist-info → django_webhook_subscriber-2.0.0.dist-info}/licenses/LICENSE +0 -0
  41. {django_webhook_subscriber-0.4.0.dist-info → django_webhook_subscriber-2.0.0.dist-info}/top_level.txt +0 -0
@@ -1,268 +0,0 @@
1
- from unittest.mock import patch
2
-
3
- # from django.contrib.auth.models import Group, User
4
- from django.test import TestCase, override_settings
5
- from django.contrib.contenttypes.models import ContentType
6
-
7
- from rest_framework import serializers
8
-
9
- from django_webhook_subscriber.utils import _webhook_registry
10
- from django_webhook_subscriber.models import (
11
- WebhookDeliveryLog,
12
- WebhookRegistry,
13
- )
14
- from django_webhook_subscriber.signals import (
15
- register_webhook_signals,
16
- register_webhooks_from_settings,
17
- process_webhook_event,
18
- webhook_post_delete,
19
- webhook_post_save,
20
- )
21
-
22
-
23
- class CustomSerializer(serializers.Serializer):
24
- pass
25
-
26
-
27
- class SignalTests(TestCase):
28
- def setUp(self):
29
- # Clear the registry before each test
30
- _webhook_registry.clear()
31
-
32
- @patch('django.db.models.signals.post_save.connect')
33
- @patch('django.db.models.signals.post_delete.connect')
34
- def test_register_all_events(self, mock_post_delete, mock_post_save):
35
- # Register with default (all) events
36
- register_webhook_signals(WebhookDeliveryLog)
37
-
38
- # Verify signals were connected
39
- mock_post_save.assert_called_once_with(
40
- webhook_post_save,
41
- sender=WebhookDeliveryLog,
42
- dispatch_uid=f'webhook_post_save_{WebhookDeliveryLog.__name__}',
43
- )
44
- mock_post_delete.assert_called_once_with(
45
- webhook_post_delete,
46
- sender=WebhookDeliveryLog,
47
- dispatch_uid=f'webhook_post_delete_{WebhookDeliveryLog.__name__}',
48
- )
49
-
50
- # Verify registry entry
51
- self.assertIn(WebhookDeliveryLog, _webhook_registry)
52
- self.assertIsNone(_webhook_registry[WebhookDeliveryLog]['serializer'])
53
- self.assertEqual(
54
- _webhook_registry[WebhookDeliveryLog]['events'],
55
- ['CREATE', 'UPDATE', 'DELETE'],
56
- )
57
-
58
- @patch('django.db.models.signals.post_save.connect')
59
- @patch('django.db.models.signals.post_delete.connect')
60
- def test_register_specific_events(self, mock_post_delete, mock_post_save):
61
-
62
- # Register with default (all) events
63
- register_webhook_signals(
64
- WebhookDeliveryLog,
65
- events=['create', 'update'],
66
- serializer=CustomSerializer,
67
- )
68
-
69
- # asserting that signals were connected
70
- mock_post_save.assert_called_once_with(
71
- webhook_post_save,
72
- sender=WebhookDeliveryLog,
73
- dispatch_uid=f'webhook_post_save_{WebhookDeliveryLog.__name__}',
74
- )
75
- mock_post_delete.assert_not_called()
76
-
77
- # asserting that user was added to _webhook_registry
78
- self.assertIn(WebhookDeliveryLog, _webhook_registry)
79
- # asserting custom values
80
- self.assertEqual(
81
- _webhook_registry[WebhookDeliveryLog]['serializer'],
82
- CustomSerializer,
83
- )
84
- self.assertEqual(
85
- _webhook_registry[WebhookDeliveryLog]['events'],
86
- ['CREATE', 'UPDATE'],
87
- )
88
-
89
- @override_settings(
90
- WEBHOOK_SUBSCRIBER={
91
- 'WEBHOOK_MODELS': {
92
- 'django_webhook_subscriber.WebhookDeliveryLog': {},
93
- 'django_webhook_subscriber.WebhookRegistry': {
94
- 'serializer': (
95
- 'django_webhook_subscriber.tests.test_signals.'
96
- 'CustomSerializer'
97
- ),
98
- 'events': ['CREATE', 'UPDATE'],
99
- },
100
- }
101
- }
102
- )
103
- @patch('django_webhook_subscriber.signals.register_webhook_signals')
104
- def test_register_from_settings(self, mock_register):
105
- # Register webhooks from settings
106
- register_webhooks_from_settings()
107
-
108
- # Verify register_webhook_signals was called with correct arguments
109
- self.assertEqual(mock_register.call_count, 2)
110
- mock_register.assert_called()
111
- mock_register.assert_called()
112
- call_args_list = mock_register.call_args_list
113
-
114
- # Check the first webhook model (Default values)
115
- args, kwargs = call_args_list[0]
116
- self.assertEqual(args[0], WebhookDeliveryLog)
117
- self.assertIsNone(kwargs['serializer'])
118
- self.assertEqual(kwargs['events'], None)
119
-
120
- # Check the second webhook model (Custom values)
121
- args, kwargs = call_args_list[1]
122
- self.assertEqual(args[0], WebhookRegistry)
123
- self.assertEqual(kwargs['serializer'], CustomSerializer)
124
- self.assertEqual(kwargs['events'], ['CREATE', 'UPDATE'])
125
-
126
- @override_settings(
127
- WEBHOOK_SUBSCRIBER={'WEBHOOK_MODELS': {'invalid.Model': {}}}
128
- )
129
- @patch('django_webhook_subscriber.signals.register_webhook_signals')
130
- def test_register_from_settings_invalid_model(self, mock_register):
131
- # Register webhooks from settings
132
- register_webhooks_from_settings()
133
-
134
- # Verify register_webhook_signals was not called
135
- mock_register.assert_not_called()
136
-
137
- @override_settings(
138
- WEBHOOK_SUBSCRIBER={
139
- 'WEBHOOK_MODELS': {
140
- 'django_webhook_subscriber.WebhookDeliveryLog': {
141
- 'serializer': 'invalid.Serializer'
142
- }
143
- }
144
- }
145
- )
146
- @patch('django_webhook_subscriber.signals.register_webhook_signals')
147
- def test_register_from_settings_invalid_serializer(self, mock_register):
148
- # Register webhooks from settings
149
- register_webhooks_from_settings()
150
-
151
- # Verify register_webhook_signals was not called
152
- mock_register.assert_called()
153
- args, kwargs = mock_register.call_args
154
-
155
- # Check the first webhook model (Default values)
156
- self.assertEqual(args[0], WebhookDeliveryLog)
157
- self.assertIsNone(kwargs['serializer'])
158
- self.assertEqual(kwargs['events'], None)
159
-
160
- @patch('django_webhook_subscriber.signals.register_webhook_signals')
161
- def test_register_from_settings_no_webhooks(self, mock_register):
162
- # Register webhooks from settings
163
- register_webhooks_from_settings()
164
-
165
- # Verify register_webhook_signals was not called
166
- mock_register.assert_not_called()
167
-
168
- @patch('django_webhook_subscriber.signals.process_and_deliver_webhook')
169
- @patch('django_webhook_subscriber.signals.serialize_instance')
170
- def test_process_webhook_event(self, mock_serializer, mock_delivery):
171
- event_signal = 'created'
172
- content_type = ContentType.objects.get_for_model(WebhookRegistry)
173
- instance = WebhookRegistry.objects.create(
174
- name='Test Webhook',
175
- endpoint='https://example.com/webhook',
176
- content_type=content_type,
177
- )
178
-
179
- # Register signals for the WebhookRegistry model
180
- register_webhook_signals(WebhookRegistry)
181
-
182
- # Mock the serializer to return a specific payload
183
- mock_serializer.return_value = 'serialized_data'
184
-
185
- # Call the function to process the webhook event
186
- process_webhook_event(instance=instance, event_signal=event_signal)
187
-
188
- # Check if mock_delivery was called
189
- mock_delivery.assert_called_once()
190
-
191
- # Get the call arguments
192
- args, kwargs = mock_delivery.call_args
193
-
194
- # Check the arguments
195
- self.assertEqual(args[0], instance)
196
- self.assertEqual(args[1], event_signal)
197
- self.assertEqual(kwargs['serialized_payload'], 'serialized_data')
198
-
199
- @patch('django_webhook_subscriber.delivery.process_and_deliver_webhook')
200
- def test_process_webhook_event_webhook_configurations(self, mock_delivery):
201
- event_signal = 'created'
202
- content_type = ContentType.objects.get_for_model(WebhookRegistry)
203
- instance = WebhookRegistry.objects.create(
204
- name='Test Webhook',
205
- endpoint='https://example.com/webhook',
206
- content_type=content_type,
207
- )
208
-
209
- # Call the function to process the webhook event
210
- process_webhook_event(instance=instance, event_signal=event_signal)
211
-
212
- mock_delivery.assert_not_called()
213
-
214
- @patch('django_webhook_subscriber.signals.process_webhook_event')
215
- def test_post_save_signal_create(self, mock_process):
216
- # Register signals for the WebhookRegistry model
217
- register_webhook_signals(WebhookRegistry)
218
-
219
- content_type = ContentType.objects.get_for_model(WebhookRegistry)
220
- webhook = WebhookRegistry.objects.create(
221
- name='Test Webhook',
222
- endpoint='https://example.com/webhook',
223
- content_type=content_type,
224
- )
225
-
226
- mock_process.assert_called_once()
227
- _, kwargs = mock_process.call_args
228
- self.assertEqual(kwargs['instance'], webhook)
229
- self.assertEqual(kwargs['event_signal'], 'created')
230
-
231
- @patch('django_webhook_subscriber.signals.process_webhook_event')
232
- def test_post_save_signal_update(self, mock_process):
233
- # Register signals for the WebhookRegistry model
234
- register_webhook_signals(WebhookRegistry)
235
-
236
- content_type = ContentType.objects.get_for_model(WebhookRegistry)
237
- webhook = WebhookRegistry.objects.create(
238
- name='Test Webhook',
239
- endpoint='https://example.com/webhook',
240
- content_type=content_type,
241
- )
242
-
243
- mock_process.reset_mock()
244
- webhook.name = 'Test'
245
- webhook.save()
246
- mock_process.assert_called_once()
247
- _, kwargs = mock_process.call_args
248
- self.assertEqual(kwargs['instance'], webhook)
249
- self.assertEqual(kwargs['event_signal'], 'updated')
250
-
251
- @patch('django_webhook_subscriber.signals.process_webhook_event')
252
- def test_post_delete_signal(self, mock_process):
253
- # Register signals for the WebhookRegistry model
254
- register_webhook_signals(WebhookRegistry)
255
-
256
- content_type = ContentType.objects.get_for_model(WebhookRegistry)
257
- webhook = WebhookRegistry.objects.create(
258
- name='Test Webhook',
259
- endpoint='https://example.com/webhook',
260
- content_type=content_type,
261
- )
262
-
263
- mock_process.reset_mock()
264
- webhook.delete()
265
- mock_process.assert_called_once()
266
- args, kwargs = mock_process.call_args
267
- self.assertEqual(kwargs['instance'].__class__, WebhookRegistry)
268
- self.assertEqual(kwargs['event_signal'], 'deleted')