mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-10 09:38:15 -06:00
Added essential tests for the double event rule invocation problem
This commit is contained in:
parent
e512027a91
commit
ecdd30778a
@ -16,6 +16,8 @@ from extras.events import enqueue_object, flush_events, serialize_for_event
|
|||||||
from extras.models import EventRule, Tag, Webhook
|
from extras.models import EventRule, Tag, Webhook
|
||||||
from extras.webhooks import generate_signature, send_webhook
|
from extras.webhooks import generate_signature, send_webhook
|
||||||
from utilities.testing import APITestCase
|
from utilities.testing import APITestCase
|
||||||
|
from netbox.tests.dummy_plugin.models import DummyModel
|
||||||
|
from netbox.context import events_queue
|
||||||
|
|
||||||
|
|
||||||
class EventRuleTest(APITestCase):
|
class EventRuleTest(APITestCase):
|
||||||
@ -31,6 +33,7 @@ class EventRuleTest(APITestCase):
|
|||||||
def setUpTestData(cls):
|
def setUpTestData(cls):
|
||||||
|
|
||||||
site_type = ObjectType.objects.get_for_model(Site)
|
site_type = ObjectType.objects.get_for_model(Site)
|
||||||
|
dummy_type = ObjectType.objects.get_for_model(DummyModel)
|
||||||
DUMMY_URL = 'http://localhost:9000/'
|
DUMMY_URL = 'http://localhost:9000/'
|
||||||
DUMMY_SECRET = 'LOOKATMEIMASECRETSTRING'
|
DUMMY_SECRET = 'LOOKATMEIMASECRETSTRING'
|
||||||
|
|
||||||
@ -65,7 +68,7 @@ class EventRuleTest(APITestCase):
|
|||||||
),
|
),
|
||||||
))
|
))
|
||||||
for event_rule in event_rules:
|
for event_rule in event_rules:
|
||||||
event_rule.object_types.set([site_type])
|
event_rule.object_types.set([site_type, dummy_type])
|
||||||
|
|
||||||
Tag.objects.bulk_create((
|
Tag.objects.bulk_create((
|
||||||
Tag(name='Foo', slug='foo'),
|
Tag(name='Foo', slug='foo'),
|
||||||
@ -377,3 +380,45 @@ class EventRuleTest(APITestCase):
|
|||||||
# Patch the Session object with our dummy_send() method, then process the webhook for sending
|
# Patch the Session object with our dummy_send() method, then process the webhook for sending
|
||||||
with patch.object(Session, 'send', dummy_send) as mock_send:
|
with patch.object(Session, 'send', dummy_send) as mock_send:
|
||||||
send_webhook(**job.kwargs)
|
send_webhook(**job.kwargs)
|
||||||
|
|
||||||
|
def test_webhook_double_save_create(self):
|
||||||
|
data = {
|
||||||
|
'name': 'Dummy',
|
||||||
|
}
|
||||||
|
url = reverse('plugins-api:dummy_plugin-api:dummymodel-list')
|
||||||
|
self.add_permissions('dummy_plugin.add_dummymodel')
|
||||||
|
response = self.client.post(url, data, format='json', **self.header)
|
||||||
|
self.assertHttpStatus(response, status.HTTP_201_CREATED)
|
||||||
|
self.assertEqual(DummyModel.objects.count(), 1)
|
||||||
|
|
||||||
|
dummy = DummyModel.objects.first()
|
||||||
|
|
||||||
|
self.assertEqual(self.queue.count, 1)
|
||||||
|
job = self.queue.jobs[0]
|
||||||
|
self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_create=True))
|
||||||
|
self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_CREATE)
|
||||||
|
self.assertEqual(job.kwargs['model_name'], 'dummymodel')
|
||||||
|
self.assertEqual(job.kwargs['data']['id'], dummy.pk)
|
||||||
|
self.assertEqual(job.kwargs['snapshots']['postchange']['name'], 'Dummy')
|
||||||
|
|
||||||
|
def test_webhook_double_save_update(self):
|
||||||
|
dummy = DummyModel.objects.create(name='Dummy')
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'name': 'New Dummy',
|
||||||
|
'number': 42,
|
||||||
|
}
|
||||||
|
url = reverse('plugins-api:dummy_plugin-api:dummymodel-detail', kwargs={'pk': dummy.pk})
|
||||||
|
self.add_permissions('dummy_plugin.change_dummymodel')
|
||||||
|
response = self.client.patch(url, data, format='json', **self.header)
|
||||||
|
self.assertHttpStatus(response, status.HTTP_200_OK)
|
||||||
|
self.assertEqual(DummyModel.objects.count(), 1)
|
||||||
|
|
||||||
|
self.assertEqual(self.queue.count, 1)
|
||||||
|
job = self.queue.jobs[0]
|
||||||
|
self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_update=True))
|
||||||
|
self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_UPDATE)
|
||||||
|
self.assertEqual(job.kwargs['model_name'], 'dummymodel')
|
||||||
|
self.assertEqual(job.kwargs['data']['id'], dummy.pk)
|
||||||
|
self.assertEqual(job.kwargs['snapshots']['postchange']['name'], 'New Dummy')
|
||||||
|
self.assertEqual(job.kwargs['snapshots']['postchange']['number'], 42)
|
||||||
|
@ -15,7 +15,7 @@ class Migration(migrations.Migration):
|
|||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)),
|
||||||
('name', models.CharField(max_length=20)),
|
('name', models.CharField(max_length=20)),
|
||||||
('number', models.IntegerField(default=100)),
|
('number', models.IntegerField(default=100)),
|
||||||
('created', models.DateField(auto_now_add=True, null=True)),
|
('created', models.DateTimeField(auto_now_add=True, null=True)),
|
||||||
('last_updated', models.DateTimeField(auto_now=True, null=True)),
|
('last_updated', models.DateTimeField(auto_now=True, null=True)),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
|
@ -13,3 +13,7 @@ class DummyModel(EventRulesMixin, ChangeLoggingMixin, models.Model):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ['name']
|
ordering = ['name']
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
super().save()
|
||||||
|
super().save()
|
||||||
|
Loading…
Reference in New Issue
Block a user