Extend staging tests

This commit is contained in:
jeremystretch 2022-11-10 15:33:47 -05:00
parent d5e76a34b8
commit 53725c382c

View File

@ -1,13 +1,16 @@
from django.test import TransactionTestCase from django.test import TransactionTestCase
from circuits.models import Provider, Circuit, CircuitType from circuits.models import Provider, Circuit, CircuitType
from extras.models import Change, Branch from extras.models import Branch, Change, Tag
from netbox.staging import checkout from netbox.staging import checkout
from utilities.testing import create_tags
class StagingTestCase(TransactionTestCase): class StagingTestCase(TransactionTestCase):
def setUp(self): def setUp(self):
create_tags('Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot')
providers = ( providers = (
Provider(name='Provider A', slug='provider-a'), Provider(name='Provider A', slug='provider-a'),
Provider(name='Provider B', slug='provider-b'), Provider(name='Provider B', slug='provider-b'),
@ -31,20 +34,42 @@ class StagingTestCase(TransactionTestCase):
def test_object_creation(self): def test_object_creation(self):
branch = Branch.objects.create(name='Branch 1') branch = Branch.objects.create(name='Branch 1')
tags = Tag.objects.all()[:3]
with checkout(branch): with checkout(branch):
provider = Provider.objects.create(name='Provider D', slug='provider-d') provider = Provider.objects.create(name='Provider D', slug='provider-d')
Circuit.objects.create(provider=provider, cid='Circuit D1', type=CircuitType.objects.first()) circuit = Circuit.objects.create(provider=provider, cid='Circuit D1', type=CircuitType.objects.first())
circuit.tags.set(tags)
# Sanity-checking
self.assertEqual(Provider.objects.count(), 4) self.assertEqual(Provider.objects.count(), 4)
self.assertEqual(Circuit.objects.count(), 10) self.assertEqual(Circuit.objects.count(), 10)
self.assertListEqual(list(circuit.tags.all()), list(tags))
# Verify that changes have been rolled back after exiting the context
self.assertEqual(Provider.objects.count(), 3) self.assertEqual(Provider.objects.count(), 3)
self.assertEqual(Circuit.objects.count(), 9) self.assertEqual(Circuit.objects.count(), 9)
self.assertEqual(Change.objects.count(), 2) self.assertEqual(Change.objects.count(), 5)
# Verify that changes are replayed upon entering the context
with checkout(branch):
self.assertEqual(Provider.objects.count(), 4)
self.assertEqual(Circuit.objects.count(), 10)
circuit = Circuit.objects.get(cid='Circuit D1')
self.assertListEqual(list(circuit.tags.all()), list(tags))
# Verify that changes are applied and deleted upon branch merge
branch.merge()
self.assertEqual(Provider.objects.count(), 4)
self.assertEqual(Circuit.objects.count(), 10)
circuit = Circuit.objects.get(cid='Circuit D1')
self.assertListEqual(list(circuit.tags.all()), list(tags))
self.assertEqual(Change.objects.count(), 0)
def test_object_modification(self): def test_object_modification(self):
branch = Branch.objects.create(name='Branch 1') branch = Branch.objects.create(name='Branch 1')
tags = Tag.objects.all()[:3]
self.assertEqual(len(tags), 3)
with checkout(branch): with checkout(branch):
provider = Provider.objects.get(name='Provider A') provider = Provider.objects.get(name='Provider A')
@ -53,17 +78,42 @@ class StagingTestCase(TransactionTestCase):
circuit = Circuit.objects.get(cid='Circuit A1') circuit = Circuit.objects.get(cid='Circuit A1')
circuit.cid = 'Circuit X' circuit.cid = 'Circuit X'
circuit.save() circuit.save()
circuit.tags.set(tags)
# Sanity-checking
self.assertEqual(Provider.objects.count(), 3) self.assertEqual(Provider.objects.count(), 3)
self.assertEqual(Provider.objects.get(pk=provider.pk).name, 'Provider X') self.assertEqual(Provider.objects.get(pk=provider.pk).name, 'Provider X')
self.assertEqual(Circuit.objects.count(), 9) self.assertEqual(Circuit.objects.count(), 9)
self.assertEqual(Circuit.objects.get(pk=circuit.pk).cid, 'Circuit X') self.assertEqual(Circuit.objects.get(pk=circuit.pk).cid, 'Circuit X')
self.assertListEqual(list(circuit.tags.all()), list(tags))
# Verify that changes have been rolled back after exiting the context
self.assertEqual(Provider.objects.count(), 3) self.assertEqual(Provider.objects.count(), 3)
self.assertEqual(Provider.objects.get(pk=provider.pk).name, 'Provider A') self.assertEqual(Provider.objects.get(pk=provider.pk).name, 'Provider A')
self.assertEqual(Circuit.objects.count(), 9) self.assertEqual(Circuit.objects.count(), 9)
self.assertEqual(Circuit.objects.get(pk=circuit.pk).cid, 'Circuit A1') circuit = Circuit.objects.get(pk=circuit.pk)
self.assertEqual(Change.objects.count(), 2) self.assertEqual(circuit.cid, 'Circuit A1')
self.assertListEqual(list(circuit.tags.all()), [])
self.assertEqual(Change.objects.count(), 5)
# Verify that changes are replayed upon entering the context
with checkout(branch):
self.assertEqual(Provider.objects.count(), 3)
self.assertEqual(Provider.objects.get(pk=provider.pk).name, 'Provider X')
self.assertEqual(Circuit.objects.count(), 9)
circuit = Circuit.objects.get(pk=circuit.pk)
self.assertEqual(circuit.cid, 'Circuit X')
self.assertListEqual(list(circuit.tags.all()), list(tags))
# Verify that changes are applied and deleted upon branch merge
branch.merge()
self.assertEqual(Provider.objects.count(), 3)
self.assertEqual(Provider.objects.get(pk=provider.pk).name, 'Provider X')
self.assertEqual(Circuit.objects.count(), 9)
circuit = Circuit.objects.get(pk=circuit.pk)
self.assertEqual(circuit.cid, 'Circuit X')
self.assertListEqual(list(circuit.tags.all()), list(tags))
self.assertEqual(Change.objects.count(), 0)
def test_object_deletion(self): def test_object_deletion(self):
branch = Branch.objects.create(name='Branch 1') branch = Branch.objects.create(name='Branch 1')
@ -73,13 +123,26 @@ class StagingTestCase(TransactionTestCase):
provider.circuits.all().delete() provider.circuits.all().delete()
provider.delete() provider.delete()
# Sanity-checking
self.assertEqual(Provider.objects.count(), 2) self.assertEqual(Provider.objects.count(), 2)
self.assertEqual(Circuit.objects.count(), 6) self.assertEqual(Circuit.objects.count(), 6)
# Verify that changes have been rolled back after exiting the context
self.assertEqual(Provider.objects.count(), 3) self.assertEqual(Provider.objects.count(), 3)
self.assertEqual(Circuit.objects.count(), 9) self.assertEqual(Circuit.objects.count(), 9)
self.assertEqual(Change.objects.count(), 4) self.assertEqual(Change.objects.count(), 4)
# Verify that changes are replayed upon entering the context
with checkout(branch):
self.assertEqual(Provider.objects.count(), 2)
self.assertEqual(Circuit.objects.count(), 6)
# Verify that changes are applied and deleted upon branch merge
branch.merge()
self.assertEqual(Provider.objects.count(), 2)
self.assertEqual(Circuit.objects.count(), 6)
self.assertEqual(Change.objects.count(), 0)
def test_create_update_delete_clean(self): def test_create_update_delete_clean(self):
branch = Branch.objects.create(name='Branch 1') branch = Branch.objects.create(name='Branch 1')
@ -96,4 +159,46 @@ class StagingTestCase(TransactionTestCase):
# Delete it # Delete it
provider.delete() provider.delete()
# Check that the staged Change has been deleted
self.assertFalse(Change.objects.exists()) self.assertFalse(Change.objects.exists())
def test_exit_enter_context(self):
branch = Branch.objects.create(name='Branch 1')
with checkout(branch):
# Create a new object
provider = Provider.objects.create(name='Provider D', slug='provider-d')
provider.save()
# Check that a create Change was recorded
self.assertEqual(Change.objects.count(), 1)
change = Change.objects.first()
self.assertEqual(change.action, 'create')
self.assertEqual(change.data['name'], provider.name)
with checkout(branch):
# Update the staged object
provider = Provider.objects.get(name='Provider D')
provider.comments = 'New comments'
provider.save()
# Check that a second Change object has been created for the object
self.assertEqual(Change.objects.count(), 2)
change = Change.objects.last()
self.assertEqual(change.action, 'update')
self.assertEqual(change.data['name'], provider.name)
self.assertEqual(change.data['comments'], provider.comments)
with checkout(branch):
# Delete the staged object
provider = Provider.objects.get(name='Provider D')
provider.delete()
# Check that a third Change has recorded the object's deletion
self.assertEqual(Change.objects.count(), 3)
change = Change.objects.last()
self.assertEqual(change.action, 'delete')
self.assertIsNone(change.data)