Files
ACORE/apps/help/tests.py
T
lokses b2f0c2a1e2 core/portal: сотрудник без группы видит только базовые разделы
Ранее разделы с perm=None (Новости, Задачи, Дислокация, Документы, Чат,
Календарь, HR-портал, Справка) были доступны любому вошедшему — сотрудник
без назначенной группы видел почти весь портал. Теперь такие разделы
требуют хотя бы одной группы; без групп доступны только базовые:
Главная, Профиль, Поддержка IT.

- user_can_access: BASELINE_OPEN_KEYS + gate «есть ли группа» для perm=None
- PortalSectionAccessMiddleware: барьер по префиксу URL (в т.ч. вложенные
  страницы вроде /tasks/5/), /settings/ не гейтим (редирект на свой профиль)
- index.html: пункты меню под can_section (сайдбар, дропдаун, bottom-nav),
  секция «Управление» скрывается целиком, если пусто
- тесты: политика без-группы + прямой заход по URL; тест-фабрики выдают
  группу (реальный сотрудник её имеет)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-21 18:26:15 +03:00

111 lines
4.5 KiB
Python

from django.test import TestCase
from apps.help.models import HelpArticle, HelpCategory, HelpContribution
from core.test_utils import login_2fa
from core.tests_portal_access import make_employee
class HelpPortalTests(TestCase):
def setUp(self):
from django.contrib.auth.models import Group
self.user = make_employee()
# Любая группа = доступ к открытым разделам (в т.ч. /help/).
self.user.groups.add(Group.objects.get_or_create(name='Сотрудники (тест)')[0])
self.category = HelpCategory.objects.create(
slug='test-cat',
title='Тест',
description='Описание',
icon='book',
sort_order=1,
)
self.article = HelpArticle.objects.create(
category=self.category,
slug='test-article',
title='Тестовая статья',
body='<p>Текст статьи</p>',
is_published=True,
is_featured=True,
author=self.user,
)
def test_help_open_for_regular_employee(self):
login_2fa(self.client, self.user)
resp = self.client.get('/help/', HTTP_HX_REQUEST='true')
self.assertEqual(resp.status_code, 200)
self.assertContains(resp, 'Тест')
self.assertContains(resp, 'Тестовая статья')
def test_article_and_category_pages(self):
login_2fa(self.client, self.user)
self.assertEqual(
self.client.get('/help/c/test-cat/', HTTP_HX_REQUEST='true').status_code,
200,
)
resp = self.client.get('/help/a/test-article/', HTTP_HX_REQUEST='true')
self.assertEqual(resp.status_code, 200)
self.assertContains(resp, 'Текст статьи')
def test_search(self):
login_2fa(self.client, self.user)
resp = self.client.get('/help/?q=Тестовая', HTTP_HX_REQUEST='true')
self.assertEqual(resp.status_code, 200)
self.assertContains(resp, 'Тестовая статья')
def test_contribute_create_pending(self):
login_2fa(self.client, self.user)
resp = self.client.post('/help/contribute/', {
'kind': 'create',
'category_id': str(self.category.pk),
'title': 'Новая из портала',
'body': 'Первый абзац.\n\nВторой абзац.',
}, HTTP_HX_REQUEST='true')
self.assertEqual(resp.status_code, 302)
contrib = HelpContribution.objects.get(title='Новая из портала')
self.assertEqual(contrib.status, HelpContribution.STATUS_PENDING)
self.assertEqual(contrib.author_id, self.user.pk)
self.assertFalse(
HelpArticle.objects.filter(title='Новая из портала', is_published=True).exists()
)
def test_approve_publishes_article(self):
contrib = HelpContribution.objects.create(
kind=HelpContribution.KIND_CREATE,
category=self.category,
title='Черновик',
body='<p>Контент</p>',
author=self.user,
)
staff = make_employee(is_staff=True, username='help.admin')
article = contrib.apply_approval(staff)
self.assertTrue(article.is_published)
self.assertEqual(article.title, 'Черновик')
contrib.refresh_from_db()
self.assertEqual(contrib.status, HelpContribution.STATUS_APPROVED)
def test_approve_update_changes_article(self):
contrib = HelpContribution.objects.create(
kind=HelpContribution.KIND_UPDATE,
article=self.article,
category=self.category,
title='Обновлённый заголовок',
body='<p>Новый текст</p>',
author=self.user,
)
staff = make_employee(is_staff=True, username='help.admin2')
contrib.apply_approval(staff)
self.article.refresh_from_db()
self.assertEqual(self.article.title, 'Обновлённый заголовок')
self.assertIn('Новый текст', self.article.body)
def test_unpublished_not_visible(self):
HelpArticle.objects.create(
category=self.category,
slug='hidden',
title='Скрытая',
body='<p>x</p>',
is_published=False,
)
login_2fa(self.client, self.user)
resp = self.client.get('/help/a/hidden/', HTTP_HX_REQUEST='true')
self.assertEqual(resp.status_code, 404)