Add API tests

This commit is contained in:
Jeremy Stretch 2024-07-08 17:12:01 -04:00
parent 0d553ca5d0
commit fdbcd3621c
7 changed files with 250 additions and 6 deletions

View File

@ -28,7 +28,7 @@ class NotificationSerializer(ValidatedModelSerializer):
fields = [ fields = [
'id', 'url', 'display', 'object_type', 'object_id', 'object', 'user', 'created', 'read', 'event_type', 'id', 'url', 'display', 'object_type', 'object_id', 'object', 'user', 'created', 'read', 'event_type',
] ]
brief_fields = ('id', 'url', 'display', 'object_type', 'object_id', 'user', 'event') brief_fields = ('id', 'url', 'display', 'object_type', 'object_id', 'user', 'read', 'event_type')
@extend_schema_field(serializers.JSONField(allow_null=True)) @extend_schema_field(serializers.JSONField(allow_null=True))
def get_object(self, instance): def get_object(self, instance):
@ -73,7 +73,7 @@ class SubscriptionSerializer(ValidatedModelSerializer):
fields = [ fields = [
'id', 'url', 'display', 'object_type', 'object_id', 'object', 'user', 'created', 'id', 'url', 'display', 'object_type', 'object_id', 'object', 'user', 'created',
] ]
brief_fields = ('id', 'url', 'display', 'object_id', 'object_type') brief_fields = ('id', 'url', 'display', 'object_type', 'object_id', 'user')
@extend_schema_field(serializers.JSONField(allow_null=True)) @extend_schema_field(serializers.JSONField(allow_null=True))
def get_object(self, instance): def get_object(self, instance):

View File

@ -13,6 +13,7 @@ __all__ = (
'ExportTemplateFilter', 'ExportTemplateFilter',
'ImageAttachmentFilter', 'ImageAttachmentFilter',
'JournalEntryFilter', 'JournalEntryFilter',
'NotificationGroupFilter',
'SavedFilterFilter', 'SavedFilterFilter',
'TagFilter', 'TagFilter',
'WebhookFilter', 'WebhookFilter',
@ -67,6 +68,12 @@ class JournalEntryFilter(BaseFilterMixin):
pass pass
@strawberry_django.filter(models.NotificationGroup, lookups=True)
@autotype_decorator(filtersets.NotificationGroupFilterSet)
class NotificationGroupFilter(BaseFilterMixin):
pass
@strawberry_django.filter(models.SavedFilter, lookups=True) @strawberry_django.filter(models.SavedFilter, lookups=True)
@autotype_decorator(filtersets.SavedFilterFilterSet) @autotype_decorator(filtersets.SavedFilterFilterSet)
class SavedFilterFilter(BaseFilterMixin): class SavedFilterFilter(BaseFilterMixin):

View File

@ -54,6 +54,21 @@ class ExtrasQuery:
return models.JournalEntry.objects.get(pk=id) return models.JournalEntry.objects.get(pk=id)
journal_entry_list: List[JournalEntryType] = strawberry_django.field() journal_entry_list: List[JournalEntryType] = strawberry_django.field()
@strawberry.field
def notification(self, id: int) -> NotificationType:
return models.Notification.objects.get(pk=id)
notification_list: List[NotificationType] = strawberry_django.field()
@strawberry.field
def notification_group(self, id: int) -> NotificationGroupType:
return models.NotificationGroup.objects.get(pk=id)
notification_group_list: List[NotificationGroupType] = strawberry_django.field()
@strawberry.field
def subscription(self, id: int) -> SubscriptionType:
return models.Subscription.objects.get(pk=id)
subscription_list: List[SubscriptionType] = strawberry_django.field()
@strawberry.field @strawberry.field
def tag(self, id: int) -> TagType: def tag(self, id: int) -> TagType:
return models.Tag.objects.get(pk=id) return models.Tag.objects.get(pk=id)

View File

@ -18,7 +18,10 @@ __all__ = (
'ExportTemplateType', 'ExportTemplateType',
'ImageAttachmentType', 'ImageAttachmentType',
'JournalEntryType', 'JournalEntryType',
'NotificationGroupType',
'NotificationType',
'SavedFilterType', 'SavedFilterType',
'SubscriptionType',
'TagType', 'TagType',
'WebhookType', 'WebhookType',
) )
@ -122,6 +125,23 @@ class JournalEntryType(CustomFieldsMixin, TagsMixin, ObjectType):
created_by: Annotated["UserType", strawberry.lazy('users.graphql.types')] | None created_by: Annotated["UserType", strawberry.lazy('users.graphql.types')] | None
@strawberry_django.type(
models.Notification,
# filters=NotificationFilter
)
class NotificationType(ObjectType):
user: Annotated["UserType", strawberry.lazy('users.graphql.types')] | None
@strawberry_django.type(
models.NotificationGroup,
filters=NotificationGroupFilter
)
class NotificationGroupType(ObjectType):
users: List[Annotated["UserType", strawberry.lazy('users.graphql.types')]]
groups: List[Annotated["GroupType", strawberry.lazy('users.graphql.types')]]
@strawberry_django.type( @strawberry_django.type(
models.SavedFilter, models.SavedFilter,
exclude=['content_types',], exclude=['content_types',],
@ -131,6 +151,14 @@ class SavedFilterType(ObjectType):
user: Annotated["UserType", strawberry.lazy('users.graphql.types')] | None user: Annotated["UserType", strawberry.lazy('users.graphql.types')] | None
@strawberry_django.type(
models.Subscription,
# filters=NotificationFilter
)
class SubscriptionType(ObjectType):
user: Annotated["UserType", strawberry.lazy('users.graphql.types')] | None
@strawberry_django.type( @strawberry_django.type(
models.Tag, models.Tag,
exclude=['extras_taggeditem_items', ], exclude=['extras_taggeditem_items', ],

View File

@ -50,7 +50,7 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)),
('created', models.DateTimeField(auto_now_add=True)), ('created', models.DateTimeField(auto_now_add=True)),
('read', models.DateTimeField(null=True)), ('read', models.DateTimeField(blank=True, null=True)),
('object_id', models.PositiveBigIntegerField()), ('object_id', models.PositiveBigIntegerField()),
('event_type', models.CharField(max_length=50)), ('event_type', models.CharField(max_length=50)),
('object_type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='contenttypes.contenttype')), ('object_type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='contenttypes.contenttype')),

View File

@ -41,7 +41,8 @@ class Notification(models.Model):
) )
read = models.DateTimeField( read = models.DateTimeField(
verbose_name=_('read'), verbose_name=_('read'),
null=True null=True,
blank=True
) )
user = models.ForeignKey( user = models.ForeignKey(
to=settings.AUTH_USER_MODEL, to=settings.AUTH_USER_MODEL,

View File

@ -7,15 +7,15 @@ from django.utils.timezone import make_aware
from rest_framework import status from rest_framework import status
from core.choices import ManagedFileRootPathChoices from core.choices import ManagedFileRootPathChoices
from core.events import *
from core.models import ObjectType from core.models import ObjectType
from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Rack, Location, RackRole, Site from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Rack, Location, RackRole, Site
from extras.choices import * from extras.choices import *
from extras.models import * from extras.models import *
from extras.scripts import BooleanVar, IntegerVar, Script as PythonClass, StringVar from extras.scripts import BooleanVar, IntegerVar, Script as PythonClass, StringVar
from users.models import Group, User
from utilities.testing import APITestCase, APIViewTestCases from utilities.testing import APITestCase, APIViewTestCases
User = get_user_model()
class AppTest(APITestCase): class AppTest(APITestCase):
@ -890,3 +890,196 @@ class ObjectTypeTest(APITestCase):
url = reverse('extras-api:objecttype-detail', kwargs={'pk': object_type.pk}) url = reverse('extras-api:objecttype-detail', kwargs={'pk': object_type.pk})
self.assertHttpStatus(self.client.get(url, **self.header), status.HTTP_200_OK) self.assertHttpStatus(self.client.get(url, **self.header), status.HTTP_200_OK)
class SubscriptionTest(APIViewTestCases.APIViewTestCase):
model = Subscription
brief_fields = ['display', 'id', 'object_id', 'object_type', 'url', 'user']
@classmethod
def setUpTestData(cls):
users = (
User(username='User 1'),
User(username='User 2'),
User(username='User 3'),
User(username='User 4'),
)
User.objects.bulk_create(users)
sites = (
Site(name='Site 1', slug='site-1'),
Site(name='Site 2', slug='site-2'),
Site(name='Site 3', slug='site-3'),
)
Site.objects.bulk_create(sites)
subscriptions = (
Subscription(
object=sites[0],
user=users[0],
),
Subscription(
object=sites[1],
user=users[1],
),
Subscription(
object=sites[2],
user=users[2],
),
)
Subscription.objects.bulk_create(subscriptions)
cls.create_data = [
{
'object_type': 'dcim.site',
'object_id': sites[0].pk,
'user': users[3].pk,
},
{
'object_type': 'dcim.site',
'object_id': sites[1].pk,
'user': users[3].pk,
},
{
'object_type': 'dcim.site',
'object_id': sites[2].pk,
'user': users[3].pk,
},
]
class NotificationGroupTest(APIViewTestCases.APIViewTestCase):
model = NotificationGroup
brief_fields = ['description', 'display', 'id', 'name', 'url']
create_data = [
{
'object_types': ['dcim.site'],
'name': 'Custom Link 4',
'enabled': True,
'link_text': 'Link 4',
'link_url': 'http://example.com/?4',
},
{
'object_types': ['dcim.site'],
'name': 'Custom Link 5',
'enabled': True,
'link_text': 'Link 5',
'link_url': 'http://example.com/?5',
},
{
'object_types': ['dcim.site'],
'name': 'Custom Link 6',
'enabled': False,
'link_text': 'Link 6',
'link_url': 'http://example.com/?6',
},
]
bulk_update_data = {
'description': 'New description',
}
@classmethod
def setUpTestData(cls):
users = (
User(username='User 1'),
User(username='User 2'),
User(username='User 3'),
)
User.objects.bulk_create(users)
groups = (
Group(name='Group 1'),
Group(name='Group 2'),
Group(name='Group 3'),
)
Group.objects.bulk_create(groups)
notification_groups = (
NotificationGroup(name='Notification Group 1'),
NotificationGroup(name='Notification Group 2'),
NotificationGroup(name='Notification Group 3'),
)
NotificationGroup.objects.bulk_create(notification_groups)
for i, notification_group in enumerate(notification_groups):
notification_group.users.add(users[i])
notification_group.groups.add(groups[i])
cls.create_data = [
{
'name': 'Notification Group 4',
'description': 'Foo',
'users': [users[0].pk],
'groups': [groups[0].pk],
},
{
'name': 'Notification Group 5',
'description': 'Bar',
'users': [users[1].pk],
'groups': [groups[1].pk],
},
{
'name': 'Notification Group 6',
'description': 'Baz',
'users': [users[2].pk],
'groups': [groups[2].pk],
},
]
class NotificationTest(APIViewTestCases.APIViewTestCase):
model = Notification
brief_fields = ['display', 'event_type', 'id', 'object_id', 'object_type', 'read', 'url', 'user']
@classmethod
def setUpTestData(cls):
users = (
User(username='User 1'),
User(username='User 2'),
User(username='User 3'),
User(username='User 4'),
)
User.objects.bulk_create(users)
sites = (
Site(name='Site 1', slug='site-1'),
Site(name='Site 2', slug='site-2'),
Site(name='Site 3', slug='site-3'),
)
Site.objects.bulk_create(sites)
notifications = (
Notification(
object=sites[0],
event_type=OBJECT_CREATED,
user=users[0],
),
Notification(
object=sites[1],
event_type=OBJECT_UPDATED,
user=users[1],
),
Notification(
object=sites[2],
event_type=OBJECT_DELETED,
user=users[2],
),
)
Notification.objects.bulk_create(notifications)
cls.create_data = [
{
'object_type': 'dcim.site',
'object_id': sites[0].pk,
'user': users[3].pk,
'event_type': OBJECT_CREATED,
},
{
'object_type': 'dcim.site',
'object_id': sites[1].pk,
'user': users[3].pk,
'event_type': OBJECT_UPDATED,
},
{
'object_type': 'dcim.site',
'object_id': sites[2].pk,
'user': users[3].pk,
'event_type': OBJECT_DELETED,
},
]