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)
130 lines
4.2 KiB
Python
130 lines
4.2 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
import pytest
|
|
|
|
from tickets import storage
|
|
from tickets.data import GuildTicketConfig, TicketCategory, TicketData
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def clean_storage(tmp_path):
|
|
"""Isolate storage in a temp dir and reset caches."""
|
|
storage.TICKETS_DIR = tmp_path / "tickets"
|
|
storage._CONFIG_FILE = storage.TICKETS_DIR / "config.json"
|
|
storage._config_cache.clear()
|
|
storage._tickets_cache.clear()
|
|
yield
|
|
storage._config_cache.clear()
|
|
storage._tickets_cache.clear()
|
|
|
|
|
|
class TestGetConfig:
|
|
def test_returns_default_when_missing(self):
|
|
config = storage.get_config(guild_id=123)
|
|
assert config.guild_id == 123
|
|
assert config.enabled is False
|
|
assert config.categories == []
|
|
|
|
def test_returns_same_object(self):
|
|
c1 = storage.get_config(guild_id=1)
|
|
c2 = storage.get_config(guild_id=1)
|
|
assert c1 is c2
|
|
|
|
def test_different_guilds_different_configs(self):
|
|
c1 = storage.get_config(guild_id=1)
|
|
c2 = storage.get_config(guild_id=2)
|
|
assert c1.guild_id != c2.guild_id
|
|
|
|
|
|
class TestSaveConfig:
|
|
def test_save_creates_file(self, tmp_path):
|
|
config = storage.get_config(guild_id=1)
|
|
config.enabled = True
|
|
storage.save_config(config)
|
|
assert storage._CONFIG_FILE.exists()
|
|
|
|
def test_save_persists(self, tmp_path):
|
|
config = storage.get_config(guild_id=1)
|
|
config.enabled = True
|
|
config.categories.append(TicketCategory(id="a", name="A"))
|
|
storage.save_config(config)
|
|
|
|
storage._config_cache.clear()
|
|
loaded = storage.get_config(guild_id=1)
|
|
assert loaded.enabled is True
|
|
assert len(loaded.categories) == 1
|
|
assert loaded.categories[0].id == "a"
|
|
|
|
def test_save_multiple_guilds(self):
|
|
c1 = storage.get_config(guild_id=1)
|
|
c1.enabled = True
|
|
storage.save_config(c1)
|
|
|
|
c2 = storage.get_config(guild_id=2)
|
|
c2.enabled = False
|
|
storage.save_config(c2)
|
|
|
|
storage._config_cache.clear()
|
|
assert storage.get_config(guild_id=1).enabled is True
|
|
assert storage.get_config(guild_id=2).enabled is False
|
|
|
|
|
|
class TestSaveAndGetTicket:
|
|
def test_get_missing_returns_none(self):
|
|
assert storage.get_ticket(999) is None
|
|
|
|
def test_save_and_get(self):
|
|
ticket = TicketData(channel_id=100, guild_id=1, user_id=2, category_id="cat")
|
|
storage.save_ticket(ticket)
|
|
loaded = storage.get_ticket(100)
|
|
assert loaded is not None
|
|
assert loaded.channel_id == 100
|
|
assert loaded.category_id == "cat"
|
|
|
|
def test_save_persists_to_disk(self):
|
|
ticket = TicketData(channel_id=200, guild_id=1, user_id=2, category_id="c")
|
|
storage.save_ticket(ticket)
|
|
|
|
storage._tickets_cache.clear()
|
|
loaded = storage.get_ticket(200)
|
|
assert loaded is not None
|
|
assert loaded.user_id == 2
|
|
|
|
def test_save_overwrites(self):
|
|
t1 = TicketData(channel_id=300, guild_id=1, user_id=2, category_id="old")
|
|
storage.save_ticket(t1)
|
|
|
|
t2 = TicketData(channel_id=300, guild_id=1, user_id=2, category_id="new")
|
|
storage.save_ticket(t2)
|
|
|
|
loaded = storage.get_ticket(300)
|
|
assert loaded.category_id == "new"
|
|
|
|
def test_multiple_tickets(self):
|
|
t1 = TicketData(channel_id=400, guild_id=1, user_id=2, category_id="a")
|
|
t2 = TicketData(channel_id=401, guild_id=1, user_id=3, category_id="b")
|
|
storage.save_ticket(t1)
|
|
storage.save_ticket(t2)
|
|
assert storage.get_ticket(400).category_id == "a"
|
|
assert storage.get_ticket(401).category_id == "b"
|
|
|
|
|
|
class TestDeleteTicket:
|
|
def test_delete_removes_file(self):
|
|
ticket = TicketData(channel_id=500, guild_id=1, user_id=2, category_id="c")
|
|
storage.save_ticket(ticket)
|
|
assert storage.get_ticket(500) is not None
|
|
|
|
storage.delete_ticket(500)
|
|
assert storage.get_ticket(500) is None
|
|
|
|
def test_delete_nonexistent(self):
|
|
storage.delete_ticket(9999)
|
|
|
|
def test_delete_clears_cache(self):
|
|
ticket = TicketData(channel_id=600, guild_id=1, user_id=2, category_id="c")
|
|
storage.save_ticket(ticket)
|
|
storage.delete_ticket(600)
|
|
assert 600 not in storage._tickets_cache
|