refactor(assistance): Refactor KnowledgeBase Unit model tests

ref: #783 #785 #735
This commit is contained in:
2025-06-04 09:45:50 +09:30
parent 69bbe94b06
commit a6d781be47
11 changed files with 398 additions and 34 deletions

View File

@ -0,0 +1,114 @@
# Generated by Django 5.1.9 on 2025-06-03 23:40
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("access", "0010_company_alter_entity_entity_type_alter_person_dob_and_more"),
("assistance", "0009_knowledgebasecategoryaudithistory_and_more"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AlterField(
model_name="knowledgebase",
name="category",
field=models.ForeignKey(
help_text="Article Category",
max_length=50,
null=True,
on_delete=django.db.models.deletion.PROTECT,
to="assistance.knowledgebasecategory",
verbose_name="Category",
),
),
migrations.AlterField(
model_name="knowledgebase",
name="content",
field=models.TextField(
blank=True,
help_text="Content of the article. Markdown is supported",
null=True,
verbose_name="Article Content",
),
),
migrations.AlterField(
model_name="knowledgebase",
name="expiry_date",
field=models.DateTimeField(
blank=True,
help_text="Date the article will be removed from published articles",
null=True,
verbose_name="End Date",
),
),
migrations.AlterField(
model_name="knowledgebase",
name="release_date",
field=models.DateTimeField(
blank=True,
help_text="Date the article will be published",
null=True,
verbose_name="Publish Date",
),
),
migrations.AlterField(
model_name="knowledgebase",
name="responsible_teams",
field=models.ManyToManyField(
blank=True,
help_text="Team(s) whom is considered the articles owner.",
related_name="responsible_teams",
to="access.team",
verbose_name="Responsible Team(s)",
),
),
migrations.AlterField(
model_name="knowledgebase",
name="responsible_user",
field=models.ForeignKey(
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",
),
),
migrations.AlterField(
model_name="knowledgebase",
name="summary",
field=models.TextField(
blank=True,
help_text="Short Summary of the article",
null=True,
verbose_name="Summary",
),
),
migrations.AlterField(
model_name="knowledgebase",
name="target_team",
field=models.ManyToManyField(
blank=True,
help_text="Team(s) to grant access to the article",
to="access.team",
verbose_name="Target Team(s)",
),
),
migrations.AlterField(
model_name="knowledgebase",
name="target_user",
field=models.ForeignKey(
blank=True,
help_text="User(s) to grant access to the article",
null=True,
on_delete=django.db.models.deletion.PROTECT,
to=settings.AUTH_USER_MODEL,
verbose_name="Target Users(s)",
),
),
]

View File

@ -0,0 +1,23 @@
# Generated by Django 5.1.9 on 2025-06-03 23:56
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("assistance", "0010_alter_knowledgebase_category_and_more"),
]
operations = [
migrations.AddField(
model_name="knowledgebase",
name="model_notes",
field=models.TextField(
blank=True,
help_text="Tid bits of information",
null=True,
verbose_name="Notes",
),
),
]

View File

@ -16,6 +16,8 @@ class KnowledgeBase(
CenturionModel
):
model_tag = 'kb'
class Meta:
@ -28,9 +30,6 @@ class KnowledgeBase(
verbose_name_plural = "Knowledge Base Articles"
model_notes = None
title = models.CharField(
blank = False,
help_text = 'Title of the article',
@ -42,7 +41,6 @@ class KnowledgeBase(
summary = models.TextField(
blank = True,
default = None,
help_text = 'Short Summary of the article',
null = True,
verbose_name = 'Summary',
@ -51,7 +49,6 @@ class KnowledgeBase(
content = models.TextField(
blank = True,
default = None,
help_text = 'Content of the article. Markdown is supported',
null = True,
verbose_name = 'Article Content',
@ -61,11 +58,10 @@ class KnowledgeBase(
category = models.ForeignKey(
KnowledgeBaseCategory,
blank = False,
default = None,
help_text = 'Article Category',
max_length = 50,
null = True,
on_delete = models.SET_NULL,
on_delete = models.PROTECT,
unique = False,
verbose_name = 'Category',
)
@ -73,7 +69,6 @@ class KnowledgeBase(
release_date = models.DateTimeField(
blank = True,
default = None,
help_text = 'Date the article will be published',
null = True,
verbose_name = 'Publish Date',
@ -82,7 +77,6 @@ class KnowledgeBase(
expiry_date = models.DateTimeField(
blank = True,
default = None,
help_text = 'Date the article will be removed from published articles',
null = True,
verbose_name = 'End Date',
@ -92,7 +86,6 @@ class KnowledgeBase(
target_team = models.ManyToManyField(
Team,
blank = True,
default = None,
help_text = 'Team(s) to grant access to the article',
verbose_name = 'Target Team(s)',
)
@ -101,10 +94,9 @@ class KnowledgeBase(
target_user = models.ForeignKey(
User,
blank = True,
default = None,
help_text = 'User(s) to grant access to the article',
null = True,
on_delete = models.SET_NULL,
on_delete = models.PROTECT,
verbose_name = 'Target Users(s)',
)
@ -112,10 +104,9 @@ class KnowledgeBase(
responsible_user = models.ForeignKey(
User,
blank = False,
default = None,
help_text = 'User(s) whom is considered the articles owner.',
null = True,
on_delete = models.SET_NULL,
on_delete = models.PROTECT,
related_name = 'responsible_user',
verbose_name = 'Responsible User',
)
@ -124,7 +115,6 @@ class KnowledgeBase(
responsible_teams = models.ManyToManyField(
Team,
blank = True,
default = None,
help_text = 'Team(s) whom is considered the articles owner.',
related_name = 'responsible_teams',
verbose_name = 'Responsible Team(s)',
@ -139,9 +129,6 @@ class KnowledgeBase(
)
created = AutoCreatedField()
modified = AutoLastModifiedField()

View File

@ -69,7 +69,7 @@ class KnowledgeBaseModelSerializer(
get_url.update({
'category': reverse(
'v2:_api_v2_knowledge_base_category-list',
'v2:_api_knowledgebasecategory-list',
request=self.context['view'].request,
),
'organization': reverse(
@ -117,7 +117,6 @@ class KnowledgeBaseModelSerializer(
'responsible_user',
'responsible_teams',
'public',
'is_global',
'created',
'modified',
'_urls',

View File

@ -100,7 +100,6 @@ class KnowledgeBaseCategoryModelSerializer(
'parent_category',
'target_user',
'target_team',
'is_global',
'created',
'modified',
'_urls',

View File

@ -0,0 +1,19 @@
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

View File

@ -1,21 +1,131 @@
from django.test import TestCase
import pytest
from centurion.tests.unit.test_unit_models import (
TenancyObjectInheritedCases
from django.db import models
from core.tests.unit.centurion_abstract.test_unit_centurion_abstract_model import (
CenturionAbstractModelInheritedCases
)
from assistance.models.knowledge_base import KnowledgeBase
class KnowledgeBaseModel(
TenancyObjectInheritedCases,
TestCase,
@pytest.mark.model_knowledge_base
class KnowledgeBaseModelTestCases(
CenturionAbstractModelInheritedCases
):
kwargs_item_create = {
'title': 'one',
'content': 'dict({"key": "one", "existing": "dont_over_write"})'
@property
def parameterized_class_attributes(self):
return {
'model_tag': {
'type': str,
'value': 'kb'
},
}
parameterized_model_fields = {
'title': {
'blank': False,
'default': models.fields.NOT_PROVIDED,
'field_type': models.CharField,
'max_length': 50,
'null': False,
'unique': False,
},
'summary': {
'blank': True,
'default': models.fields.NOT_PROVIDED,
'field_type': models.TextField,
'null': True,
'unique': False,
},
'content': {
'blank': True,
'default': models.fields.NOT_PROVIDED,
'field_type': models.TextField,
'null': True,
'unique': False,
},
'category': {
'blank': False,
'default': models.fields.NOT_PROVIDED,
'field_type': models.ForeignKey,
'null': True,
'unique': False,
},
'release_date': {
'blank': True,
'default': models.fields.NOT_PROVIDED,
'field_type': models.DateTimeField,
'null': True,
'unique': False,
},
'expiry_date': {
'blank': True,
'default': models.fields.NOT_PROVIDED,
'field_type': models.DateTimeField,
'null': True,
'unique': False,
},
'target_team': {
'blank': True,
'default': models.fields.NOT_PROVIDED,
'field_type': models.ManyToManyField,
'null': False,
'unique': False,
},
'target_user': {
'blank': True,
'default': models.fields.NOT_PROVIDED,
'field_type': models.ForeignKey,
'null': True,
'unique': False,
},
'responsible_user': {
'blank': False,
'default': models.fields.NOT_PROVIDED,
'field_type': models.ForeignKey,
'null': True,
'related_name': 'responsible_user',
'unique': False,
},
'responsible_teams': {
'blank': True,
'default': models.fields.NOT_PROVIDED,
'field_type': models.ManyToManyField,
'null': False,
'related_name': 'responsible_teams',
'unique': False,
},
'public': {
'blank': False,
'default': False,
'field_type': models.BooleanField,
'null': False,
'unique': False,
},
'modified': {
'blank': False,
'default': models.fields.NOT_PROVIDED,
'field_type': models.DateTimeField,
'null': False,
'unique': False,
},
}
model = KnowledgeBase
class KnowledgeBaseModelInheritedCases(
KnowledgeBaseModelTestCases,
):
pass
class KnowledgeBaseModelPyTest(
KnowledgeBaseModelTestCases,
):
pass

View File

@ -113,7 +113,7 @@ class Index(IndexViewset):
"device_model": reverse('v2:_api_v2_device_model-list', request=request),
"device_type": reverse('v2:_api_v2_device_type-list', request=request),
"external_link": reverse('v2:_api_v2_external_link-list', request=request),
"knowledge_base_category": reverse('v2:_api_v2_knowledge_base_category-list', request=request),
"knowledge_base_category": reverse('v2:_api_knowledgebasecategory-list', request=request),
"manufacturer": reverse('v2:_api_v2_manufacturer-list', request=request),
"port": reverse('v2:_api_v2_port-list', request=request),
"project_state": reverse('v2:_api_v2_project_state-list', request=request),

View File

@ -58,6 +58,16 @@ from .model_instance import (
model_instance
)
from .model_knowledgebase import (
kwargs_knowledgebase,
model_knowledgebase,
)
from .model_knowledgebasecategory import (
kwargs_knowledgebasecategory,
model_knowledgebasecategory,
)
from .model_permission import (
model_permission,
)

View File

@ -0,0 +1,66 @@
import datetime
import pytest
from assistance.models.knowledge_base import KnowledgeBase
@pytest.fixture( scope = 'class')
def model_knowledgebase():
yield KnowledgeBase
@pytest.fixture( scope = 'class')
def kwargs_knowledgebase(django_db_blocker,
kwargs_centurionmodel, model_team, model_user, model_knowledgebasecategory
):
with django_db_blocker.unblock():
random_str = str(datetime.datetime.now(tz=datetime.timezone.utc))
team = model_team.objects.create(
organization = kwargs_centurionmodel['organization'],
name = 'kb tgt team' + random_str
)
user = model_user.objects.create(
username = 'kb resp user' + random_str,
password = 'apassword'
)
default_context_user = model_knowledgebasecategory.context['user']
model_knowledgebasecategory.context['user'] = user
category = model_knowledgebasecategory.objects.create(
organization = kwargs_centurionmodel['organization'],
name = 'kb cat for kb art' + random_str
)
model_knowledgebasecategory.context['user'] = default_context_user
kwargs = {
**kwargs_centurionmodel.copy(),
'title': 'title' + random_str,
'summary': 'a summary',
'content': 'the kb body text',
'category': category,
'release_date': '2024-06-04T00:00:01Z',
'expiry_date': '2024-06-04T00:00:02Z',
'target_team': team,
# 'target_user': ,
'responsible_user': user,
# 'responsible_teams': '',
'public': True,
'modified': '2024-06-03T23:00:00Z',
}
yield kwargs.copy()
team.delete()
user.delete()
category.delete()

View File

@ -0,0 +1,37 @@
import datetime
import pytest
from assistance.models.knowledge_base_category import KnowledgeBaseCategory
@pytest.fixture( scope = 'class')
def model_knowledgebasecategory():
yield KnowledgeBaseCategory
@pytest.fixture( scope = 'class')
def kwargs_knowledgebasecategory(django_db_blocker, kwargs_centurionmodel, model_user):
with django_db_blocker.unblock():
random_str = str(datetime.datetime.now(tz=datetime.timezone.utc))
user = model_user.objects.create(
username = 'kb cat tgt user' + random_str,
password = 'apassword'
)
kwargs = {
**kwargs_centurionmodel.copy(),
'name': 'kb cat' + random_str,
# 'parent_category': '',
# 'target_team': '',
'target_user': user,
'modified': '2024-06-03T23:00:00Z',
}
yield kwargs.copy()
user.delete()