Replace persisted event statuses with publication and cancellation flags, and compute public lifecycle labels from event timing and registration capacity. Keep filters, registration checks, and profile responses aligned with the derived status.
42 lines
1.6 KiB
Python
42 lines
1.6 KiB
Python
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
from django.contrib import admin
|
|
|
|
from apps.events.admin import EventAdmin
|
|
from apps.events.models import Event
|
|
|
|
|
|
pytestmark = pytest.mark.unit
|
|
|
|
|
|
def test_event_admin_formats_empty_price_and_capacity():
|
|
model_admin = EventAdmin(Event, admin.site)
|
|
event = SimpleNamespace(price=None, capacity=None, current_attendees_count=3, is_registration_open=True)
|
|
assert model_admin.price_display(event) == "رایگان"
|
|
assert model_admin.capacity_display(event) == "نامحدود"
|
|
assert model_admin.attendees_display(event) == 3
|
|
assert model_admin.is_registration_open_display(event)
|
|
|
|
|
|
def test_event_admin_publication_and_cancellation_actions_update_selection(mocker):
|
|
model_admin = EventAdmin(Event, admin.site)
|
|
mocker.patch.object(model_admin, "message_user")
|
|
cancel_checkouts = mocker.patch("apps.events.admin.cancel_event_checkouts")
|
|
queryset = mocker.Mock()
|
|
queryset.count.return_value = 2
|
|
for action, field_value in (
|
|
(model_admin.make_published, {"is_published": True}),
|
|
(model_admin.make_draft, {"is_published": False}),
|
|
):
|
|
action(SimpleNamespace(), queryset)
|
|
queryset.update.assert_called_with(**field_value)
|
|
|
|
published = SimpleNamespace(is_cancelled=False, pk=10, save=mocker.Mock())
|
|
already_cancelled = SimpleNamespace(is_cancelled=True, pk=11, save=mocker.Mock())
|
|
model_admin.make_cancelled(SimpleNamespace(), [published, already_cancelled])
|
|
|
|
published.save.assert_called_once_with(update_fields=["is_cancelled", "updated_at"])
|
|
already_cancelled.save.assert_not_called()
|
|
cancel_checkouts.assert_called_once_with(published.pk)
|