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.
- django_webhook_subscriber/__init__.py +7 -1
- django_webhook_subscriber/admin.py +831 -182
- django_webhook_subscriber/apps.py +3 -20
- django_webhook_subscriber/conf.py +11 -24
- django_webhook_subscriber/delivery.py +414 -159
- django_webhook_subscriber/http.py +51 -0
- django_webhook_subscriber/management/commands/webhook.py +169 -0
- django_webhook_subscriber/management/commands/webhook_cache.py +173 -0
- django_webhook_subscriber/management/commands/webhook_logs.py +226 -0
- django_webhook_subscriber/management/commands/webhook_performance_test.py +469 -0
- django_webhook_subscriber/management/commands/webhook_send.py +96 -0
- django_webhook_subscriber/management/commands/webhook_status.py +139 -0
- django_webhook_subscriber/managers.py +36 -14
- django_webhook_subscriber/migrations/0002_remove_webhookregistry_content_type_and_more.py +192 -0
- django_webhook_subscriber/models.py +291 -114
- django_webhook_subscriber/serializers.py +16 -50
- django_webhook_subscriber/tasks.py +434 -56
- django_webhook_subscriber/tests/factories.py +40 -0
- django_webhook_subscriber/tests/settings.py +27 -8
- django_webhook_subscriber/tests/test_delivery.py +453 -190
- django_webhook_subscriber/tests/test_http.py +32 -0
- django_webhook_subscriber/tests/test_managers.py +26 -37
- django_webhook_subscriber/tests/test_models.py +341 -251
- django_webhook_subscriber/tests/test_serializers.py +22 -56
- django_webhook_subscriber/tests/test_tasks.py +477 -189
- django_webhook_subscriber/tests/test_utils.py +98 -94
- django_webhook_subscriber/utils.py +87 -69
- django_webhook_subscriber/validators.py +53 -0
- django_webhook_subscriber-2.0.0.dist-info/METADATA +774 -0
- django_webhook_subscriber-2.0.0.dist-info/RECORD +38 -0
- django_webhook_subscriber/management/commands/check_webhook_tasks.py +0 -113
- django_webhook_subscriber/management/commands/clean_webhook_logs.py +0 -65
- django_webhook_subscriber/management/commands/test_webhook.py +0 -96
- django_webhook_subscriber/signals.py +0 -152
- django_webhook_subscriber/testing.py +0 -14
- django_webhook_subscriber/tests/test_signals.py +0 -268
- django_webhook_subscriber-0.4.0.dist-info/METADATA +0 -448
- django_webhook_subscriber-0.4.0.dist-info/RECORD +0 -33
- {django_webhook_subscriber-0.4.0.dist-info → django_webhook_subscriber-2.0.0.dist-info}/WHEEL +0 -0
- {django_webhook_subscriber-0.4.0.dist-info → django_webhook_subscriber-2.0.0.dist-info}/licenses/LICENSE +0 -0
- {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')
|