b2f0c2a1e2
Ранее разделы с 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>
111 lines
4.5 KiB
Python
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)
|