All checks were successful
ci / ci (push) Successful in 1m3s
- tests/test_data.py: models serialization, enums, roundtrip - tests/test_storage.py: CRUD JSON, cache, persistence - tests/test_transcript.py: HTML generation, escaping, attachments - tests/test_ui.py: button callbacks with mocked interactions - Fixed: transcript.py attachments access (dataclass not dict)
133 lines
4.4 KiB
Python
133 lines
4.4 KiB
Python
from __future__ import annotations
|
|
|
|
from tickets.data import TicketData, TicketMessage
|
|
from tickets.transcript import _format_ts, generate_transcript
|
|
|
|
|
|
class TestFormatTs:
|
|
def test_valid_iso(self):
|
|
result = _format_ts("2026-01-15T10:30:00+00:00")
|
|
assert result == "15/01/2026 10:30:00"
|
|
|
|
def test_valid_naive_iso(self):
|
|
result = _format_ts("2026-06-01T12:00:00")
|
|
assert result == "01/06/2026 12:00:00"
|
|
|
|
def test_invalid_string_returns_as_is(self):
|
|
assert _format_ts("not-a-date") == "not-a-date"
|
|
|
|
def test_empty_string(self):
|
|
assert _format_ts("") == ""
|
|
|
|
def test_none_returns_none(self):
|
|
assert _format_ts(None) is None
|
|
|
|
|
|
def _make_ticket(**kwargs) -> TicketData:
|
|
defaults = dict(channel_id=123, guild_id=456, user_id=789, category_id="support")
|
|
defaults.update(kwargs)
|
|
return TicketData(**defaults)
|
|
|
|
|
|
class TestGenerateTranscript:
|
|
def test_returns_html(self):
|
|
result = generate_transcript(_make_ticket())
|
|
assert result.startswith("<!DOCTYPE html>")
|
|
assert "</html>" in result
|
|
|
|
def test_contains_channel_id(self):
|
|
result = generate_transcript(_make_ticket(channel_id=42))
|
|
assert "Ticket #42" in result
|
|
|
|
def test_empty_messages(self):
|
|
ticket = _make_ticket()
|
|
result = generate_transcript(ticket)
|
|
assert "Aucun message" in result
|
|
|
|
def test_single_user_message(self):
|
|
ticket = _make_ticket()
|
|
ticket.messages.append(
|
|
TicketMessage(author_id=1, author_name="TestUser", content="Hello!", timestamp="2026-01-01T00:00:00")
|
|
)
|
|
result = generate_transcript(ticket)
|
|
assert "TestUser" in result
|
|
assert "Hello!" in result
|
|
assert 'class="badge badge-staff"' not in result
|
|
|
|
def test_staff_message_has_badge(self):
|
|
ticket = _make_ticket()
|
|
ticket.messages.append(
|
|
TicketMessage(
|
|
author_id=2, author_name="StaffUser", content="Reply", timestamp="2026-01-01T00:00:00", is_staff=True
|
|
)
|
|
)
|
|
result = generate_transcript(ticket)
|
|
assert "badge-staff" in result
|
|
assert "STAFF" in result
|
|
|
|
def test_message_content_escaped(self):
|
|
ticket = _make_ticket()
|
|
ticket.messages.append(
|
|
TicketMessage(author_id=1, author_name="x", content="<script>alert('xss')</script>", timestamp="t")
|
|
)
|
|
result = generate_transcript(ticket)
|
|
assert "<script>" not in result
|
|
assert "<script>" in result
|
|
|
|
def test_image_attachment(self):
|
|
ticket = _make_ticket()
|
|
ticket.messages.append(
|
|
TicketMessage(
|
|
author_id=1,
|
|
author_name="u",
|
|
content="pic",
|
|
timestamp="t",
|
|
attachments=["https://example.com/image.png"],
|
|
)
|
|
)
|
|
result = generate_transcript(ticket)
|
|
assert "<img" in result
|
|
assert "image.png" in result
|
|
|
|
def test_file_attachment(self):
|
|
ticket = _make_ticket()
|
|
ticket.messages.append(
|
|
TicketMessage(
|
|
author_id=1,
|
|
author_name="u",
|
|
content="file",
|
|
timestamp="t",
|
|
attachments=["https://example.com/doc.pdf"],
|
|
)
|
|
)
|
|
result = generate_transcript(ticket)
|
|
assert "<a href=" in result
|
|
assert "doc.pdf" in result
|
|
|
|
def test_closed_ticket_shows_closed_at(self):
|
|
ticket = _make_ticket(closed_at="2026-01-02T10:00:00+00:00")
|
|
result = generate_transcript(ticket)
|
|
assert "Ferme" in result or "Fermé" in result
|
|
|
|
def test_open_ticket_no_closed_at(self):
|
|
ticket = _make_ticket()
|
|
result = generate_transcript(ticket)
|
|
assert "Ferme" not in result
|
|
|
|
def test_dark_theme_colors(self):
|
|
result = generate_transcript(_make_ticket())
|
|
assert "#0b0d11" in result
|
|
|
|
def test_multiple_messages(self):
|
|
ticket = _make_ticket()
|
|
for i in range(5):
|
|
ticket.messages.append(
|
|
TicketMessage(author_id=i, author_name=f"User{i}", content=f"Message {i}", timestamp=f"t{i}")
|
|
)
|
|
result = generate_transcript(ticket)
|
|
for i in range(5):
|
|
assert f"Message {i}" in result
|
|
|
|
def test_footer_text(self):
|
|
result = generate_transcript(_make_ticket())
|
|
assert "Vision Studio" in result
|