test_models.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. from django.contrib.contenttypes.models import ContentType
  2. from django.core.exceptions import ObjectDoesNotExist
  3. from django.test import TestCase
  4. from core.models import DataSource, ObjectType
  5. from core.choices import ObjectChangeActionChoices
  6. from dcim.models import Site, Location, Device
  7. from netbox.constants import CENSOR_TOKEN, CENSOR_TOKEN_CHANGED
  8. class DataSourceChangeLoggingTestCase(TestCase):
  9. def test_password_added_on_create(self):
  10. datasource = DataSource.objects.create(
  11. name='Data Source 1',
  12. type='git',
  13. source_url='http://localhost/',
  14. parameters={
  15. 'username': 'jeff',
  16. 'password': 'foobar123',
  17. }
  18. )
  19. objectchange = datasource.to_objectchange(ObjectChangeActionChoices.ACTION_CREATE)
  20. self.assertIsNone(objectchange.prechange_data)
  21. self.assertEqual(objectchange.postchange_data['parameters']['username'], 'jeff')
  22. self.assertEqual(objectchange.postchange_data['parameters']['password'], CENSOR_TOKEN_CHANGED)
  23. def test_password_added_on_update(self):
  24. datasource = DataSource.objects.create(
  25. name='Data Source 1',
  26. type='git',
  27. source_url='http://localhost/'
  28. )
  29. datasource.snapshot()
  30. # Add a blank password
  31. datasource.parameters = {
  32. 'username': 'jeff',
  33. 'password': '',
  34. }
  35. objectchange = datasource.to_objectchange(ObjectChangeActionChoices.ACTION_UPDATE)
  36. self.assertIsNone(objectchange.prechange_data['parameters'])
  37. self.assertEqual(objectchange.postchange_data['parameters']['username'], 'jeff')
  38. self.assertEqual(objectchange.postchange_data['parameters']['password'], '')
  39. # Add a password
  40. datasource.parameters = {
  41. 'username': 'jeff',
  42. 'password': 'foobar123',
  43. }
  44. objectchange = datasource.to_objectchange(ObjectChangeActionChoices.ACTION_UPDATE)
  45. self.assertEqual(objectchange.postchange_data['parameters']['username'], 'jeff')
  46. self.assertEqual(objectchange.postchange_data['parameters']['password'], CENSOR_TOKEN_CHANGED)
  47. def test_password_changed(self):
  48. datasource = DataSource.objects.create(
  49. name='Data Source 1',
  50. type='git',
  51. source_url='http://localhost/',
  52. parameters={
  53. 'username': 'jeff',
  54. 'password': 'password1',
  55. }
  56. )
  57. datasource.snapshot()
  58. # Change the password
  59. datasource.parameters['password'] = 'password2'
  60. objectchange = datasource.to_objectchange(ObjectChangeActionChoices.ACTION_UPDATE)
  61. self.assertEqual(objectchange.prechange_data['parameters']['username'], 'jeff')
  62. self.assertEqual(objectchange.prechange_data['parameters']['password'], CENSOR_TOKEN)
  63. self.assertEqual(objectchange.postchange_data['parameters']['username'], 'jeff')
  64. self.assertEqual(objectchange.postchange_data['parameters']['password'], CENSOR_TOKEN_CHANGED)
  65. def test_password_removed_on_update(self):
  66. datasource = DataSource.objects.create(
  67. name='Data Source 1',
  68. type='git',
  69. source_url='http://localhost/',
  70. parameters={
  71. 'username': 'jeff',
  72. 'password': 'foobar123',
  73. }
  74. )
  75. datasource.snapshot()
  76. objectchange = datasource.to_objectchange(ObjectChangeActionChoices.ACTION_UPDATE)
  77. self.assertEqual(objectchange.prechange_data['parameters']['username'], 'jeff')
  78. self.assertEqual(objectchange.prechange_data['parameters']['password'], CENSOR_TOKEN)
  79. self.assertEqual(objectchange.postchange_data['parameters']['username'], 'jeff')
  80. self.assertEqual(objectchange.postchange_data['parameters']['password'], CENSOR_TOKEN)
  81. # Remove the password
  82. datasource.parameters['password'] = ''
  83. objectchange = datasource.to_objectchange(ObjectChangeActionChoices.ACTION_UPDATE)
  84. self.assertEqual(objectchange.prechange_data['parameters']['username'], 'jeff')
  85. self.assertEqual(objectchange.prechange_data['parameters']['password'], CENSOR_TOKEN)
  86. self.assertEqual(objectchange.postchange_data['parameters']['username'], 'jeff')
  87. self.assertEqual(objectchange.postchange_data['parameters']['password'], '')
  88. def test_password_not_modified(self):
  89. datasource = DataSource.objects.create(
  90. name='Data Source 1',
  91. type='git',
  92. source_url='http://localhost/',
  93. parameters={
  94. 'username': 'username1',
  95. 'password': 'foobar123',
  96. }
  97. )
  98. datasource.snapshot()
  99. # Remove the password
  100. datasource.parameters['username'] = 'username2'
  101. objectchange = datasource.to_objectchange(ObjectChangeActionChoices.ACTION_UPDATE)
  102. self.assertEqual(objectchange.prechange_data['parameters']['username'], 'username1')
  103. self.assertEqual(objectchange.prechange_data['parameters']['password'], CENSOR_TOKEN)
  104. self.assertEqual(objectchange.postchange_data['parameters']['username'], 'username2')
  105. self.assertEqual(objectchange.postchange_data['parameters']['password'], CENSOR_TOKEN)
  106. class ObjectTypeTest(TestCase):
  107. def test_create(self):
  108. """
  109. Test that an ObjectType created for a given app_label & model name will be automatically assigned to
  110. the appropriate ContentType.
  111. """
  112. kwargs = {
  113. 'app_label': 'foo',
  114. 'model': 'bar',
  115. }
  116. ct = ContentType.objects.create(**kwargs)
  117. ot = ObjectType.objects.create(**kwargs)
  118. self.assertEqual(ot.contenttype_ptr, ct)
  119. def test_get_by_natural_key(self):
  120. """
  121. Test that get_by_natural_key() returns the appropriate ObjectType.
  122. """
  123. self.assertEqual(
  124. ObjectType.objects.get_by_natural_key('dcim', 'site'),
  125. ObjectType.objects.get(app_label='dcim', model='site')
  126. )
  127. with self.assertRaises(ObjectDoesNotExist):
  128. ObjectType.objects.get_by_natural_key('foo', 'bar')
  129. def test_get_for_id(self):
  130. """
  131. Test that get_by_id() returns the appropriate ObjectType.
  132. """
  133. ot = ObjectType.objects.get_by_natural_key('dcim', 'site')
  134. self.assertEqual(
  135. ObjectType.objects.get_for_id(ot.pk),
  136. ObjectType.objects.get(pk=ot.pk)
  137. )
  138. with self.assertRaises(ObjectDoesNotExist):
  139. ObjectType.objects.get_for_id(0)
  140. def test_get_for_model(self):
  141. """
  142. Test that get_by_model() returns the appropriate ObjectType.
  143. """
  144. self.assertEqual(
  145. ObjectType.objects.get_for_model(Site),
  146. ObjectType.objects.get_by_natural_key('dcim', 'site')
  147. )
  148. def test_get_for_models(self):
  149. """
  150. Test that get_by_models() returns the appropriate ObjectType mapping.
  151. """
  152. self.assertEqual(
  153. ObjectType.objects.get_for_models(Site, Location, Device),
  154. {
  155. Site: ObjectType.objects.get_by_natural_key('dcim', 'site'),
  156. Location: ObjectType.objects.get_by_natural_key('dcim', 'location'),
  157. Device: ObjectType.objects.get_by_natural_key('dcim', 'device'),
  158. }
  159. )
  160. def test_public(self):
  161. """
  162. Test that public() returns only ObjectTypes for public models.
  163. """
  164. public_ots = ObjectType.objects.public()
  165. self.assertIn(ObjectType.objects.get_by_natural_key('dcim', 'site'), public_ots)
  166. self.assertNotIn(ObjectType.objects.get_by_natural_key('extras', 'taggeditem'), public_ots)
  167. def test_with_feature(self):
  168. """
  169. Test that with_feature() returns only ObjectTypes for models which support the specified feature.
  170. """
  171. bookmarks_ots = ObjectType.objects.with_feature('bookmarks')
  172. self.assertIn(ObjectType.objects.get_by_natural_key('dcim', 'site'), bookmarks_ots)
  173. self.assertNotIn(ObjectType.objects.get_by_natural_key('dcim', 'cabletermination'), bookmarks_ots)