Merge pull request #904 from nofusscomputing/assistance-refactor-tests

This commit is contained in:
Jon
2025-07-29 16:26:33 +09:30
committed by GitHub
33 changed files with 1331 additions and 1553 deletions

View File

@ -92,10 +92,39 @@ class APIFieldsTestCases:
with django_db_blocker.unblock():
kwargs_many_to_many = {}
kwargs = {}
for key, value in model_kwargs.items():
field = model._meta.get_field(key)
if isinstance(field, models.ManyToManyField):
kwargs_many_to_many.update({
key: value
})
else:
kwargs.update({
key: value
})
item = model.objects.create(
**model_kwargs
**kwargs
)
for key, value in kwargs_many_to_many.items():
field = getattr(item, 'target_team')
for entry in value:
field.add(entry)
request.cls.item = item
yield item
@ -198,7 +227,7 @@ class APIFieldsTestCases:
else:
assert(
type( api_data['value'] ) is param_expected
type( api_data.get('value', 'is empty') ) is param_expected
or type( api_data_two.get('value', 'is empty') ) is param_expected
)

View File

@ -0,0 +1,29 @@
# Generated by Django 5.1.10 on 2025-07-29 04:13
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("assistance", "0013_alter_modelknowledgebasearticle_model"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AlterField(
model_name="knowledgebase",
name="responsible_user",
field=models.ForeignKey(
blank=True,
help_text="User(s) whom is considered the articles owner.",
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="responsible_user",
to=settings.AUTH_USER_MODEL,
verbose_name="Responsible User",
),
),
]

View File

@ -103,7 +103,7 @@ class KnowledgeBase(
responsible_user = models.ForeignKey(
User,
blank = False,
blank = True,
help_text = 'User(s) whom is considered the articles owner.',
null = True,
on_delete = models.PROTECT,

View File

@ -0,0 +1,25 @@
import pytest
@pytest.fixture( scope = 'class')
def model(model_knowledgebase):
yield model_knowledgebase
@pytest.fixture( scope = 'class', autouse = True)
def model_kwargs(request, kwargs_knowledgebase):
request.cls.kwargs_create_item = kwargs_knowledgebase.copy()
yield kwargs_knowledgebase.copy()
if hasattr(request.cls, 'kwargs_create_item'):
del request.cls.kwargs_create_item
@pytest.fixture( scope = 'class')
def model_serializer(serializer_knowledgebase):
yield serializer_knowledgebase

View File

@ -1,216 +0,0 @@
import django
import json
import pytest
from django.test import TestCase
from rest_framework.exceptions import ValidationError
from access.models.tenant import Tenant as Organization
from access.models.team import Team
from centurion.tests.abstract.mock_view import MockView
from assistance.models.knowledge_base import KnowledgeBase
from assistance.serializers.knowledge_base import KnowledgeBaseModelSerializer
User = django.contrib.auth.get_user_model()
class KnowledgeBaseValidationAPI(
TestCase,
):
model = KnowledgeBase
app_namespace = 'API'
url_name = '_api_knowledgebase'
@classmethod
def setUpTestData(self):
"""Setup Test
1. Create an org
2. Create a team
4. Add user to add team
"""
organization = Organization.objects.create(name='test_org')
self.user = User.objects.create_user(username="test_user_view", password="password")
self.mock_view = MockView( user = self.user )
self.organization = organization
self.add_team = Team.objects.create(
organization=organization,
team_name = 'teamone',
model_notes = 'random note'
)
self.add_user = User.objects.create_user(username="test_user_add", password="password")
self.item_has_target_user = self.model.objects.create(
organization=organization,
title = 'random title',
content = 'random note',
summary = 'a summary',
target_user = self.add_user,
release_date = '2024-01-01 12:00:00',
expiry_date = '2024-01-01 12:00:01',
responsible_user = self.add_user,
)
self.item_has_target_team = self.model.objects.create(
organization=organization,
title = 'random title',
content = 'random note',
summary = 'a summary',
release_date = '2024-01-01 12:00:00',
expiry_date = '2024-01-01 12:00:01',
responsible_user = self.add_user,
)
self.item_has_target_team.target_team.set([ self.add_team ])
def test_serializer_validation_no_title(self):
"""Serializer Validation Check
Ensure that if creating and no title is provided a validation error occurs
"""
with pytest.raises(ValidationError) as err:
serializer = KnowledgeBaseModelSerializer(
context = {
'request': self.mock_view.request,
'view': self.mock_view,
},
data={
"organization": self.organization.id,
"content": "random note",
"target_user": self.add_user.id,
"target_team": [
self.add_team.id
],
"responsible_user": self.add_user.id,
})
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['title'][0] == 'required'
def test_serializer_validation_both_target_team_target_user(self):
"""Serializer Validation Check
Ensure that both target user and target team raises a validation error
"""
with pytest.raises(ValidationError) as err:
serializer = KnowledgeBaseModelSerializer(
context = {
'request': self.mock_view.request,
'view': self.mock_view,
},
data={
"organization": self.organization.id,
"title": "teamone",
"content": "random note",
"target_user": self.add_user.id,
"target_team": [
self.add_team.id
],
"responsible_user": self.add_user.id,
})
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_not_both_target_team_user'
def test_serializer_validation_no_target_team_target_user(self):
"""Serializer Validation Check
Ensure that if either target user and target team is missing it raises validation error
"""
with pytest.raises(ValidationError) as err:
serializer = KnowledgeBaseModelSerializer(
context = {
'request': self.mock_view.request,
'view': self.mock_view,
},
data={
"organization": self.organization.id,
"title": 'teamone',
"content": 'random note',
"responsible_user": self.add_user.id,
})
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_need_target_team_or_user'
def test_serializer_validation_update_existing_target_user(self):
"""Serializer Validation Check
Ensure that if an existing item with target user is updated to include a target_team
it raises a validation error
"""
with pytest.raises(ValidationError) as err:
serializer = KnowledgeBaseModelSerializer(
self.item_has_target_user,
context = {
'request': self.mock_view.request,
'view': self.mock_view,
},
data={
"target_team": [ self.add_team.id ]
},
partial=True,
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_not_both_target_team_user'
def test_serializer_validation_update_existing_target_team(self):
"""Serializer Validation Check
Ensure that if an existing item with target team is updated to include a target_user
it raises a validation error
"""
with pytest.raises(ValidationError) as err:
serializer = KnowledgeBaseModelSerializer(
self.item_has_target_team,
context = {
'request': self.mock_view.request,
'view': self.mock_view,
},
data={
"target_user": self.add_user.id
},
partial=True,
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_not_both_target_team_user'

View File

@ -0,0 +1,191 @@
import pytest
from django.db import models
from rest_framework.relations import Hyperlink
from api.tests.functional.test_functional_api_fields import (
APIFieldsInheritedCases,
)
@pytest.mark.model_knowledgebase
class knowledgeBaseAPITestCases(
APIFieldsInheritedCases,
):
@pytest.fixture( scope = 'class')
def second_model(self, request, django_db_blocker,
model, model_kwargs
):
item = None
with django_db_blocker.unblock():
kwargs_many_to_many = {}
kwargs = {}
for key, value in model_kwargs.items():
field = model._meta.get_field(key)
if isinstance(field, models.ManyToManyField):
kwargs_many_to_many.update({
key: value
})
else:
kwargs.update({
key: value
})
# Switch model fields so all fields can be checked
kwargs_many_to_many.update({ 'responsible_teams': kwargs_many_to_many['target_team']})
del kwargs_many_to_many['target_team']
kwargs.update({ 'target_user': kwargs['responsible_user']})
del kwargs['responsible_user']
item_two = model.objects.create(
**kwargs
)
for key, value in kwargs_many_to_many.items():
field = getattr(item_two, key)
for entry in value:
field.add(entry)
request.cls.item_two = item_two
yield item_two
with django_db_blocker.unblock():
item_two.delete()
del request.cls.item_two
@pytest.fixture( scope = 'class', autouse = True)
def class_setup(self,
create_model,
second_model,
make_request,
):
pass
@property
def parameterized_api_fields(self):
return {
'title': {
'expected': str
},
'summary': {
'expected': str
},
'content': {
'expected': str
},
'category': {
'expected': dict
},
'category.id': {
'expected': int
},
'category.display_name': {
'expected': str
},
'category.url': {
'expected': str
},
'release_date': {
'expected': str
},
'expiry_date': {
'expected': str
},
'target_team': {
'expected': list
},
'target_team.0.id': {
'expected': int
},
'target_team.0.display_name': {
'expected': str
},
'target_team.0.url': {
'expected': str
},
'target_user': {
'expected': dict
},
'target_user.id': {
'expected': int
},
'target_user.display_name': {
'expected': str
},
'target_user.url': {
'expected': Hyperlink
},
'responsible_user': {
'expected': dict
},
'responsible_user.id': {
'expected': int
},
'responsible_user.display_name': {
'expected': str
},
'responsible_user.url': {
'expected': Hyperlink
},
'responsible_teams': {
'expected': list
},
'responsible_teams.0.id': {
'expected': int
},
'responsible_teams.0.display_name': {
'expected': str
},
'responsible_teams.0.url': {
'expected': str
},
'public': {
'expected': bool
},
'modified': {
'expected': str
}
}
class knowledgeBaseAPIInheritedCases(
knowledgeBaseAPITestCases,
):
pass
@pytest.mark.module_assistance
class knowledgeBaseAPIPyTest(
knowledgeBaseAPITestCases,
):
pass

View File

@ -0,0 +1,28 @@
import pytest
from core.tests.functional.centurion_abstract.test_functional_centurion_abstract_model import (
CenturionAbstractModelInheritedCases
)
@pytest.mark.model_knowledgebase
class knowledgeBaseModelTestCases(
CenturionAbstractModelInheritedCases
):
pass
class knowledgeBaseModelInheritedCases(
knowledgeBaseModelTestCases,
):
pass
@pytest.mark.module_assistance
class knowledgeBaseModelPyTest(
knowledgeBaseModelTestCases,
):
pass

View File

@ -1,11 +1,7 @@
import django
import pytest
import unittest
import requests
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser, Permission
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.test import TestCase
@ -13,11 +9,9 @@ from access.models.tenant import Tenant as Organization
from access.models.team import Team
from access.models.team_user import TeamUsers
from api.tests.abstract.api_permissions_viewset import APIPermissions
from api.tests.abstract.api_serializer_viewset import SerializersTestCases
from api.tests.abstract.test_metadata_functional import MetadataAttributesFunctional, MetaDataNavigationEntriesFunctional
from assistance.models.knowledge_base import KnowledgeBase
from assistance.models.knowledge_base import KnowledgeBase, KnowledgeBaseCategory
from settings.models.app_settings import AppSettings
@ -25,7 +19,6 @@ User = django.contrib.auth.get_user_model()
class ViewSetBase:
model = KnowledgeBase
@ -65,11 +58,17 @@ class ViewSetBase:
name = 'test_global_organization'
)
category = KnowledgeBaseCategory.objects.create(
organization = self.global_organization,
name = 'cat2'
)
self.global_org_item = self.model.objects.create(
organization = self.global_organization,
title = 'one',
content = 'some text for bodygfdgdf',
target_user = self.view_user
target_user = self.view_user,
category = category,
)
app_settings = AppSettings.objects.get(
@ -163,19 +162,29 @@ class ViewSetBase:
user = self.view_user
)
category_item = KnowledgeBaseCategory.objects.create(
organization = self.organization,
name = 'cat'
)
self.item = self.model.objects.create(
organization = self.organization,
title = 'one',
content = 'some text for body',
target_user = self.view_user
target_user = self.view_user,
category = category_item,
)
category = KnowledgeBaseCategory.objects.create(
organization = self.different_organization,
name = 'cat1'
)
self.other_org_item = self.model.objects.create(
organization = self.different_organization,
title = 'two',
content = 'some text for body',
target_user = self.view_user_b
target_user = self.view_user_b,
category = category,
)
@ -185,7 +194,8 @@ class ViewSetBase:
'title': 'team_post',
'organization': self.organization.id,
'content': 'article text',
'target_user': self.view_user.id
'target_user': self.view_user.id,
'category': category_item.id,
}
@ -229,24 +239,6 @@ class ViewSetBase:
)
class KnowledgeBasePermissionsAPI(
ViewSetBase,
APIPermissions,
TestCase,
):
pass
class KnowledgeBaseViewSet(
ViewSetBase,
SerializersTestCases,
TestCase,
):
pass
class KnowledgeBaseMetadata(
ViewSetBase,

View File

@ -0,0 +1,25 @@
import pytest
@pytest.fixture( scope = 'class')
def model(model_knowledgebasecategory):
yield model_knowledgebasecategory
@pytest.fixture( scope = 'class', autouse = True)
def model_kwargs(request, kwargs_knowledgebasecategory):
request.cls.kwargs_create_item = kwargs_knowledgebasecategory.copy()
yield kwargs_knowledgebasecategory.copy()
if hasattr(request.cls, 'kwargs_create_item'):
del request.cls.kwargs_create_item
@pytest.fixture( scope = 'class')
def model_serializer(serializer_knowledgebasecategory):
yield serializer_knowledgebasecategory

View File

@ -1,222 +0,0 @@
import django
import json
import pytest
from django.test import TestCase
from rest_framework.exceptions import ValidationError
from access.models.tenant import Tenant as Organization
from access.models.team import Team
from centurion.tests.abstract.mock_view import MockView
from assistance.serializers.knowledge_base_category import KnowledgeBaseCategory, KnowledgeBaseCategoryModelSerializer
User = django.contrib.auth.get_user_model()
class KnowledgeBaseCategoryValidationAPI(
TestCase,
):
model = KnowledgeBaseCategory
app_namespace = 'API'
url_name = '_api_v2_knowledge_base'
@classmethod
def setUpTestData(self):
"""Setup Test
1. Create an org
2. Create a team
4. Add user to add team
"""
organization = Organization.objects.create(name='test_org')
self.organization = organization
self.add_team = Team.objects.create(
organization=organization,
team_name = 'teamone',
model_notes = 'random note'
)
self.add_user = User.objects.create_user(username="test_user_add", password="password")
self.mock_view = MockView( user = self.add_user )
self.item_has_target_user = self.model.objects.create(
organization=organization,
name = 'random title',
target_user = self.add_user,
)
self.item_has_target_team = self.model.objects.create(
organization=organization,
name = 'random title0',
)
self.item_has_target_team.target_team.set([ self.add_team ])
def test_serializer_validation_no_name(self):
"""Serializer Validation Check
Ensure that if creating and no name is provided a validation error occurs
"""
with pytest.raises(ValidationError) as err:
serializer = KnowledgeBaseCategoryModelSerializer(
context = {
'request': self.mock_view.request,
'view': self.mock_view,
},
data={
"organization": self.organization.id,
"target_user": self.add_user.id,
"target_team": [
self.add_team.id
]
})
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['name'][0] == 'required'
def test_serializer_validation_parent_category_not_self(self):
"""Serializer Validation Check
Ensure that you cant assisgn self as parent category
"""
with pytest.raises(ValidationError) as err:
serializer = KnowledgeBaseCategoryModelSerializer(
self.item_has_target_user,
context = {
'request': self.mock_view.request,
'view': self.mock_view,
},
data={
"parent_category": self.item_has_target_user.id
},
partial=True,
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['parent_category'][0] == 'parent_category_not_self'
def test_serializer_validation_both_target_team_target_user(self):
"""Serializer Validation Check
Ensure that both target user and target team raises a validation error
"""
with pytest.raises(ValidationError) as err:
serializer = KnowledgeBaseCategoryModelSerializer(
context = {
'request': self.mock_view.request,
'view': self.mock_view,
},
data={
"organization": self.organization.id,
"name": "teamone",
"target_user": self.add_user.id,
"target_team": [
self.add_team.id
]
})
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_not_both_target_team_user'
def test_serializer_validation_no_target_team_target_user(self):
"""Serializer Validation Check
Ensure that if either target user and target team is missing it raises validation error
"""
with pytest.raises(ValidationError) as err:
serializer = KnowledgeBaseCategoryModelSerializer(
context = {
'request': self.mock_view.request,
'view': self.mock_view,
},
data={
"organization": self.organization.id,
"name": 'teamone'
})
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_need_target_team_or_user'
def test_serializer_validation_update_existing_target_user(self):
"""Serializer Validation Check
Ensure that if an existing item with target user is updated to include a target_team
it raises a validation error
"""
with pytest.raises(ValidationError) as err:
serializer = KnowledgeBaseCategoryModelSerializer(
self.item_has_target_user,
context = {
'request': self.mock_view.request,
'view': self.mock_view,
},
data={
"target_team": [ self.add_team.id ]
},
partial=True,
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_not_both_target_team_user'
def test_serializer_validation_update_existing_target_team(self):
"""Serializer Validation Check
Ensure that if an existing item with target team is updated to include a target_user
it raises a validation error
"""
with pytest.raises(ValidationError) as err:
serializer = KnowledgeBaseCategoryModelSerializer(
self.item_has_target_team,
context = {
'request': self.mock_view.request,
'view': self.mock_view,
},
data={
"target_user": self.add_user.id
},
partial=True,
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_not_both_target_team_user'

View File

@ -0,0 +1,154 @@
import pytest
from django.db import models
from rest_framework.relations import Hyperlink
from api.tests.functional.test_functional_api_fields import (
APIFieldsInheritedCases,
)
@pytest.mark.model_knowledgebasecategory
class knowledgeBaseCategoryAPITestCases(
APIFieldsInheritedCases,
):
@pytest.fixture( scope = 'class')
def second_model(self, request, django_db_blocker,
model, model_kwargs, model_team, kwargs_team
):
item = None
with django_db_blocker.unblock():
kwargs_many_to_many = {}
kwargs = {}
for key, value in model_kwargs.items():
field = model._meta.get_field(key)
if isinstance(field, models.ManyToManyField):
kwargs_many_to_many.update({
key: value
})
else:
kwargs.update({
key: value
})
# Switch model fields so all fields can be checked
team = model_team.objects.create( **kwargs_team )
kwargs_many_to_many.update({ 'target_team': [ team ]})
del kwargs['target_user']
kwargs['parent_category'] = request.cls.item
item_two = model.objects.create(
**kwargs
)
for key, value in kwargs_many_to_many.items():
field = getattr(item_two, key)
for entry in value:
field.add(entry)
request.cls.item_two = item_two
yield item_two
with django_db_blocker.unblock():
item_two.delete()
team.delete()
del request.cls.item_two
@pytest.fixture( scope = 'class', autouse = True)
def class_setup(self,
create_model,
second_model,
make_request,
):
pass
@property
def parameterized_api_fields(self):
return {
'parent_category': {
'expected': dict
},
'parent_category.id': {
'expected': int
},
'parent_category.display_name': {
'expected': str
},
'parent_category.url': {
'expected': str
},
'name': {
'expected': str
},
'target_team': {
'expected': list
},
'target_team.0.id': {
'expected': int
},
'target_team.0.display_name': {
'expected': str
},
'target_team.0.url': {
'expected': str
},
'target_user': {
'expected': dict
},
'target_user.id': {
'expected': int
},
'target_user.display_name': {
'expected': str
},
'target_user.url': {
'expected': Hyperlink
},
'modified': {
'expected': str
}
}
class knowledgeBaseCategoryAPIInheritedCases(
knowledgeBaseCategoryAPITestCases,
):
pass
@pytest.mark.module_assistance
class knowledgeBaseCategoryAPIPyTest(
knowledgeBaseCategoryAPITestCases,
):
pass

View File

@ -0,0 +1,28 @@
import pytest
from core.tests.functional.centurion_abstract.test_functional_centurion_abstract_model import (
CenturionAbstractModelInheritedCases
)
@pytest.mark.model_knowledgebasecategory
class knowledgeBaseCategoryModelTestCases(
CenturionAbstractModelInheritedCases
):
pass
class knowledgeBaseCategoryModelInheritedCases(
knowledgeBaseCategoryModelTestCases,
):
pass
@pytest.mark.module_assistance
class knowledgeBaseCategoryModelPyTest(
knowledgeBaseCategoryModelTestCases,
):
pass

View File

@ -9,8 +9,6 @@ from access.models.tenant import Tenant as Organization
from access.models.team import Team
from access.models.team_user import TeamUsers
from api.tests.abstract.api_permissions_viewset import APIPermissions
from api.tests.abstract.api_serializer_viewset import SerializersTestCases
from api.tests.abstract.test_metadata_functional import MetadataAttributesFunctional
from assistance.models.knowledge_base_category import KnowledgeBaseCategory
@ -26,8 +24,8 @@ class ViewSetBase:
model = KnowledgeBaseCategory
app_namespace = 'v2'
url_name = '_api_v2_knowledge_base_category'
url_name = '_api_knowledgebasecategory'
change_data = {'name': 'device'}
@ -218,25 +216,6 @@ class ViewSetBase:
class KnowledgeBaseCategoryPermissionsAPI(
ViewSetBase,
APIPermissions,
TestCase,
):
pass
class KnowledgeBaseCategoryViewSet(
ViewSetBase,
SerializersTestCases,
TestCase,
):
pass
class KnowledgeBaseCategoryMetadata(
ViewSetBase,
MetadataAttributesFunctional,

View File

@ -17,3 +17,9 @@ def model_kwargs(request, kwargs_knowledgebase):
if hasattr(request.cls, 'kwargs_create_item'):
del request.cls.kwargs_create_item
@pytest.fixture( scope = 'class')
def model_serializer(serializer_knowledgebase):
yield serializer_knowledgebase

View File

@ -1,485 +0,0 @@
import django
import pytest
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import reverse
from django.test import Client, TestCase
from rest_framework.relations import Hyperlink
from access.models.tenant import Tenant as Organization
from access.models.team import Team
from access.models.team_user import TeamUsers
from api.tests.abstract.api_fields import APITenancyObject
from assistance.models.knowledge_base import KnowledgeBase
from assistance.models.knowledge_base_category import KnowledgeBaseCategory
User = django.contrib.auth.get_user_model()
class KnowledgeBaseAPI(
TestCase,
APITenancyObject
):
model = KnowledgeBase
app_namespace = 'v2'
url_name = '_api_knowledgebase'
@classmethod
def setUpTestData(self):
"""Setup Test
1. Create the object
2. create view user
4. make api request
"""
organization = Organization.objects.create(name='test_org')
self.organization = organization
different_organization = Organization.objects.create(name='test_different_organization')
self.view_team = Team.objects.create(
organization=organization,
team_name = 'teamone',
model_notes = 'random note'
)
view_permissions = Permission.objects.get(
codename = 'view_' + self.model._meta.model_name,
content_type = ContentType.objects.get(
app_label = self.model._meta.app_label,
model = self.model._meta.model_name,
)
)
self.view_team.permissions.set([view_permissions])
self.view_user = User.objects.create_user(username="test_user_view", password="password")
self.item = self.model.objects.create(
organization=organization,
title = 'teamone',
content = 'random note',
summary = 'a summary',
target_user = self.view_user,
release_date = '2024-01-01 12:00:00',
expiry_date = '2024-01-01 12:00:01',
responsible_user = self.view_user,
category = KnowledgeBaseCategory.objects.create(
name='cat',
target_user = self.view_user,
organization=organization,
)
)
self.item.responsible_teams.set([self.view_team])
self.url_view_kwargs = {'pk': self.item.id}
teamuser = TeamUsers.objects.create(
team = self.view_team,
user = self.view_user
)
organization.manager = self.view_user
organization.save()
client = Client()
url = reverse(self.app_namespace + ':' + self.url_name + '-detail', kwargs=self.url_view_kwargs)
client.force_login(self.view_user)
response = client.get(url)
self.api_data = response.data
def test_api_field_exists_model_notes(self):
""" Test for existance of API Field
model_notes field does not exist for KB articles
"""
assert 'model_notes' not in self.api_data
def test_api_field_type_model_notes(self):
""" Test for type for API Field
model_notes does not exist for KB articles
"""
pass
def test_api_field_exists_category(self):
""" Test for existance of API Field
category field must exist
"""
assert 'category' in self.api_data
def test_api_field_type_category(self):
""" Test for type for API Field
category field must be dict
"""
assert type(self.api_data['category']) is dict
def test_api_field_exists_category_id(self):
""" Test for existance of API Field
category.id field must exist
"""
assert 'id' in self.api_data['category']
def test_api_field_type_category_id(self):
""" Test for type for API Field
category.id field must be int
"""
assert type(self.api_data['category']['id']) is int
def test_api_field_exists_category_display_name(self):
""" Test for existance of API Field
category.display_name field must exist
"""
assert 'display_name' in self.api_data['category']
def test_api_field_type_category_display_name(self):
""" Test for type for API Field
category.display_name field must be int
"""
assert type(self.api_data['category']['display_name']) is str
def test_api_field_exists_category_url(self):
""" Test for existance of API Field
category.url field must exist
"""
assert 'url' in self.api_data['category']
def test_api_field_type_category_url(self):
""" Test for type for API Field
category.url field must be int
"""
assert type(self.api_data['category']['url']) is str
def test_api_field_exists_summary(self):
""" Test for existance of API Field
summary field must exist
"""
assert 'summary' in self.api_data
def test_api_field_type_summary(self):
""" Test for type for API Field
summary field must be str
"""
assert type(self.api_data['summary']) is str
def test_api_field_exists_content(self):
""" Test for existance of API Field
content field must exist
"""
assert 'content' in self.api_data
def test_api_field_type_summary(self):
""" Test for type for API Field
content field must be str
"""
assert type(self.api_data['content']) is str
def test_api_field_exists_release_date(self):
""" Test for existance of API Field
release_date field must exist
"""
assert 'release_date' in self.api_data
def test_api_field_type_release_date(self):
""" Test for type for API Field
release_date field must be str
"""
assert type(self.api_data['release_date']) is str
def test_api_field_exists_expiry_date(self):
""" Test for existance of API Field
expiry_date field must exist
"""
assert 'expiry_date' in self.api_data
def test_api_field_type_expiry_date(self):
""" Test for type for API Field
expiry_date field must be str
"""
assert type(self.api_data['expiry_date']) is str
def test_api_field_exists_public(self):
""" Test for existance of API Field
public field must exist
"""
assert 'public' in self.api_data
def test_api_field_type_public(self):
""" Test for type for API Field
public field must be bool
"""
assert type(self.api_data['public']) is bool
def test_api_field_type_target_user(self):
""" Test for type for API Field
target_user field must be dict
"""
assert type(self.api_data['target_user']) is dict
def test_api_field_exists_target_user_id(self):
""" Test for existance of API Field
target_user.id field must exist
"""
assert 'id' in self.api_data['target_user']
def test_api_field_type_target_user_id(self):
""" Test for type for API Field
target_user.id field must be int
"""
assert type(self.api_data['target_user']['id']) is int
def test_api_field_exists_target_user_display_name(self):
""" Test for existance of API Field
target_user.display_name field must exist
"""
assert 'display_name' in self.api_data['target_user']
def test_api_field_type_target_user_display_name(self):
""" Test for type for API Field
target_user.display_name field must be int
"""
assert type(self.api_data['target_user']['display_name']) is str
def test_api_field_exists_target_user_url(self):
""" Test for existance of API Field
target_user.url field must exist
"""
assert 'url' in self.api_data['target_user']
def test_api_field_type_target_user_url(self):
""" Test for type for API Field
target_user.url field must be int
"""
assert type(self.api_data['target_user']['url']) is Hyperlink
def test_api_field_type_responsible_user(self):
""" Test for type for API Field
responsible_user field must be dict
"""
assert type(self.api_data['responsible_user']) is dict
def test_api_field_exists_responsible_user_id(self):
""" Test for existance of API Field
responsible_user.id field must exist
"""
assert 'id' in self.api_data['responsible_user']
def test_api_field_type_responsible_user_id(self):
""" Test for type for API Field
responsible_user.id field must be int
"""
assert type(self.api_data['responsible_user']['id']) is int
def test_api_field_exists_responsible_user_display_name(self):
""" Test for existance of API Field
responsible_user.display_name field must exist
"""
assert 'display_name' in self.api_data['responsible_user']
def test_api_field_type_responsible_user_display_name(self):
""" Test for type for API Field
responsible_user.display_name field must be int
"""
assert type(self.api_data['responsible_user']['display_name']) is str
def test_api_field_exists_responsible_user_url(self):
""" Test for existance of API Field
responsible_user.url field must exist
"""
assert 'url' in self.api_data['responsible_user']
def test_api_field_type_responsible_user_url(self):
""" Test for type for API Field
responsible_user.url field must be Hyperlink
"""
assert type(self.api_data['responsible_user']['url']) is Hyperlink
def test_api_field_type_responsible_teams(self):
""" Test for type for API Field
responsible_teams field must be list
"""
assert type(self.api_data['responsible_teams']) is list
def test_api_field_exists_responsible_teams_id(self):
""" Test for existance of API Field
responsible_teams.id field must exist
"""
assert 'id' in self.api_data['responsible_teams'][0]
def test_api_field_type_responsible_teams_id(self):
""" Test for type for API Field
responsible_teams.id field must be int
"""
assert type(self.api_data['responsible_teams'][0]['id']) is int
def test_api_field_exists_responsible_teams_display_name(self):
""" Test for existance of API Field
responsible_teams.display_name field must exist
"""
assert 'display_name' in self.api_data['responsible_teams'][0]
def test_api_field_type_responsible_teams_display_name(self):
""" Test for type for API Field
responsible_teams.display_name field must be int
"""
assert type(self.api_data['responsible_teams'][0]['display_name']) is str
def test_api_field_exists_responsible_teams_url(self):
""" Test for existance of API Field
responsible_teams.url field must exist
"""
assert 'url' in self.api_data['responsible_teams'][0]
def test_api_field_type_responsible_teams_url(self):
""" Test for type for API Field
responsible_teams.url field must be str
"""
assert type(self.api_data['responsible_teams'][0]['url']) is str

View File

@ -88,7 +88,7 @@ class KnowledgeBaseModelTestCases(
'unique': False,
},
'responsible_user': {
'blank': False,
'blank': True,
'default': models.fields.NOT_PROVIDED,
'field_type': models.ForeignKey,
'null': True,
@ -128,6 +128,7 @@ class KnowledgeBaseModelInheritedCases(
@pytest.mark.module_module_assistance
class KnowledgeBaseModelPyTest(
KnowledgeBaseModelTestCases,
):

View File

@ -0,0 +1,258 @@
import pytest
from django.db import models
from rest_framework.exceptions import ValidationError
from api.tests.unit.test_unit_serializer import (
SerializerTestCases
)
from centurion.tests.abstract.mock_view import MockView
@pytest.mark.model_knowledgebase
class KnowledgeBaseSerializerTestCases(
SerializerTestCases
):
@pytest.fixture( scope = 'function' )
def created_model(self, django_db_blocker, model, model_kwargs):
with django_db_blocker.unblock():
kwargs_many_to_many = {}
kwargs = {}
for key, value in model_kwargs.items():
field = model._meta.get_field(key)
if isinstance(field, models.ManyToManyField):
kwargs_many_to_many.update({
key: value
})
else:
kwargs.update({
key: value
})
item = model.objects.create( **kwargs )
for key, value in kwargs_many_to_many.items():
field = getattr(item, key)
for entry in value:
field.add(entry)
yield item
item.delete()
def test_serializer_validation_no_title(self,
kwargs_api_create, model, model_serializer, request_user):
"""Serializer Validation Check
Ensure that if creating and no title is provided a validation error occurs
"""
mock_view = MockView(
user = request_user,
model = model,
action = 'create',
)
kwargs = kwargs_api_create.copy()
del kwargs['title']
with pytest.raises(ValidationError) as err:
serializer = model_serializer['model'](
context = {
'request': mock_view.request,
'view': mock_view,
},
data = kwargs
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['title'][0] == 'required'
def test_serializer_validation_both_target_team_target_user(self,
kwargs_api_create, model, model_serializer, request_user,
model_team, kwargs_team
):
"""Serializer Validation Check
Ensure that both target user and target team raises a validation error
"""
mock_view = MockView(
user = request_user,
model = model,
action = 'create',
)
kwargs = kwargs_api_create.copy()
kwargs.update({
'target_user': request_user.id
})
with pytest.raises(ValidationError) as err:
serializer = model_serializer['model'](
context = {
'request': mock_view.request,
'view': mock_view,
},
data = kwargs
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_not_both_target_team_user'
def test_serializer_validation_no_target_team_target_user(self,
kwargs_api_create, model, model_serializer, request_user,
model_team, kwargs_team
):
"""Serializer Validation Check
Ensure that if either target user and target team is missing it raises validation error
"""
mock_view = MockView(
user = request_user,
model = model,
action = 'create',
)
kwargs = kwargs_api_create.copy()
del kwargs['target_team']
with pytest.raises(ValidationError) as err:
serializer = model_serializer['model'](
context = {
'request': mock_view.request,
'view': mock_view,
},
data = kwargs
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_need_target_team_or_user'
def test_serializer_validation_update_existing_target_user(self,
kwargs_api_create, model, model_serializer, request_user,
model_team, kwargs_team
):
"""Serializer Validation Check
Ensure that if an existing item with target user is updated to include a target_team
it raises a validation error
"""
mock_view = MockView(
user = request_user,
model = model,
action = 'create',
)
kwargs = kwargs_api_create.copy()
with pytest.raises(ValidationError) as err:
serializer = model_serializer['model'](
self.item_has_target_user,
context = {
'request': mock_view.request,
'view': mock_view,
},
data={
"target_team": [ self.add_team.id ]
},
partial=True,
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_not_both_target_team_user'
def test_serializer_validation_update_existing_target_user(self,
created_model,
kwargs_api_create, model, model_serializer, request_user,
model_team, kwargs_team
):
"""Serializer Validation Check
Ensure that if an existing item with target team is updated to include a target_user
it raises a validation error
"""
mock_view = MockView(
user = request_user,
model = model,
action = 'create',
)
kwargs = kwargs_api_create.copy()
team = model_team.objects.create( **kwargs_team )
kwargs.update({
'target_team': [ team ]
})
with pytest.raises(ValidationError) as err:
serializer = model_serializer['model'](
created_model,
context = {
'request': mock_view.request,
'view': mock_view,
},
data={
"target_user": request_user.id
},
partial=True,
)
serializer.is_valid(raise_exception = True)
team.delete()
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_not_both_target_team_user'
class KnowledgeBaseSerializerInheritedCases(
KnowledgeBaseSerializerTestCases
):
pass
@pytest.mark.module_assistance
class KnowledgeBaseSerializerPyTest(
KnowledgeBaseSerializerTestCases
):
pass

View File

@ -1,44 +1,91 @@
import pytest
from django.test import Client, TestCase
from rest_framework.reverse import reverse
from api.tests.unit.test_unit_common_viewset import ModelViewSetInheritedCases
from assistance.viewsets.knowledge_base import ViewSet
from assistance.viewsets.knowledge_base import (
KnowledgeBase,
ViewSet,
)
@pytest.mark.skip(reason = 'see #895, tests being refactored')
class KnowledgeBaseViewsetList(
@pytest.mark.model_knowledgebase
class ViewsetTestCases(
ModelViewSetInheritedCases,
TestCase,
):
viewset = ViewSet
route_name = 'v2:_api_knowledgebase'
@pytest.fixture( scope = 'function' )
def viewset(self):
return ViewSet
@classmethod
def setUpTestData(self):
"""Setup Test
1. make list request
"""
@property
def parameterized_class_attributes(self):
return {
'_model_documentation': {
'type': type(None),
},
'back_url': {
'type': type(None),
},
'documentation': {
'type': type(None),
'value': None
},
'filterset_fields': {
'value': [
'organization',
'category',
'target_user',
'target_team',
'responsible_user',
'responsible_teams',
'public'
]
},
'model': {
'value': KnowledgeBase
},
'model_documentation': {
'type': type(None),
},
'queryset': {
'type': type(None),
},
'serializer_class': {
'type': type(None),
},
'search_fields': {
'value': [
'title',
'summary',
'content'
]
},
'view_description': {
'value': 'Information Management Knowledge Base Article(s)'
},
'view_name': {
'type': type(None),
},
'view_serializer_name': {
'type': type(None),
}
}
super().setUpTestData()
class KnowledgeBaseViewsetInheritedCases(
ViewsetTestCases,
):
pass
client = Client()
url = reverse(
self.route_name + '-list',
kwargs = self.kwargs
)
client.force_login(self.view_user)
@pytest.mark.module_assistance
class KnowledgeBaseViewsetPyTest(
ViewsetTestCases,
):
self.http_options_response_list = client.options(url)
pass

View File

@ -17,3 +17,9 @@ def model_kwargs(request, kwargs_knowledgebasecategory):
if hasattr(request.cls, 'kwargs_create_item'):
del request.cls.kwargs_create_item
@pytest.fixture( scope = 'class')
def model_serializer(serializer_knowledgebasecategory):
yield serializer_knowledgebasecategory

View File

@ -1,481 +0,0 @@
import django
import pytest
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import reverse
from django.test import Client, TestCase
from rest_framework.relations import Hyperlink
from access.models.tenant import Tenant as Organization
from access.models.team import Team
from access.models.team_user import TeamUsers
from api.tests.abstract.api_fields import APITenancyObject
from assistance.models.knowledge_base_category import KnowledgeBaseCategory
User = django.contrib.auth.get_user_model()
class KnowledgeBaseCategoryAPI(
TestCase,
APITenancyObject
):
model = KnowledgeBaseCategory
app_namespace = 'v2'
url_name = '_api_v2_knowledge_base_category'
@classmethod
def setUpTestData(self):
"""Setup Test
1. Create the object
2. create view user
4. make api request
"""
organization = Organization.objects.create(name='test_org')
self.organization = organization
different_organization = Organization.objects.create(name='test_different_organization')
self.view_team = Team.objects.create(
organization=organization,
team_name = 'teamone',
model_notes = 'random note'
)
view_permissions = Permission.objects.get(
codename = 'view_' + self.model._meta.model_name,
content_type = ContentType.objects.get(
app_label = self.model._meta.app_label,
model = self.model._meta.model_name,
)
)
self.view_team.permissions.set([view_permissions])
self.view_user = User.objects.create_user(username="test_user_view", password="password")
parent_category = self.model.objects.create(
name='cat parent',
target_user = self.view_user,
organization=organization,
)
self.item = self.model.objects.create(
name='cat',
model_notes='dsa',
target_user = self.view_user,
organization=organization,
parent_category = parent_category,
)
# self.item.target_teams.set([self.view_team])
self.url_view_kwargs = {'pk': self.item.id}
teamuser = TeamUsers.objects.create(
team = self.view_team,
user = self.view_user
)
organization.manager = self.view_user
organization.save()
client = Client()
url = reverse(self.app_namespace + ':' + self.url_name + '-detail', kwargs=self.url_view_kwargs)
client.force_login(self.view_user)
response = client.get(url)
self.api_data = response.data
# def test_api_field_exists_model_notes(self):
# """ Test for existance of API Field
# model_notes field does not exist for KB articles
# """
# assert 'model_notes' not in self.api_data
# def test_api_field_type_model_notes(self):
# """ Test for type for API Field
# model_notes does not exist for KB articles
# """
# pass
def test_api_field_exists_parent_category(self):
""" Test for existance of API Field
parent_category field must exist
"""
assert 'parent_category' in self.api_data
def test_api_field_type_parent_category(self):
""" Test for type for API Field
parent_category field must be dict
"""
assert type(self.api_data['parent_category']) is dict
def test_api_field_exists_parent_category_id(self):
""" Test for existance of API Field
parent_category.id field must exist
"""
assert 'id' in self.api_data['parent_category']
def test_api_field_type_parent_category_id(self):
""" Test for type for API Field
parent_category.id field must be int
"""
assert type(self.api_data['parent_category']['id']) is int
def test_api_field_exists_parent_category_display_name(self):
""" Test for existance of API Field
parent_category.display_name field must exist
"""
assert 'display_name' in self.api_data['parent_category']
def test_api_field_type_parent_category_display_name(self):
""" Test for type for API Field
parent_category.display_name field must be int
"""
assert type(self.api_data['parent_category']['display_name']) is str
def test_api_field_exists_parent_category_url(self):
""" Test for existance of API Field
parent_category.url field must exist
"""
assert 'url' in self.api_data['parent_category']
def test_api_field_type_parent_category_url(self):
""" Test for type for API Field
parent_category.url field must be int
"""
assert type(self.api_data['parent_category']['url']) is str
# def test_api_field_exists_summary(self):
# """ Test for existance of API Field
# summary field must exist
# """
# assert 'summary' in self.api_data
# def test_api_field_type_summary(self):
# """ Test for type for API Field
# summary field must be str
# """
# assert type(self.api_data['summary']) is str
# def test_api_field_exists_content(self):
# """ Test for existance of API Field
# content field must exist
# """
# assert 'content' in self.api_data
# def test_api_field_type_summary(self):
# """ Test for type for API Field
# content field must be str
# """
# assert type(self.api_data['content']) is str
# def test_api_field_exists_release_date(self):
# """ Test for existance of API Field
# release_date field must exist
# """
# assert 'release_date' in self.api_data
# def test_api_field_type_release_date(self):
# """ Test for type for API Field
# release_date field must be str
# """
# assert type(self.api_data['release_date']) is str
# def test_api_field_exists_expiry_date(self):
# """ Test for existance of API Field
# expiry_date field must exist
# """
# assert 'expiry_date' in self.api_data
# def test_api_field_type_expiry_date(self):
# """ Test for type for API Field
# expiry_date field must be str
# """
# assert type(self.api_data['expiry_date']) is str
# def test_api_field_exists_public(self):
# """ Test for existance of API Field
# public field must exist
# """
# assert 'public' in self.api_data
# def test_api_field_type_public(self):
# """ Test for type for API Field
# public field must be bool
# """
# assert type(self.api_data['public']) is bool
def test_api_field_type_target_user(self):
""" Test for type for API Field
target_user field must be dict
"""
assert type(self.api_data['target_user']) is dict
def test_api_field_exists_target_user_id(self):
""" Test for existance of API Field
target_user.id field must exist
"""
assert 'id' in self.api_data['target_user']
def test_api_field_type_target_user_id(self):
""" Test for type for API Field
target_user.id field must be int
"""
assert type(self.api_data['target_user']['id']) is int
def test_api_field_exists_target_user_display_name(self):
""" Test for existance of API Field
target_user.display_name field must exist
"""
assert 'display_name' in self.api_data['target_user']
def test_api_field_type_target_user_display_name(self):
""" Test for type for API Field
target_user.display_name field must be int
"""
assert type(self.api_data['target_user']['display_name']) is str
def test_api_field_exists_target_user_url(self):
""" Test for existance of API Field
target_user.url field must exist
"""
assert 'url' in self.api_data['target_user']
def test_api_field_type_target_user_url(self):
""" Test for type for API Field
target_user.url field must be int
"""
assert type(self.api_data['target_user']['url']) is Hyperlink
# def test_api_field_type_responsible_user(self):
# """ Test for type for API Field
# responsible_user field must be dict
# """
# assert type(self.api_data['responsible_user']) is dict
# def test_api_field_exists_responsible_user_id(self):
# """ Test for existance of API Field
# responsible_user.id field must exist
# """
# assert 'id' in self.api_data['responsible_user']
# def test_api_field_type_responsible_user_id(self):
# """ Test for type for API Field
# responsible_user.id field must be int
# """
# assert type(self.api_data['responsible_user']['id']) is int
# def test_api_field_exists_responsible_user_display_name(self):
# """ Test for existance of API Field
# responsible_user.display_name field must exist
# """
# assert 'display_name' in self.api_data['responsible_user']
# def test_api_field_type_responsible_user_display_name(self):
# """ Test for type for API Field
# responsible_user.display_name field must be int
# """
# assert type(self.api_data['responsible_user']['display_name']) is str
# def test_api_field_exists_responsible_user_url(self):
# """ Test for existance of API Field
# responsible_user.url field must exist
# """
# assert 'url' in self.api_data['responsible_user']
# def test_api_field_type_responsible_user_url(self):
# """ Test for type for API Field
# responsible_user.url field must be Hyperlink
# """
# assert type(self.api_data['responsible_user']['url']) is Hyperlink
# def test_api_field_type_responsible_teams(self):
# """ Test for type for API Field
# responsible_teams field must be list
# """
# assert type(self.api_data['responsible_teams']) is list
# def test_api_field_exists_responsible_teams_id(self):
# """ Test for existance of API Field
# responsible_teams.id field must exist
# """
# assert 'id' in self.api_data['responsible_teams'][0]
# def test_api_field_type_responsible_teams_id(self):
# """ Test for type for API Field
# responsible_teams.id field must be int
# """
# assert type(self.api_data['responsible_teams'][0]['id']) is int
# def test_api_field_exists_responsible_teams_display_name(self):
# """ Test for existance of API Field
# responsible_teams.display_name field must exist
# """
# assert 'display_name' in self.api_data['responsible_teams'][0]
# def test_api_field_type_responsible_teams_display_name(self):
# """ Test for type for API Field
# responsible_teams.display_name field must be int
# """
# assert type(self.api_data['responsible_teams'][0]['display_name']) is str
# def test_api_field_exists_responsible_teams_url(self):
# """ Test for existance of API Field
# responsible_teams.url field must exist
# """
# assert 'url' in self.api_data['responsible_teams'][0]
# def test_api_field_type_responsible_teams_url(self):
# """ Test for type for API Field
# responsible_teams.url field must be str
# """
# assert type(self.api_data['responsible_teams'][0]['url']) is str

View File

@ -77,6 +77,7 @@ class KnowledgeBaseCategoryModelInheritedCases(
@pytest.mark.module_assistance
class KnowledgeBaseCategoryModelPyTest(
KnowledgeBaseCategoryModelTestCases,
):

View File

@ -0,0 +1,266 @@
import pytest
from rest_framework.exceptions import ValidationError
from api.tests.unit.test_unit_serializer import (
SerializerTestCases
)
from centurion.tests.abstract.mock_view import MockView
@pytest.mark.model_knowledgebasecategory
class knowledgebaseCategorySerializerTestCases(
SerializerTestCases
):
@pytest.fixture( scope = 'function' )
def created_model(self, django_db_blocker, model, model_kwargs):
with django_db_blocker.unblock():
item = model.objects.create( **model_kwargs )
yield item
item.delete()
def test_serializer_validation_no_name(self,
kwargs_api_create, model, model_serializer, request_user
):
"""Serializer Validation Check
Ensure that if creating and no name is provided a validation error occurs
"""
mock_view = MockView(
user = request_user,
model = model,
action = 'create',
)
kwargs = kwargs_api_create.copy()
del kwargs['name']
with pytest.raises(ValidationError) as err:
serializer = model_serializer['model'](
context = {
'request': mock_view.request,
'view': mock_view,
},
data = kwargs
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['name'][0] == 'required'
def test_serializer_validation_parent_category_not_self(self,
created_model,
model, model_serializer, request_user
):
"""Serializer Validation Check
Ensure that you cant assisgn self as parent category
"""
mock_view = MockView(
user = request_user,
model = model,
action = 'create',
)
with pytest.raises(ValidationError) as err:
serializer = model_serializer['model'](
created_model,
context = {
'request': mock_view.request,
'view': mock_view,
},
data={
"parent_category": created_model.id
},
partial=True,
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['parent_category'][0] == 'parent_category_not_self'
def test_serializer_validation_both_target_team_target_user(self,
kwargs_api_create, model, model_serializer, request_user,
model_team, kwargs_team
):
"""Serializer Validation Check
Ensure that both target user and target team raises a validation error
"""
mock_view = MockView(
user = request_user,
model = model,
action = 'create',
)
kwargs = kwargs_api_create.copy()
team = model_team.objects.create( **kwargs_team )
kwargs.update({
'target_team': [ team ]
})
with pytest.raises(ValidationError) as err:
serializer = model_serializer['model'](
context = {
'request': mock_view.request,
'view': mock_view,
},
data = kwargs
)
serializer.is_valid(raise_exception = True)
team.delete()
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_not_both_target_team_user'
def test_serializer_validation_no_target_team_target_user(self,
kwargs_api_create, model, model_serializer, request_user
):
"""Serializer Validation Check
Ensure that if either target user and target team is missing it raises validation error
"""
mock_view = MockView(
user = request_user,
model = model,
action = 'create',
)
kwargs = kwargs_api_create.copy()
del kwargs['target_user']
with pytest.raises(ValidationError) as err:
serializer = model_serializer['model'](
context = {
'request': mock_view.request,
'view': mock_view,
},
data = kwargs
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_need_target_team_or_user'
def test_serializer_validation_update_existing_target_team(self,
created_model,
model, model_serializer, request_user,
model_team, kwargs_team
):
"""Serializer Validation Check
Ensure that if an existing item with target user is updated to include a target_team
it raises a validation error
"""
mock_view = MockView(
user = request_user,
model = model,
action = 'create',
)
team = model_team.objects.create( **kwargs_team )
with pytest.raises(ValidationError) as err:
serializer = model_serializer['model'](
created_model,
context = {
'request': mock_view.request,
'view': mock_view,
},
data={
"target_team": [ team.id ]
},
partial=True,
)
serializer.is_valid(raise_exception = True)
team.delete()
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_not_both_target_team_user'
def test_serializer_validation_update_existing_target_user(self,
created_model,
model, model_serializer, request_user,
model_team, kwargs_team
):
"""Serializer Validation Check
Ensure that if an existing item with target team is updated to include a target_user
it raises a validation error
"""
mock_view = MockView(
user = request_user,
model = model,
action = 'create',
)
team = model_team.objects.create( **kwargs_team )
created_model.target_user = None
created_model.target_team.add( team )
created_model.save()
with pytest.raises(ValidationError) as err:
serializer = model_serializer['model'](
created_model,
context = {
'request': mock_view.request,
'view': mock_view,
},
data={
"target_user": request_user.id
},
partial=True,
)
serializer.is_valid(raise_exception = True)
team.delete()
assert err.value.get_codes()['non_field_errors'][0] == 'invalid_not_both_target_team_user'
class knowledgebaseCategorySerializerInheritedCases(
knowledgebaseCategorySerializerTestCases
):
pass
@pytest.mark.module_assistance
class knowledgebaseCategorySerializerPyTest(
knowledgebaseCategorySerializerTestCases
):
pass

View File

@ -0,0 +1,87 @@
import pytest
from api.tests.unit.test_unit_common_viewset import ModelViewSetInheritedCases
from assistance.viewsets.knowledge_base_category import (
KnowledgeBaseCategory,
ViewSet,
)
@pytest.mark.model_knowledgebasecategory
class ViewsetTestCases(
ModelViewSetInheritedCases,
):
@pytest.fixture( scope = 'function' )
def viewset(self):
return ViewSet
@property
def parameterized_class_attributes(self):
return {
'_model_documentation': {
'type': type(None),
},
'back_url': {
'type': type(None),
},
'documentation': {
'type': type(None),
'value': None
},
'filterset_fields': {
'value': [
'name',
'organization',
'parent_category',
'target_user',
'target_team'
]
},
'model': {
'value': KnowledgeBaseCategory
},
'model_documentation': {
'type': type(None),
},
'queryset': {
'type': type(None),
},
'serializer_class': {
'type': type(None),
},
'search_fields': {
'value': [
'name'
]
},
'view_description': {
'value': 'Settings, Knowledge Base Categories'
},
'view_name': {
'type': type(None),
},
'view_serializer_name': {
'type': type(None),
}
}
class knowledgebaseCategoryViewsetInheritedCases(
ViewsetTestCases,
):
pass
@pytest.mark.module_assistance
class knowledgebaseCategoryViewsetPyTest(
ViewsetTestCases,
):
pass

View File

@ -1,42 +0,0 @@
from django.test import Client, TestCase
from rest_framework.reverse import reverse
from api.tests.unit.test_unit_common_viewset import ModelViewSetInheritedCases
from assistance.viewsets.knowledge_base_category import ViewSet
@pytest.mark.skip(reason = 'see #895, tests being refactored')
class KnowledgeBaseViewsetList(
ModelViewSetInheritedCases,
TestCase,
):
viewset = ViewSet
route_name = 'v2:_api_v2_knowledge_base_category'
@classmethod
def setUpTestData(self):
"""Setup Test
1. make list request
"""
super().setUpTestData()
client = Client()
url = reverse(
self.route_name + '-list',
kwargs = self.kwargs
)
client.force_login(self.view_user)
self.http_options_response_list = client.options(url)

View File

@ -11,7 +11,7 @@ from assistance.viewsets.model_knowledge_base_article import ViewSet
from itam.models.device import Device
@pytest.mark.skip(reason = 'see #895, tests being refactored')
@pytest.mark.skip(reason = 'see #895 #903, tests being refactored')
class ModelKnowledgeBaseArticleViewsetList(
ModelViewSetInheritedCases,
TestCase,

View File

@ -25,7 +25,7 @@ class Index(IndexViewset):
return Response(
{
"knowledge_base": reverse('v2:_api_v2_knowledge_base-list', request=request),
"knowledge_base": reverse('v2:_api_knowledgebase-list', request=request),
"request": reverse('v2:_api_v2_ticket_request-list', request=request),
}
)

View File

@ -1,5 +1,7 @@
import pytest
from django.db import models
@pytest.mark.models
@ -23,25 +25,70 @@ class ModelTestCases:
"""
@pytest.fixture( scope = 'function' )
def created_model(self, django_db_blocker, model, model_kwargs):
@pytest.fixture( scope = 'function')
def created_model(self, request, django_db_blocker,
model, model_kwargs, mocker, model_user, kwargs_user
):
model_object = None
item = None
if not model._meta.abstract:
with django_db_blocker.unblock():
model_object = model.objects.create(
**model_kwargs
kwargs_many_to_many = {}
kwargs = {}
for key, value in model_kwargs.items():
field = model._meta.get_field(key)
if isinstance(field, models.ManyToManyField):
kwargs_many_to_many.update({
key: value
})
else:
kwargs.update({
key: value
})
context_user = mocker.patch.object(
model, 'context'
)
user = model_user.objects.create( **kwargs_user )
context_user.__getitem__.side_effect = {
'logger': None,
'user': user
}.__getitem__
item = model.objects.create(
**kwargs
)
yield model_object
for key, value in kwargs_many_to_many.items():
with django_db_blocker.unblock():
field = getattr(item, key)
if model_object:
model_object.delete()
for entry in value:
field.add(entry)
request.cls.item = item
yield item
if item:
with django_db_blocker.unblock():
item.delete()
user.delete()

View File

@ -685,7 +685,11 @@ def recursearray() -> dict[dict, str, any]:
print( f'Index {keys[1]} does not exist. List had a length of {len(v)}', file = sys.stderr )
return None
return {
'obj': obj,
'key': key,
'value': '-value-does_not-exist-'
}
except ValueError:

View File

@ -39,7 +39,7 @@ class CenturionAbstractModelTestCases(
assert history_model.__name__ == model().get_history_model_name()
@pytest.mark.skip( reason = 'test must be as part of serializer and viewset tests, not model' )
def test_model_create_has_history_entry(self, model_contenttype, created_model, model):
"""Model Created

View File

@ -16,17 +16,6 @@ class GitGroupModelTestCases(
):
@pytest.mark.skip( reason = 'test must be as part of serializer and viewset tests, not model' )
def test_model_create_has_history_entry(self, model_contenttype, created_model, model):
"""Model Created
Ensure that the model when created, added a `create` Audit History
entry.
"""
pass
def test_model_create_with_parent_sets_tenancy(self, created_model, model, model_kwargs):
"""Model Created

View File

@ -181,11 +181,13 @@ from .model_itamassetbase import (
from .model_knowledgebase import (
kwargs_knowledgebase,
model_knowledgebase,
serializer_knowledgebase,
)
from .model_knowledgebasecategory import (
kwargs_knowledgebasecategory,
model_knowledgebasecategory,
serializer_knowledgebasecategory,
)
from .model_kwarg_data import (

View File

@ -2,6 +2,11 @@ import datetime
import pytest
from assistance.models.knowledge_base import KnowledgeBase
from assistance.serializers.knowledge_base import (
KnowledgeBaseBaseSerializer,
KnowledgeBaseModelSerializer,
KnowledgeBaseViewSerializer
)
@ -65,3 +70,13 @@ def kwargs_knowledgebase(django_db_blocker,
pass
category.delete()
@pytest.fixture( scope = 'class')
def serializer_knowledgebase():
yield {
'base': KnowledgeBaseBaseSerializer,
'model': KnowledgeBaseModelSerializer,
'view': KnowledgeBaseViewSerializer
}

View File

@ -2,6 +2,11 @@ import datetime
import pytest
from assistance.models.knowledge_base_category import KnowledgeBaseCategory
from assistance.serializers.knowledge_base_category import (
KnowledgeBaseCategoryBaseSerializer,
KnowledgeBaseCategoryModelSerializer,
KnowledgeBaseCategoryViewSerializer
)
@ -37,3 +42,13 @@ def kwargs_knowledgebasecategory(django_db_blocker, kwargs_centurionmodel, model
with django_db_blocker.unblock():
user.delete()
@pytest.fixture( scope = 'class')
def serializer_knowledgebasecategory():
yield {
'base': KnowledgeBaseCategoryBaseSerializer,
'model': KnowledgeBaseCategoryModelSerializer,
'view': KnowledgeBaseCategoryViewSerializer
}