a2fe4a49e3
Сотрудник сам подключает ящик (autoconfig, вложения, пагинация списка, надёжный IMAP-поиск); в хедере работает /api/search по разделам и сущностям с ACL. Также устойчивость Mattermost-токена для чата. Co-authored-by: Cursor <cursoragent@cursor.com>
77 lines
3.2 KiB
Python
77 lines
3.2 KiB
Python
"""Тесты глобального поиска портала."""
|
||
from datetime import date
|
||
|
||
from django.contrib.auth.models import Group
|
||
from django.test import TestCase
|
||
|
||
from apps.employees.models import Employee
|
||
from apps.help.models import HelpArticle, HelpCategory
|
||
from apps.tasks.models import Task
|
||
from core.test_utils import login_2fa
|
||
|
||
|
||
def _make_employee(**overrides):
|
||
n = Employee.objects.count() + 1
|
||
defaults = {
|
||
'username': f'search.user{n}',
|
||
'email': f'search.user{n}@aks-apteka.com.ua',
|
||
'first_name': 'Иван',
|
||
'last_name': 'Тестов',
|
||
'hire_date': date(2026, 1, 1),
|
||
'user_location_type': 'office',
|
||
'is_active': True,
|
||
}
|
||
defaults.update(overrides)
|
||
return Employee.objects.create_user(password='pass', **defaults)
|
||
|
||
|
||
class PortalSearchViewTests(TestCase):
|
||
def setUp(self):
|
||
self.user = _make_employee(last_name='Поисковый', first_name='Юзер')
|
||
# Открытые разделы (без perm) требуют хотя бы одну группу
|
||
group = Group.objects.create(name='search-testers')
|
||
self.user.groups.add(group)
|
||
login_2fa(self.client, self.user)
|
||
|
||
def test_requires_login(self):
|
||
self.client.logout()
|
||
resp = self.client.get('/api/search', {'q': 'тест'})
|
||
self.assertIn(resp.status_code, (302, 401, 403))
|
||
|
||
def test_short_query_hint(self):
|
||
resp = self.client.get('/api/search', {'q': 'а'}, HTTP_HX_REQUEST='true')
|
||
self.assertEqual(resp.status_code, 200)
|
||
self.assertContains(resp, 'минимум')
|
||
|
||
def test_finds_employee_and_section(self):
|
||
other = _make_employee(last_name='Коваленко', first_name='Мария')
|
||
Task.objects.create(title='Проверить поиск по задачам', creator=self.user)
|
||
|
||
resp = self.client.get('/api/search', {'q': 'Коваленко'}, HTTP_HX_REQUEST='true')
|
||
self.assertEqual(resp.status_code, 200)
|
||
self.assertContains(resp, 'Коваленко')
|
||
self.assertContains(resp, f'/employees/{other.pk}/')
|
||
|
||
resp2 = self.client.get('/api/search', {'q': 'задач'}, HTTP_HX_REQUEST='true')
|
||
self.assertContains(resp2, 'Задачи')
|
||
self.assertContains(resp2, '/tasks/')
|
||
|
||
def test_finds_help_article(self):
|
||
cat = HelpCategory.objects.create(title='Общее', slug='general')
|
||
HelpArticle.objects.create(
|
||
category=cat,
|
||
title='Как сменить пароль портала',
|
||
body='Инструкция по смене пароля',
|
||
slug='change-password',
|
||
is_published=True,
|
||
)
|
||
resp = self.client.get('/api/search', {'q': 'пароль'}, HTTP_HX_REQUEST='true')
|
||
self.assertEqual(resp.status_code, 200)
|
||
self.assertContains(resp, 'сменить пароль')
|
||
self.assertContains(resp, '/help/a/change-password/')
|
||
|
||
def test_empty_result(self):
|
||
resp = self.client.get('/api/search', {'q': 'zzzznotfound999'}, HTTP_HX_REQUEST='true')
|
||
self.assertEqual(resp.status_code, 200)
|
||
self.assertContains(resp, 'Ничего не найдено')
|