105 lines
3.6 KiB
Python
105 lines
3.6 KiB
Python
from app.services.support_ticket_service import (
|
|
ANSWERED_SUPPORT_TICKET_STATUS,
|
|
CLOSED_SUPPORT_TICKET_STATUS,
|
|
OPEN_SUPPORT_TICKET_STATUS,
|
|
SupportTicketService,
|
|
)
|
|
|
|
|
|
async def test_support_ticket_lifecycle(session_factory) -> None:
|
|
service = SupportTicketService(session_factory=session_factory)
|
|
|
|
ticket = await service.create_ticket(
|
|
public_id="ABCD1234",
|
|
telegram_id=1001,
|
|
username="tester",
|
|
display_name="Test User",
|
|
user_message="Need help",
|
|
support_chat_id=-1001234567890,
|
|
support_thread_id=12,
|
|
support_message_id=345,
|
|
)
|
|
|
|
assert ticket.status == OPEN_SUPPORT_TICKET_STATUS
|
|
assert await service.get_open_tickets_count() == 1
|
|
|
|
answered_ticket = await service.mark_answered(ticket_id=ticket.id)
|
|
assert answered_ticket is not None
|
|
assert answered_ticket.status == ANSWERED_SUPPORT_TICKET_STATUS
|
|
assert await service.get_open_tickets_count() == 1
|
|
|
|
noted_ticket = await service.append_note(
|
|
ticket_id=ticket.id,
|
|
note_text="First note",
|
|
status=OPEN_SUPPORT_TICKET_STATUS,
|
|
)
|
|
assert noted_ticket is not None
|
|
assert noted_ticket.support_note == "First note"
|
|
assert noted_ticket.status == OPEN_SUPPORT_TICKET_STATUS
|
|
|
|
appended_ticket = await service.append_note(ticket_id=ticket.id, note_text="Second note")
|
|
assert appended_ticket is not None
|
|
assert appended_ticket.support_note == "First note\n\nSecond note"
|
|
|
|
closed_ticket = await service.close_ticket(
|
|
ticket_id=ticket.id,
|
|
closed_by_telegram_id=9999,
|
|
)
|
|
assert closed_ticket is not None
|
|
assert closed_ticket.status == CLOSED_SUPPORT_TICKET_STATUS
|
|
assert closed_ticket.closed_by_telegram_id == 9999
|
|
assert closed_ticket.closed_at is not None
|
|
assert await service.get_open_tickets_count() == 0
|
|
|
|
still_closed_ticket = await service.mark_answered(ticket_id=ticket.id)
|
|
assert still_closed_ticket is not None
|
|
assert still_closed_ticket.status == CLOSED_SUPPORT_TICKET_STATUS
|
|
|
|
|
|
async def test_get_ticket_by_support_message_returns_ticket(session_factory) -> None:
|
|
service = SupportTicketService(session_factory=session_factory)
|
|
|
|
created_ticket = await service.create_ticket(
|
|
public_id="EFGH5678",
|
|
telegram_id=2002,
|
|
username=None,
|
|
display_name="Another User",
|
|
user_message="Another issue",
|
|
support_chat_id=-1009876543210,
|
|
support_thread_id=None,
|
|
support_message_id=777,
|
|
)
|
|
|
|
loaded_ticket = await service.get_ticket_by_support_message(
|
|
support_chat_id=-1009876543210,
|
|
support_message_id=777,
|
|
)
|
|
|
|
assert loaded_ticket is not None
|
|
assert loaded_ticket.id == created_ticket.id
|
|
assert loaded_ticket.public_id == "EFGH5678"
|
|
|
|
|
|
async def test_get_admin_tickets_page_returns_latest_first(session_factory) -> None:
|
|
service = SupportTicketService(session_factory=session_factory)
|
|
|
|
for index in range(3):
|
|
await service.create_ticket(
|
|
public_id=f"TICKET{index}",
|
|
telegram_id=3000 + index,
|
|
username=f"user{index}",
|
|
display_name=f"User {index}",
|
|
user_message=f"Message {index}",
|
|
support_chat_id=-100500,
|
|
support_thread_id=None,
|
|
support_message_id=900 + index,
|
|
)
|
|
|
|
first_page = await service.get_admin_tickets_page(page=1, page_size=2)
|
|
second_page = await service.get_admin_tickets_page(page=2, page_size=2)
|
|
|
|
assert first_page.total_items == 3
|
|
assert first_page.total_pages == 2
|
|
assert [item.public_id for item in first_page.items] == ["TICKET2", "TICKET1"]
|
|
assert [item.public_id for item in second_page.items] == ["TICKET0"]
|