mod: catalog_profile и документация

This commit is contained in:
2026-04-18 15:39:39 +03:00
parent c0b41cd866
commit c930e059a0
5 changed files with 168 additions and 63 deletions

View File

@@ -1,3 +1,113 @@
from django.test import TestCase
from datetime import timedelta
from unittest.mock import patch
# Create your tests here.
from django.contrib.auth.models import User
from django.test import TestCase
from django.utils import timezone
from oknardia.models import OurUser, PVCprofiles
class CatalogProfileViewTests(TestCase):
"""Регрессионные тесты для вьюхи каталога профилей."""
def setUp(self) -> None:
# Базовый пользователь нужен, потому что профиль ссылается на OurUser.
django_user = User.objects.create_user(username="tester", password="secret")
self.our_user = OurUser.objects.create(kDjangoUser=django_user)
def _get_context(self, response):
"""Достаёт итоговый контекст из ответа тестового клиента."""
context = response.context
if isinstance(context, list):
return context[-1]
return context
def _create_profile(self, *, name: str, brief: str, manufacturer: str, days_ago: int) -> PVCprofiles:
"""Создаёт профиль с нужными полями и фиксирует дату изменения вручную."""
profile = PVCprofiles.objects.create(
sProfileName=name,
sProfileBriefDescription=brief,
sProfileManufacturer=manufacturer,
kProfile2User=self.our_user,
fProfileRating=3.5,
)
# В модели стоит auto_now=True, поэтому после создания дату правим отдельным update.
modified_at = timezone.now() - timedelta(days=days_ago)
PVCprofiles.objects.filter(pk=profile.pk).update(dProfileModify=modified_at)
profile.refresh_from_db()
return profile
@patch("web.catalog.get_last_all_user_visit_list", return_value=["all-visits"])
@patch("web.catalog.get_last_user_visit_list", return_value=["last-visits"])
@patch("web.catalog.get_last_user_visit_cookies", return_value=["cookie-1", "cookie-2", "cookie-3"])
def test_catalog_profile_handles_empty_catalog(
self,
mocked_cookies,
mocked_last_visits,
mocked_all_visits,
):
"""Пустой каталог не должен падать и должен отдавать ожидаемый контекст."""
with self.assertNumQueries(1):
response = self.client.get("/catalog/profile/")
context = self._get_context(response)
self.assertEqual(response.status_code, 200)
self.assertEqual(context["CATALOG_PROFILE_NUM"], "0 профилей")
self.assertEqual(context["CATALOG_MANUFACT_NUM"], 0)
self.assertEqual(context["CATALOG_PROFILE_MAN1_NAME2"], [])
self.assertEqual(context["LAST_VISIT"], ["last-visits"])
self.assertEqual(context["LOG_VISIT"], ["all-visits"])
self.assertTrue(mocked_cookies.called)
self.assertTrue(mocked_last_visits.called)
self.assertTrue(mocked_all_visits.called)
@patch("web.catalog.get_last_all_user_visit_list", return_value=[])
@patch("web.catalog.get_last_user_visit_list", return_value=[])
@patch("web.catalog.get_last_user_visit_cookies", return_value=[])
def test_catalog_profile_groups_and_sorts_profiles(
self,
mocked_cookies,
mocked_last_visits,
mocked_all_visits,
):
"""Каталог должен группировать профили по производителю и сохранять сортировку."""
self._create_profile(name="Alpha Basic", brief="Альфа База", manufacturer="Альфа", days_ago=5)
self._create_profile(name="Alpha Plus", brief="Альфа Плюс", manufacturer="Альфа", days_ago=2)
self._create_profile(name="Beta Light", brief="Бета Лайт", manufacturer="Бета", days_ago=1)
self._create_profile(name="Hidden", brief="Скрытый", manufacturer="", days_ago=7)
with self.assertNumQueries(1):
response = self.client.get("/catalog/profile/")
context = self._get_context(response)
self.assertEqual(response.status_code, 200)
# Пустой производитель не должен превращаться в отдельную группу.
groups = context["CATALOG_PROFILE_MAN1_NAME2"]
self.assertEqual(len(groups), 2)
self.assertEqual([group["PROF_MAN"] for group in groups], ["Альфа", "Бета"])
alpha_group = groups[0]
self.assertEqual(alpha_group["PROF_MAN_T"], "alfa")
self.assertEqual(
[item["PROF_NAME"] for item in alpha_group["PROF_MAN_LIST"]],
["Альфа База", "Альфа Плюс"],
)
self.assertEqual(
[item["PROF_NAME_T"] for item in alpha_group["PROF_MAN_LIST"]],
["alpha-basic", "alpha-plus"],
)
beta_group = groups[1]
self.assertEqual(beta_group["PROF_MAN_T"], "beta")
self.assertEqual([item["PROF_NAME"] for item in beta_group["PROF_MAN_LIST"]], ["Бета Лайт"])
# Проверяем итоговые счетчики и структуру контекста.
self.assertEqual(context["CATALOG_MANUFACT_NUM"], 2)
self.assertEqual(context["CATALOG_PROFILE_NUM"], "4 профиля")
self.assertEqual(context["LAST_VISIT"], [])
self.assertEqual(context["LOG_VISIT"], [])
self.assertTrue(mocked_cookies.called)
self.assertTrue(mocked_last_visits.called)
self.assertTrue(mocked_all_visits.called)