import pytest from django.contrib.auth.models import Permission from django.urls import reverse from apps.accounts.models import User from apps.customers.models import ContactGroup, CustomerProfile from apps.staff.models import OrganizationalUnit, StaffProfile from apps.tickets.dispatch_presentation import dispatch_form_options from apps.tickets.models import TicketCategory pytestmark = pytest.mark.django_db def test_dispatch_options_count_only_eligible_members_and_preserve_unit_scope(client): unit = OrganizationalUnit.objects.create(name="واحد مجاز", slug="dispatch-options") other = OrganizationalUnit.objects.create(name="واحد دیگر", slug="dispatch-options-other") unit.permissions.add(Permission.objects.get(codename="dispatch_group_tickets")) user = User.objects.create_user(username="dispatch-options", account_type="STAFF") StaffProfile.objects.create(user=user, primary_unit=unit) group = ContactGroup.objects.create(unit=unit, name="گروه مجاز") hidden_group = ContactGroup.objects.create(unit=other, name="گروه پنهان") category = TicketCategory.objects.create(unit=unit, title="مجاز", slug="options-category") hidden_category = TicketCategory.objects.create(unit=other, title="پنهان", slug="options-hidden-category") for index, (mobile, active) in enumerate([("09120000091", True), ("", True), (None, True), ("09120000092", False)]): contact = User.objects.create_user(username=f"options-customer-{index}", mobile=mobile, is_active=active, account_type="CUSTOMER") profile = CustomerProfile.objects.create(user=contact) profile.groups.add(group) client.force_login(user) response = client.get(reverse("staff_tickets:dispatch_create")) assert response.status_code == 200 options = response.context["dispatch_options"] assert options["units"] == [{"id": unit.pk, "name": unit.name, "operations": ["BULK"]}] assert options["groups"] == [{"id": group.pk, "name": group.name, "unit_id": unit.pk, "recipient_count": 1}] assert category.pk in [item["id"] for item in options["categories"]] assert hidden_category.pk not in [item["id"] for item in options["categories"]] assert hidden_group.pk not in [item["id"] for item in options["groups"]] assert "?v=" in response.content.decode().split("dispatch-workspace.js", 1)[1] def test_dispatch_options_include_global_category_fallback_for_units_without_categories(): unit = OrganizationalUnit.objects.create(name="بدون دسته‌بندی", slug="dispatch-options-fallback") user = User.objects.create_superuser(username="options-admin", account_type="STAFF") global_category = TicketCategory.objects.create(title="عمومی", slug="options-global", unit=None) options = dispatch_form_options(user, [unit], ContactGroup.objects.none()) assert {"id": global_category.pk, "title": global_category.title, "unit_id": None} in options["categories"] assert options["groups"] == []