refactor(assistance): Refactor KnowledgeBase Unit model tests
ref: #783 #785 #735
This commit is contained in:
@ -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)",
|
||||
),
|
||||
),
|
||||
]
|
23
app/assistance/migrations/0011_knowledgebase_model_notes.py
Normal file
23
app/assistance/migrations/0011_knowledgebase_model_notes.py
Normal 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",
|
||||
),
|
||||
),
|
||||
]
|
@ -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()
|
||||
|
||||
|
||||
|
@ -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',
|
||||
|
@ -100,7 +100,6 @@ class KnowledgeBaseCategoryModelSerializer(
|
||||
'parent_category',
|
||||
'target_user',
|
||||
'target_team',
|
||||
'is_global',
|
||||
'created',
|
||||
'modified',
|
||||
'_urls',
|
||||
|
19
app/assistance/tests/unit/knowledge_base/conftest.py
Normal file
19
app/assistance/tests/unit/knowledge_base/conftest.py
Normal 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
|
@ -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
|
||||
|
@ -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),
|
||||
|
10
app/tests/fixtures/__init__.py
vendored
10
app/tests/fixtures/__init__.py
vendored
@ -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,
|
||||
)
|
||||
|
66
app/tests/fixtures/model_knowledgebase.py
vendored
Normal file
66
app/tests/fixtures/model_knowledgebase.py
vendored
Normal 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()
|
37
app/tests/fixtures/model_knowledgebasecategory.py
vendored
Normal file
37
app/tests/fixtures/model_knowledgebasecategory.py
vendored
Normal 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()
|
Reference in New Issue
Block a user